File: Pages\ResourceOverviewTypeDisplayNameTests.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.Controls;
using Aspire.Dashboard.Components.Layout;
using Aspire.Dashboard.Components.Pages;
using Aspire.Dashboard.Components.Resize;
using Aspire.Dashboard.Components.Tests.Shared;
using Aspire.Dashboard.Model;
using Aspire.Dashboard.Tests.Shared;
using Aspire.Tests.Shared.DashboardModel;
using Bunit;
using Google.Protobuf.WellKnownTypes;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
 
namespace Aspire.Dashboard.Components.Tests.Pages;
 
[UseCulture("en-US")]
public class ResourceOverviewTypeDisplayNameTests : DashboardTestContext
{
    [Fact]
    public void Overview_DisplaysTypeLabelAndKeepsTechnicalTypeInProperties()
    {
        var cut = RenderOverview("postgres");
 
        cut.WaitForAssertion(() => Assert.Equal(["postgres"], cut.Instance.SelectedResourceNames));
 
        var status = cut.Find("[aria-labelledby='overview-status-title']");
        var values = status.QuerySelectorAll("dt").ToDictionary(dt => dt.TextContent.Trim(), dt => dt.NextElementSibling!);
        Assert.Equal("PostgreSQL Server", values["Type"].TextContent.Trim());
 
        var graph = cut.FindComponent<ResourceRelationshipGraph>().Instance;
        Assert.Equal(new RelationshipGraphNode("postgres", "PostgreSQL Server", Url: null), graph.Resource);
 
        Assert.Contains(KnownResourceTypes.Container, cut.Find(".overview-property-grid").TextContent, StringComparison.Ordinal);
    }
 
    [Fact]
    public void Overview_WithoutTypeLabel_TechnicalTypeOnlyDisplaysInStatus()
    {
        var cut = RenderOverview("api");
 
        cut.WaitForAssertion(() => Assert.Equal(["api"], cut.Instance.SelectedResourceNames));
 
        var status = cut.Find("[aria-labelledby='overview-status-title']");
        var values = status.QuerySelectorAll("dt").ToDictionary(dt => dt.TextContent.Trim(), dt => dt.NextElementSibling!);
        Assert.Equal(KnownResourceTypes.Project, values["Type"].TextContent.Trim());
 
        Assert.Empty(cut.FindAll(".overview-property-grid"));
    }
 
    private IRenderedComponent<ResourcesLayout> RenderOverview(string resourceName)
    {
        var viewport = new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false);
        var channel = Channel.CreateUnbounded<IReadOnlyList<ResourceViewModelChange>>();
        var client = new TestDashboardClient(isEnabled: true,
            initialResources:
            [
                ModelTestHelpers.CreateResource("postgres", resourceType: KnownResourceTypes.Container, state: KnownResourceState.Running,
                    resourceTypeDisplayName: "PostgreSQL Server", properties: CreateTypeProperty(KnownResourceTypes.Container)),
                ModelTestHelpers.CreateResource("api", resourceType: KnownResourceTypes.Project, state: KnownResourceState.Running,
                    relationships: [new RelationshipViewModel("postgres", "Reference")], properties: CreateTypeProperty(KnownResourceTypes.Project))
            ],
            resourceChannelProvider: () => channel);
        ResourceSetupHelpers.SetupResourceOverview(this, viewport, client);
        Services.GetRequiredService<NavigationManager>().NavigateTo($"/resources/{resourceName}");
 
        return Render<ResourcesLayout>(p => p.AddCascadingValue(viewport).Add(p => p.Body, builder =>
        {
            builder.OpenComponent<ResourceOverview>(0);
            builder.AddAttribute(1, nameof(ResourceOverview.ResourceName), resourceName);
            builder.CloseComponent();
        }));
    }
 
    private static Dictionary<string, ResourcePropertyViewModel> CreateTypeProperty(string resourceType) => new()
    {
        [KnownProperties.Resource.Type] = new(KnownProperties.Resource.Type, Value.ForString(resourceType), false, null, 0, null, false)
    };
}