Ejemplo n.º 1
0
        public async Task Invoke_must_call_requestDelegate_invoker()
        {
            //Arrange
            A.CallTo(() => _next.Invoke(A <HttpContext> .Ignored)).Returns(Task.FromResult(1));

            //Act
            await _errorHandlingMiddleware.Invoke(_httpContext);

            //Assert
            A.CallTo(() => _next.Invoke(A <HttpContext> .Ignored)).MustHaveHappened();
        }
Ejemplo n.º 2
0
        public async Task Writes_Unhandled_Exceptions_Thrown_In_Inner_Middlewares_As_Errors_In_Response_Body()
        {
            var written     = false;
            var httpContext = CreateHttpResponseMock(() => written = true);

            Moq.Mock.Get(_next).Setup(n => n.Invoke(It.IsAny <HttpContext>())).ThrowsAsync(new InvalidOperationException("Any error"));

            var mockacoContext = Moq.Mock.Of <IMockacoContext>(c => c.Errors == new List <Error>());

            await _middleware.Invoke(httpContext, mockacoContext, _statusCodeOptions, _mockProvider, _logger);

            written.Should().BeTrue();
        }
Ejemplo n.º 3
0
        public async void HttpContextResponseMustConsistsOfDefaultValuesIfCatchedNotProcessableException()
        {
            var loggerMock = new Mock <ILogger <ErrorHandlingMiddleware> >();
            var errorHandlingMiddleware = new ErrorHandlingMiddleware(
                next: (innerHttpContext) =>
            {
                throw new Exception("Something bad is happening!");
            },
                logger: loggerMock.Object);

            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            await errorHandlingMiddleware.Invoke(context);

            var responseMessage = "";
            var expectedMessage = JsonConvert.SerializeObject(new { errorMessage = "Something bad is happening!" });

            using (var memoryStream = context.Response.Body)
            {
                memoryStream.Position = 0;
                var streamReader = new StreamReader(memoryStream);
                responseMessage = streamReader.ReadToEnd();
            }

            Assert.Equal("application/json", context.Response.ContentType);
            Assert.Equal(StatusCodes.Status500InternalServerError, context.Response.StatusCode);
            Assert.Equal(expectedMessage, responseMessage);
        }
Ejemplo n.º 4
0
        public async Task ErrorHandlingMiddleware_ExceptionRaised_ReturnsInternalServerError()
        {
            var mockLogger = Substitute.For <ILoggerFactory>();

            // Arrange
            var middleware = new ErrorHandlingMiddleware(next: (innerHttpContext) =>
            {
                throw new Exception("Something went wrong");
            }
                                                         , mockLogger);


            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            //Act
            await middleware.Invoke(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);

            string objResponse;

            using (var reader = new StreamReader(context.Response.Body))
            {
                objResponse = reader.ReadToEnd();
            }

            //Assert
            Assert.That(objResponse, Does.Contain("Something went wrong"));
            Assert.That(context.Response.StatusCode, Is.EqualTo((int)HttpStatusCode.InternalServerError));
        }
Ejemplo n.º 5
0
        public async Task TestMiddleware_HttpAcceptHtml()
        {
            // Arrange
            var logger     = Mock.Of <ILogger <ErrorHandlingMiddleware> >();
            var middleware = new ErrorHandlingMiddleware((innerHttpContext) =>
            {
                throw new System.Exception("Error", new System.Exception("inner"));
            }, logger);

            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();
            var headerDict = new HeaderDictionary();
            var accept     = @"text/html; q=0.5, application/json, text/x-dvi; q=0.8, text/x-c";

            context.Request.Headers.Add(KeyValuePair.Create <string, StringValues>("Accept", accept));

            // Act
            await middleware.Invoke(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);
            var reader     = new StreamReader(context.Response.Body);
            var streamText = reader.ReadToEnd();

            // Assert
            context.Response.StatusCode
            .Should()
            .Be((int)HttpStatusCode.Redirect);

            context.Response.Headers["Location"]
            .Should().Contain(x => x == "/Error");
        }
