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);
        }
示例#2
0
        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
                );
        }
示例#3
0
        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);
        }