コード例 #1
0
        public async Task AdaptiveDialogBotExceptionWhenNoResource()
        {
            // Arrange
            var logger = NullLogger <AdaptiveDialogBot> .Instance;

            var storage                    = new MemoryStorage();
            var conversationState          = new ConversationState(storage);
            var userState                  = new UserState(storage);
            var skillConversationIdFactory = new SkillConversationIdFactory(storage);
            var languagePolicy             = new LanguagePolicy("en-US");

            var resourceExplorer = new ResourceExplorer();
            var resourceProvider = new MockResourceProvider(resourceExplorer);

            resourceExplorer.AddResourceProvider(resourceProvider);

            var botFrameworkClientMock = new Mock <BotFrameworkClient>();

            var botFrameworkAuthenticationMock = new Mock <BotFrameworkAuthentication>();

            botFrameworkAuthenticationMock.Setup(bfa => bfa.CreateBotFrameworkClient()).Returns(botFrameworkClientMock.Object);

            // The test dialog being used here happens to not send anything so we only need to mock the type.
            var adapterMock = new Mock <BotAdapter>();

            // ChannelId and Conversation.Id are required for ConversationState and
            // ChannelId and From.Id are required for UserState.
            var activity = new Activity
            {
                ChannelId    = "test-channel",
                Conversation = new ConversationAccount {
                    Id = "test-conversation-id"
                },
                From = new ChannelAccount {
                    Id = "test-id"
                }
            };

            var turnContext = new TurnContext(adapterMock.Object, activity);

            // Act
            var bot = new AdaptiveDialogBot(
                "main.dialog",
                "main.lg",
                resourceExplorer,
                conversationState,
                userState,
                skillConversationIdFactory,
                languagePolicy,
                botFrameworkAuthenticationMock.Object,
                logger: logger);

            var exception = await Record.ExceptionAsync(() => ((IBot)bot).OnTurnAsync(turnContext, CancellationToken.None));

            // Assert
            Assert.NotNull(exception);
            Assert.IsType <InvalidOperationException>(exception);
        }
コード例 #2
0
        public void AdaptiveDialogBot_ShouldNotThrowOnNullLogger()
        {
            // Arrange
            var logger = NullLogger <AdaptiveDialogBot> .Instance;

            var storage                    = new MemoryStorage();
            var conversationState          = new ConversationState(storage);
            var userState                  = new UserState(storage);
            var skillConversationIdFactory = new SkillConversationIdFactory(storage);
            var languagePolicy             = new LanguagePolicy("en-US");

            var resourceExplorer = new ResourceExplorer();
            var resourceProvider = new MockResourceProvider(resourceExplorer);

            resourceExplorer.AddResourceProvider(resourceProvider);

            var botFrameworkClientMock = new Mock <BotFrameworkClient>();

            var botFrameworkAuthenticationMock = new Mock <BotFrameworkAuthentication>();

            botFrameworkAuthenticationMock.Setup(bfa => bfa.CreateBotFrameworkClient()).Returns(botFrameworkClientMock.Object);

            // The test dialog being used here happens to not send anything so we only need to mock the type.
            var adapterMock = new Mock <BotAdapter>();

            // ChannelId and Conversation.Id are required for ConversationState and
            // ChannelId and From.Id are required for UserState.
            var activity = new Activity
            {
                ChannelId    = "test-channel",
                Conversation = new ConversationAccount {
                    Id = "test-conversation-id"
                },
                From = new ChannelAccount {
                    Id = "test-id"
                }
            };

            var turnContext = new TurnContext(adapterMock.Object, activity);

            var telemetryClient = new NullBotTelemetryClient();

            new AdaptiveDialogBot(
                "main.dialog",
                "main.lg",
                resourceExplorer,
                conversationState,
                userState,
                skillConversationIdFactory,
                languagePolicy,
                botFrameworkAuthenticationMock.Object,
                telemetryClient,
                logger: null);
        }
