public void GetFilters_FiltersAddedByFilterProviders_AreNeverCached(bool reusable) { // Arrange var customFilterProvider = new TestFilterProvider( providerExecuting: (providerContext) => { var filter = new TestFilter(providerContext.ActionContext.HttpContext.Items["name"] as string); providerContext.Results.Add( new FilterItem(new FilterDescriptor(filter, FilterScope.Global), filter) { IsReusable = reusable }); }, providerExecuted: null); var staticFilter = new TestFilter(); var controllerContext = CreateControllerContext(new[] { new FilterDescriptor(new TestFilterFactory() { IsReusable = false }, FilterScope.Action), new FilterDescriptor(staticFilter, FilterScope.Action), }); var controllerActionInvokerCache = CreateControllerActionInvokerCache( controllerContext, new IFilterProvider[] { new DefaultFilterProvider(), customFilterProvider }); var filterDescriptors = controllerContext.ActionDescriptor.FilterDescriptors; // Act - 1 controllerContext.HttpContext.Items["name"] = "foo"; var filters = controllerActionInvokerCache.GetState(controllerContext).Filters; // Assert - 1 Assert.Equal(3, filters.Length); var request1Filter1 = Assert.IsType <TestFilter>(filters[0]); // Created by factory Assert.Same(staticFilter, filters[1]); // Cached and the same statically created filter instance var request1Filter3 = Assert.IsType <TestFilter>(filters[2]); // Created by custom filter provider Assert.Equal("foo", request1Filter3.Data); // Act - 2 controllerContext.HttpContext.Items["name"] = "bar"; filters = controllerActionInvokerCache.GetState(controllerContext).Filters; // Assert -2 Assert.Equal(3, filters.Length); var request2Filter1 = Assert.IsType <TestFilter>(filters[0]); Assert.NotSame(request1Filter1, request2Filter1); // Created by factory Assert.Same(staticFilter, filters[1]); // Cached and the same statically created filter instance var request2Filter3 = Assert.IsType <TestFilter>(filters[2]); Assert.NotSame(request1Filter3, request2Filter3); // Created by custom filter provider again Assert.Equal("bar", request2Filter3.Data); }
public void GetServices_PrependsServiceInDependencyInjectionContainer() { IFilterProvider filterProvider = new TestFilterProvider(); this.WrapTest( services => services.TryAddSingleton <IFilterProvider>(instance: filterProvider), //,TestFilterProvider>(), // or transient but have its factory return the same instance? hmm this.GetServices_PrependsServiceInDependencyInjectionContainer_Impl, filterProvider ); }
public void GetAllFilters_ReturnsNoFilters_IfAllFiltersAreRemoved() { // Arrange var filterProvider = new TestFilterProvider( context => context.Results.Clear(), content => { }); var filter = new FilterDescriptor(new TypeFilterAttribute(typeof(object)), FilterScope.Global); var actionContext = CreateActionContext(new[] { filter }); // Act var filterResult = FilterFactory.GetAllFilters( new[] { filterProvider }, actionContext); // Assert Assert.Collection(filterResult.CacheableFilters, f => { Assert.Null(f.Filter); Assert.False(f.IsReusable); }); Assert.Empty(filterResult.Filters); }