public async Task Test_CustomExceptionMiddleWareResponse_Success() { //Arrange var context = new DefaultHttpContext(); context.Response.Body = new MemoryStream(); var middleware = new ExceptionMiddleware(next: (a) => { throw new Exception("This is a custom message"); }, (ex, context) => Process(ex, context)); //Act await middleware.Invoke(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var reader = new StreamReader(context.Response.Body); var streamText = await reader.ReadToEndAsync().ConfigureAwait(false); var objResponse = JsonConvert.DeserializeObject <CustomErrorResponse>(streamText); //Validate Assert.True(context.Response.StatusCode == StatusCodes.Status500InternalServerError); Assert.True(objResponse.CustomStatusCode == 999); Assert.True(objResponse.CustomMessage == "This is a custom message."); Assert.True(objResponse.CustomRequestID == "CustomRequestIs-999"); }
public async Task Invoke_ShouldCatchException() { //ARRANGE var useCaseException = new UseCaseException(UseCaseExceptionCode.FailedToAuthenticatedToInstagram); var defaultHttpContext = new DefaultHttpContext(); const HttpStatusCode httpStatusCode = HttpStatusCode.Unauthorized; requestDelegateMock.Setup(rd => rd(defaultHttpContext)).Throws(useCaseException); useCaseExceptionCodeMapperMock.Setup(ucecm => ucecm.MapToStatusCode(useCaseException.StatusCode)) .Returns(httpStatusCode); //ACT await _exceptionMiddleware.Invoke(defaultHttpContext); defaultHttpContext.Response.Body.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(defaultHttpContext.Response.Body, Encoding.UTF8)) { var responseBody = await reader.ReadToEndAsync(); //ASSERT Assert.AreEqual(defaultHttpContext.Response.ContentType, useCaseException.ContentType); Assert.AreEqual(responseBody, useCaseException.Message); Assert.AreEqual(defaultHttpContext.Response.StatusCode, (int)httpStatusCode); } }
public async Task Invoke_NoHandlersAdded_DefaultDelegateCalled(NullLoggerFactory loggerFactory, Mock <IServiceProvider> serviceProviderMock, string exceptionMessage, string path, string method) { //Arrange var requestDelegate = new RequestDelegate(httpContext => throw new Exception(exceptionMessage)); var httpContextMock = new HttpContextMock(); httpContextMock.HttpResponseMock.SetupSet(m => m.StatusCode = 500).Verifiable(); httpContextMock.HttpResponseMock.SetupSet(m => m.ContentType = "application/problem+json").Verifiable(); httpContextMock.HttpRequestMock.SetupGet(r => r.Path).Returns("/" + path); httpContextMock.HttpRequestMock.SetupGet(r => r.Method).Returns(method); var expectedResponse = new ProblemDetails() { Status = 500, Title = exceptionMessage }; var expectedBody = JObject.FromObject(expectedResponse); var middleware = new ExceptionMiddleware(requestDelegate, loggerFactory, serviceProviderMock.Object); await middleware.Invoke(httpContextMock.Object); //Assert httpContextMock.HttpResponseMock.Verify(); JToken.DeepEquals(expectedBody, JObject.Parse(httpContextMock.HttpResponseMock.ActualBody)); }
public async Task Should_Handle_Success() { // Arrange var middleware = new ExceptionMiddleware( (innerHttpContext) => { var dummyResponse = new DummyResponse("dummy"); var json = JsonConvert.SerializeObject(dummyResponse); var bytes = Encoding.ASCII.GetBytes(json); innerHttpContext.Response.Body = new MemoryStream(bytes); return(Task.CompletedTask); }, new LoggerFactory().CreateLogger <ExceptionMiddleware>() ); var context = new DefaultHttpContext(); context.Response.Body = new MemoryStream(); //Act await middleware.Invoke(context); context.Response.Body.Seek(0, SeekOrigin.Begin); var reader = new StreamReader(context.Response.Body); var streamText = reader.ReadToEnd(); var dummy = JsonConvert.DeserializeObject <DummyResponse>(streamText); //Assert Assert.Equal((int)HttpStatusCode.OK, context.Response.StatusCode); Assert.Equal("dummy", dummy.Name); }
public async Task Invoke_HandlerOfOtherTypeAdded_BaseDelegateCalled(NullLoggerFactory loggerFactory, Mock <IServiceProvider> serviceProviderMock, string exceptionMessage, string path, string method) { //Arrange var expectedResponse = new TestResponse { Message = exceptionMessage }; var argumentExceptionHandler = new Mock <IExceptionHandler <ArgumentException> >(); argumentExceptionHandler .Setup(eh => eh.GetResponseDataGeneric(It.IsAny <ArgumentException>(), It.IsAny <ResponseContext>())) .Returns((Exception exc, ResponseContext opt) => new ResponseData { StatusCode = 400, Body = null }); var exceptionHandler = new Mock <IExceptionHandler <Exception> >(); exceptionHandler .Setup(eh => eh.GetResponseData(It.IsAny <Exception>(), It.IsAny <ResponseContext>())) .Returns((Exception exc, ResponseContext opt) => new ResponseData { StatusCode = 404, Body = expectedResponse }); serviceProviderMock .Setup(s => s.GetService(typeof(IExceptionHandler <ArgumentException>))) .Returns(argumentExceptionHandler.Object); serviceProviderMock .Setup(s => s.GetService(typeof(IExceptionHandler <Exception>))) .Returns(exceptionHandler.Object); var requestDelegate = new RequestDelegate(httpContext => throw new InvalidOperationException(exceptionMessage)); var httpContextMock = new HttpContextMock(); httpContextMock.HttpResponseMock.SetupSet(m => m.StatusCode = 404).Verifiable(); httpContextMock.HttpRequestMock.SetupGet(r => r.Path).Returns("/" + path); httpContextMock.HttpRequestMock.SetupGet(r => r.Method).Returns(method); var expectedBody = JObject.FromObject(expectedResponse); var middleware = new ExceptionMiddleware(requestDelegate, loggerFactory, serviceProviderMock.Object); //Act await middleware.Invoke(httpContextMock.Object); //Assert httpContextMock.HttpResponseMock.Verify(); JToken.DeepEquals(expectedBody, JObject.Parse(httpContextMock.HttpResponseMock.ActualBody)); }
public async Task Invoke_HandlesFunctionInvocationExceptions() { var ex = new FunctionInvocationException("Kaboom!"); RequestDelegate next = (ctxt) => { throw ex; }; var middleware = new ExceptionMiddleware(next, _logger); var context = new DefaultHttpContext(); await middleware.Invoke(context); Assert.Equal(StatusCodes.Status500InternalServerError, context.Response.StatusCode); Assert.Empty(_loggerProvider.GetAllLogMessages()); }
public async Task CallsNextInChain() { bool called = false; var classUnderTest = new ExceptionMiddleware(httpContext => { called = true; return(Task.CompletedTask); }); var responseStream = new MemoryStream(); var mockResponse = new MockResponse(responseStream); var mockContext = new MockHttpContext(mockResponse); await classUnderTest.Invoke(mockContext); called.Should().BeTrue(); }
public async Task Invoke_NoException_DelegateCalled(NullLoggerFactory loggerFactory, Mock <IServiceProvider> serviceProviderMock) { //Arrange var delegateWasCalled = false; var requestDelegate = new RequestDelegate(_ => { delegateWasCalled = true; return(Task.CompletedTask); }); var httpContext = new Mock <HttpContext>(); var middleware = new ExceptionMiddleware(requestDelegate, loggerFactory, serviceProviderMock.Object); //Act await middleware.Invoke(httpContext.Object); //Assert delegateWasCalled.Should().BeTrue(); }
public async Task Invoke_HandlesNonHttpExceptions() { var ex = new Exception("Kaboom!"); RequestDelegate next = (ctxt) => { throw ex; }; var middleware = new ExceptionMiddleware(next, _logger); var context = new DefaultHttpContext(); await middleware.Invoke(context); Assert.Equal(StatusCodes.Status500InternalServerError, context.Response.StatusCode); var log = _loggerProvider.GetAllLogMessages().Single(); Assert.Equal("An unhandled host error has occurred.", log.FormattedMessage); Assert.Same(ex, log.Exception); }