Пример #1
0
    public void CreateFactory_ProducesDelegateThatSetsPagePath()
    {
        // Arrange
        var relativePath = "/file-exists";
        var descriptor   = new CompiledViewDescriptor
        {
            RelativePath     = relativePath,
            Item             = TestRazorCompiledItem.CreateForView(typeof(TestRazorPage), relativePath),
            ExpirationTokens = Array.Empty <IChangeToken>(),
        };
        var viewCompiler = new Mock <IViewCompiler>();

        viewCompiler
        .Setup(f => f.CompileAsync(It.IsAny <string>()))
        .ReturnsAsync(descriptor);

        var factoryProvider = new DefaultRazorPageFactoryProvider(GetCompilerProvider(viewCompiler.Object));

        // Act
        var result = factoryProvider.CreateFactory(relativePath);

        // Assert
        Assert.True(result.Success);
        var actual = result.RazorPageFactory();

        Assert.Equal("/file-exists", actual.Path);
    }
Пример #2
0
    public void CreateFactory_ReturnsViewDescriptor_ForSuccessfulResults()
    {
        // Arrange
        var relativePath     = "/file-exists";
        var expirationTokens = new[]
        {
            Mock.Of <IChangeToken>(),
            Mock.Of <IChangeToken>(),
        };
        var descriptor = new CompiledViewDescriptor
        {
            RelativePath     = relativePath,
            Item             = TestRazorCompiledItem.CreateForView(typeof(TestRazorPage), relativePath),
            ExpirationTokens = expirationTokens,
        };
        var compilerCache = new Mock <IViewCompiler>();

        compilerCache
        .Setup(f => f.CompileAsync(It.IsAny <string>()))
        .ReturnsAsync(descriptor);

        var factoryProvider = new DefaultRazorPageFactoryProvider(GetCompilerProvider(compilerCache.Object));

        // Act
        var result = factoryProvider.CreateFactory(relativePath);

        // Assert
        Assert.True(result.Success);
        Assert.Equal(expirationTokens, descriptor.ExpirationTokens);
    }
Пример #3
0
        public void PopulateFeature_PrefersViewsFromPartsWithHigherPrecedence()
        {
            // Arrange
            var part1 = new AssemblyPart(typeof(ViewsFeatureProvider).Assembly);
            var item1 = new TestRazorCompiledItem(typeof(StringBuilder), "mvc.1.0.view", "/Areas/Admin/Views/Shared/_Layout.cshtml", new object[] { });

            var part2 = new AssemblyPart(GetType().Assembly);
            var item2 = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Areas/Admin/Views/Shared/_Layout.cshtml", new object[] { });
            var item3 = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Areas/Admin/Views/Shared/_Partial.cshtml", new object[] { });

            var items = new Dictionary <AssemblyPart, IReadOnlyList <RazorCompiledItem> >
            {
                { part1, new[] { item1 } },
                { part2, new[] { item2, item3, } },
            };

            var featureProvider = new TestableViewsFeatureProvider(items, attributes: new Dictionary <AssemblyPart, IEnumerable <RazorViewAttribute> >());
            var partManager     = new ApplicationPartManager();

            partManager.ApplicationParts.Add(part1);
            partManager.ApplicationParts.Add(part2);
            partManager.FeatureProviders.Add(featureProvider);
            var feature = new ViewsFeature();

            // Act
            partManager.PopulateFeature(feature);

            // Assert
            Assert.Collection(feature.ViewDescriptors.OrderBy(f => f.RelativePath, StringComparer.Ordinal),
                              view => Assert.Same(item1, view.Item),
                              view => Assert.Same(item3, view.Item));
        }
    public void GetRouteTemplate_ReturnsNull_IfAttributeDoesNotExist()
    {
        // Arrange
        var descriptor = new CompiledViewDescriptor(TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml"));

        // Act
        var result = CompiledPageRouteModelProvider.GetRouteTemplate(descriptor);

        // Assert
        Assert.Null(result);
    }
Пример #5
0
    public void IsItemValid_NoChecksumAttributes_ReturnsTrue()
    {
        // Arrange
        var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[] { });

        // Act
        var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);

        // Assert
        Assert.True(result);
    }
Пример #6
0
    public void IsRecompilationSupported_NoChecksumAttributes_ReturnsFalse()
    {
        // Arrange
        var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[] { });

        // Act
        var result = ChecksumValidator.IsRecompilationSupported(item);

        // Assert
        Assert.False(result);
    }
    public void OnProvidersExecuting_AddsModelsForCompiledViews()
    {
        // Arrange
        var items = new[]
        {
            TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Pages/Home.cshtml", metadata: new[]
            {
                new RazorCompiledItemMetadataAttribute("RouteTemplate", "some-prefix"),
            }),
        };

        var provider = CreateProvider(items);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Pages/About.cshtml", result.RelativePath);
            Assert.Equal("/About", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("About", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/About", kvp.Value);
            });
        },
            result =>
        {
            Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
            Assert.Equal("/Home", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Home/some-prefix", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Home", kvp.Value);
            });
        });
    }
