File: Interaction\SpectreConsoleLoggerProviderTests.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Cli.Interaction;
using Microsoft.Extensions.Logging;
 
namespace Aspire.Cli.Tests.Interaction;
 
public class SpectreConsoleLoggerProviderTests
{
    [Fact]
    public void CreateLogger_ReturnsSpectreConsoleLogger()
    {
        // Arrange
        var output = new StringWriter();
        var provider = new SpectreConsoleLoggerProvider(output);
 
        // Act
        var logger = provider.CreateLogger("Test.Category");
 
        // Assert
        Assert.NotNull(logger);
        Assert.IsType<SpectreConsoleLogger>(logger);
    }
 
    [Fact]
    public void SpectreConsoleLogger_IsEnabled_FiltersCorrectly()
    {
        // Arrange
        var output = new StringWriter();
        var aspireLogger = new SpectreConsoleLogger(output, "Aspire.Cli.Test");
        var systemLogger = new SpectreConsoleLogger(output, "System.Test");
 
        // Act & Assert
        Assert.True(aspireLogger.IsEnabled(LogLevel.Debug));
        Assert.True(aspireLogger.IsEnabled(LogLevel.Information));
        Assert.True(aspireLogger.IsEnabled(LogLevel.Warning));
 
        Assert.False(systemLogger.IsEnabled(LogLevel.Debug));
        Assert.False(systemLogger.IsEnabled(LogLevel.Information));
        Assert.True(systemLogger.IsEnabled(LogLevel.Warning)); // Warnings and above are allowed for non-Aspire categories
    }
 
    [Fact]
    public void SpectreConsoleLogger_Log_FormatsMessageCorrectly()
    {
        // Arrange
        var output = new StringWriter();
        var logger = new SpectreConsoleLogger(output, "Aspire.Cli.Test");
 
        // Act
        logger.LogDebug("Test debug message");
        logger.LogInformation("Test info message");
        logger.LogWarning("Test warning message");
 
        // Assert
        var outputString = output.ToString();
        // Note: With timestamp format, the log line will be: [HH:mm:ss] [dbug] Test: Test debug message
        Assert.Contains("[dbug] Test: Test debug message", outputString);
        Assert.Contains("[info] Test: Test info message", outputString);
        Assert.Contains("[warn] Test: Test warning message", outputString);
 
        // Verify that timestamps are present
        Assert.Matches(@"\[\d{2}:\d{2}:\d{2}\]", outputString);
    }
 
    [Fact]
    public void SpectreConsoleLogger_Log_UsesShortCategoryName()
    {
        // Arrange
        var output = new StringWriter();
        var logger = new SpectreConsoleLogger(output, "Aspire.Cli.NuGet.NuGetPackageCache");
 
        // Act
        logger.LogDebug("Getting integrations from NuGet");
 
        // Assert
        var outputString = output.ToString();
        // Note: With timestamp format, the log line will be: [HH:mm:ss] [dbug] NuGetPackageCache: Getting integrations from NuGet
        Assert.Contains("[dbug] NuGetPackageCache: Getting integrations from NuGet", outputString);
        Assert.DoesNotContain("Aspire.Cli.NuGet.NuGetPackageCache", outputString);
 
        // Verify that timestamps are present
        Assert.Matches(@"\[\d{2}:\d{2}:\d{2}\]", outputString);
    }
 
    [Fact]
    public void SpectreConsoleLogger_Log_IncludesTimestampInHHmmssFormat()
    {
        // Arrange
        var output = new StringWriter();
        var logger = new SpectreConsoleLogger(output, "Aspire.Cli.Test");
 
        // Act
        logger.LogDebug("Test debug message");
 
        // Assert
        var outputString = output.ToString();
 
        // Verify timestamp format (HH:mm:ss) is included at the beginning
        // The format should be: [HH:mm:ss] [dbug] Test: Test debug message
        Assert.Matches(@"\[\d{2}:\d{2}:\d{2}\] \[dbug\] Test: Test debug message", outputString);
    }
}