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);
        }
Example #7
0
        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);
        }
Example #9
0
        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>();
        }