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); }
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(); }
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(); }
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(); }
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(); }
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(); }