public void GivenBuilderWhenLevelOfDetailsSetToStandardThenOptionsShouldHaveSameLevelOfDetails() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>().UseStandardMessage().Build(); // Assert Assert.Equal(LevelOfDetails.StandardMessage, result.ErrorLevelOfDetails); }
public void GivenBuilderWhenApplicationBaseExceptionIsSpecifiedThenGlobalExceptionHandlerShouldBeConfigured() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>().UseStandardMessage().Build(); // Assert Assert.Collection(result.RulesForExceptionHandling, t1 => { Assert.Equal(typeof(ApplicationExceptionBase).FullName, t1.TypeFullName); }); }
public void GivenBuilderWhenInvalidCustomErrorMessageOrTypeIsSpecifiedThenThrow(string message, string type) { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act // Assert Assert.Throws <ArgumentException>(() => sut.Handle <ApplicationExceptionBase>() .UseUserErrors() .UseGenericError(message, type) .Build()); }
public void GivenBuilderWhenInvalidIndentBySymbolSpecifiedThenThrow(string invalidSymbol) { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act // Assert Assert.Throws <ArgumentException>(() => sut.Handle <ApplicationExceptionBase>() .UseUserErrors() .IndentMessagesUsing(invalidSymbol) .Build()); }
public void GivenBuilderWhenNoIndentBySpecifiedThenDefaultIndenterShouldBeUsed() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>() .UseStandardMessage() .Build(); // Assert Assert.Equal(" ", result.IndentBy); }
public void GivenBuilderWhenIndentBySymbolSpecifiedThenItShouldBeUsed() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>() .UseUserErrors() .IndentMessagesUsing("*|*") .Build(); // Assert Assert.Equal("*|*", result.IndentBy); }
public AppBootstrapper( IServiceCollection services, IConfiguration configuration) { _services = services ?? throw new ArgumentNullException(nameof(services)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _configurationOptionBuilder = new ConfigurationOptionBuilder(services, _configuration); _errorHandlerBuilder = new GlobalErrorHandlerConfigurationBuilder(services); _errorHandlerBuilder.UseStandardMessage(); _appInfo = _configuration.GetApplicationInfo(); _authOptions = _configuration.GetAuthOptions(); _healthChecksBuilder = _services.AddHealthChecks(); }
public void GivenBuilderWhenNoGenericErrorGivenThenDefaultErrorShouldBeUsed() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>() .UseStandardMessage() .Build(); // Assert Assert.Equal(GenericErrorMessage, result.GenericError.Message); Assert.Equal(typeof(Exception).Name, result.GenericError.ErrorType); Assert.Empty(result.GenericError.ChildErrors); }
public static GlobalErrorHandlerConfigurationBuilder UseDefault( this GlobalErrorHandlerConfigurationBuilder builder) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } builder .AndHandle <ValidationException>() .AndHandle <NotCorrelatedRequestException>() .AndHandle <ApiException>(b => b.UseBuilderForApi(), f => f.ClientError()) .UseGenericError(GenericErrorMessage, GenericErrorType); return(builder); }
public void GivenBuilderWhenGenericErrorIsSpecifiedThenItShouldBeUsed() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>() .UseUserErrors() .UseGenericError("Custom Message", "Custom Error Type") .Build(); // Assert Assert.Equal("Custom Message", result.GenericError.Message); Assert.Equal("Custom Error Type", result.GenericError.ErrorType); Assert.Empty(result.GenericError.ChildErrors); }
public void GivenBuilderWhenExtraExceptionTypesAreSpecifiedThenConfigurationShouldReflectThem() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act var result = sut.Handle <ApplicationExceptionBase>() .AndHandle <ThirdPartyFailureException>() .UseStandardMessage() .Build(); // Assert Assert.Collection(result.RulesForExceptionHandling, t1 => { Assert.Equal(typeof(ApplicationExceptionBase).FullName, t1.TypeFullName); }, t2 => { Assert.Equal(typeof(ThirdPartyFailureException).FullName, t2.TypeFullName); } ); }
public void GivenBuilderWhenCustomErrorMessageFormatterSuppliedThenItShouldBeRegistered() { // Arrange var servicesMock = Substitute.For <IServiceCollection>(); var sut = new GlobalErrorHandlerConfigurationBuilder(servicesMock); // Act sut.Handle <ApplicationExceptionBase>() .UseUserErrors() .FormatMessageUsing <CustomErrorMessageFormatter>() .Build(); // Assert servicesMock.Received(1) .Add( Arg.Is <ServiceDescriptor>( d => d.ServiceType.FullName.Equals(typeof(IErrorMessageFormatter).FullName) && d.ImplementationType.FullName.Equals(typeof(CustomErrorMessageFormatter).FullName) && d.Lifetime.Equals(ServiceLifetime.Transient))); }
public static void AddGlobalExceptionHandler(this IServiceCollection services, Func <IHandleApplicationException, IBuildErrorProviderOptions> configurationBuilder) { if (services == null) { throw new ArgumentNullException(nameof(services)); } if (configurationBuilder == null) { throw new ArgumentNullException(nameof(configurationBuilder)); } var builder = new GlobalErrorHandlerConfigurationBuilder(services); var options = configurationBuilder(builder).Build(); services.AddSingleton(options); services.AddSingleton <IErrorMessageFormatterOptions>(options); services.AddSingleton <IHttpStatusCodeProvider, DefaultHttpStatusCodeProvider>(); services.AddTransient <IErrorProvider, ErrorProvider>(); services.AddTransient <IErrorMessageFormatter, HierarchicalErrorMessageFormatter>(); services.AddTransient <IErrorResponseProvider, ErrorResponseProvider>(); }