コード例 #1
0
        public async void ShouldShowInstructionCorrectly()
        {
            var context        = new FakeRegistrationDb();
            var mediator       = MockBuilder.BuildMediatorMock();
            var client         = new Mock <ISendApiClient>();
            var confirmHandler = new Mock <IConfirmSubscriptionMessageHandler>();

            var handler = new GatherClassMessageHandler(mediator.Object, client.Object,
                                                        MockBuilder.BuildFakeTranslator(), confirmHandler.Object, context,
                                                        MockBuilder.BuildFakeLogger <GatherClassMessageHandler>());
            await handler.ShowInstruction(await context.IncompleteUsers.FindAsync("sample-registering-user-with-year"));

            var expectedMessage = new SendRequest("sample-registering-user-with-year", new Message("class-selection-text", new[]
            {
                new QuickReply("1a", new Payload(PayloadType.Class, "sample-class-1a").ToJson()),
                new QuickReply("1b", new Payload(PayloadType.Class, "sample-class-1b").ToJson()),
                new QuickReply("1c", new Payload(PayloadType.Class, "sample-class-1c").ToJson()),
                new QuickReply("1d", new Payload(PayloadType.Class, "sample-class-1d").ToJson()),
                new QuickReply("1e", new Payload(PayloadType.Class, "sample-class-1e").ToJson()),
                new QuickReply("1f", new Payload(PayloadType.Class, "sample-class-1f").ToJson()),
                new QuickReply("1g", new Payload(PayloadType.Class, "sample-class-1g").ToJson()),
                new QuickReply("1h", new Payload(PayloadType.Class, "sample-class-1h").ToJson()),
                new QuickReply("1i", new Payload(PayloadType.Class, "sample-class-1i").ToJson()),
                new QuickReply("1j", new Payload(PayloadType.Class, "sample-class-1j").ToJson()),
                new QuickReply("cancel-button-text", new Payload(PayloadType.Cancel).ToJson()),
                new QuickReply("->", new Payload(PayloadType.Class, 1).ToJson())
            }));

            client.Verify(x => x.Send(
                              It.Is <SendRequest>(y => y.IsEquivalentTo(expectedMessage))
                              ), Times.Once);
            client.VerifyNoOtherCalls();
        }
コード例 #2
0
        public async void ShouldRouteRequestWithUnsupportedCommandCorrectly()
        {
            var cancelHandler      = new Mock <ICancelSubscriptionMessageHandler>();
            var unsupportedHandler = new Mock <IUnsupportedCommandMessageHandler>();

            var message = new Messaging
            {
                Sender = new Sender {
                    Id = "sample-subscriber"
                },
                Recipient = new Recipient {
                    Id = "sample-page-id"
                },
                Timestamp = 123456789,
                Message   = new Message
                {
                    Mid  = "sample-message-id",
                    Text = "sample-message-text"
                }
            };

            var handler = new KnownUserMessageMessageHandler(cancelHandler.Object, unsupportedHandler.Object,
                                                             MockBuilder.BuildFakeLogger <KnownUserMessageMessageHandler>());
            await handler.Handle(message);

            unsupportedHandler.Verify(x => x.Handle(message));
            unsupportedHandler.VerifyNoOtherCalls();
            cancelHandler.VerifyNoOtherCalls();
        }
コード例 #3
0
        public async void ShouldShowListPageCorrectly()
        {
            var context        = new FakeRegistrationDb();
            var mediator       = MockBuilder.BuildMediatorMock();
            var client         = new Mock <ISendApiClient>();
            var confirmHandler = new Mock <IGatherClassMessageHandler>();

            var handler = new GatherYearMessageHandler(mediator.Object, client.Object,
                                                       MockBuilder.BuildFakeTranslator(), confirmHandler.Object, context,
                                                       MockBuilder.BuildFakeLogger <GatherYearMessageHandler>());
            await handler.Handle(
                await context.IncompleteUsers.FindAsync("sample-registering-user-with-lang"),
                new Payload(PayloadType.Year, 1)
                );

            var expectedMessage = new SendRequest("sample-registering-user-with-lang", new Message("year-selection-text", new[]
            {
                new QuickReply("11", new Payload(PayloadType.Year, "11").ToJson()),
                new QuickReply("12", new Payload(PayloadType.Year, "12").ToJson()),
                new QuickReply("cancel-button-text", new Payload(PayloadType.Cancel).ToJson()),
                new QuickReply("<-", new Payload(PayloadType.Year, 0).ToJson())
            }));

            client.Verify(x => x.Send(
                              It.Is <SendRequest>(y => y.IsEquivalentTo(expectedMessage))
                              ));
            client.VerifyNoOtherCalls();
        }