Ejemplo n.º 6
0
        public async void HttpContextResponseMustConsistsOfValuesAccordingToEmptyCollectionException()
        {
            var loggerMock = new Mock <ILogger <ErrorHandlingMiddleware> >();
            var errorHandlingMiddleware = new ErrorHandlingMiddleware(
                next: (innerHttpContext) =>
            {
                throw new EmptyCollectionException("Collection is empty");
            },
                logger: loggerMock.Object);

            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            await errorHandlingMiddleware.Invoke(context);

            var responseMessage = "";
            var expectedMessage = JsonConvert.SerializeObject(new { errorMessage = "Collection is empty" });

            using (var memoryStream = context.Response.Body)
            {
                memoryStream.Position = 0;
                var streamReader = new StreamReader(memoryStream);
                responseMessage = streamReader.ReadToEnd();
            }

            Assert.Equal("application/json", context.Response.ContentType);
            Assert.Equal(StatusCodes.Status204NoContent, context.Response.StatusCode);
            Assert.Equal(expectedMessage, responseMessage);
        }
Ejemplo n.º 7
0
        public async Task ErrorHandlingMiddleware_NotFoundExceptionRaised_ReturnsNotFoundtWithId()
        {
            var mockLogger = Substitute.For <ILoggerFactory>();

            // Arrange
            var middleware = new ErrorHandlingMiddleware(next: (innerHttpContext) =>
            {
                throw new NotFoundException("Patient", 1);
            }
                                                         , mockLogger);


            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            //Act
            await middleware.Invoke(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);

            string objResponse;

            using (var reader = new StreamReader(context.Response.Body))
            {
                objResponse = reader.ReadToEnd();
            }

            //Assert
            Assert.That(objResponse, Does.Contain("(1) was not found."));
            Assert.That(context.Response.StatusCode, Is.EqualTo((int)HttpStatusCode.NotFound));
        }
        public async Task WhenAnUnExpectedExceptionIsRaised_ErrorHandlingMiddlewareShouldHandleItToCustomErrorResponseAndCorrectHttpStatus()
        {
            // Arrange
            var middleware = new ErrorHandlingMiddleware((innerHttpContext) =>
            {
                throw new NullReferenceException("Test");
            },
                                                         new NullLoggerFactory());

            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 message = reader.ReadToEnd();

            //Assert
            message
            .Should()
            .BeEquivalentTo("Ops, something bad happened");

            context.Response.StatusCode
            .Should()
            .Be((int)HttpStatusCode.BadRequest);
        }
Ejemplo n.º 9
0
        public async Task TestMiddleware_StandardBehavior()
        {
            // Arrange
            var logger     = Mock.Of <ILogger <ErrorHandlingMiddleware> >();
            var middleware = new ErrorHandlingMiddleware((innerHttpContext) =>
            {
                throw new System.Exception("Error", new System.Exception("inner"));
            }, logger);

            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 pd         = JsonSerializer.Deserialize <ProblemDetails>(streamText);

            // Assert
            pd.Type.Should().Be("about:blank");
            pd.Title.Should().StartWith("error during request: ");
            pd.Status.Should().Be(500);
            pd.Detail.Should().Be("Error, inner");

            context.Response.StatusCode
            .Should()
            .Be((int)HttpStatusCode.InternalServerError);
        }
