File: Mcp\ApiDocs\ApiMemberMarkdownParserTests.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.Documentation.ApiDocs;
 
namespace Aspire.Cli.Tests.Documentation.ApiDocs;
 
public class ApiMemberMarkdownParserTests
{
    [Fact]
    public void Parse_UsesKnownMemberGroupRoutes()
    {
        var containerItem = new ApiReferenceItem
        {
            Id = "csharp/aspire.test.package/testresource",
            Name = "TestResource",
            Language = ApiReferenceLanguages.CSharp,
            Kind = ApiReferenceKinds.Type,
            PageUrl = "https://aspire.dev/reference/api/csharp/aspire.test.package/testresource"
        };
 
        var memberGroupItem = new ApiReferenceItem
        {
            Id = "csharp/aspire.test.package/testresource/methods",
            Name = "methods",
            Language = ApiReferenceLanguages.CSharp,
            Kind = ApiReferenceKinds.MemberGroup,
            PageUrl = "https://aspire.dev/reference/api/csharp/aspire.test.package/testresource/methods",
            ParentId = containerItem.Id,
            MemberGroup = "methods"
        };
 
        var items = ApiMemberMarkdownParser.Parse(
            containerItem,
            """
            # TestResource
 
            ## Methods
 
            - [RunEmulator()](/reference/api/csharp/aspire.test.package/testresource/methods.md#runemulator) : `void` -- Runs the emulator.
            - [OtherType](/reference/api/csharp/aspire.test.package/othertype.md) -- Should not be treated as a member.
            """,
            ApiDocsSourceConfiguration.DefaultSitemapUrl,
            new Dictionary<string, ApiReferenceItem>(StringComparer.OrdinalIgnoreCase)
            {
                [memberGroupItem.PageUrl] = memberGroupItem
            });
 
        var item = Assert.Single(items);
        Assert.Equal("csharp/aspire.test.package/testresource/methods#runemulator", item.Id);
        Assert.Equal("RunEmulator()", item.Name);
        Assert.Equal(ApiReferenceLanguages.CSharp, item.Language);
        Assert.Equal(ApiReferenceKinds.Member, item.Kind);
        Assert.Equal(memberGroupItem.Id, item.ParentId);
        Assert.Equal("Runs the emulator.", item.Summary);
    }
 
    [Fact]
    public void Parse_ShortenOverloadIdsWhileKeepingThemDistinct()
    {
        var containerItem = new ApiReferenceItem
        {
            Id = "csharp/aspire.test.package/resourcebuilderextensions",
            Name = "ResourceBuilderExtensions",
            Language = ApiReferenceLanguages.CSharp,
            Kind = ApiReferenceKinds.Type,
            PageUrl = "https://aspire.dev/reference/api/csharp/aspire.test.package/resourcebuilderextensions"
        };
 
        var memberGroupItem = new ApiReferenceItem
        {
            Id = "csharp/aspire.test.package/resourcebuilderextensions/methods",
            Name = "methods",
            Language = ApiReferenceLanguages.CSharp,
            Kind = ApiReferenceKinds.MemberGroup,
            PageUrl = "https://aspire.dev/reference/api/csharp/aspire.test.package/resourcebuilderextensions/methods",
            ParentId = containerItem.Id,
            MemberGroup = "methods"
        };
 
        var items = ApiMemberMarkdownParser.Parse(
            containerItem,
            """
            # ResourceBuilderExtensions
 
            ## Methods
 
            - [WithEnvironment(IResourceBuilder<T>, string, string?)](/reference/api/csharp/aspire.test.package/resourcebuilderextensions/methods.md#withenvironment-iresourcebuilder-t-string-string) : `IResourceBuilder<T>` -- Adds a string environment variable.
            - [WithEnvironment(IResourceBuilder<T>, Action<EnvironmentCallbackContext>)](/reference/api/csharp/aspire.test.package/resourcebuilderextensions/methods.md#withenvironment-iresourcebuilder-t-action-environmentcallbackcontext) : `IResourceBuilder<T>` -- Adds environment variables from a callback.
            """,
            ApiDocsSourceConfiguration.DefaultSitemapUrl,
            new Dictionary<string, ApiReferenceItem>(StringComparer.OrdinalIgnoreCase)
            {
                [memberGroupItem.PageUrl] = memberGroupItem
            });
 
        Assert.Equal(2, items.Count);
        Assert.All(items, item =>
        {
            Assert.True(item.Id.StartsWith("csharp/aspire.test.package/resourcebuilderextensions/methods#withenvironment-", StringComparison.Ordinal), item.Id);
            Assert.DoesNotContain("iresourcebuilder", item.Id, StringComparison.OrdinalIgnoreCase);
        });
        Assert.NotEqual(items[0].Id, items[1].Id);
    }
}