File: PageLoggerExtensionsTest.cs
Web Access
Project: src\src\Mvc\Mvc.RazorPages\test\Microsoft.AspNetCore.Mvc.RazorPages.Test.csproj (Microsoft.AspNetCore.Mvc.RazorPages.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Reflection;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
using Microsoft.Extensions.Logging.Testing;
 
namespace Microsoft.AspNetCore.Mvc;
 
public class PageLoggerExtensionsTest
{
    [Fact]
    public void ExecutingPageFactory_LogsPageName()
    {
        // Arrange
        var testSink = new TestSink();
        var loggerFactory = new TestLoggerFactory(testSink, enabled: true);
        var logger = loggerFactory.CreateLogger("test");
 
        var context = new PageContext
        {
            ActionDescriptor = new CompiledPageActionDescriptor
            {
                // Using a generic type to verify the use of a clean name
                PageTypeInfo = typeof(ValueTuple<int, string>).GetTypeInfo()
            }
        };
 
        // Act
        logger.ExecutingPageFactory(context);
 
        // Assert
        var write = Assert.Single(testSink.Writes);
        Assert.Equal(
            "Executing page factory for page " +
            "System.ValueTuple<int, string> (System.Private.CoreLib)",
            write.State.ToString());
    }
 
    [Fact]
    public void ExecutedPageFactory_LogsPageName()
    {
        // Arrange
        var testSink = new TestSink();
        var loggerFactory = new TestLoggerFactory(testSink, enabled: true);
        var logger = loggerFactory.CreateLogger("test");
 
        var context = new PageContext
        {
            ActionDescriptor = new CompiledPageActionDescriptor
            {
                // Using a generic type to verify the use of a clean name
                PageTypeInfo = typeof(ValueTuple<int, string>).GetTypeInfo()
            }
        };
 
        // Act
        logger.ExecutedPageFactory(context);
 
        // Assert
        var write = Assert.Single(testSink.Writes);
        Assert.Equal(
            "Executed page factory for page " +
            "System.ValueTuple<int, string> (System.Private.CoreLib)",
            write.State.ToString());
    }
 
    [Fact]
    public void ExecutingPageModelFactory_LogsPageName()
    {
        // Arrange
        var testSink = new TestSink();
        var loggerFactory = new TestLoggerFactory(testSink, enabled: true);
        var logger = loggerFactory.CreateLogger("test");
 
        var context = new PageContext
        {
            ActionDescriptor = new CompiledPageActionDescriptor
            {
                // Using a generic type to verify the use of a clean name
                PageTypeInfo = typeof(ValueTuple<int, string>).GetTypeInfo()
            }
        };
 
        // Act
        logger.ExecutingPageModelFactory(context);
 
        // Assert
        var write = Assert.Single(testSink.Writes);
        Assert.Equal(
            "Executing page model factory for page " +
            "System.ValueTuple<int, string> (System.Private.CoreLib)",
            write.State.ToString());
    }
 
    [Fact]
    public void ExecutedPageModelFactory_LogsPageName()
    {
        // Arrange
        var testSink = new TestSink();
        var loggerFactory = new TestLoggerFactory(testSink, enabled: true);
        var logger = loggerFactory.CreateLogger("test");
 
        var context = new PageContext
        {
            ActionDescriptor = new CompiledPageActionDescriptor
            {
                // Using a generic type to verify the use of a clean name
                PageTypeInfo = typeof(ValueTuple<int, string>).GetTypeInfo()
            }
        };
 
        // Act
        logger.ExecutedPageModelFactory(context);
 
        // Assert
        var write = Assert.Single(testSink.Writes);
        Assert.Equal(
            "Executed page model factory for page " +
            "System.ValueTuple<int, string> (System.Private.CoreLib)",
            write.State.ToString());
    }
 
    [Theory]
    [InlineData(true)]
    [InlineData(false)]
    public void ExecutingHandlerMethod_LogsHandlerNameAndModelState(bool isValidModelState)
    {
        // Arrange
        var testSink = new TestSink();
        var loggerFactory = new TestLoggerFactory(testSink, enabled: true);
        var logger = loggerFactory.CreateLogger("test");
 
        var context = new PageContext();
        if (!isValidModelState)
        {
            context.ModelState.AddModelError("foo", "bar");
        }
        var handler = new HandlerMethodDescriptor
        {
            // Using a generic type to verify the use of a clean name
            MethodInfo = typeof(ValueTuple<int, string>).GetMethod(nameof(ToString)),
        };
 
        // Act
        logger.ExecutingHandlerMethod(context, handler, null);
 
        // Assert
        var write = Assert.Single(testSink.Writes);
        var validationState = isValidModelState ? "Valid" : "Invalid";
        Assert.Equal(
            $"Executing handler method System.ValueTuple<int, string>.ToString - ModelState is {validationState}",
            write.State.ToString());
    }
 
    [Theory]
    [InlineData("")]
    [InlineData("foo", "foo")]
    [InlineData("foo, 42", "foo", 42)]
    public void ExecutingHandlerMethod_WithArguments_LogsArguments(string expectedArgumentsMessage, params object[] arguments)
    {
        // Arrange
        var testSink = new TestSink();
        var loggerFactory = new TestLoggerFactory(testSink, enabled: true);
        var logger = loggerFactory.CreateLogger("test");
 
        var context = new PageContext();
        var handler = new HandlerMethodDescriptor
        {
            // Using a generic type to verify the use of a clean name
            MethodInfo = typeof(ValueTuple<int, string>).GetMethod(nameof(ToString)),
        };
 
        // Act
        logger.ExecutingHandlerMethod(context, handler, arguments);
 
        // Assert
        Assert.Equal(2, testSink.Writes.Count);
        var enumerator = testSink.Writes.GetEnumerator();
        enumerator.MoveNext();
        enumerator.MoveNext();
        Assert.Equal(
            $"Executing handler method System.ValueTuple<int, string>.ToString with arguments ({expectedArgumentsMessage})",
            enumerator.Current.State.ToString());
    }
}