public void ShouldExtractErrorsFromAggregateExceptionForGivenApplicationException() { // Arrange var options = Substitute.For <IErrorProviderOptions>(); options.IncludeSystemLevelExceptions.Returns(false); options.ExceptionsToHandle.Returns(new List <IExceptionRule> { new ExceptionRuleForErrorProvider <ApplicationExceptionBase>() }); var internalError1 = new OurApplicationException("Internal app error 1"); var internalError2 = new AnotherOurApplicationException("Internal app error 2"); var internalError3 = new Exception("Internal app error 3"); var aggregateException = new AggregateException(new List <Exception> { internalError1, internalError2, internalError3 }); var exception = new OurApplicationException("Our App Error", aggregateException); var sut = new ErrorProvider(); // Act var result = sut.ExtractErrorsFor(exception, options); // Assert Assert.Equal("Our App Error", result.Message); Assert.Equal("OurApplicationException", result.ErrorType); Assert.Collection(result.ChildErrors, t1 => { Assert.Equal("Internal app error 1", t1.Message); Assert.Equal("OurApplicationException", t1.ErrorType); Assert.Empty(t1.ChildErrors); }, t2 => { Assert.Equal("Internal app error 2", t2.Message); Assert.Equal("AnotherOurApplicationException", t2.ErrorType); Assert.Empty(t2.ChildErrors); } ); }
public void GivenExceptionWhenMatchingRuleSuppliedForInternalExceptionThenReturnCustomizedErrorMessage() { // Arrange var ruleMock = Substitute.For <IExceptionRule>(); var options = Substitute.For <IErrorProviderOptions>(); options.IncludeSystemLevelExceptions.Returns(false); options.ExceptionsToHandle.Returns(new List <IExceptionRule> { ruleMock }); ruleMock.CanHandle(Arg.Any <ApplicationExceptionBase>()).Returns(true); ruleMock.GetError(Arg.Any <ApplicationExceptionBase>(), Arg.Any <IEnumerable <Error> >(), false) .Returns(c => { var ex = c.Arg <ApplicationExceptionBase>(); var errors = c.Arg <IEnumerable <Error> >(); return(new Error($"*** {ex.Message} ***", ex.GetType().Name, errors)); }); var sut = new ErrorProvider(); var internalError = new OurApplicationException("Internal app error"); var exception = new AnotherOurApplicationException("Error", internalError); // Act var result = sut.ExtractErrorsFor(exception, options); // Assert Assert.Equal("*** Error ***", result.Message); Assert.Equal("AnotherOurApplicationException", result.ErrorType); Assert.Collection(result.ChildErrors, t1 => { Assert.Equal("*** Internal app error ***", t1.Message); Assert.Equal("OurApplicationException", t1.ErrorType); Assert.Empty(t1.ChildErrors); } ); }
public void ShouldExtractErrorsFromDeepExceptionHierarchies() { // Arrange var options = Substitute.For <IErrorProviderOptions>(); options.IncludeSystemLevelExceptions.Returns(false); options.ExceptionsToHandle.Returns(new List <IExceptionRule> { new ExceptionRuleForErrorProvider <ApplicationExceptionBase>() }); var leafError1 = new OurApplicationException("(Leaf) Internal app error 1"); var leafError2 = new AnotherOurApplicationException("(Leaf) Internal app error 2"); var leafError3 = new Exception("(Leaf) Internal app error 3"); var leafError4 = new AnotherOurApplicationException("(Leaf) Internal app error 4"); var branchError1 = new OurApplicationException("(Branch) app error 1", leafError1); var branchError2 = new OurApplicationException("(Branch) app error 2", leafError2); var branchError3Aggregate = new AggregateException(new List <Exception> { branchError1, branchError2, leafError3, leafError4 }); var rootError = new AnotherOurApplicationException("(Root) app error", branchError3Aggregate); var sut = new ErrorProvider(); // Act var result = sut.ExtractErrorsFor(rootError, options); // Assert Assert.Equal("(Root) app error", result.Message); Assert.Equal("AnotherOurApplicationException", result.ErrorType); Assert.Collection(result.ChildErrors, t1 => { Assert.Equal("(Branch) app error 1", t1.Message); Assert.Equal("OurApplicationException", t1.ErrorType); Assert.Collection(t1.ChildErrors, l1 => { Assert.Equal("(Leaf) Internal app error 1", l1.Message); Assert.Equal("OurApplicationException", l1.ErrorType); Assert.Empty(l1.ChildErrors); }); }, t2 => { Assert.Equal("(Branch) app error 2", t2.Message); Assert.Equal("OurApplicationException", t2.ErrorType); Assert.Collection(t2.ChildErrors, l1 => { Assert.Equal("(Leaf) Internal app error 2", l1.Message); Assert.Equal("AnotherOurApplicationException", l1.ErrorType); Assert.Empty(l1.ChildErrors); }); }, t3 => { Assert.Equal("(Leaf) Internal app error 4", t3.Message); Assert.Equal("AnotherOurApplicationException", t3.ErrorType); Assert.Empty(t3.ChildErrors); } ); }