Ejemplo n.º 10
0
        public async Task Writes_Unhandled_Exceptions_Thrown_In_Inner_Middlewares_As_Errors_In_Response_Body()
        {
            DefaultHttpContext httpContext = GetHttpContextForTest();

            var anyException = new InvalidOperationException("Any error");

            Moq.Mock.Get(_next).Setup(n => n.Invoke(It.IsAny <HttpContext>())).ThrowsAsync(anyException);

            var mockacoContext = Moq.Mock.Of <IMockacoContext>(c => c.Errors == new List <Error>());

            await _middleware.Invoke(httpContext, mockacoContext, _statusCodeOptions, _mockProvider, _logger);

            var body = await ReadResponseBody(httpContext);

            var bodyAsJToken = JToken.Parse(body);

            bodyAsJToken.Should().NotBeNullOrEmpty();
            bodyAsJToken.SelectToken("$[0].Exception.ClassName").ToString().Should().Be(anyException.GetType().FullName);
            bodyAsJToken.SelectToken("$[0].Exception.Message").ToString().Should().Be(anyException.Message);
            httpContext.Response.StatusCode.Should().Be(501);
            httpContext.Response.ContentType.Should().Be("application/json");
        }
Ejemplo n.º 11
0
        public async Task ErrorInDeDelegateMustBeConvertedToResponseError()
        {
            Task ReqDelegate(HttpContext context)
            {
                throw new Exception("Unhandled");
            }

            DefaultHttpContext      defaultHttpContext      = new DefaultHttpContext();
            ErrorHandlingMiddleware errorHandlingMiddleware = new ErrorHandlingMiddleware(ReqDelegate);
            await errorHandlingMiddleware.Invoke(defaultHttpContext);

            Assert.IsTrue(defaultHttpContext.Response.StatusCode == (int)HttpStatusCode.InternalServerError);
        }
Ejemplo n.º 12
0
        public async Task Error_Handling_Middleware_Success()
        {
            var errorHandlingMiddleware = new ErrorHandlingMiddleware(
                async(innerHttpContext) =>
            {
                await innerHttpContext.Response.WriteAsync("test response body");
            }, _mockLoggerFactory.Object);

            var context = new DefaultHttpContext();
            await errorHandlingMiddleware.Invoke(context);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.OK);
        }
Ejemplo n.º 13
0
        public async Task ErrorHandlingMiddlewareMustCallNextDelegate()
        {
            var delegateWasExecuted = false;

            Task ReqDelegate(HttpContext context)
            {
                delegateWasExecuted = true;
                return(Task.CompletedTask);
            }

            ErrorHandlingMiddleware errorHandlingMiddleware = new ErrorHandlingMiddleware(ReqDelegate);
            await errorHandlingMiddleware.Invoke(new DefaultHttpContext());

            Assert.IsTrue(delegateWasExecuted);
        }
Ejemplo n.º 14
0
        public void ChangeSuccessStatusCodeTo500AndRethrowException(int requestStatusCode, int responseStatusCode)
        {
            // Arrange
            var context    = new DefaultHttpContext();
            var middleware = new ErrorHandlingMiddleware(innerHttpContext =>
            {
                innerHttpContext.Response.StatusCode = requestStatusCode;
                throw new Exception("Exception");
            }, Substitute.For <ILogger <ErrorHandlingMiddleware> >());

            // Act
            Func <Task> action = async() => await middleware.Invoke(context);

            // Assert
            action.Should().Throw <Exception>().WithMessage("Exception");
            context.Response.StatusCode.Should().Be(responseStatusCode);
        }
        private async Task <(ErrorResponse errorResponse, int statusCode)> GetResponseFromContext(ErrorHandlingMiddleware mw)
        {
            var context = new DefaultHttpContext();

            using var memoryStream = new MemoryStream();
            context.Response.Body  = memoryStream;

            await mw.Invoke(context);

            memoryStream.Position = 0;

            using var reader = new StreamReader(memoryStream);
            var content  = reader.ReadToEnd();
            var response = JsonConvert.DeserializeObject <ErrorResponse>(content);

            return(response, context.Response.StatusCode);
        }
        public async void Invoke_ShouldDoNothing_WhenNextThrowsNoExceptions()
        {
            var httpContext  = new Mock <HttpContext>();
            var httpResponse = new Mock <HttpResponse>();

            httpContext.Setup(a => a.Response).Returns(httpResponse.Object);

            RequestDelegate next = (a) =>
            {
                return(Task.Run(() => { }));
            };

            var classUnderTest = new ErrorHandlingMiddleware(next);

            await classUnderTest.Invoke(httpContext.Object);

            VerifyHttpResponse(httpResponse, It.IsAny <string>(), It.IsAny <int>(), Times.Never());
        }
