File: Model\ResourceMenuItemsTests.cs
Web Access
Project: src\tests\Aspire.Dashboard.Tests\Aspire.Dashboard.Tests.csproj (Aspire.Dashboard.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.Model;
using Aspire.Dashboard.Otlp.Model;
using Aspire.Dashboard.Resources;
using Aspire.Dashboard.Tests.TelemetryRepositoryTests;
using Aspire.Tests.Shared.DashboardModel;
using Aspire.Tests.Shared.Telemetry;
using Google.Protobuf.Collections;
using Microsoft.AspNetCore.Components;
using OpenTelemetry.Proto.Trace.V1;
using Xunit;
 
namespace Aspire.Dashboard.Tests.Model;
 
public sealed class ResourceMenuItemsTests
{
    private static readonly DateTime s_testTime = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
 
    [Fact]
    public void AddMenuItems_NoTelemetry_NoTelemetryItems()
    {
        // Arrange
        var resource = ModelTestHelpers.CreateResource();
        var telemetryRespository = TelemetryTestHelpers.CreateRepository();
 
        // Act
        var menuItems = new List<MenuButtonItem>();
        ResourceMenuItems.AddMenuItems(
            menuItems,
            openingMenuButtonId: null,
            resource,
            new TestNavigationManager(),
            telemetryRespository,
            r => r.Name,
            new TestStringLocalizer<Resources.ControlsStrings>(),
            new TestStringLocalizer<Resources.Resources>(),
            new TestStringLocalizer<Commands>(),
            _ => Task.CompletedTask,
            _ => Task.CompletedTask,
            (_, _) => false,
            true,
            true);
 
        // Assert
        Assert.Collection(menuItems,
            e => Assert.Equal("Localized:ActionViewDetailsText", e.Text),
            e => Assert.Equal("Localized:ResourceActionConsoleLogsText", e.Text));
    }
 
    [Fact]
    public void AddMenuItems_UninstrumentedPeer_TraceItem()
    {
        // Arrange
        var resource = ModelTestHelpers.CreateResource(appName: "test-abc");
        var outgoingPeerResolver = new TestOutgoingPeerResolver(onResolve: attributes => (resource.Name, resource));
        var repository = TelemetryTestHelpers.CreateRepository(outgoingPeerResolvers: [outgoingPeerResolver]);
        var addContext = new AddContext();
        repository.AddTraces(addContext, new RepeatedField<ResourceSpans>()
        {
            new ResourceSpans
            {
                Resource = TelemetryTestHelpers.CreateResource(name: "source", instanceId: "abc"),
                ScopeSpans =
                {
                    new ScopeSpans
                    {
                        Scope = TelemetryTestHelpers.CreateScope(),
                        Spans =
                        {
                            TelemetryTestHelpers.CreateSpan(traceId: "1", spanId: "1-1", startTime: s_testTime.AddMinutes(1), endTime: s_testTime.AddMinutes(10), attributes: [KeyValuePair.Create(OtlpSpan.PeerServiceAttributeKey, "value-1")], kind: Span.Types.SpanKind.Client),
                            TelemetryTestHelpers.CreateSpan(traceId: "1", spanId: "1-2", startTime: s_testTime.AddMinutes(5), endTime: s_testTime.AddMinutes(10), parentSpanId: "1-1", attributes: [KeyValuePair.Create(OtlpSpan.PeerServiceAttributeKey, "value-2")], kind: Span.Types.SpanKind.Client)
                        }
                    }
                }
            }
        });
 
        // Act
        var menuItems = new List<MenuButtonItem>();
        ResourceMenuItems.AddMenuItems(
            menuItems,
            openingMenuButtonId: null,
            resource,
            new TestNavigationManager(),
            repository,
            r => r.Name,
            new TestStringLocalizer<Resources.ControlsStrings>(),
            new TestStringLocalizer<Resources.Resources>(),
            new TestStringLocalizer<Commands>(),
            _ => Task.CompletedTask,
            _ => Task.CompletedTask,
            (_, _) => false,
            true,
            true);
 
        // Assert
        Assert.Collection(menuItems,
            e => Assert.Equal("Localized:ActionViewDetailsText", e.Text),
            e => Assert.Equal("Localized:ResourceActionConsoleLogsText", e.Text),
            e => Assert.True(e.IsDivider),
            e => Assert.Equal("Localized:ResourceActionTracesText", e.Text));
    }
 
    [Fact]
    public void AddMenuItems_HasTelemetry_TelemetryItems()
    {
        // Arrange
        var resource = ModelTestHelpers.CreateResource(appName: "test-abc");
        var repository = TelemetryTestHelpers.CreateRepository();
        var addContext = new AddContext();
        repository.AddTraces(addContext, new RepeatedField<ResourceSpans>()
        {
            new ResourceSpans
            {
                Resource = TelemetryTestHelpers.CreateResource(name: "test", instanceId: "abc"),
                ScopeSpans =
                {
                    new ScopeSpans
                    {
                        Scope = TelemetryTestHelpers.CreateScope(),
                        Spans =
                        {
                            TelemetryTestHelpers.CreateSpan(traceId: "1", spanId: "1-1", startTime: s_testTime.AddMinutes(1), endTime: s_testTime.AddMinutes(10))
                        }
                    }
                }
            }
        });
 
        // Act
        var menuItems = new List<MenuButtonItem>();
        ResourceMenuItems.AddMenuItems(
            menuItems,
            openingMenuButtonId: null,
            resource,
            new TestNavigationManager(),
            repository,
            r => r.Name,
            new TestStringLocalizer<Resources.ControlsStrings>(),
            new TestStringLocalizer<Resources.Resources>(),
            new TestStringLocalizer<Commands>(),
            _ => Task.CompletedTask,
            _ => Task.CompletedTask,
            (_, _) => false,
            true,
            true);
 
        // Assert
        Assert.Collection(menuItems,
            e => Assert.Equal("Localized:ActionViewDetailsText", e.Text),
            e => Assert.Equal("Localized:ResourceActionConsoleLogsText", e.Text),
            e => Assert.True(e.IsDivider),
            e => Assert.Equal("Localized:ResourceActionStructuredLogsText", e.Text),
            e => Assert.Equal("Localized:ResourceActionTracesText", e.Text),
            e => Assert.Equal("Localized:ResourceActionMetricsText", e.Text));
    }
 
    private sealed class TestNavigationManager : NavigationManager
    {
    }
}