예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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();
        }
예제 #6
0
 public DialogAdaptive(string dialogId, AdaptiveCardPrompt prompt) : base(nameof(dialogId))
 {
     _dialogId           = dialogId;
     _adaptiveCardPrompt = prompt;
 }
예제 #7
0
        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();
        }
예제 #8
0
        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();
        }