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 ExceptionMiddleware_Capture_ForeignKey_Reference_Sql_Exception()
        {
            // Arrange
            var defaultContext = new DefaultHttpContext();

            defaultContext.Response.Body = new MemoryStream();
            var loggerMock = new Mock <ILogger <ExceptionMiddleware> >();

            // Act
            var middlewareInstance = new ExceptionMiddleware(next: (innerHttpContext) =>
            {
                throw MakeSqlException(547);
            }, logger: loggerMock.Object);

            await middlewareInstance.InvokeAsync(defaultContext);

            // Assert
            defaultContext.Response.Body.Seek(0, SeekOrigin.Begin);
            var body = new StreamReader(defaultContext.Response.Body).ReadToEnd();

            body.Should().Contain("409");
            body.Should().Contain("This item cannot be deleted.");
            body.Should().Contain("errorCode");
            body.Should().Contain("errorType");
            body.Should().Contain("errorMessage");
            body.Should().Contain("errorDate");
        }
        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));
        }
Exemple #4
0
        public async Task InvokeAsync_ValidationExceptionThrownInsideMiddleware_ContextResponseModifiedAsync()
        {
            //arrange
            string expectedOutput = "{\"Message\":\"Bad Request\"}";
            var    middleWare     = new ExceptionMiddleware(next: async(innerHttpContext) =>
            {
                await Task.Run(() =>
                {
                    throw new ValidationException("Bad Request");
                });
            }, loggerFactory);
            var context = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            //act
            await middleWare.InvokeAsync(context);

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

            Assert.Equal(expectedOutput, body);
        }
            public async Task GivenRequestThrowsCustomExceptionWithoutUSerMessage_SetsErrorResponse()
            {
                // Arrange
                var exception = new DiagnoseaTestException(ExceptionCode.EntityNotFound, "TM");

                Task CurrentRequest(HttpContext c) => throw exception;

                var classUnderTest = new ExceptionMiddleware(CurrentRequest, _exceptionMapping);
                var context        = GetDefaultHttpContext();

                // Act
                await classUnderTest.InvokeAsync(context);

                // Assert
                var message = await GetExceptionResponse(context);

                Assert.Multiple(() =>
                {
                    var statusCode = _exceptionMapping[typeof(DiagnoseaTestException)];
                    Assert.That(context.Response.StatusCode, Is.EqualTo((int)statusCode));

                    Assert.That(message.ExceptionCode, Is.EqualTo(exception.ExceptionCode));
                    Assert.That(message.TechnicalMessage, Is.EqualTo(exception.TechnicalMessage));
                    Assert.That(message.UserMessage, Is.Null);
                });
            }
        public async Task ExceptionMiddleware_Capture_Any_Exception()
        {
            // Arrange
            var defaultContext = new DefaultHttpContext();

            defaultContext.Response.Body = new MemoryStream();
            var loggerMock = new Mock <ILogger <ExceptionMiddleware> >();

            // Act
            var middlewareInstance = new ExceptionMiddleware(next: (innerHttpContext) =>
            {
                throw new Exception("Server Error");
            }, logger: loggerMock.Object);

            await middlewareInstance.InvokeAsync(defaultContext);

            // Assert
            defaultContext.Response.Body.Seek(0, SeekOrigin.Begin);
            var body = new StreamReader(defaultContext.Response.Body).ReadToEnd();

            body.Should().Contain("500");
            body.Should().Contain("Server Error");
            body.Should().Contain("errorCode");
            body.Should().Contain("errorType");
            body.Should().Contain("errorMessage");
            body.Should().Contain("errorDate");
        }
        private static List <HttpMiddleware> GetMiddlewares(
            HttpMiddleware functionMiddleware,
            IServerlessLogger serverlessLogger,
            IHttpContextAccessor acessor,
            bool allowAnonymous)
        {
            var exceptionMiddleware = new ExceptionMiddleware(serverlessLogger);
            var loggerMiddleware    = new LoggerMiddleware(serverlessLogger);
            var headerMiddleware    = new HeaderMiddleware();

            List <HttpMiddleware> middlewares = null;

            if (allowAnonymous)
            {
                middlewares = MiddlewaresWithoutAuth(
                    functionMiddleware,
                    exceptionMiddleware,
                    loggerMiddleware,
                    headerMiddleware);
            }
            else
            {
                middlewares = MiddlewaresWithAuth(
                    functionMiddleware,
                    serverlessLogger,
                    acessor,
                    exceptionMiddleware,
                    loggerMiddleware,
                    headerMiddleware);
            }

            return(middlewares);
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            var routeBuilder = new RouteBuilder(app);

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
            // specifying the Swagger JSON endpoint.
            app.UseSwaggerUI(c =>
            {
                c.DocExpansion(DocExpansion.None);
                c.RoutePrefix = string.Empty;
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Todo V1.0");
            });
            // Serialize all exceptions to JSON
            var jsonExceptionMiddleware = new ExceptionMiddleware(app.ApplicationServices.GetRequiredService <IHostingEnvironment>());

            app.UseExceptionHandler(new ExceptionHandlerOptions {
                ExceptionHandler = jsonExceptionMiddleware.Invoke
            });
            app.UseAuthentication();
            app.UseMvc();
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
            // specifying the Swagger JSON endpoint.
            app.UseSwaggerUI(c =>
            {
                c.RoutePrefix = string.Empty;
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Voting Application");
            });
            // Serialize all exceptions to JSON
            var jsonExceptionMiddleware = new ExceptionMiddleware(app.ApplicationServices.GetRequiredService <Microsoft.AspNetCore.Hosting.IHostingEnvironment>());

            app.UseExceptionHandler(new ExceptionHandlerOptions {
                ExceptionHandler = jsonExceptionMiddleware.Invoke
            });
            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
        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);
        }
