File: Pages\ConsoleLogsTerminalTests.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.Resize;
using Aspire.Dashboard.Components.Tests.Shared;
using Aspire.Dashboard.Model;
using Aspire.Dashboard.Tests.Shared;
using Aspire.Dashboard.Utils;
using Bunit;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.FluentUI.AspNetCore.Components;
using Xunit;
 
namespace Aspire.Dashboard.Components.Tests.Pages;
 
public partial class ConsoleLogsTests
{
    [Theory]
    [InlineData(KnownResourceState.Running)]
    [InlineData(KnownResourceState.Waiting)]
    [InlineData(KnownResourceState.Finished)]
    public async Task TerminalResource_AlwaysShowsLogsAndConsoleOptions(KnownResourceState state)
    {
        var logs = Channel.CreateUnbounded<IReadOnlyList<ResourceLogLine>>();
        var resource = TerminalSetupHelpers.CreateTerminalResource("shell", state: state);
        var client = new TestDashboardClient(isEnabled: true, initialResources: [resource],
            resourceChannelProvider: () => Channel.CreateUnbounded<IReadOnlyList<ResourceViewModelChange>>(),
            consoleLogsChannelProvider: _ => logs);
        SetupConsoleLogsServices(client);
        JSInterop.SetupVoid("Microsoft.FluentUI.Blazor.Components.Select.Initialize", _ => true).SetVoidResult();
        Services.GetRequiredService<NavigationManager>().NavigateTo(DashboardUrls.ConsoleLogsUrl(resource.Name));
        var viewport = new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false);
        Services.GetRequiredService<DimensionManager>().InvokeOnViewportInformationChanged(viewport);
        var cut = Render<Components.Pages.ConsoleLogs>(builder => builder
            .Add(p => p.ResourceName, resource.Name)
            .Add(p => p.ViewportInformation, viewport));
 
        await logs.Writer.WriteAsync([new ResourceLogLine(1, "startup output", false)]);
        cut.WaitForAssertion(() =>
        {
            var viewer = cut.FindComponent<LogViewer>();
            Assert.Single(viewer.Instance.LogEntries!.GetEntries(), l => l.RawContent == "startup output");
            Assert.Empty(cut.FindComponents<TerminalView>());
            Assert.Equal("console-logs-search", cut.FindComponent<FluentTextInput>().Instance.Name);
            Assert.Equal(
                new[]
                {
                    Resources.ConsoleLogs.DownloadLogs,
                    viewer.Instance.ShowTimestamp ? Resources.ConsoleLogs.ConsoleLogsTimestampHide : Resources.ConsoleLogs.ConsoleLogsTimestampShow,
                    Resources.ConsoleLogs.ConsoleLogsTimestampShowUtc,
                    viewer.Instance.NoWrapLogs ? Resources.ConsoleLogs.ConsoleLogsWrapLogs : Resources.ConsoleLogs.ConsoleLogsNoWrapLogs
                },
                cut.Instance.LogsMenuItemsForTest.Where(i => !i.IsDivider).Select(i => i.Text));
        });
    }
}