File: Model\DashboardViewPreferencesTests.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.Configuration;
using Aspire.Dashboard.Model;
using Aspire.Dashboard.Utils;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
 
namespace Aspire.Dashboard.Components.Tests.Model;
 
public class DashboardViewPreferencesTests : DashboardTestContext
{
    [Theory]
    [InlineData("Cards")]
    [InlineData("Resources")]
    public async Task Load_RemovedLayout_WritesSummaryOnce(string removedLayout)
    {
        object? stored = removedLayout;
        var writes = new List<(string Key, object? Value)>();
        var storage = new TestLocalStorage
        {
            OnGetUnprotectedAsync = key => key == BrowserStorageKeys.GroupOverview ? (true, stored) : (false, null),
            OnSetUnprotectedAsync = (key, value) =>
            {
                writes.Add((key, value));
                stored = value;
            }
        };
        FluentUISetupHelpers.AddCommonDashboardServices(this, localStorage: storage);
        var preferences = Services.GetRequiredService<DashboardViewPreferences>();
 
        await preferences.EnsureLoadedAsync();
        await preferences.EnsureLoadedAsync();
 
        Assert.Equal(GroupOverview.Summary, preferences.GroupOverview);
        Assert.Equal([(BrowserStorageKeys.GroupOverview, (object?)"Summary")], writes);
 
        await using var reopened = new DashboardViewPreferencesTests();
        FluentUISetupHelpers.AddCommonDashboardServices(reopened, localStorage: storage);
        await reopened.Services.GetRequiredService<DashboardViewPreferences>().EnsureLoadedAsync();
        Assert.Single(writes);
    }
 
    [Theory]
    [InlineData(null, GroupOverview.Summary)]
    [InlineData("", GroupOverview.Summary)]
    [InlineData("invalid", GroupOverview.Summary)]
    [InlineData("999", GroupOverview.Summary)]
    [InlineData("0", GroupOverview.Summary)]
    [InlineData("3", GroupOverview.Summary)]
    [InlineData("1", GroupOverview.Summary)]
    [InlineData("2", GroupOverview.Graph)]
    [InlineData("Summary", GroupOverview.Summary)]
    [InlineData("Graph", GroupOverview.Graph)]
    public async Task Load_ExistingOrInvalidPreference_UsesAvailableLayout(string? stored, GroupOverview expected)
    {
        var storage = new TestLocalStorage
        {
            OnGetUnprotectedAsync = key => key == BrowserStorageKeys.GroupOverview ? (true, stored) : (false, null),
            OnSetUnprotectedAsync = (_, _) => Assert.Fail("Only removed named layouts require a migration write.")
        };
        FluentUISetupHelpers.AddCommonDashboardServices(this, localStorage: storage);
        var preferences = Services.GetRequiredService<DashboardViewPreferences>();
 
        await preferences.EnsureLoadedAsync();
 
        Assert.Equal(expected, preferences.GroupOverview);
        Assert.Equal([GroupOverview.Summary, GroupOverview.Graph], Enum.GetValues<GroupOverview>());
        // Nothing stored for the density, so the list starts compact.
        Assert.Equal(ResourceListDensity.Compact, preferences.Density);
        Assert.Equal(RecordingsStyle.Panel, preferences.RecordingsStyle);
    }
 
    [Fact]
    public async Task Load_DisabledGraph_FallsBackToSummaryWithoutChangingExistingGraphPolicy()
    {
        var storage = new TestLocalStorage
        {
            OnGetUnprotectedAsync = key => key == BrowserStorageKeys.GroupOverview ? (true, "Graph") : (false, null),
            OnSetUnprotectedAsync = (_, _) => Assert.Fail("The graph preference is unchanged.")
        };
        FluentUISetupHelpers.AddCommonDashboardServices(this, localStorage: storage);
        Services.Configure<DashboardOptions>(options => options.UI.DisableResourceGraph = true);
        var preferences = Services.GetRequiredService<DashboardViewPreferences>();
 
        await preferences.EnsureLoadedAsync();
        await preferences.SetGroupOverviewAsync(GroupOverview.Graph);
 
        Assert.Equal(GroupOverview.Summary, preferences.GroupOverview);
    }
}