File: TrayIconStatusTests.cs
Web Access
Project: src\tests\Aspire.Tray.Tests\Aspire.Tray.Tests.csproj (Aspire.Tray.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.Tray.Tests.Helpers;
 
namespace Aspire.Tray.Tests;
 
public class TrayIconStatusTests
{
    [Fact]
    public void NothingRunningShowsThePlainLogo()
    {
        Assert.Equal(TrayIconStatus.Idle, TrayIconStatusRules.Get(TrayPanelSamples.Empty()));
        Assert.False(TrayIconStatusRules.HasBadge(TrayIconStatus.Idle));
        Assert.False(TrayIconStatusRules.IsDimmed(TrayIconStatus.Idle));
    }
 
    [Fact]
    public void HealthyRunningAppHostsShowTheRunningBadge()
    {
        var state = new TrayViewState(DiscoveryState.Live,
            [TrayPanelSamples.Running("/src/A/A.AppHost.csproj", 1), TrayPanelSamples.Running("/src/B/B.AppHost.csproj", 2, AppHostHealth.Unknown)], "");
 
        Assert.Equal(TrayIconStatus.Running, TrayIconStatusRules.Get(state));
        Assert.True(TrayIconStatusRules.HasBadge(TrayIconStatus.Running));
    }
 
    [Theory]
    [InlineData((int)AppHostHealth.Warning)]
    [InlineData((int)AppHostHealth.Unhealthy)]
    public void UnhealthyResourcesShowTheAttentionBadge(int health)
    {
        var state = new TrayViewState(DiscoveryState.Live, [TrayPanelSamples.Running("/src/A/A.AppHost.csproj", 1, (AppHostHealth)health)], "");
 
        Assert.Equal(TrayIconStatus.Attention, TrayIconStatusRules.Get(state));
    }
 
    [Fact]
    public void ActionErrorsAndNoticesShowTheAttentionBadgeWhileAppHostsRun()
    {
        var running = TrayPanelSamples.Running("/src/A/A.AppHost.csproj", 1);
        var failedStop = new TrayViewState(DiscoveryState.Live, [running with { Error = "Stop timed out." }], "");
        var notice = new TrayViewState(DiscoveryState.Live, [running], "") { Notice = "Unable to save AppHost history." };
        var noticeWhileIdle = new TrayViewState(DiscoveryState.Live, [], "") { Notice = "Unable to save AppHost history." };
 
        Assert.Equal(TrayIconStatus.Attention, TrayIconStatusRules.Get(failedStop));
        Assert.Equal(TrayIconStatus.Attention, TrayIconStatusRules.Get(notice));
        Assert.Equal(TrayIconStatus.Idle, TrayIconStatusRules.Get(noticeWhileIdle));
    }
 
    [Fact]
    public void StartingAppHostsCountAsRunning()
    {
        var state = new TrayViewState(DiscoveryState.Live, [TrayPanelSamples.Offline("/src/A/A.cs", starting: true)], "");
 
        Assert.Equal(TrayIconStatus.Running, TrayIconStatusRules.Get(state));
    }
 
    [Theory]
    [InlineData((int)DiscoveryState.Connecting, (int)TrayIconStatus.Connecting)]
    [InlineData((int)DiscoveryState.Disconnected, (int)TrayIconStatus.Unavailable)]
    [InlineData((int)DiscoveryState.Incompatible, (int)TrayIconStatus.Unavailable)]
    [InlineData((int)DiscoveryState.LimitExceeded, (int)TrayIconStatus.Unavailable)]
    public void DiscoveryProblemsDimTheLogoWithoutABadge(int discovery, int expected)
    {
        var state = new TrayViewState((DiscoveryState)discovery, [TrayPanelSamples.Running("/src/A/A.AppHost.csproj", 1)], "");
        var status = TrayIconStatusRules.Get(state);
 
        Assert.Equal((TrayIconStatus)expected, status);
        Assert.True(TrayIconStatusRules.IsDimmed(status));
        Assert.False(TrayIconStatusRules.HasBadge(status));
    }
}