コード例 #4
0
        public PlatformClientBuilder()
        {
            ApiClientMock = new Mock <ISendApiClient>();

            PlatformClient = new FacebookMessengerPlatformClient(ApiClientMock.Object,
                                                                 MockBuilder.BuildMediatorMock().Object, MockBuilder.BuildFakeTranslator(),
                                                                 MockBuilder.BuildFakeLogger <FacebookMessengerPlatformClient>());
        }
コード例 #5
0
        public async void ShouldUpdateUserCorrectly()
        {
            var context     = new FakeRegistrationDb();
            var client      = new Mock <ISendApiClient>();
            var yearHandler = new Mock <IGatherYearMessageHandler>();

            var handler = new GatherLanguageMessageHandler(MockBuilder.BuildFakeConfiguration(), client.Object,
                                                           MockBuilder.BuildFakeTranslator(), yearHandler.Object, context,
                                                           MockBuilder.BuildFakeLogger <GatherLanguageMessageHandler>());
            await handler.Handle(await context.IncompleteUsers.FindAsync("sample-registering-user"), new Payload(PayloadType.Lang, "pl"));

            context.IncompleteUsers.Should().ContainSingle(x =>
                                                           x.Id == "sample-registering-user" && x.PreferredLanguage == "pl" && x.LastPage == 0 &&
                                                           x.Stage == Stage.GatheredLanguage);

            yearHandler.Verify(x
                               => x.ShowInstruction(It.Is <IncompleteUser>(y => y.Id == "sample-registering-user"), 0), Times.Once);
            yearHandler.VerifyNoOtherCalls();
        }
コード例 #6
0
        public async void ShouldUpdateUserCorrectly()
        {
            var context        = new FakeRegistrationDb();
            var confirmHandler = new Mock <IConfirmSubscriptionMessageHandler>();

            var handler = new GatherClassMessageHandler(MockBuilder.BuildMediatorMock().Object,
                                                        new Mock <ISendApiClient>().Object, MockBuilder.BuildFakeTranslator(), confirmHandler.Object, context,
                                                        MockBuilder.BuildFakeLogger <GatherClassMessageHandler>());
            await handler.Handle(await context.IncompleteUsers.FindAsync("sample-registering-user-with-year"),
                                 new Payload(PayloadType.Class, "sample-class-1a"));

            context.IncompleteUsers.Should().ContainSingle(x =>
                                                           x.Id == "sample-registering-user-with-year" && x.PreferredLanguage == "en" && x.Year == 1 &&
                                                           x.ClassId == "sample-class-1a" && x.LastPage == 0 && x.Stage == Stage.GatheredClass);

            confirmHandler.Verify(
                x => x.ShowInstruction(
                    It.Is <IncompleteUser>(y => y.Id == "sample-registering-user-with-year")
                    ), Times.Once);
            confirmHandler.VerifyNoOtherCalls();
        }
コード例 #7
0
        public async void ShouldShowInstructionCorrectly()
        {
            var context     = new FakeRegistrationDb();
            var client      = new Mock <ISendApiClient>();
            var yearHandler = new Mock <IGatherYearMessageHandler>();

            var handler = new GatherLanguageMessageHandler(MockBuilder.BuildFakeConfiguration(), client.Object,
                                                           MockBuilder.BuildFakeTranslator(), yearHandler.Object, context,
                                                           MockBuilder.BuildFakeLogger <GatherLanguageMessageHandler>());
            await handler.ShowInstruction(await context.IncompleteUsers.FindAsync("sample-registering-user"));

            var expectedMessage = new SendRequest("sample-registering-user", new Message("greeting-text", new[]
            {
                new QuickReply("EN", new Payload(PayloadType.Lang, "en").ToJson()),
                new QuickReply("PL", new Payload(PayloadType.Lang, "pl").ToJson()),
                new QuickReply("cancel-button-text", new Payload(PayloadType.Cancel).ToJson())
            }));

            client.Verify(x => x.Send(
                              It.Is <SendRequest>(y => y.IsEquivalentTo(expectedMessage))
                              ));
            client.VerifyNoOtherCalls();
        }