Ejemplo n.º 17
0
        public async Task Return404StatusCodeForNotFoundException()
        {
            // Arrange
            var context = new DefaultHttpContext();

            context.Response.StatusCode = StatusCodes.Status200OK;

            var middleware = new ErrorHandlingMiddleware(innerHttpContext =>
            {
                throw new NotFoundException();
            }, Substitute.For <ILogger <ErrorHandlingMiddleware> >());

            // Act
            await middleware.Invoke(context);

            // Assert
            context.Response.StatusCode.Should().Be(StatusCodes.Status404NotFound);
        }
Ejemplo n.º 18
0
        public async Task TestMiddleware_LoginChallengeException()
        {
            // Arrange
            var logger     = Mock.Of <ILogger <ErrorHandlingMiddleware> >();
            var middleware = new ErrorHandlingMiddleware((innerHttpContext) =>
            {
                throw new LoginChallengeException("login");
            }, logger);

            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            // Act && Assert
            await Assert.ThrowsAsync <LoginChallengeException>(() => {
                return(middleware.Invoke(context));
            });
        }
        private async Task VerifyErrorHandling(Exception exception, string expectedErrorMessage, HttpStatusCode expectedResponseCode, ApiErrorCode expectedApiErrorCode)
        {
            // Arrange
            RequestDelegate next         = (innerHttpContext) => Task.FromException <Exception>(exception);
            var             loggerMock   = new Mock <ILogger <ErrorHandlingMiddleware> >();
            var             contextMock  = new Mock <HttpContext>();
            var             responseMock = new Mock <HttpResponse>();
            var             body         = new MemoryStream();
            int             responseCode = 0;

            loggerMock.Setup(m => m.Log(
                                 LogLevel.Warning,
                                 It.IsAny <EventId>(),
                                 It.Is <FormattedLogValues>(v => v.ToString().Contains(expectedErrorMessage)),
                                 It.IsAny <Exception>(),
                                 It.IsAny <Func <object, Exception, string> >()
                                 ));
            contextMock.SetupGet(x => x.Response).Returns(responseMock.Object);
            responseMock.SetupGet(x => x.Body).Returns(body);
            responseMock.SetupSet(x => x.StatusCode = It.IsAny <int>()).Callback <int>(y => responseCode = y);

            var middleware = new ErrorHandlingMiddleware(next: next, logger: loggerMock.Object);

            // Act
            await middleware.Invoke(contextMock.Object);

            body.Position = 0;
            var serializedResult = Encoding.UTF8.GetString(body.ToArray());

            body.Dispose();

            // Assert
            loggerMock.VerifyAll();
            contextMock.VerifyAll();
            responseMock.VerifyAll();
            Assert.That(responseCode, Is.EqualTo((int)expectedResponseCode));
            Assert.That(serializedResult, Is.Not.Null);
            dynamic      myobject     = JsonConvert.DeserializeObject(serializedResult);
            string       errorMessage = myobject.Error;
            ApiErrorCode apiErrorCode = myobject.ApiErrorCode;

            Assert.That(errorMessage, Is.EqualTo(expectedErrorMessage));
            Assert.That(apiErrorCode, Is.EqualTo(expectedApiErrorCode));
        }
