File: Pages\ResourceOverviewRelationshipGraphTests.cs
Web Access
Project: src\tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj (Aspire.Dashboard.Components.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Threading.Channels;
using Aspire.Dashboard.Components.Layout;
using Aspire.Dashboard.Components.Pages;
using Aspire.Dashboard.Components.Resize;
using Aspire.Dashboard.Components.Tests.Shared;
using Aspire.Dashboard.Tests.Shared;
using Aspire.Tests.Shared.DashboardModel;
using Bunit;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
 
namespace Aspire.Dashboard.Components.Tests.Pages;
 
[UseCulture("en-US")]
public class ResourceOverviewRelationshipGraphTests : DashboardTestContext
{
    [Fact]
    public async Task Labels_TrimAtEndUnlessResourceHasMultipleInstances()
    {
        var viewport = new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false);
        var changes = Channel.CreateUnbounded<IReadOnlyList<ResourceViewModelChange>>();
        var client = new TestDashboardClient(isEnabled: true,
            initialResources:
            [
                ModelTestHelpers.CreateResource("catalogservice-production",
                    relationships: [new("catalogdatabase-production", "Reference")]),
                ModelTestHelpers.CreateResource("frontendservice-production-abc1234", displayName: "frontendservice-production",
                    relationships: [new("catalogservice-production", "Reference")]),
                ModelTestHelpers.CreateResource("catalogdatabase-production-abc1234", displayName: "catalogdatabase-production")
            ],
            resourceChannelProvider: () => changes);
        ResourceSetupHelpers.SetupResourceOverview(this, viewport, client);
        Services.GetRequiredService<NavigationManager>().NavigateTo("/resources/catalogservice-production");
 
        var cut = Render<ResourcesLayout>(p => p.AddCascadingValue(viewport).Add(p => p.Body, builder =>
        {
            builder.OpenComponent<ResourceOverview>(0);
            builder.AddAttribute(1, nameof(ResourceOverview.ResourceName), "catalogservice-production");
            builder.CloseComponent();
        }));
 
        string[] singletonLabels = ["frontendservice…", "catalogservice-…", "catalogdatabase…"];
        cut.WaitForAssertion(() => Assert.Equal(singletonLabels,
            cut.FindAll(".relationship-graph-node text").Select(n => n.TextContent)));
 
        // The center's other instance has no relationships, so it isn't a node in this graph.
        var replicas = new[]
        {
            ModelTestHelpers.CreateResource("catalogservice-production-second", displayName: "catalogservice-production"),
            ModelTestHelpers.CreateResource("frontendservice-production-xyz9876", displayName: "frontendservice-production",
                relationships: [new("catalogservice-production", "Reference")]),
            ModelTestHelpers.CreateResource("catalogdatabase-production-xyz9876", displayName: "catalogdatabase-production")
        };
        await changes.Writer.WriteAsync(replicas.Select(r => new ResourceViewModelChange(ResourceViewModelChangeType.Upsert, r)).ToArray());
 
        cut.WaitForAssertion(() => Assert.Equal(
            ["frontend…abc1234", "frontend…xyz9876", "catalogs…duction", "catalogd…abc1234", "catalogd…xyz9876"],
            cut.FindAll(".relationship-graph-node text").Select(n => n.TextContent)));
        var outgoing = cut.Find(".relationship-graph-node[href='/resources/catalogdatabase-production-abc1234']");
        Assert.Equal("Reference: catalogdatabase-production-abc1234", outgoing.GetAttribute("aria-label"));
        Assert.Equal("Reference: catalogdatabase-production-abc1234", outgoing.GetAttribute("data-tooltip"));
 
        await changes.Writer.WriteAsync(replicas.Select(r => new ResourceViewModelChange(ResourceViewModelChangeType.Delete, r)).ToArray());
 
        cut.WaitForAssertion(() => Assert.Equal(singletonLabels,
            cut.FindAll(".relationship-graph-node text").Select(n => n.TextContent)));
    }
}