コード例 #8
0
        public async void ShouldShowInstructionCorrectly()
        {
            var context        = new FakeRegistrationDb();
            var mediator       = MockBuilder.BuildMediatorMock();
            var client         = new Mock <ISendApiClient>();
            var confirmHandler = new Mock <IGatherClassMessageHandler>();

            var handler = new GatherYearMessageHandler(mediator.Object, client.Object,
                                                       MockBuilder.BuildFakeTranslator(), confirmHandler.Object, context,
                                                       MockBuilder.BuildFakeLogger <GatherYearMessageHandler>());
            await handler.ShowInstruction(await context.IncompleteUsers.FindAsync("sample-registering-user-with-lang"));

            context.IncompleteUsers.Should().ContainSingle(x =>
                                                           x.Id == "sample-registering-user-with-lang" && x.PreferredLanguage == "en" &&
                                                           x.LastPage == 0 && x.Stage == Stage.GatheredLanguage);

            var expectedMessage = new SendRequest("sample-registering-user-with-lang", new Message("year-selection-text", new[]
            {
                new QuickReply("1", new Payload(PayloadType.Year, "1").ToJson()),
                new QuickReply("2", new Payload(PayloadType.Year, "2").ToJson()),
                new QuickReply("3", new Payload(PayloadType.Year, "3").ToJson()),
                new QuickReply("4", new Payload(PayloadType.Year, "4").ToJson()),
                new QuickReply("5", new Payload(PayloadType.Year, "5").ToJson()),
                new QuickReply("6", new Payload(PayloadType.Year, "6").ToJson()),
                new QuickReply("7", new Payload(PayloadType.Year, "7").ToJson()),
                new QuickReply("8", new Payload(PayloadType.Year, "8").ToJson()),
                new QuickReply("9", new Payload(PayloadType.Year, "9").ToJson()),
                new QuickReply("10", new Payload(PayloadType.Year, "10").ToJson()),
                new QuickReply("cancel-button-text", new Payload(PayloadType.Cancel).ToJson()),
                new QuickReply("->", new Payload(PayloadType.Year, 1).ToJson())
            }));

            client.Verify(x => x.Send(
                              It.Is <SendRequest>(y => y.IsEquivalentTo(expectedMessage))
                              ));
            client.VerifyNoOtherCalls();
        }
コード例 #9
0
        public async void ShouldStartRegistrationCorrectly()
        {
            var context                 = new FakeRegistrationDb();
            var langHandlerMock         = new Mock <IGatherLanguageMessageHandler>();
            var backgroundJobClientMock = new Mock <IBackgroundJobClient>();

            var message = new Messaging
            {
                Sender = new Sender {
                    Id = "sample-unknown-user"
                },
                Recipient = new Recipient {
                    Id = "sample-page-id"
                },
                Timestamp = 123456789,
                Message   = new Message
                {
                    Mid  = "sample-message-id",
                    Text = "sample-message-text"
                }
            };

            var handler = new StartRegistrationMessageHandler(context, MockBuilder.BuildFakeConfiguration(),
                                                              langHandlerMock.Object, backgroundJobClientMock.Object,
                                                              MockBuilder.BuildFakeLogger <StartRegistrationMessageHandler>());
            await handler.Handle(message);

            context.IncompleteUsers.Should().ContainSingle(x =>
                                                           x.Id == "sample-unknown-user" && x.PreferredLanguage == "en" && x.Year == 0 && x.ClassId == null &&
                                                           x.Stage == Stage.Created && x.LastPage == 0);

            var user = await context.IncompleteUsers.FindAsync("sample-unknown-user");

            langHandlerMock.Verify(x => x.ShowInstruction(user, 0));
            langHandlerMock.VerifyNoOtherCalls();
        }