Exemple #11
0
 public void OneTimeSetup()
 {
     requestDelegateMock            = new Mock <RequestDelegate>();
     useCaseExceptionCodeMapperMock = new Mock <IUseCaseExceptionCodeMapper>();
     loggerMock           = new Mock <ILogger <ExceptionMiddleware> >();
     _exceptionMiddleware = new ExceptionMiddleware(requestDelegateMock.Object,
                                                    useCaseExceptionCodeMapperMock.Object, loggerMock.Object);
 }
Exemple #12
0
 private void Setup()
 {
     _requestDelegateMock      = new Mock <DelegateMock>();
     _loggerMock               = new Mock <ILoggerManager>(MockBehavior.Strict);
     _exceptionMiddleware      = new ExceptionMiddleware(_requestDelegateMock.Object.RequestDelegate, _loggerMock.Object);
     _httpContext              = new DefaultHttpContext();
     _httpContext.Request.Path = _url;
     ConfigureLoggerMock();
 }
        public async Task TestNoExceptionWithoutSentry()
        {
            var middleware = new ExceptionMiddleware(_loggerFactory, null);
            var context    = new DefaultHttpContext();

            await middleware.InvokeAsync(context, (ctx) =>
            {
                throw new Exception();
            });
        }
        public async Task Should_Invoke_Delegate()
        {
            RequestDelegateMock
            .Setup(x => x.RequestDelegate(It.IsAny <HttpContext>()))
            .Returns(Task.FromResult(0));
            ExceptionMiddleware = new ExceptionMiddleware(RequestDelegateMock.Object.RequestDelegate);
            await ExceptionMiddleware.InvokeAsync(new DefaultHttpContext());

            RequestDelegateMock.Verify(x => x.RequestDelegate(It.IsAny <HttpContext>()), Times.Once);
        }
        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));
        }
Exemple #16
0
        public async Task InvokeAsync_NextThrowException_ReturnsStatusCode500([Frozen] RequestDelegate next,
                                                                              HttpContext context,
                                                                              ExceptionMiddleware sut)
        {
            next.WhenForAnyArgs(x => x(Arg.Any <HttpContext>())).Throw(new Exception());
            Func <Task> func = async() => await sut.InvokeAsync(context).ConfigureAwait(false);

            await func.Should().NotThrowAsync().ConfigureAwait(false);

            context.Response.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError);
        }
        public async Task InvokeAsync_SuccessScenario_Test()
        {
            var middleware = new ExceptionMiddleware(_next.Object);

            _httpContext.Response.Body = new MemoryStream(); //set body as stream

            await middleware.InvokeAsync(_httpContext);      // invoking the middleware fills up the stream

            Assert.Equal(_httpContext.Response.StatusCode, StatusCodes.Status200OK);
            Assert.Null(ReadContextResponse());
        }
Exemple #18
0
 public ExceptionMiddlewareTests()
 {
     _logger     = new Mock <ILoggerManager>();
     _middleware = new ExceptionMiddleware(
         next: (innerHttpContext) =>
     {
         return(Task.CompletedTask);
     },
         _logger.Object
         );
 }
        public async Task Should_return_bad_request_message()
        {
            RequestDelegateMock
            .Setup(x => x.RequestDelegate(It.IsAny <HttpContext>()))
            .Returns(Task.FromException(new BadRequestException("Error")));
            ExceptionMiddleware = new ExceptionMiddleware(RequestDelegateMock.Object.RequestDelegate);


            await ExceptionMiddleware.InvokeAsync(HttpContext);

            Assert.AreEqual((int)HttpStatusCode.BadRequest, HttpContext.Response.StatusCode);
        }
        public async Task Should_return_exception_message()
        {
            RequestDelegateMock
            .Setup(x => x.RequestDelegate(It.IsAny <HttpContext>()))
            .Returns(Task.FromException(new Exception()));
            ExceptionMiddleware = new ExceptionMiddleware(RequestDelegateMock.Object.RequestDelegate);

            await ExceptionMiddleware.InvokeAsync(HttpContext);

            Assert.AreEqual("application/json", HttpContext.Response.ContentType);
            Assert.AreEqual((int)HttpStatusCode.InternalServerError, HttpContext.Response.StatusCode);
        }
        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();
        }
