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();
        }
Ejemplo n.º 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();
        }
Ejemplo n.º 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();
        }
Ejemplo n.º 4
0
        public PlatformClientBuilder()
        {
            ApiClientMock = new Mock <ISendApiClient>();

            PlatformClient = new FacebookMessengerPlatformClient(ApiClientMock.Object,
                                                                 MockBuilder.BuildMediatorMock().Object, MockBuilder.BuildFakeTranslator(),
                                                                 MockBuilder.BuildFakeLogger <FacebookMessengerPlatformClient>());
        }
        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();
        }
        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();
        }
        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();
        }
Ejemplo n.º 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();
        }
        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();
        }
 public RegisteringUserMessageHandlerBuilder()
 {
     RegisteringUserMessageHandler = new RegisteringUserMessageHandler(BuildServiceProvider(),
                                                                       MockBuilder.BuildFakeLogger <RegisteringUserMessageHandler>());
 }
Ejemplo n.º 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"
                    );
            }
        }
Ejemplo n.º 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);
        }
Ejemplo n.º 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");
        }
Ejemplo n.º 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();
        }
Ejemplo n.º 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();
        }
Ejemplo n.º 16
0
 public IncomingMessageHandlerBuilder()
 {
     IncomingMessageHandler = new IncomingMessageHandler(BuildServiceProvider(), MockBuilder.BuildFakeLogger <IncomingMessageHandler>());
 }
        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();
        }
Ejemplo n.º 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();
        }
Ejemplo n.º 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();
        }