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); }
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); }
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); }
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); }
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); }); }); }
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); }
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); }
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); }
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); }
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)); }); }
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); }); }); }