File: Compilation\DefaultRazorPageFactoryProviderTest.cs
Web Access
Project: src\src\Mvc\Mvc.Razor\test\Microsoft.AspNetCore.Mvc.Razor.Test.csproj (Microsoft.AspNetCore.Mvc.Razor.Test)
// 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.Hosting;
using Microsoft.Extensions.Primitives;
using Moq;
 
namespace Microsoft.AspNetCore.Mvc.Razor.Compilation;
 
public class DefaultRazorPageFactoryProviderTest
{
    [Fact]
    public void CreateFactory_ReturnsViewDescriptor_ForUnsuccessfulResults()
    {
        // Arrange
        var path = "/file-does-not-exist";
        var expirationTokens = new[]
        {
                Mock.Of<IChangeToken>(),
                Mock.Of<IChangeToken>(),
            };
        var descriptor = new CompiledViewDescriptor
        {
            RelativePath = path,
            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(path);
 
        // Assert
        Assert.False(result.Success);
        Assert.Same(descriptor, result.ViewDescriptor);
    }
 
    [Fact]
    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);
    }
 
    [Fact]
    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);
    }
 
    private IViewCompilerProvider GetCompilerProvider(IViewCompiler cache)
    {
        var compilerCacheProvider = new Mock<IViewCompilerProvider>();
        compilerCacheProvider
            .Setup(c => c.GetCompiler())
            .Returns(cache);
 
        return compilerCacheProvider.Object;
    }
 
    private class TestRazorPage : RazorPage
    {
        public override Task ExecuteAsync()
        {
            throw new NotImplementedException();
        }
    }
}