Exemple #1
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);
        }
Exemple #2
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();
        }
Exemple #3
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();
        }
Exemple #4
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");
        }
        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();
        }
Exemple #6
0
        public async void CannotVerifyWebhookWithoutChallenge()
        {
            var messageHandler = new Mock <IMessageHandler>();

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

            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.BadRequest);

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

            content.Should().BeEmpty();
        }
        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();
        }
Exemple #8
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"
                    );
            }
        }
        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();
        }
        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();
        }