Ejemplo n.º 20
0
        public async void ProperInformationMustBeLoggedWhenNotHandledExceptionIsRaised()
        {
            var context    = new DefaultHttpContext();
            var loggerMock = new Mock <ILogger <ErrorHandlingMiddleware> >();
            var errorHandlingMiddleware = new ErrorHandlingMiddleware(
                next: (innerHttpContext) =>
            {
                throw new Exception("Something bad is happening here!");
            },
                logger: loggerMock.Object);

            await errorHandlingMiddleware.Invoke(context);

            loggerMock.Verify(exp => exp.Log(It.Is <LogLevel>(x => x == LogLevel.Error),
                                             It.IsAny <EventId>(),
                                             It.IsAny <Object>(),
                                             It.Is <Exception>(y => y.Message == "Something bad is happening here!"),
                                             It.IsAny <Func <object, Exception, string> >()));
        }
        public async void Invoke_ShouldAssembleAnErrorResponse_WhenNextThrowsAnException(Exception ex, int statusCode)
        {
            var httpContext  = new Mock <HttpContext>();
            var httpResponse = new Mock <HttpResponse>();

            httpContext.Setup(a => a.Response).Returns(httpResponse.Object);
            httpResponse.Setup(a => a.Body).Returns(new MemoryStream());

            RequestDelegate next = (a) =>
            {
                return(Task.FromException(ex));
            };

            var classUnderTest = new ErrorHandlingMiddleware(next);

            await classUnderTest.Invoke(httpContext.Object);

            VerifyHttpResponse(httpResponse, "application/json", statusCode, Times.Once());
        }
Ejemplo n.º 22
0
        public async Task ErrorHandlingMiddleware_ValidationExceptionRaised_ReturnsBadRquestWithValidationErrors()
        {
            var mockLogger = Substitute.For <ILoggerFactory>();

            // Arrange
            var middleware = new ErrorHandlingMiddleware(next: (innerHttpContext) =>
            {
                throw new ValidationException(
                    new List <ValidationFailure> {
                    new ValidationFailure("Error", "Big error")
                });
            }
                                                         , mockLogger);


            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            //Act
            await middleware.Invoke(context);

            context.Response.Body.Seek(0, SeekOrigin.Begin);

            Dictionary <string, string[]> objResponse;

            using (var reader = new StreamReader(context.Response.Body))
            {
                var streamText = reader.ReadToEnd();
                objResponse = JsonConvert.DeserializeObject <Dictionary <string, string[]> >(streamText);
            }

            //Assert
            var firstError = objResponse.TryGetValue("Error", out string[] errors);

            Assert.That(errors[0], Is.EqualTo("Big error"));
            Assert.That(context.Response.StatusCode, Is.EqualTo((int)HttpStatusCode.BadRequest));
        }
        public async Task ExceptionTests()
        {
            // Arrange
            var statusCode   = 200;
            var contentType  = "";
            var stream       = new MemoryStream();
            var fakeResponse = new Mock <HttpResponse>();

            fakeResponse
            .SetupSet(x => x.StatusCode)
            .Callback(val => statusCode = val);
            fakeResponse
            .SetupSet(x => x.ContentType)
            .Callback(val => contentType = val);
            fakeResponse
            .SetupGet(x => x.BodyPipe)
            .Returns(new StreamPipeWriter(stream));
            fakeResponse
            .SetupGet(x => x.Body)
            .Returns(stream);
            var fakeHttpContext = new Mock <HttpContext>();

            fakeHttpContext
            .SetupGet(x => x.Response)
            .Returns(fakeResponse.Object);
            var handler = new ErrorHandlingMiddleware((ctx =>
            {
                throw new Exception("Test Exception");
            }));

            // Act
            await handler.Invoke(fakeHttpContext.Object);

            // Assert
            Assert.Equal(500, statusCode);
            Assert.Equal("application/json", contentType);
        }
Ejemplo n.º 24
0
        public async Task Invoke_LogsWhenExceptionIsThrown()
        {
            await _middleware.Invoke(new DefaultHttpContext());

            _logger.Verify(o => o.Log(LogLevel.Error, It.IsAny <EventId>(), It.IsAny <object>(), It.IsAny <DivideByZeroException>(), It.IsAny <Func <object, Exception, string> >()));
        }