File: Controls\UrlsColumnDisplayTests.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 Aspire.Dashboard.Components.Tests.Shared;
using Aspire.Dashboard.Model;
using Aspire.Tests.Shared.DashboardModel;
using Bunit;
using Xunit;
 
namespace Aspire.Dashboard.Components.Tests.Controls;
 
public class UrlsColumnDisplayTests : DashboardTestContext
{
    [Fact]
    public void Render_MoreThanMaxRenderedItems_RendersBoundedPayload()
    {
        // Arrange
        const int totalUrls = 30;
 
        JSInterop.Mode = JSRuntimeMode.Loose;
        FluentUISetupHelpers.SetupFluentOverflow(this);
        FluentUISetupHelpers.AddCommonDashboardServices(this);
 
        var displayedUrls = CreateDisplayedUrls(totalUrls);
        var resource = ModelTestHelpers.CreateResource(resourceName: "test-resource", resourceType: "Project", state: KnownResourceState.Running);
 
        // Act
        var cut = Render<UrlsColumnDisplay>(builder =>
        {
            builder.Add(p => p.Resource, resource);
            builder.Add(p => p.HasMultipleReplicas, false);
            builder.Add(p => p.DisplayedUrls, displayedUrls);
        });
 
        // Assert
        var overflow = cut.Find("fluent-overflow");
        var overflowItems = cut.FindAll("fluent-overflow > div:not(.fluent-overflow-more)");
        Assert.Equal("10", overflow.GetAttribute("pre-overflow-count"));
        Assert.Equal("0", overflow.GetAttribute("threshold"));
        Assert.Equal("ellipsis", overflowItems[0].GetAttribute("behavior"));
        Assert.All(overflowItems.Skip(1), item => Assert.Null(item.GetAttribute("behavior")));
        Assert.Equal(20, overflowItems.Count);
        Assert.Equal("+10", cut.Find(".fluent-overflow-more fluent-button").TextContent.Trim());
 
        var popupItems = cut.FindAll(".url-overflow-popover .url-link");
        Assert.Equal(displayedUrls.Skip(20).Select(url => url.Text), popupItems.Select(item => item.TextContent.Trim()));
    }
 
    [Fact]
    public void Render_ExactlyMaxUrls_RendersAllItems()
    {
        // Arrange
        const int totalUrls = 20;
 
        JSInterop.Mode = JSRuntimeMode.Loose;
        FluentUISetupHelpers.SetupFluentOverflow(this);
        FluentUISetupHelpers.AddCommonDashboardServices(this);
 
        var displayedUrls = CreateDisplayedUrls(totalUrls);
        var resource = ModelTestHelpers.CreateResource(resourceName: "test-resource", resourceType: "Project", state: KnownResourceState.Running);
 
        // Act
        var cut = Render<UrlsColumnDisplay>(builder =>
        {
            builder.Add(p => p.Resource, resource);
            builder.Add(p => p.HasMultipleReplicas, false);
            builder.Add(p => p.DisplayedUrls, displayedUrls);
        });
 
        // Assert
        var overflowItems = cut.FindAll("fluent-overflow > div:not(.fluent-overflow-more)");
        Assert.Equal(totalUrls, overflowItems.Count);
    }
 
    private static List<DisplayedUrl> CreateDisplayedUrls(int count)
    {
        return Enumerable.Range(0, count).Select(i => new DisplayedUrl
        {
            Index = i,
            Name = $"https-{i}",
            Text = $"Endpoint {i}",
            Url = $"https://localhost:{5000 + i}",
            OriginalUrlString = $"https://localhost:{5000 + i}"
        }).ToList<DisplayedUrl>();
    }
}