Exemple #23
0
        public async Task ExceptionRequestTest(string errorText, HttpStatusCode statusCode, Type exceptionType)
        {
            var connection = Substitute.For <IConnection>();
            var request    = Substitute.For <IWebApiRequest>();
            var context    = new MiddlewareContext(connection, request);
            var response   = Substitute.For <IWebApiResponse>();

            response.Content.Returns($"{{\"text\":\"{errorText}\"}}");
            response.StatusCode.Returns(statusCode);

            var middleware = new ExceptionMiddleware();
            var exception  = (UnexpectedStatusException <ErrorObject>) await Assert.ThrowsAsync(exceptionType,
                                                                                                () => middleware.OnRequestAsync(context, (c, t) => Task.FromResult(response)));

            Assert.Equal(errorText, exception.Response?.Content.Text);
        }
Exemple #24
0
        /// <summary>
        /// This method will be invoked when exception occurs.
        /// </summary>
        /// <param name="context">Contains all informations about request that has been made.</param>
        public override void OnException(ExceptionContext context)
        {
            // Creating view-model that will be used in Error view.
            Error err = ExceptionMiddleware.HandleException(context.Exception);

            // Indicates that thrown exception is handled.
            context.ExceptionHandled = true;

            context.Result = new ViewResult()
            {
                ViewName = "Error",
                ViewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                {
                    Model = err
                }
            };
        }
Exemple #25
0
        public async Task UnexpectedStatusExceptionRequestTest()
        {
            const string MESSAGE = "{\"error\":\"Some nice error message\"}";

            var connection = Substitute.For <IConnection>();
            var request    = Substitute.For <IWebApiRequest>();
            var context    = new MiddlewareContext(connection, request);
            var response   = Substitute.For <IWebApiResponse>();

            response.Content.Returns(MESSAGE);
            response.StatusCode.Returns((HttpStatusCode)499);

            var middleware = new ExceptionMiddleware();
            var exception  = await Assert.ThrowsAsync <UnexpectedStatusException>(() => middleware.OnRequestAsync(context, (c, t) => Task.FromResult(response)));

            Assert.Equal(MESSAGE, exception.Response?.Content);
        }
Exemple #26
0
        public async Task ExceptionNoJsonRequestTest()
        {
            const string BODY = "<html><body>This is not JSON</body></html>";

            var connection = Substitute.For <IConnection>();
            var request    = Substitute.For <IWebApiRequest>();
            var context    = new MiddlewareContext(connection, request);
            var response   = Substitute.For <IWebApiResponse>();

            response.Content.Returns(BODY);
            response.StatusCode.Returns(HttpStatusCode.InternalServerError);

            var middleware = new ExceptionMiddleware();
            var exception  = await Assert.ThrowsAsync <UnexpectedStatusException>(() => middleware.OnRequestAsync(context, (c, t) => Task.FromResult(response)));

            Assert.Equal(BODY, exception.Response?.Content);
        }
        public async Task TestUnkownReplacement()
        {
            var middleware = new ExceptionMiddleware(_loggerFactory, null);
            var context    = new DefaultHttpContext();

            context.Response.Body = new MemoryStream();

            await middleware.InvokeAsync(context, (ctx) => throw new Exception());

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

            var reader    = new StreamReader(context.Response.Body);
            var body      = reader.ReadToEnd();
            var exception = JsonConvert.DeserializeObject <CrpcException>(body);

            Assert.Equal(CrpcCodes.Unknown, exception.Message);
            Assert.Equal((int)HttpStatusCode.InternalServerError, context.Response.StatusCode);
        }
        public async Task TestGenericCrpcException()
        {
            var middleware      = new ExceptionMiddleware(_loggerFactory, null);
            var context         = new DefaultHttpContext();
            var thrownException = new CrpcException(CrpcCodes.ValidationFailed);

            context.Response.Body = new MemoryStream();

            await middleware.InvokeAsync(context, (ctx) => throw thrownException);

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

            var reader    = new StreamReader(context.Response.Body);
            var body      = reader.ReadToEnd();
            var exception = JsonConvert.DeserializeObject <CrpcException>(body);

            Assert.Equal(CrpcCodes.ValidationFailed, exception.Message);
            Assert.Equal(thrownException.StatusCode(), (int)context.Response.StatusCode);
        }
        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);
        }