File: PageDirectiveTest.cs
Web Access
Project: src\src\Razor\src\Compiler\Microsoft.AspNetCore.Mvc.Razor.Extensions\test\Microsoft.AspNetCore.Mvc.Razor.Extensions.UnitTests.csproj (Microsoft.AspNetCore.Mvc.Razor.Extensions.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Razor.Language;
using Xunit;
 
namespace Microsoft.AspNetCore.Mvc.Razor.Extensions;
 
public class PageDirectiveTest : RazorProjectEngineTestBase
{
    protected override RazorLanguageVersion Version => RazorLanguageVersion.Version_3_0;
 
    protected override void ConfigureProjectEngine(RazorProjectEngineBuilder builder)
    {
        PageDirective.Register(builder);
    }
 
    protected override void ConfigureCodeDocumentProcessor(RazorCodeDocumentProcessor processor)
    {
        processor.ExecutePhasesThrough<IRazorDocumentClassifierPhase>();
    }
 
    [Fact]
    public void TryGetPageDirective_ReturnsTrue_IfPageIsMalformed()
    {
        // Arrange
        var codeDocument = ProjectEngine.CreateCodeDocument("@page \"some-route-template\" Invalid");
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Act
        Assert.True(PageDirective.TryGetPageDirective(documentNode, out var pageDirective));
 
        // Assert
        Assert.Equal("some-route-template", pageDirective.RouteTemplate);
        Assert.NotNull(pageDirective.DirectiveNode);
    }
 
    [Fact]
    public void TryGetPageDirective_ReturnsTrue_IfPageIsImported()
    {
        // Arrange
        var importSource = RazorSourceDocument.Create("@page", "import.cshtml");
        var codeDocument = ProjectEngine.CreateCodeDocument("Hello world", [importSource]);
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Act
        Assert.True(PageDirective.TryGetPageDirective(documentNode, out var pageDirective));
 
        // Assert
        Assert.Null(pageDirective.RouteTemplate);
    }
 
    [Fact]
    public void TryGetPageDirective_ReturnsFalse_IfPageDoesNotHaveDirective()
    {
        // Arrange
        var codeDocument = ProjectEngine.CreateCodeDocument("Hello world");
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Act & Assert
        Assert.False(PageDirective.TryGetPageDirective(documentNode, out _));
    }
 
    [Fact]
    public void TryGetPageDirective_ReturnsTrue_IfPageDoesStartWithDirective()
    {
        // Arrange
        var codeDocument = ProjectEngine.CreateCodeDocument("Hello @page");
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Act
        Assert.True(PageDirective.TryGetPageDirective(documentNode, out var pageDirective));
 
        // Assert
        Assert.Null(pageDirective.RouteTemplate);
        Assert.NotNull(pageDirective.DirectiveNode);
    }
 
    [Fact]
    public void TryGetPageDirective_ReturnsTrue_IfContentHasDirective()
    {
        // Arrange
        var codeDocument = ProjectEngine.CreateCodeDocument("@page");
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Act
        Assert.True(PageDirective.TryGetPageDirective(documentNode, out var pageDirective));
 
        // Assert
        Assert.Null(pageDirective.RouteTemplate);
    }
 
    [Fact]
    public void TryGetPageDirective_ParsesRouteTemplate()
    {
        // Arrange
        var codeDocument = ProjectEngine.CreateCodeDocument("@page \"some-route-template\"");
        var processor = CreateCodeDocumentProcessor(codeDocument);
        var documentNode = processor.GetDocumentNode();
 
        // Act
        Assert.True(PageDirective.TryGetPageDirective(documentNode, out var pageDirective));
 
        // Assert
        Assert.Equal("some-route-template", pageDirective.RouteTemplate);
    }
}