public async Task FiltersDefinitionWasChanged_Should_Rebuild_Delegates() { // Act var services = new ServiceCollection(); services.AddOptions <MariCommandsOptions>(); services.Configure <MariCommandsOptions>(options => { options.Filters.Add(typeof(TestExceptionFilter)); }); services.AddSingleton <SingletonDependency>(); services.AddSingleton <ExceptionFilterFactory>(); var provider = services.BuildServiceProvider(true); var scopeFactory = provider.GetRequiredService <IServiceScopeFactory>(); var exceptionFilterFactory = provider.GetRequiredService <ExceptionFilterFactory>(); await using var context = new CommandContext { ServiceScopeFactory = scopeFactory, }; var edi = ExceptionDispatchInfo.Capture(new Exception()); var exceptionContext = new CommandExceptionContext(context, edi); var singletonDependency = provider.GetRequiredService <SingletonDependency>(); // Arrange + Assert var exceptionDelegate = exceptionFilterFactory.GetFiltersDelegate(); Assert.NotNull(exceptionDelegate); await exceptionDelegate(exceptionContext); Assert.True(singletonDependency.Invoked); singletonDependency.Invoked = false; var filters = Array.Empty <ICommandFilter>(); exceptionFilterFactory.FiltersDefinitionWasChanged(filters); exceptionDelegate = exceptionFilterFactory.GetFiltersDelegate(); await exceptionDelegate(exceptionContext); Assert.False(singletonDependency.Invoked); }
public async Task InvokeFiltersAsync_Should_Invoke_ExceptionFilterFactory_Builded_Delegate() { // Act var services = new ServiceCollection(); services.AddOptions <MariCommandsOptions>(); services.Configure <MariCommandsOptions>(options => { options.Filters.Add(typeof(TestExceptionFilter)); }); services.AddFilterFactory <ExceptionFilterFactory, ICommandExceptionFilter, CommandExceptionDelegate>(); services.AddSingleton <SingletonDependency>(); services.AddSingleton <FilterProvider>(); var provider = services.BuildServiceProvider(true); var scopeFactory = provider.GetRequiredService <IServiceScopeFactory>(); var filterProvider = provider.GetRequiredService <FilterProvider>(); await using var context = new CommandContext { ServiceScopeFactory = scopeFactory, }; var edi = ExceptionDispatchInfo.Capture(new Exception()); var exceptionContext = new CommandExceptionContext(context, edi); var singletonDependency = provider.GetRequiredService <SingletonDependency>(); // Arrange + Assert await filterProvider.InvokeFiltersAsync <CommandExceptionContext, ICommandExceptionFilter>(exceptionContext); Assert.True(singletonDependency.Invoked); }
public Task InvokeAsync(CommandExceptionContext context, CommandExceptionDelegate next) { _singletonDependency.Invoked = true; return(next(context)); }