using MeterVault.App; using MeterVault.App.Theme; namespace MeterVault.Integration.Tests.Analysis; /// /// The cookie forms of the shell's preferences (D-48, D-49): the expanded navigation groups, the group holding a route, /// and the theme. Pure; no database. /// public sealed class ShellPreferenceTests { [Fact] public void Navigation_groups_round_trip_through_their_cookie() { Assert.Null(NavGroups.Parse(null)); Assert.Null(NavGroups.Parse(" ")); Assert.Null(NavGroups.Parse("nonsense.more")); Assert.Equal(["config", "types"], NavGroups.Parse("types.config")!.Order()); Assert.Equal(["views"], NavGroups.Parse("VIEWS.unknown")!); Assert.Empty(NavGroups.Parse("none")!); Assert.Equal("types.config", NavGroups.Format(["config", "types"])); Assert.Equal("none", NavGroups.Format([])); Assert.Equal("types.views", NavGroups.Format(NavGroups.DefaultExpanded)); } [Theory] [InlineData("energy/3", "types")] [InlineData("/energy/3?tab=history", "types")] [InlineData("solar", "views")] [InlineData("consumables?period=ytd", "views")] [InlineData("admin/tariffs", "config")] [InlineData("http://localhost:8760/admin/settings", "config")] [InlineData("", null)] [InlineData("meters/5", null)] [InlineData("trends", null)] [InlineData("import", null)] public void The_group_holding_a_route_is_known(string path, string? group) => Assert.Equal(group, NavGroups.GroupFor(path)); [Fact] public void Nav_state_starts_from_the_request_cookie() { var state = new NavState(); Assert.Null(state.SavedGroups); state.InitializeGroups("config"); Assert.Equal(["config"], state.SavedGroups!); var raised = 0; state.MetersChanged += () => raised++; state.NotifyMetersChanged(); Assert.Equal(1, raised); } [Theory] [InlineData("dark", true)] [InlineData("LIGHT", false)] [InlineData(" light ", false)] [InlineData("sepia", null)] [InlineData(null, null)] public void The_theme_cookie_names_a_mode(string? cookie, bool? dark) => Assert.Equal(dark, ThemeState.Parse(cookie)); [Fact] public void The_theme_defaults_to_dark_and_tokens_round_trip() { Assert.True(ThemeState.DefaultIsDark); Assert.True(ThemeState.Parse(ThemeState.Token(true))); Assert.False(ThemeState.Parse(ThemeState.Token(false))); } }