コード例 #10
0
 public RegisteringUserMessageHandlerBuilder()
 {
     RegisteringUserMessageHandler = new RegisteringUserMessageHandler(BuildServiceProvider(),
                                                                       MockBuilder.BuildFakeLogger <RegisteringUserMessageHandler>());
 }
コード例 #11
0
        public async void ShouldHandleErrorWhileSendingRequestToFacebookCorrectly()
        {
            var factory = SetupHttpClientFactory(HttpStatusCode.BadRequest,
                                                 "{\"error\":{\"message\":\"Invalid OAuth access token.\",\"type\":\"OAuthException\",\"code\":190,\"error_subcode\":1234567,\"fbtrace_id\":\"traceid\"}}",
                                                 "{\"messaging_type\":\"RESPONSE\",\"recipient\":{\"id\":\"sample-subscriber\"},\"message\":{\"text\":\"hello, world!\"}}"
                                                 );

            var request = new SendRequest("sample-subscriber", new Message("hello, world!"));

            var apiClient = new SendApiClient(factory, MockBuilder.BuildFakeConfiguration(), MockBuilder.BuildFakeLogger <SendApiClient>());

            try
            {
                await apiClient.Send(request);
            }
            catch (MessageSendingException exception)
            {
                exception.Message.Should()
                .BeEquivalentTo(
                    "An exception was thrown while sending a message: Facebook Messenger GraphQL Endpoint returned non-success HTTP Status Code"
                    );
            }
        }
コード例 #12
0
        public async void ShouldSendRequestToFacebookCorrectly()
        {
            var factory = SetupHttpClientFactory(HttpStatusCode.OK,
                                                 "{\"recipient_id\":\"sample-subscriber\",\"message_id\":\"sample-message-id\"}",
                                                 "{\"messaging_type\":\"RESPONSE\",\"recipient\":{\"id\":\"sample-subscriber\"},\"message\":{\"text\":\"hello, world!\"}}"
                                                 );

            var request = new SendRequest("sample-subscriber", new Message("hello, world!"));

            var apiClient = new SendApiClient(factory, MockBuilder.BuildFakeConfiguration(), MockBuilder.BuildFakeLogger <SendApiClient>());
            await apiClient.Send(request);
        }
コード例 #13
0
        public async void CanReceiveGraphEvent()
        {
            var messageHandler = new Mock <IMessageHandler>();
            var middleware     = new FbMiddleware(MockBuilder.BuildFakeConfiguration(), messageHandler.Object, MockBuilder.BuildFakeLogger <FbMiddleware>());

            var context = BuildHttpContext(
                "{\"object\":\"page\",\"entry\":[{\"messaging\":[{\"sender\":{\"id\":\"<PSID>\"},\"recipient\":{\"id\":\"<PAGE_ID>\"},\"timestamp\":123456789,\"message\":{\"mid\":\"mid.1457764197618:41d102a3e1ae206a38\",\"text\":\"hello, world!\"}}]}]}"
                );


            await middleware.InvokeAsync(context, requestDelegateContext => Task.CompletedTask);

            var content = await GetStringBody(context.Response.Body);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.OK);
            content.Should().Be("EVENT_RECEIVED");
        }
コード例 #14
0
        public async void CannotHandleRequestWithUnsupportedMethod()
        {
            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(x => x.Request.Method).Returns("PUT");
            httpContext.SetupProperty(x => x.Response.Body, new MemoryStream());
            httpContext.SetupProperty(x => x.Response.StatusCode);
            var context = httpContext.Object;

            var messageHandler = new Mock <IMessageHandler>();

            var middleware = new FbMiddleware(MockBuilder.BuildFakeConfiguration(), messageHandler.Object, MockBuilder.BuildFakeLogger <FbMiddleware>());
            await middleware.InvokeAsync(context, requestDelegateContext => Task.CompletedTask);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.MethodNotAllowed);

            context.Response.Body.Position = 0; var reader = new StreamReader(context.Response.Body); var content = await reader.ReadToEndAsync();

            content.Should().BeEmpty();
        }