コード例 #3
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddNewtonsoftJson();

            services.AddSingleton <IConfiguration>(this.Configuration);

            // Load settings
            var settings = new BotSettings();

            Configuration.Bind(settings);

            var storage = ConfigureStorage(settings);

            services.AddSingleton(storage);
            var userState         = new UserState(storage);
            var conversationState = new ConversationUserState(storage);

            services.AddSingleton(userState);
            services.AddSingleton <ConversationState>(conversationState);

            // Create the credential provider to be used with the Bot Framework Adapter.
            services.AddSingleton <ICredentialProvider, ConfigurationCredentialProvider>();
            services.AddSingleton <BotAdapter>(sp => (BotFrameworkHttpAdapter)sp.GetService <IBotFrameworkHttpAdapter>());

            // Register AuthConfiguration to enable custom claim validation.
            services.AddSingleton <AuthenticationConfiguration>();

            // register components.
            ComponentRegistration.Add(new DialogsComponentRegistration());
            ComponentRegistration.Add(new DeclarativeComponentRegistration());
            ComponentRegistration.Add(new AdaptiveComponentRegistration());
            ComponentRegistration.Add(new LanguageGenerationComponentRegistration());
            ComponentRegistration.Add(new QnAMakerComponentRegistration());

            // ComponentRegistration.Add(new LuisComponentRegistration());

            // This is for custom action component registration.
            ComponentRegistration.Add(new CustomActionComponentRegistration());

            // Register the skills client and skills request handler.
            var skillConversationIdFactory = new SkillConversationIdFactory(storage);

            services.AddSingleton <SkillConversationIdFactoryBase>(skillConversationIdFactory);
            services.AddHttpClient <BotFrameworkClient, SkillHttpClient>();
            services.AddSingleton <ChannelServiceHandler, SkillHandler>();

            // Register telemetry client, initializers and middleware
            services.AddApplicationInsightsTelemetry(settings.ApplicationInsights.InstrumentationKey);
            services.AddSingleton <ITelemetryInitializer, OperationCorrelationTelemetryInitializer>();
            services.AddSingleton <ITelemetryInitializer, TelemetryBotIdInitializer>();
            services.AddSingleton <IBotTelemetryClient, BotTelemetryClient>();
            services.AddSingleton <TelemetryLoggerMiddleware>(sp =>
            {
                var telemetryClient = sp.GetService <IBotTelemetryClient>();
                return(new TelemetryLoggerMiddleware(telemetryClient, logPersonalInformation: settings.Telemetry.LogPersonalInformation));
            });
            services.AddSingleton <TelemetryInitializerMiddleware>(sp =>
            {
                var httpContextAccessor       = sp.GetService <IHttpContextAccessor>();
                var telemetryLoggerMiddleware = sp.GetService <TelemetryLoggerMiddleware>();
                return(new TelemetryInitializerMiddleware(httpContextAccessor, telemetryLoggerMiddleware, settings.Telemetry.LogActivities));
            });

            var cachedLuisManager = new CachedLuisManager(settings.CachedLuis);

            // Configure bot loading path
            var botDir           = settings.Bot;
            var resourceExplorer = new ResourceExplorer().AddFolder(botDir).RegisterType(LuisAdaptiveRecognizer.Kind, typeof(CachedLuisRecognizer), new CachedLuisLoader(cachedLuisManager));
            var rootDialog       = GetRootDialog(botDir);

            var defaultLocale = Configuration.GetValue <string>("defaultLanguage") ?? "en-us";

            services.AddSingleton(resourceExplorer);

            resourceExplorer.RegisterType <OnQnAMatch>("Microsoft.OnQnAMatch");

            services.AddSingleton <IBotFrameworkHttpAdapter, BotFrameworkHttpAdapter>((s) => GetBotAdapter(storage, settings, userState, conversationState, s, s.GetService <TelemetryInitializerMiddleware>()));

            var removeRecipientMention = settings?.Feature?.RemoveRecipientMention ?? false;

            services.AddSingleton <IBot>((s) => new ComposerBot(
                                             conversationState,
                                             userState,
                                             resourceExplorer,
                                             s.GetService <BotFrameworkClient>(),
                                             skillConversationIdFactory,
                                             s.GetService <IBotTelemetryClient>(),
                                             rootDialog,
                                             defaultLocale,
                                             removeRecipientMention));

            var discordAdapterOptions = new DiscordAdapterOptions
            {
                Token = settings.DiscordToken
            };

            services.AddSingleton((s) =>
            {
                var adapter = new DiscordAdapter(
                    discordAdapterOptions,
                    s.GetService <IBot>());
                SetBotAdapter(adapter, storage, settings, userState, conversationState, s, s.GetService <TelemetryInitializerMiddleware>());
                return(adapter);
            });

            Task.Run(async() =>
            {
                var client = new HttpClient();
                await client.GetAsync(settings.HostUrl + "/discord");
            });
        }
