File: Commands\McpIconHelperTests.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.Commands;
using Aspire.Shared.Mcp;
 
namespace Aspire.Cli.Tests.Commands;
 
public class McpIconHelperTests
{
    [Fact]
    public void GetAspireIcons_LoadsAllIconsFromCli()
    {
        // Arrange
        var assembly = typeof(McpStartCommand).Assembly;
        var resourceNamespace = "Aspire.Cli.Mcp.Resources";
 
        // Act
        var icons = McpIconHelper.GetAspireIcons(assembly, resourceNamespace);
 
        // Assert
        Assert.NotNull(icons);
        Assert.Equal(5, icons.Count);
 
        // Verify each icon has correct properties
        Assert.All(icons, icon =>
        {
            Assert.NotNull(icon);
            Assert.Equal("image/png", icon.MimeType);
            Assert.NotNull(icon.Source);
            Assert.StartsWith("data:image/png;base64,", icon.Source);
            
            // Verify it's actually base64 encoded data
            var base64Part = icon.Source.Substring("data:image/png;base64,".Length);
            Assert.True(base64Part.Length > 0, "Icon should have base64 data");
            
            // Verify base64 is valid by attempting to decode
            var bytes = Convert.FromBase64String(base64Part);
            Assert.True(bytes.Length > 0, "Icon data should not be empty");
            
            // Verify PNG header (first 4 bytes should be PNG signature: 89 50 4E 47)
            Assert.Equal(0x89, bytes[0]);
            Assert.Equal(0x50, bytes[1]);
            Assert.Equal(0x4E, bytes[2]);
            Assert.Equal(0x47, bytes[3]);
 
            Assert.NotNull(icon.Sizes);
            Assert.Single(icon.Sizes);
        });
 
        // Verify all expected sizes are present
        var sizes = icons.SelectMany(i => i.Sizes ?? []).ToHashSet();
        Assert.Contains("16", sizes);
        Assert.Contains("32", sizes);
        Assert.Contains("48", sizes);
        Assert.Contains("64", sizes);
        Assert.Contains("256", sizes);
    }
 
    [Fact]
    public void GetAspireIcons_MissingResource_ThrowsInvalidOperationException()
    {
        // Arrange
        var assembly = typeof(McpStartCommand).Assembly;
        var invalidResourceNamespace = "Aspire.Cli.Invalid.Namespace";
 
        // Act & Assert
        var exception = Assert.Throws<InvalidOperationException>(() =>
            McpIconHelper.GetAspireIcons(assembly, invalidResourceNamespace));
 
        Assert.Contains("Could not find embedded resource", exception.Message);
        Assert.Contains(invalidResourceNamespace, exception.Message);
    }
}