using System.Text.RegularExpressions; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using SQLInsight.Core.Instances; using SQLInsight.Repository; namespace SQLInsight.IntegrationTests; /// The menu in foldable groups, and the instance chooser behind per-instance menu entries. [Collection(SqlServerTestGroup.Name)] [Trait("Category", "Integration")] public partial class NavigationTests(SqlServerFixture sql) : IAsyncLifetime { private readonly string _database = "SQLInsightNav_" + Guid.NewGuid().ToString("N")[..8]; private WebApplicationFactory _factory = null!; private InsightRepository _repository = null!; public async Task InitializeAsync() { await sql.ExecuteAsSaAsync($"CREATE DATABASE [{_database}];"); _repository = new InsightRepository(sql.DatabaseConnectionString(_database)); await _repository.MigrateAsync(); _factory = new WebApplicationFactory().WithWebHostBuilder(b => { b.UseEnvironment("Development"); b.UseSetting("SQLInsight:Repository:ConnectionString", sql.DatabaseConnectionString(_database)); b.UseSetting("SQLInsight:Web:Authentication", "None"); }); } public async Task DisposeAsync() { await _factory.DisposeAsync(); await sql.ExecuteAsSaAsync($"ALTER DATABASE [{_database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [{_database}];"); } private static InstanceInfo Info => new() { ServerName = "AX01", Version = SqlServerVersion.Parse("16.0.4135.4"), ProductLevel = "RTM", Edition = "Standard Edition", EngineEdition = EngineEdition.Standard, }; /// The open groups' keys. private static List OpenGroups(string html) => OpenGroup().Matches(html).Select(m => m.Groups[1].Value).ToList(); [Fact] public async Task Menu_has_the_groups_and_opens_the_one_with_the_current_page() { var client = _factory.CreateClient(); var home = await client.GetStringAsync("/"); var rights = await client.GetStringAsync("/rettigheder"); var reports = await client.GetStringAsync("/rapporter"); foreach (var title in new[] { "OvervÄgning", "Analyse", "Konfiguration og sikkerhed", "Rapporter", "Community" }) { Assert.Contains($"{title}", home, StringComparison.Ordinal); } Assert.Contains("
", home, StringComparison.Ordinal); // no AX databases Assert.Contains("nav-toggle", home, StringComparison.Ordinal); // folds away on narrow screens } [Fact] public async Task Per_instance_entries_choose_the_instance_and_pages_below_an_instance_open_their_group() { await _repository.UpsertInstanceAsync(@"AX01\AX30", Info, "SqlClient", false, DateTimeOffset.UtcNow); await _repository.UpsertInstanceAsync(@"AX02\AX40", Info, "SqlClient", false, DateTimeOffset.UtcNow); var client = _factory.CreateClient(); var chooser = await client.GetStringAsync("/vaelg/konfiguration"); var configuration = await client.GetStringAsync($"/instanser/{Uri.EscapeDataString(@"AX01\AX30")}/konfiguration"); var waitType = await client.GetStringAsync($"/instanser/{Uri.EscapeDataString(@"AX01\AX30")}/ventetyper/LCK_M_X"); Assert.Contains($"/instanser/{Uri.EscapeDataString(@"AX02\AX40")}/konfiguration", chooser, StringComparison.Ordinal); Assert.Equal(["sikkerhed"], OpenGroups(configuration)); Assert.Equal(["analyse"], OpenGroups(waitType)); } [GeneratedRegex("
]*data-nav-group=\"([a-z]+)\"")] private static partial Regex OpenGroup(); }