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");
        }
Exemple #2
0
        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);
        }