public void should_not_do_anything_if_there_is_not_an_exception()
        {
            var outputWriter = Substitute.For<IOutputWriter>();
            var innerBehavior = Substitute.For<IActionBehavior>();
            var logger = Substitute.For<ILogger>();
            var webServer = Substitute.For<IWebServer>();

            var exceptionHandlerBehavior = new AjaxExceptionHandlerBehavior(innerBehavior, outputWriter, logger, webServer);

            exceptionHandlerBehavior.Invoke();

            innerBehavior.Received().Invoke();
            webServer.DidNotReceiveWithAnyArgs().IgnoreErrorStatus = true;
            outputWriter.DidNotReceiveWithAnyArgs().WriteResponseCode(0);
            outputWriter.DidNotReceiveWithAnyArgs().WriteResponseCode(HttpStatusCode.OK);
            logger.DidNotReceiveWithAnyArgs().Write(null);
        }
        public void should_not_log_and_set_status_to_403_when_there_is_an_authorization_exception()
        {
            var outputWriter = Substitute.For<IOutputWriter>();
            var innerBehavior = Substitute.For<IActionBehavior>();
            var logger = Substitute.For<ILogger>();
            var webServer = Substitute.For<IWebServer>();

            innerBehavior.When(x => x.Invoke()).Do(x => { throw new AuthorizationException(); });

            var exceptionHandlerBehavior = new AjaxExceptionHandlerBehavior(innerBehavior, outputWriter, logger, webServer);

            exceptionHandlerBehavior.Invoke();

            webServer.Received().IgnoreErrorStatus = true;
            innerBehavior.Received().Invoke();
            outputWriter.Received().WriteResponseCode(HttpStatusCode.Forbidden, "You are not authorized to perform this action.");
            logger.DidNotReceiveWithAnyArgs().Write(null);
        }
        public void should_log_and_set_status_to_500_when_there_is_an_unhandled_exception()
        {
            var outputWriter = Substitute.For<IOutputWriter>();
            var innerBehavior = Substitute.For<IActionBehavior>();
            var logger = Substitute.For<ILogger>();
            var webServer = Substitute.For<IWebServer>();
            var exception = new Exception("bad things happening");

            innerBehavior.When(x => x.Invoke()).Do(x => { throw exception; });

            var exceptionHandlerBehavior = new AjaxExceptionHandlerBehavior(innerBehavior, outputWriter, logger, webServer);

            exceptionHandlerBehavior.Invoke();

            webServer.Received().IgnoreErrorStatus = true;
            innerBehavior.Received().Invoke();
            outputWriter.Received().WriteResponseCode(HttpStatusCode.InternalServerError, "A system error has occured.");
            logger.Received().Write(exception);
        }