Пример #8
0
    public void IsRecompilationSupported_NoPrimaryChecksumAttribute_ReturnsFalse()
    {
        // Arrange
        var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
        {
            new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
        });

        // Act
        var result = ChecksumValidator.IsRecompilationSupported(item);

        // Assert
        Assert.False(result);
    }
Пример #9
0
        private static IViewCompilerProvider GetCompilerProvider()
        {
            var compiledItem = TestRazorCompiledItem.CreateForView(typeof(object), "/Views/Index.cshtml");
            var descriptor   = new CompiledViewDescriptor(compiledItem);
            var compiler     = new Mock <IViewCompiler>();

            compiler.Setup(c => c.CompileAsync(It.IsAny <string>()))
            .ReturnsAsync(descriptor);
            var compilerProvider = new Mock <IViewCompilerProvider>();

            compilerProvider.Setup(p => p.GetCompiler())
            .Returns(compiler.Object);
            return(compilerProvider.Object);
        }
    public void OnProvidersExecuting_AllowsRazorFilesWithUnderscorePrefix()
    {
        // Arrange
        var items = new[]
        {
            TestRazorCompiledItem.CreateForPage("/Pages/_About.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Pages/Home.cshtml"),
        };

        var provider = CreateProvider(items);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Pages/_About.cshtml", result.RelativePath);
            Assert.Equal("/_About", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("_About", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/_About", kvp.Value);
            });
        },
            result =>
        {
            Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
            Assert.Equal("/Home", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Home", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Home", kvp.Value);
            });
        });
    }
    public void GetRouteTemplate_ReturnsPathFromMetadataAttribute()
    {
        // Arrange
        var expected   = "test";
        var descriptor = new CompiledViewDescriptor(TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml", metadata: new object[]
        {
            new RazorCompiledItemMetadataAttribute("RouteTemplate", expected),
        }));

        // Act
        var result = CompiledPageRouteModelProvider.GetRouteTemplate(descriptor);

        // Assert
        Assert.Equal(expected, result);
    }
Пример #12
0
    public void IsItemValid_NoPrimaryChecksumAttribute_ReturnsTrue()
    {
        // Arrange
        var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
        {
            new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
            new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/About.cstml"),
        });

        // Act
        var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);

        // Assert
        Assert.True(result);
    }
Пример #13
0
        public void IsItemValid_ImportFileDoesNotExist_ReturnsFalse()
        {
            // Arrange
            var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
            {
                new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
                new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
            });

            FileProvider.AddFile("/Views/Home/Index.cstml", "some content");

            // Act
            var result = ChecksumValidator.IsItemValid(FileSystem, item);

            // Assert
            Assert.False(result);
        }
Пример #14
0
    public void IsItemValid_PrimaryFileDoesNotExist_ReturnsTrue()
    {
        // Arrange
        var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
        {
            new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
            new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
        });

        ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/_ViewImports.cstml", "dkdkfkdf")); // This will be ignored

        // Act
        var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);

        // Assert
        Assert.True(result);
    }
    public void OnProvidersExecuting_AddsMultipleSelectorsForIndexPage_WithIndexAtRoot()
    {
        // Arrange
        var items = new[]
        {
            TestRazorCompiledItem.CreateForPage("/Pages/Index.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Pages/Admin/Index.cshtml", metadata: new object[]
            {
                new RazorCompiledItemMetadataAttribute("RouteTemplate", "some-template"),
            }),
        };
        var options = new RazorPagesOptions {
            RootDirectory = "/"
        };

        var provider = CreateProvider(items, options);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Pages/Index.cshtml", result.RelativePath);
            Assert.Equal("/Pages/Index", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Pages/Index", selector.AttributeRouteModel.Template),
                selector => Assert.Equal("Pages", selector.AttributeRouteModel.Template));
        },
            result =>
        {
            Assert.Equal("/Pages/Admin/Index.cshtml", result.RelativePath);
            Assert.Equal("/Pages/Admin/Index", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Pages/Admin/Index/some-template", selector.AttributeRouteModel.Template),
                selector => Assert.Equal("Pages/Admin/some-template", selector.AttributeRouteModel.Template));
        });
    }
