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_AddsMultipleSelectorsForIndexPage_WithIndexAtRoot() { // Arrange var descriptors = new[] { CreateVersion_2_0_Descriptor("/Pages/Index.cshtml"), CreateVersion_2_0_Descriptor("/Pages/Admin/Index.cshtml", "some-template"), }; var options = new RazorPagesOptions { RootDirectory = "/" }; var provider = CreateProvider(options: options, descriptors: descriptors); 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)); }); }
private void CreateModels(PageRouteModelProviderContext context) { var rootDirectory = _pagesOptions.RootDirectory; if (!rootDirectory.EndsWith("/", StringComparison.Ordinal)) { rootDirectory = rootDirectory + "/"; } var areaRootDirectory = "/Areas/"; foreach (var viewDescriptor in GetViewDescriptors(_applicationManager)) { if (viewDescriptor.Item != null && !ChecksumValidator.IsItemValid(_razorProjectEngine.FileSystem, viewDescriptor.Item)) { // If we get here, this compiled Page has different local content, so ignore it. continue; } var relativePath = viewDescriptor.RelativePath; var routeTemplate = GetRouteTemplate(viewDescriptor); PageRouteModel routeModel = null; // When RootDirectory and AreaRootDirectory overlap (e.g. RootDirectory = '/', AreaRootDirectory = '/Areas'), we // only want to allow a page to be associated with the area route. if (_pagesOptions.AllowAreas && relativePath.StartsWith(areaRootDirectory, StringComparison.OrdinalIgnoreCase)) { routeModel = _routeModelFactory.CreateAreaRouteModel(relativePath, routeTemplate); } else if (relativePath.StartsWith(rootDirectory, StringComparison.OrdinalIgnoreCase)) { routeModel = _routeModelFactory.CreateRouteModel(relativePath, routeTemplate); } if (routeModel != null) { context.RouteModels.Add(routeModel); } } }
public void OnProvidersExecuting_AddsMultipleSelectorsForIndexPage() { // Arrange var items = new[] { TestRazorCompiledItem.CreateForPage("/Pages/Index.cshtml"), TestRazorCompiledItem.CreateForPage("/Pages/Admin/Index.cshtml", metadata: new object[] { new RazorCompiledItemMetadataAttribute("RouteTemplate", "some-template"), }), }; 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("Index", selector.AttributeRouteModel.Template), selector => Assert.Equal("", selector.AttributeRouteModel.Template)); }, result => { Assert.Equal("/Pages/Admin/Index.cshtml", result.RelativePath); Assert.Equal("/Admin/Index", result.ViewEnginePath); Assert.Collection( result.Selectors, selector => Assert.Equal("Admin/Index/some-template", selector.AttributeRouteModel.Template), selector => Assert.Equal("Admin/some-template", selector.AttributeRouteModel.Template)); }); }
public void OnProvidersExecuting_DoesNotAddsModelsForAreaPages_IfFeatureIsDisabled() { // Arrange var descriptors = new[] { CreateVersion_2_0_Descriptor("/Pages/About.cshtml"), CreateVersion_2_0_Descriptor("/Areas/Accounts/Pages/Home.cshtml"), }; var options = new RazorPagesOptions { AllowAreas = false }; var provider = CreateProvider(options: options, descriptors: descriptors); 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); }); }); }
public void OnProvidersExecuting_AddsMultipleSelectorsForIndexPages() { // Arrange var fileSystem = new VirtualRazorProjectFileSystem(); fileSystem.Add(new TestRazorProjectItem("/Pages/Index.cshtml", "@page")); fileSystem.Add(new TestRazorProjectItem("/Pages/Test.cshtml", "Hello world")); fileSystem.Add(new TestRazorProjectItem("/Pages/Admin/Index.cshtml", "@page \"test\"")); var optionsManager = Options.Create(new RazorPagesOptions()); optionsManager.Value.RootDirectory = "/"; var provider = new RazorProjectPageRouteModelProvider(fileSystem, optionsManager, NullLoggerFactory.Instance); var context = new PageRouteModelProviderContext(); // Act provider.OnProvidersExecuting(context); // Assert Assert.Collection(context.RouteModels, model => { Assert.Equal("/Pages/Index.cshtml", model.RelativePath); Assert.Equal("/Pages/Index", model.ViewEnginePath); Assert.Collection(model.Selectors, selector => Assert.Equal("Pages/Index", selector.AttributeRouteModel.Template), selector => Assert.Equal("Pages", selector.AttributeRouteModel.Template)); }, model => { Assert.Equal("/Pages/Admin/Index.cshtml", model.RelativePath); Assert.Equal("/Pages/Admin/Index", model.ViewEnginePath); Assert.Collection(model.Selectors, selector => Assert.Equal("Pages/Admin/Index/test", selector.AttributeRouteModel.Template), selector => Assert.Equal("Pages/Admin/test", selector.AttributeRouteModel.Template)); }); }
public void OnProvidersExecuting_ValidatesChecksum_RejectsPageWhenContentDoesntMatch() { // Arrange var descriptors = new[] { CreateVersion_2_1_Descriptor("/Pages/About.cshtml", metadata: new object[] { new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Pages/About.cshtml"), }), }; var fileSystem = new VirtualRazorProjectFileSystem(); fileSystem.Add(new TestRazorProjectItem("/Pages/About.cshtml", "some other content")); var provider = CreateProvider(descriptors: descriptors, fileSystem: fileSystem); var context = new PageRouteModelProviderContext(); // Act provider.OnProvidersExecuting(context); // Assert Assert.Empty(context.RouteModels); }
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); }); }
private void AddPageModels(PageRouteModelProviderContext context) { foreach (var item in _razorFileSystem.EnumerateItems(_pagesOptions.RootDirectory)) { var relativePath = item.CombinedPath; if (context.RouteModels.Any(m => string.Equals(relativePath, m.RelativePath, StringComparison.OrdinalIgnoreCase))) { // A route for this file was already registered either by the CompiledPageRouteModel or as an area route. // by this provider. Skip registering an additional entry. // Note: We're comparing duplicates based on root-relative paths. This eliminates a page from being discovered // by overlapping area and non-area routes where ViewEnginePath would be different. continue; } if (!PageDirectiveFeature.TryGetPageDirective(_logger, item, out var routeTemplate)) { // .cshtml pages without @page are not RazorPages. continue; } if (_pagesOptions.AllowAreas && relativePath.StartsWith(AreaRootDirectory, StringComparison.OrdinalIgnoreCase)) { // Ignore Razor pages that are under the area root directory when AllowAreas is enabled. // Conforming page paths will be added by AddAreaPageModels. _logger.UnsupportedAreaPath(relativePath); continue; } var routeModel = _routeModelFactory.CreateRouteModel(relativePath, routeTemplate); if (routeModel != null) { context.RouteModels.Add(routeModel); } } }
public void OnProvidersExecuting_DoesNotAddAreaAndNonAreaRoutesForAPage() { // Arrange var descriptors = new[] { CreateVersion_2_0_Descriptor("/Areas/Accounts/Pages/Manage/Home.cshtml"), CreateVersion_2_0_Descriptor("/Areas/Accounts/Manage/Home.cshtml"), CreateVersion_2_0_Descriptor("/Areas/About.cshtml"), CreateVersion_2_0_Descriptor("/Contact.cshtml"), }; var options = new RazorPagesOptions { AllowAreas = true, RootDirectory = "/", }; var provider = CreateProvider(options: options, descriptors: descriptors); 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); }); }); }
public void OnProvidersExecuting_AddsModelsForCompiledAreaPages() { // Arrange var descriptors = new[] { CreateVersion_2_0_Descriptor("/Areas/Products/Files/About.cshtml"), CreateVersion_2_0_Descriptor("/Areas/Products/Pages/About.cshtml"), CreateVersion_2_0_Descriptor("/Areas/Products/Pages/Manage/Index.cshtml"), CreateVersion_2_0_Descriptor("/Areas/Products/Pages/Manage/Edit.cshtml", "{id}"), }; var options = new RazorPagesOptions { AllowAreas = true, // Setting this value should not affect area page lookup. RootDirectory = "/Files", }; var provider = CreateProvider(options: options, descriptors: descriptors); 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_AddsPagesUnderAreas() { // Arrange var fileSystem = new VirtualRazorProjectFileSystem(); fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/Manage/Categories.cshtml", "@page")); fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/Index.cshtml", "@page")); fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/List.cshtml", "@page \"{sortOrder?}\"")); fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/_Test.cshtml", "@page")); var optionsManager = Options.Create(new RazorPagesOptions { AllowAreas = true }); var provider = new RazorProjectPageRouteModelProvider(fileSystem, optionsManager, NullLoggerFactory.Instance); var context = new PageRouteModelProviderContext(); // Act provider.OnProvidersExecuting(context); // Assert Assert.Collection(context.RouteModels, model => { Assert.Equal("/Areas/Products/Pages/Index.cshtml", model.RelativePath); Assert.Equal("/Index", model.ViewEnginePath); Assert.Collection(model.Selectors, selector => Assert.Equal("Products/Index", selector.AttributeRouteModel.Template), selector => Assert.Equal("Products", selector.AttributeRouteModel.Template)); Assert.Collection(model.RouteValues.OrderBy(k => k.Key), kvp => { Assert.Equal("area", kvp.Key); Assert.Equal("Products", kvp.Value); }, kvp => { Assert.Equal("page", kvp.Key); Assert.Equal("/Index", kvp.Value); }); }, model => { Assert.Equal("/Areas/Products/Pages/List.cshtml", model.RelativePath); Assert.Equal("/List", model.ViewEnginePath); Assert.Collection(model.Selectors, selector => Assert.Equal("Products/List/{sortOrder?}", selector.AttributeRouteModel.Template)); Assert.Collection(model.RouteValues.OrderBy(k => k.Key), kvp => { Assert.Equal("area", kvp.Key); Assert.Equal("Products", kvp.Value); }, kvp => { Assert.Equal("page", kvp.Key); Assert.Equal("/List", kvp.Value); }); }, model => { Assert.Equal("/Areas/Products/Pages/_Test.cshtml", model.RelativePath); Assert.Equal("/_Test", model.ViewEnginePath); Assert.Collection(model.Selectors, selector => Assert.Equal("Products/_Test", selector.AttributeRouteModel.Template)); Assert.Collection(model.RouteValues.OrderBy(k => k.Key), kvp => { Assert.Equal("area", kvp.Key); Assert.Equal("Products", kvp.Value); }, kvp => { Assert.Equal("page", kvp.Key); Assert.Equal("/_Test", kvp.Value); }); }, model => { Assert.Equal("/Areas/Products/Pages/Manage/Categories.cshtml", model.RelativePath); Assert.Equal("/Manage/Categories", model.ViewEnginePath); Assert.Collection(model.Selectors, selector => Assert.Equal("Products/Manage/Categories", selector.AttributeRouteModel.Template)); Assert.Collection(model.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/Categories", kvp.Value); }); }); }
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 OnProvidersExecuted(PageRouteModelProviderContext context) { }