File: Model\IconResolverTests.cs
Web Access
Project: src\tests\Aspire.Dashboard.Tests\Aspire.Dashboard.Tests.csproj (Aspire.Dashboard.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.Dashboard.Model;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.FluentUI.AspNetCore.Components;
using Xunit;
 
namespace Aspire.Dashboard.Tests.Model;
 
public sealed class IconResolverTests
{
    private static IconResolver CreateIconResolver(ILogger<IconResolver>? logger = null)
    {
        return new IconResolver(logger ?? NullLogger<IconResolver>.Instance);
    }
 
    [Fact]
    public void ResolveIconName_ValidIcon_ReturnsIcon()
    {
        // Arrange
        var iconResolver = CreateIconResolver();
 
        // Act
        var icon = iconResolver.ResolveIconName("Database", IconSize.Size20, IconVariant.Filled);
 
        // Assert
        Assert.NotNull(icon);
    }
 
    [Fact]
    public void ResolveIconName_InvalidIcon_ReturnsNull()
    {
        // Arrange
        var iconResolver = CreateIconResolver();
 
        // Act
        var icon = iconResolver.ResolveIconName("NonExistentIcon", IconSize.Size20, IconVariant.Filled);
 
        // Assert
        Assert.Null(icon);
    }
 
    [Fact]
    public void ResolveIconName_InvalidIcon_LogsWarning()
    {
        // Arrange
        var testSink = new TestSink();
        var factory = LoggerFactory.Create(b => b.AddProvider(new TestLoggerProvider(testSink)));
        var logger = factory.CreateLogger<IconResolver>();
        var iconResolver = CreateIconResolver(logger);
 
        // Act
        var icon = iconResolver.ResolveIconName("NonExistentIcon", IconSize.Size20, IconVariant.Filled);
 
        // Assert
        Assert.Null(icon);
        var write = Assert.Single(testSink.Writes);
        Assert.Equal(LogLevel.Warning, write.LogLevel);
        Assert.Contains("NonExistentIcon", write.Message);
        Assert.Contains("could not be resolved", write.Message);
    }
 
    [Fact]
    public void ResolveIconName_CachesResults()
    {
        // Arrange
        var iconResolver = CreateIconResolver();
 
        // Act
        var icon1 = iconResolver.ResolveIconName("Database", IconSize.Size20, IconVariant.Filled);
        var icon2 = iconResolver.ResolveIconName("Database", IconSize.Size20, IconVariant.Filled);
 
        // Assert
        Assert.NotNull(icon1);
        Assert.NotNull(icon2);
        Assert.Same(icon1, icon2); // Should be the same cached instance
    }
 
    [Fact]
    public void ResolveIconName_InvalidIcon_CachesNullResult()
    {
        // Arrange
        var iconResolver = CreateIconResolver();
 
        // Act - call twice with same invalid icon
        var icon1 = iconResolver.ResolveIconName("NonExistentIcon", IconSize.Size20, IconVariant.Filled);
        var icon2 = iconResolver.ResolveIconName("NonExistentIcon", IconSize.Size20, IconVariant.Filled);
 
        // Assert
        Assert.Null(icon1);
        Assert.Null(icon2);
        // Both calls should return the same cached null result
    }
 
    [Fact]
    public void ResolveIconName_DifferentSizes_CreatesSeparateCacheEntries()
    {
        // Arrange
        var iconResolver = CreateIconResolver();
 
        // Act
        var icon16 = iconResolver.ResolveIconName("Database", IconSize.Size16, IconVariant.Filled);
        var icon20 = iconResolver.ResolveIconName("Database", IconSize.Size20, IconVariant.Filled);
 
        // Assert
        Assert.NotNull(icon16);
        Assert.NotNull(icon20);
        // Different sizes should have different instances
        Assert.NotSame(icon16, icon20);
    }
 
    [Fact]
    public void ResolveIconName_DifferentVariants_CreatesSeparateCacheEntries()
    {
        // Arrange
        var iconResolver = CreateIconResolver();
 
        // Act
        var iconFilled = iconResolver.ResolveIconName("Database", IconSize.Size20, IconVariant.Filled);
        var iconRegular = iconResolver.ResolveIconName("Database", IconSize.Size20, IconVariant.Regular);
 
        // Assert
        Assert.NotNull(iconFilled);
        Assert.NotNull(iconRegular);
        // Different variants should have different instances
        Assert.NotSame(iconFilled, iconRegular);
    }
}