public async Task PresentsMissingIdsErrorWhenInputIsMissingIds() { var usedValidator = false; var prompt = new AdaptiveCardPrompt( "prompt", new AdaptiveCardPromptSettings() { Card = GetCard(), RequiredInputIds = new string[] { "test1", "test2", "test3", } }, async(context, cancel) => { Assert.IsFalse(context.Recognized.Succeeded); Assert.AreEqual(context.Recognized.Value.Error, AdaptiveCardPromptErrors.MissingRequiredIds); await context.Context.SendActivityAsync($"test inputs missing: {string.Join(", ", context.Recognized.Value.MissingIds)}"); usedValidator = true; return(context.Recognized.Succeeded); }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { await dc.PromptAsync("prompt", new PromptOptions()); } else if (results.Status == DialogTurnStatus.Complete) { var content = results.Result.GetType().GetProperty("Data"); await turnContext.SendActivityAsync($"You said: {content.ToString()}"); } }) .Send("hello") .AssertReply((activity) => { AssertActivityHasCard(activity); }) .Send(simulatedInput) .AssertReply("test inputs missing: test1, test2, test3") .StartTestAsync(); Assert.IsTrue(usedValidator); }
public async Task RecognizesInputWithCustomPromptIdAndCorrectInput() { var usedValidator = false; var prompt = new AdaptiveCardPrompt( "prompt", new AdaptiveCardPromptSettings() { PromptId = customPromptId, Card = GetCard(), }, (context, cancel) => { Assert.IsTrue(context.Recognized.Succeeded); Assert.AreEqual(context.Recognized.Value.Error, AdaptiveCardPromptErrors.None); usedValidator = true; return(Task.FromResult(context.Recognized.Succeeded)); }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { await dc.PromptAsync("prompt", new PromptOptions()); } else if (results.Status == DialogTurnStatus.Complete) { var content = (results.Result as AdaptiveCardPromptResult).Data; await turnContext.SendActivityAsync($"You said: {content.ToString()}"); } }) .Send("hello") .AssertReply( (activity) => { var card = JObject.FromObject((activity as Activity).Attachments[0].Content); Assert.AreEqual(card["selectAction"]["data"]["promptId"], customPromptId); }) .Send(simulatedInput) .StartTestAsync(); Assert.IsTrue(usedValidator); }
public async Task RecognizesIfAllRequiredIdsSupplied() { var usedValidator = false; var prompt = new AdaptiveCardPrompt( "prompt", new AdaptiveCardPromptSettings() { Card = GetCard(), RequiredInputIds = new string[] { "foodChoice", "steakOther", "steakTemp", } }, (context, cancel) => { Assert.IsTrue(context.Recognized.Succeeded); Assert.AreEqual(context.Recognized.Value.Error, AdaptiveCardPromptErrors.None); usedValidator = true; return(Task.FromResult(context.Recognized.Succeeded)); }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { await dc.PromptAsync("prompt", new PromptOptions()); } else if (results.Status == DialogTurnStatus.Complete) { var content = (results.Result as AdaptiveCardPromptResult).Data; await turnContext.SendActivityAsync($"You said: {content.ToString()}"); } }) .Send("hello") .AssertReply((activity) => { AssertActivityHasCard(activity); }) .Send(simulatedInput) .StartTestAsync(); Assert.IsTrue(usedValidator); }
public async Task DoesNotRepromptIfNotRecognizedSucceededButValidatorTrue() { var usedValidator = false; var prompt = new AdaptiveCardPrompt( "prompt", new AdaptiveCardPromptSettings() { Card = GetCard(), }, (context, cancel) => { Assert.IsFalse(context.Recognized.Succeeded); usedValidator = true; return(Task.FromResult(true)); }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { await dc.PromptAsync("prompt", new PromptOptions()); } else if (results.Status == DialogTurnStatus.Complete) { var content = (results.Result as AdaptiveCardPromptResult).Data; await turnContext.SendActivityAsync("Validator passed"); } }) .Send("hello") .AssertReply((activity) => { AssertActivityHasCard(activity); }) .Send("this is not valid input") .AssertReply("Validator passed") .StartTestAsync(); Assert.IsTrue(usedValidator); }
public async Task UsesRetryPromptOnRetries() { var prompt = new AdaptiveCardPrompt("prompt", new AdaptiveCardPromptSettings() { Card = GetCard() }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { await dc.BeginDialogAsync("prompt", new PromptOptions() { RetryPrompt = MessageFactory.Text("RETRY") }); } else if (results.Status == DialogTurnStatus.Complete) { var content = (results.Result as AdaptiveCardPromptResult).Data; await turnContext.SendActivityAsync($"You said: {content.ToString()}"); } }) .Send("hello") .AssertReply((activity) => { AssertActivityHasCard(activity); }) .Send("This is not a valid response") .AssertReply("RETRY") .StartTestAsync(); }
public DialogAdaptive(string dialogId, AdaptiveCardPrompt prompt) : base(nameof(dialogId)) { _dialogId = dialogId; _adaptiveCardPrompt = prompt; }
public async Task TracksTheNumberOfAttempts() { var attempts = 0; var prompt = new AdaptiveCardPrompt( "prompt", new AdaptiveCardPromptSettings() { Card = GetCard(), }, (context, cancel) => { attempts = int.Parse(context.State["AttemptCount"].ToString()); return(Task.FromResult(false)); }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { await dc.PromptAsync("prompt", new PromptOptions()); } else if (results.Status == DialogTurnStatus.Complete) { var content = (results.Result as AdaptiveCardPromptResult).Data; await turnContext.SendActivityAsync($"You said: {content.ToString()}"); } }) .Send("hello") .AssertReply((activity) => { AssertActivityHasCard(activity); }) .Send(simulatedInput) .AssertReply((activity) => { AssertActivityHasCard(activity); Assert.AreEqual(attempts, 1); }) .Send(simulatedInput) .AssertReply((activity) => { AssertActivityHasCard(activity); Assert.AreEqual(attempts, 2); }) .Send(simulatedInput) .AssertReply((activity) => { AssertActivityHasCard(activity); Assert.AreEqual(attempts, 3); }) .StartTestAsync(); }
public async Task DoesNotOverwriteDevProvidedAttachments() { var prompt = new AdaptiveCardPrompt("prompt", new AdaptiveCardPromptSettings() { Card = GetCard() }); var simulatedInput = GetSimulatedInput(); var convoState = new ConversationState(new MemoryStorage()); var dialogState = convoState.CreateProperty <DialogState>("dialogState"); var adapter = new TestAdapter() .Use(new AutoSaveStateMiddleware(convoState)); // Create new DialogSet. var dialogs = new DialogSet(dialogState); // Create and add custom activity prompt to DialogSet. dialogs.Add(prompt); // Create mock Activity for testing. await new TestFlow(adapter, async(turnContext, cancellationToken) => { var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); var results = await dc.ContinueDialogAsync(cancellationToken); if (results.Status == DialogTurnStatus.Empty) { var promptWithAttachments = MessageFactory.Text(string.Empty); promptWithAttachments.Attachments = new List <Attachment> { new Attachment() { Content = "a" }, new Attachment() { Content = "b" }, new Attachment() { Content = "c" }, }; await dc.BeginDialogAsync("prompt", new PromptOptions() { Prompt = promptWithAttachments }); } else if (results.Status == DialogTurnStatus.Complete) { var content = (results.Result as AdaptiveCardPromptResult).Data; await turnContext.SendActivityAsync($"You said: {content.ToString()}"); } }) .Send("hello") .AssertReply((activity) => { Assert.AreEqual((activity as Activity).Attachments[0].Content, "a"); Assert.AreEqual((activity as Activity).Attachments[1].Content, "b"); Assert.AreEqual((activity as Activity).Attachments[2].Content, "c"); Assert.AreEqual((activity as Activity).Attachments[3].ContentType, "application/vnd.microsoft.card.adaptive"); }) .StartTestAsync(); }