public void Should_Log_And_Redirect_To_The_Error_Page_When_There_Is_An_Exception()
        {
            var exceptionContext = Substitute.For<ExceptionContext>();
            var logger = Substitute.For<ILogger>();
            var exception = new Exception("something bad happened!!");

            exceptionContext.Exception.Returns(exception);

            var exceptionHandlerFilter = new ExceptionHandlerFilter(logger);

            exceptionHandlerFilter.OnException(exceptionContext);

            exceptionContext.ExceptionHandled.ShouldBeTrue();
            ((RedirectResult)exceptionContext.Result).Url.ShouldEqual("/Error.htm");
            logger.Received().LogException(exception);
        }
        public void Should_Log_And_Redirect_To_The_Error_Page_When_There_Is_An_Exception_With_An_Action_Result()
        {
            var exceptionContext = new ExceptionContext();
            var logger = Substitute.For<ILogger>();
            var exception = new Exception("something bad happened!!");

            // GRIPE: You cannot mock these properties
            exceptionContext.Result = new ViewResult();
            exceptionContext.Exception = exception;
            exceptionContext.Controller = new DummyController();
            exceptionContext.RouteData = new RouteData();
            exceptionContext.RouteData.Values["action"] = "viewaction";

            var exceptionHandlerFilter = new ExceptionHandlerFilter(logger);

            exceptionHandlerFilter.OnException(exceptionContext);

            exceptionContext.ExceptionHandled.ShouldBeTrue();
            ((RedirectResult)exceptionContext.Result).Url.ShouldEqual("/Error.htm");
            logger.Received().LogException(exception);
        }
        public void Should_Not_Log_And_Only_Set_Status_To_400_With_An_Json_Result_And_Validation_Exception()
        {
            var exceptionContext = new ExceptionContext();
            var logger = Substitute.For<ILogger>();
            var exception = new ValidationException("why u enter bad data??");

            exceptionContext.HttpContext = Substitute.For<HttpContextBase>();
            exceptionContext.Result = new JsonResult();
            exceptionContext.Exception = exception;
            exceptionContext.Controller = new DummyController();
            exceptionContext.RouteData = new RouteData();
            exceptionContext.RouteData.Values["action"] = "jsonaction";

            var exceptionHandlerFilter = new ExceptionHandlerFilter(logger);

            exceptionHandlerFilter.OnException(exceptionContext);

            exceptionContext.HttpContext.Response.StatusCode.ShouldEqual(400);
            exceptionContext.HttpContext.Response.StatusDescription.ShouldEqual(exception.Message);
            exceptionContext.ExceptionHandled.ShouldBeTrue();
            logger.DidNotReceiveWithAnyArgs().LogException(null);
        }
        public void Should_Log_And_Set_Status_To_500_With_An_Json_Result_An_Unhandled_Exception()
        {
            var exceptionContext = new ExceptionContext();
            var logger = Substitute.For<ILogger>();
            var exception = new Exception("something bad happened!!");

            exceptionContext.HttpContext = Substitute.For<HttpContextBase>();
            exceptionContext.Result = new JsonResult();
            exceptionContext.Exception = exception;
            exceptionContext.Controller = new DummyController();
            exceptionContext.RouteData = new RouteData();
            exceptionContext.RouteData.Values["action"] = "jsonaction";

            var exceptionHandlerFilter = new ExceptionHandlerFilter(logger);

            exceptionHandlerFilter.OnException(exceptionContext);

            exceptionContext.HttpContext.Response.StatusCode.ShouldEqual(500);
            exceptionContext.HttpContext.Response.StatusDescription.ShouldEqual("A system error has occured.");
            exceptionContext.ExceptionHandled.ShouldBeTrue();
            logger.Received().LogException(exception);
        }
        public void Should_Not_Log_And_Only_Set_Status_To_401_With_An_Json_Result_And_Authorization_Exception()
        {
            var exceptionContext = new ExceptionContext();
            var logger = Substitute.For<ILogger>();

            exceptionContext.HttpContext = Substitute.For<HttpContextBase>();
            exceptionContext.Result = new JsonResult();
            exceptionContext.Exception = new AuthorizationException();
            exceptionContext.Controller = new DummyController();
            exceptionContext.RouteData = new RouteData();
            exceptionContext.RouteData.Values["action"] = "jsonaction";

            var exceptionHandlerFilter = new ExceptionHandlerFilter(logger);

            exceptionHandlerFilter.OnException(exceptionContext);

            exceptionContext.HttpContext.Response.StatusCode.ShouldEqual(401);
            exceptionContext.HttpContext.Response.StatusDescription.ShouldEqual("You are not authorized to perform this action.");
            exceptionContext.ExceptionHandled.ShouldBeTrue();
            logger.DidNotReceiveWithAnyArgs().LogException(null);
        }