public void InvokeThrowsExceptionWithNullContextTest()
        {
            RequestDelegate next     = delegate { return(Task.CompletedTask); };
            var             logger   = _output.BuildLoggerFor <OversizeDataExceptionMiddleware>();
            var             executor = Substitute.For <IResultExecutor>();
            var             config   = Model.Create <PhotoConfig>();

            var sut = new OversizeDataExceptionMiddleware(next, logger, executor, config);

            Func <Task> action = async() => await sut.Invoke(null).ConfigureAwait(false);

            action.Should().Throw <ArgumentNullException>();
        }
        public async Task InvokeDoesNotRunExecutorWhenDelegateIsSuccessfulTest()
        {
            RequestDelegate next     = delegate { return(Task.CompletedTask); };
            var             logger   = _output.BuildLoggerFor <OversizeDataExceptionMiddleware>();
            var             executor = Substitute.For <IResultExecutor>();
            var             context  = Substitute.For <HttpContext>();
            var             config   = Model.Create <PhotoConfig>();

            var sut = new OversizeDataExceptionMiddleware(next, logger, executor, config);

            await sut.Invoke(context).ConfigureAwait(false);

            await executor.DidNotReceive().Execute(Arg.Any <HttpContext>(), Arg.Any <ObjectResult>())
            .ConfigureAwait(false);
        }
        public void InvokeThrowsExceptionWhenDelegateThrowsOtherExceptionTest()
        {
            RequestDelegate next     = delegate { throw new InvalidOperationException(); };
            var             logger   = _output.BuildLoggerFor <OversizeDataExceptionMiddleware>();
            var             executor = Substitute.For <IResultExecutor>();
            var             context  = Substitute.For <HttpContext>();
            var             config   = Model.Create <PhotoConfig>();
            var             response = Substitute.For <HttpResponse>();

            context.Response.Returns(response);
            response.HasStarted.Returns(true);

            var sut = new OversizeDataExceptionMiddleware(next, logger, executor, config);

            Func <Task> action = async() => await sut.Invoke(context).ConfigureAwait(false);

            action.Should().Throw <InvalidOperationException>();
        }
        public async Task InvokeSendsBadRequestToExecutorWhenDelegateThrowsInvalidDataExceptionTest()
        {
            var config = Model.Create <PhotoConfig>();

            var expectedMessage = string.Format(CultureInfo.InvariantCulture,
                                                "Multipart body length limit {0} exceeded", config.MaxLength);

            RequestDelegate next     = delegate { throw new InvalidDataException(expectedMessage); };
            var             logger   = _output.BuildLoggerFor <OversizeDataExceptionMiddleware>();
            var             executor = Substitute.For <IResultExecutor>();
            var             context  = Substitute.For <HttpContext>();

            var sut = new OversizeDataExceptionMiddleware(next, logger, executor, config);

            await sut.Invoke(context).ConfigureAwait(false);

            await executor.Received().Execute(
                context,
                Arg.Is <ObjectResult>(x => x.StatusCode == (int)HttpStatusCode.BadRequest))
            .ConfigureAwait(false);
        }