Пример #16
0
        public void IsItemValid_AllFilesMatch_ReturnsTrue()
        {
            // Arrange
            var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
            {
                new RazorSourceChecksumAttribute("SHA1", GetChecksum("some other import"), "/Views/_ViewImports.cstml"),
                new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
                new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
            });

            FileProvider.AddFile("/Views/Home/Index.cstml", "some content");
            FileProvider.AddFile("/Views/Home/_ViewImports.cstml", "some import");
            FileProvider.AddFile("/Views/_ViewImports.cstml", "some other import");

            // Act
            var result = ChecksumValidator.IsItemValid(Project, item);

            // Assert
            Assert.True(result);
        }
    public void OnProvidersExecuting_AllowsRouteTemplatesWithOverridePattern()
    {
        // Arrange
        var items = new[]
        {
            TestRazorCompiledItem.CreateForPage("/Pages/Index.cshtml", metadata: new object[]
            {
                new RazorCompiledItemMetadataAttribute("RouteTemplate", "~/some-other-prefix"),
            }),
            TestRazorCompiledItem.CreateForPage("/Pages/Home.cshtml", metadata: new object[]
            {
                new RazorCompiledItemMetadataAttribute("RouteTemplate", "/some-prefix"),
            }),
        };

        var provider = CreateProvider(items);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Pages/Index.cshtml", result.RelativePath);
            Assert.Equal("/Index", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("some-other-prefix", selector.AttributeRouteModel.Template));
        },
            result =>
        {
            Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
            Assert.Equal("/Home", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("some-prefix", selector.AttributeRouteModel.Template));
        });
    }
    public void OnProvidersExecuting_UsesTheFirstDescriptorForEachPath()
    {
        // ViewsFeature may contain duplicate entries for the same Page - for instance when an app overloads a library's views.
        // It picks the first entry for each path. In the ordinary case, this should ensure that the app's Razor Pages are preferred
        // to a Razor Page added by a library.

        // Arrange
        var items = new[]
        {
            // Page coming from the app
            TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Pages/Home.cshtml"),
            // Page coming from the app
            TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml"),
        };

        var provider = CreateProvider(items);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Pages/About.cshtml", result.RelativePath);
            Assert.Equal("/About", result.ViewEnginePath);
        },
            result =>
        {
            Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
            Assert.Equal("/Home", result.ViewEnginePath);
        });
    }
    public void OnProvidersExecuting_AddsModelsForCompiledAreaPages()
    {
        // Arrange
        var items = new[]
        {
            TestRazorCompiledItem.CreateForPage("/Areas/Products/Files/About.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Areas/Products/Pages/About.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Areas/Products/Pages/Manage/Index.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Areas/Products/Pages/Manage/Edit.cshtml", metadata: new object[]
            {
                new RazorCompiledItemMetadataAttribute("RouteTemplate", "{id}"),
            }),
        };

        var options = new RazorPagesOptions
        {
            // Setting this value should not affect area page lookup.
            RootDirectory = "/Files",
        };

        var provider = CreateProvider(items, options);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Areas/Products/Pages/About.cshtml", result.RelativePath);
            Assert.Equal("/About", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Products/About", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("area", kvp.Key);
                Assert.Equal("Products", kvp.Value);
            },
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/About", kvp.Value);
            });
        },
            result =>
        {
            Assert.Equal("/Areas/Products/Pages/Manage/Index.cshtml", result.RelativePath);
            Assert.Equal("/Manage/Index", result.ViewEnginePath);
            Assert.Collection(result.Selectors,
                              selector => Assert.Equal("Products/Manage/Index", selector.AttributeRouteModel.Template),
                              selector => Assert.Equal("Products/Manage", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("area", kvp.Key);
                Assert.Equal("Products", kvp.Value);
            },
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Manage/Index", kvp.Value);
            });
        },
            result =>
        {
            Assert.Equal("/Areas/Products/Pages/Manage/Edit.cshtml", result.RelativePath);
            Assert.Equal("/Manage/Edit", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Products/Manage/Edit/{id}", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("area", kvp.Key);
                Assert.Equal("Products", kvp.Value);
            },
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Manage/Edit", kvp.Value);
            });
        });
    }
    public void OnProvidersExecuting_DoesNotAddAreaAndNonAreaRoutesForAPage()
    {
        // Arrange
        var items = new[]
        {
            TestRazorCompiledItem.CreateForPage("/Areas/Accounts/Pages/Manage/Home.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Areas/Accounts/Manage/Home.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Areas/About.cshtml"),
            TestRazorCompiledItem.CreateForPage("/Contact.cshtml"),
        };

        var options = new RazorPagesOptions
        {
            RootDirectory = "/",
        };

        var provider = CreateProvider(items, options);
        var context  = new PageRouteModelProviderContext();

        // Act
        provider.OnProvidersExecuting(context);

        // Assert
        Assert.Collection(
            context.RouteModels,
            result =>
        {
            Assert.Equal("/Areas/Accounts/Pages/Manage/Home.cshtml", result.RelativePath);
            Assert.Equal("/Manage/Home", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Accounts/Manage/Home", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("area", kvp.Key);
                Assert.Equal("Accounts", kvp.Value);
            },
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Manage/Home", kvp.Value);
            });
        },
            result =>
        {
            Assert.Equal("/Contact.cshtml", result.RelativePath);
            Assert.Equal("/Contact", result.ViewEnginePath);
            Assert.Collection(
                result.Selectors,
                selector => Assert.Equal("Contact", selector.AttributeRouteModel.Template));
            Assert.Collection(
                result.RouteValues.OrderBy(k => k.Key),
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Contact", kvp.Value);
            });
        });
    }