コード例 #4
0
        public async Task AdaptiveDialogBotTurnState()
        {
            // Arrange
            var logger = NullLogger <AdaptiveDialogBot> .Instance;

            var storage                    = new MemoryStorage();
            var conversationState          = new ConversationState(storage);
            var userState                  = new UserState(storage);
            var skillConversationIdFactory = new SkillConversationIdFactory(storage);
            var languagePolicy             = new LanguagePolicy("en-US");

            var resourceExplorer = new ResourceExplorer();
            var resourceProvider = new MockResourceProvider(resourceExplorer);

            resourceProvider.Add("main.dialog", new MockResource("{ \"$kind\": \"Microsoft.AdaptiveDialog\" }"));
            resourceExplorer.AddResourceProvider(resourceProvider);

            var botFrameworkClientMock = new Mock <BotFrameworkClient>();

            var botFrameworkAuthenticationMock = new Mock <BotFrameworkAuthentication>();

            botFrameworkAuthenticationMock.Setup(bfa => bfa.CreateBotFrameworkClient()).Returns(botFrameworkClientMock.Object);

            // The test dialog being used here happens to not send anything so we only need to mock the type.
            var adapterMock = new Mock <BotAdapter>();

            // ChannelId and Conversation.Id are required for ConversationState and
            // ChannelId and From.Id are required for UserState.
            var activity = new Activity
            {
                ChannelId    = "test-channel",
                Conversation = new ConversationAccount {
                    Id = "test-conversation-id"
                },
                From = new ChannelAccount {
                    Id = "test-id"
                }
            };

            var turnContext = new TurnContext(adapterMock.Object, activity);

            var telemetryClient = new NullBotTelemetryClient();

            // Act
            var bot = new AdaptiveDialogBot(
                "main.dialog",
                "main.lg",
                resourceExplorer,
                conversationState,
                userState,
                skillConversationIdFactory,
                languagePolicy,
                botFrameworkAuthenticationMock.Object,
                telemetryClient,
                logger: logger);

            await bot.OnTurnAsync(turnContext, CancellationToken.None);

            // Assert
            Assert.NotNull(turnContext.TurnState.Get <BotFrameworkClient>());
            Assert.NotNull(turnContext.TurnState.Get <SkillConversationIdFactoryBase>());
            Assert.NotNull(turnContext.TurnState.Get <ConversationState>());
            Assert.NotNull(turnContext.TurnState.Get <UserState>());
            Assert.NotNull(turnContext.TurnState.Get <ResourceExplorer>());
            Assert.NotNull(turnContext.TurnState.Get <LanguageGenerator>());
            Assert.NotNull(turnContext.TurnState.Get <LanguageGeneratorManager>());
            Assert.NotNull(turnContext.TurnState.Get <LanguagePolicy>());
        }
コード例 #5
0
        public async Task AdaptiveDialogBotSetTestOptions()
        {
            // Arrange
            var logger = NullLogger <AdaptiveDialogBot> .Instance;

            var storage                    = new MemoryStorage();
            var conversationState          = new ConversationState(storage);
            var userState                  = new UserState(storage);
            var skillConversationIdFactory = new SkillConversationIdFactory(storage);
            var languagePolicy             = new LanguagePolicy("en-US");

            var resourceExplorer = new ResourceExplorer();
            var resourceProvider = new MockResourceProvider(resourceExplorer);

            resourceProvider.Add("main.dialog", new MockResource("{ \"$kind\": \"Microsoft.AdaptiveDialog\" }"));
            resourceExplorer.AddResourceProvider(resourceProvider);

            var botFrameworkClientMock = new Mock <BotFrameworkClient>();

            var botFrameworkAuthenticationMock = new Mock <BotFrameworkAuthentication>();

            botFrameworkAuthenticationMock.Setup(bfa => bfa.CreateBotFrameworkClient()).Returns(botFrameworkClientMock.Object);

            // The test dialog being used here happens to not send anything so we only need to mock the type.
            var adapterMock = new Mock <BotAdapter>();

            // Type "event" and Name of "SetTestOptions" should store Value in ConversationState.
            // ChannelId and Conversation.Id are required for ConversationState and
            // ChannelId and From.Id are required for UserState.
            var activity = new Activity
            {
                Type         = "event",
                Name         = "SetTestOptions",
                ChannelId    = "test-channel",
                Conversation = new ConversationAccount {
                    Id = "test-conversation-id"
                },
                From = new ChannelAccount {
                    Id = "test-id"
                },
                Value = new JObject {
                    { "randomSeed", new JValue(123) }, { "randomValue", new JValue(456) }
                }
            };

            var turnContext = new TurnContext(adapterMock.Object, activity);

            var telemetryClient = new NullBotTelemetryClient();

            // Act
            var bot = new AdaptiveDialogBot(
                "main.dialog",
                "main.lg",
                resourceExplorer,
                conversationState,
                userState,
                skillConversationIdFactory,
                languagePolicy,
                botFrameworkAuthenticationMock.Object,
                telemetryClient,
                logger: logger);

            await bot.OnTurnAsync(turnContext, CancellationToken.None);

            // Assert TestOptions are in Conversation
            var testOptionsAccessor = conversationState.CreateProperty <JObject>("TestOptions");

            Assert.Equal(123, (await testOptionsAccessor.GetAsync(turnContext)).GetValue("randomSeed"));
            Assert.Equal(456, (await testOptionsAccessor.GetAsync(turnContext)).GetValue("randomValue"));
        }