コード例 #15
0
        public async void CannotVerifyWebhookWithInvalidToken()
        {
            var messageHandler = new Mock <IMessageHandler>();

            var context = BuildHttpContext(new Dictionary <string, StringValues>
            {
                { "hub.mode", "subscribe" },
                { "hub.verify_token", "invalid-verify-token" },
                { "hub.challenge", "sample-challenge" }
            });

            var middleware = new FbMiddleware(MockBuilder.BuildFakeConfiguration(), messageHandler.Object, MockBuilder.BuildFakeLogger <FbMiddleware>());
            await middleware.InvokeAsync(context, requestDelegateContext => Task.CompletedTask);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.Forbidden);

            var content = await GetStringBody(context.Response.Body);

            content.Should().BeEmpty();
        }
コード例 #16
0
 public IncomingMessageHandlerBuilder()
 {
     IncomingMessageHandler = new IncomingMessageHandler(BuildServiceProvider(), MockBuilder.BuildFakeLogger <IncomingMessageHandler>());
 }
コード例 #17
0
        public async void ShouldCancelSubscriptionCorrectly()
        {
            var mediator  = MockBuilder.BuildMediatorMock();
            var apiClient = new Mock <ISendApiClient>();

            var message = new Messaging
            {
                Sender = new Sender {
                    Id = "sample-subscriber"
                },
                Recipient = new Recipient {
                    Id = "sample-page-id"
                },
                Timestamp = 123456789,
                Message   = new Message
                {
                    Mid        = "sample-message-id",
                    Text       = "Cancel",
                    QuickReply = new QuickReply {
                        Payload = new Payload(PayloadType.Cancel).ToJson()
                    }
                }
            };

            var handler = new CancelSubscriptionMessageHandler(mediator.Object, apiClient.Object,
                                                               MockBuilder.BuildFakeTranslator(), MockBuilder.BuildFakeLogger <CancelSubscriptionMessageHandler>());
            await handler.Handle(message);

            mediator.Verify(
                x => x.Send(
                    It.Is <GetSubscriberQuery>(y =>
                                               y.Id == "sample-subscriber" && y.Platform == FacebookMessengerPlatformClient.PId),
                    It.IsAny <CancellationToken>()), Times.Once);

            mediator.Verify(
                x => x.Send(
                    It.Is <CancelSubscriptionCommand>(y =>
                                                      y.Id == "sample-subscriber" && y.Platform == FacebookMessengerPlatformClient.PId),
                    It.IsAny <CancellationToken>()), Times.Once);

            mediator.VerifyNoOtherCalls();

            var expectedMessage = new SendRequest("sample-subscriber",
                                                  new FacebookMessenger.SendAPIClient.Requests.Message("subscription-cancelled-text")
                                                  );

            apiClient.Verify(x => x.Send(
                                 It.Is <SendRequest>(y => y.IsEquivalentTo(expectedMessage))
                                 ));
            apiClient.VerifyNoOtherCalls();
        }
コード例 #18
0
        public async void DoesWebhookReturnBadRequestWhenRequestIsInvalid()
        {
            var messageHandler = new Mock <IMessageHandler>();
            var middleware     = new FbMiddleware(MockBuilder.BuildFakeConfiguration(), messageHandler.Object, MockBuilder.BuildFakeLogger <FbMiddleware>());

            var context = BuildHttpContext(
                "{\"object\": \"page\", \"entry\": [{\"messaging\": [{\"message\": \"TEST_MESSAGE\"}]}]}"
                );

            await middleware.InvokeAsync(context, requestDelegateContext => Task.CompletedTask);

            var content = await GetStringBody(context.Response.Body);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.BadRequest);
            content.Should().BeEmpty();
        }
コード例 #19
0
        public async void DoesWebhookReturnNotFoundWhenSubscriptionTargetIsUnknown()
        {
            var messageHandler = new Mock <IMessageHandler>();
            var middleware     = new FbMiddleware(MockBuilder.BuildFakeConfiguration(), messageHandler.Object, MockBuilder.BuildFakeLogger <FbMiddleware>());

            var context = BuildHttpContext("{\"object\":\"unknown\"}");

            await middleware.InvokeAsync(context, requestDelegateContext => Task.CompletedTask);

            var content = await GetStringBody(context.Response.Body);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.NotFound);
            content.Should().BeEmpty();
        }