| File: Model\DashboardSettingsDatabaseTests.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 Microsoft.Extensions.Logging.Abstractions; using Xunit; namespace Aspire.Dashboard.Tests.Model; public sealed class DashboardSettingsDatabaseTests(ITestOutputHelper testOutputHelper) : IDisposable { private readonly TemporaryWorkspace _workspace = TemporaryWorkspace.Create(testOutputHelper); [Fact] public void Load_UnreadableDatabase_KeepsChangesInMemoryWithoutWriting() { // A directory where the database file should be makes opening it fail. var databasePath = Path.Combine(_workspace.Path, DashboardSettingsDatabase.DatabaseFileName); Directory.CreateDirectory(databasePath); var database = new DashboardSettingsDatabase(databasePath, NullLogger.Instance); var loaded = false; database.Load("test settings", _ => loaded = true); var saved = false; var result = database.TrySave("test settings", _ => saved = true); Assert.False(loaded); Assert.True(result); Assert.False(saved); } [Fact] public void TrySave_FailedWrite_ReturnsFalse() { var databasePath = Path.Combine(_workspace.Path, DashboardSettingsDatabase.DatabaseFileName); var database = new DashboardSettingsDatabase(databasePath, NullLogger.Instance); database.Load("test settings", _ => { }); var result = database.TrySave("test settings", connection => { using var command = connection.CreateCommand(); command.CommandText = "INSERT INTO missing_table (value) VALUES (1);"; command.ExecuteNonQuery(); }); Assert.False(result); } [Fact] public void Stores_UnreadableDatabase_AllKeepChangesInMemory() { var databasePath = Path.Combine(_workspace.Path, DashboardSettingsDatabase.DatabaseFileName); Directory.CreateDirectory(databasePath); var tags = new ResourceTagStore(databasePath, NullLogger.Instance); var order = new ResourceOrderStore(databasePath, NullLogger.Instance); var pins = new MetricPinStore(databasePath, NullLogger.Instance); var instrument = new OtlpInstrumentKey("System.Runtime", "dotnet.gc.heap.total_allocated"); Assert.True(tags.AddTag("api", "backend")); order.EnsureResources(["api_0", "cache_0"]); Assert.True(order.TryMove("cache_0", "api_0", after: false)); Assert.True(pins.SetPinned(instrument, pinned: true)); Assert.Equal(["backend"], tags.GetTags("api")); Assert.Equal(["cache_0", "api_0"], order.GetPositions().OrderBy(pair => pair.Value).Select(pair => pair.Key)); Assert.Equal([instrument], pins.GetPins()); Assert.Empty(Directory.GetFileSystemEntries(databasePath)); } public void Dispose() => _workspace.Dispose(); }