public void HandleAsyncWithoutHandlersThrowsException()
        {
            //Arrange
            var response  = new DefaultHttpContext().Response;
            var exception = new ArgumentNullException();
            var sut       = new ExceptionHandlerManager(new IExceptionHandler[] {});

            //Act
            var result = Assert.CatchAsync(async() => await sut.HandleAsync(response, exception));

            //Assert
            result.Should().Be(exception);
        }
        public async Task HandleAsyncCallsHandler()
        {
            //Arrange
            var response = new DefaultHttpContext().Response;
            var handler  = Substitute.For <IExceptionHandler>();

            handler.CanHandle(Arg.Any <Exception>()).Returns(true);
            handler
            .HandleExceptionAsync(Arg.Any <HttpResponse>(), Arg.Any <Exception>())
            .Returns(r => Task.CompletedTask);
            var exception = new ArgumentException();
            var sut       = new ExceptionHandlerManager(new[] { handler });

            //Act
            await sut.HandleAsync(response, exception);

            //Assert
            await handler.Received(1).HandleExceptionAsync(response, exception);
        }
        public void HandleAsyncChecksAllHandlersAndThrowsIfItCannotHandle()
        {
            //Arrange
            var response = new DefaultHttpContext().Response;
            var handler1 = Substitute.For <IExceptionHandler>();

            handler1.CanHandle(Arg.Any <Exception>()).Returns(false);
            var handler2 = Substitute.For <IExceptionHandler>();

            handler2.CanHandle(Arg.Any <Exception>()).Returns(false);
            var exception = new ArgumentNullException();
            var sut       = new ExceptionHandlerManager(new[] { handler1, handler2 });

            //Act
            var result = Assert.CatchAsync(async() => await sut.HandleAsync(response, exception));

            //Assert
            result.Should().Be(exception);
            handler1.Received(1).CanHandle(exception);
            handler2.Received(1).CanHandle(exception);
        }