using SQLInsight.Core.Data; namespace SQLInsight.Core.Tests; public class ConfigurationFingerprintTests { private static readonly DateTimeOffset At = new(2026, 10, 2, 8, 0, 0, TimeSpan.Zero); [Fact] public void Changed_added_and_removed_items_are_listed() { ConfigurationItem[] before = [ new("sp_configure", "max degree of parallelism", "0"), new("Trace flag", "1222", "til"), new("Tjenestekonto", "SQL Server (MSSQLSERVER)", @"NT Service\MSSQLSERVER"), ]; ConfigurationItem[] after = [ new("sp_configure", "max degree of parallelism", "1"), new("Trace flag", "3226", "til"), new("Tjenestekonto", "SQL Server (MSSQLSERVER)", @"NT Service\MSSQLSERVER"), ]; var changes = ConfigurationFingerprint.Diff(before, after, At); Assert.Equal(3, changes.Count); Assert.Contains(new ConfigurationChange("sp_configure", "max degree of parallelism", "0", "1", At), changes); Assert.Contains(new ConfigurationChange("Trace flag", "3226", null, "til", At), changes); Assert.Contains(new ConfigurationChange("Trace flag", "1222", "til", null, At), changes); } [Fact] public void Same_setup_has_no_changes() => Assert.Empty(ConfigurationFingerprint.Diff([new("Instans", "Collation", "Danish_Norwegian_CI_AS")], [new("Instans", "Collation", "Danish_Norwegian_CI_AS")], At)); [Fact] public void Fingerprint_covers_options_flags_services_and_instance_settings() { var instance = new InstanceConfigurationSnapshot { CapturedAt = At, ProductVersion = "16.0.4135.4", ProductLevel = "RTM", Collation = "Danish_Norwegian_CI_AS", Services = [new ServiceInfo("SQL Server (MSSQLSERVER)", @"KUNDE\svc-sql", "Automatic", "Running", true)], InstantFileInitialization = true, TempdbFiles = [new TempdbFile("tempdev", "ROWS", 8, "64 MB", "ubegrænset"), new TempdbFile("temp2", "ROWS", 8, "64 MB", "ubegrænset"), new TempdbFile("templog", "LOG", 8, "64 MB", "ubegrænset")], }; var items = ConfigurationFingerprint.Items(instance, [new ConfigurationOption("max server memory (MB)", 8192, 8192)], [1222]); Assert.Contains(new ConfigurationItem("sp_configure", "max server memory (MB)", "8192"), items); Assert.Contains(new ConfigurationItem("Trace flag", "1222", "til"), items); Assert.Contains(new ConfigurationItem("Tjenestekonto", "SQL Server (MSSQLSERVER)", @"KUNDE\svc-sql"), items); Assert.Contains(new ConfigurationItem("Instans", "Version", "16.0.4135.4 RTM"), items); Assert.Contains(new ConfigurationItem("Tempdb", "Antal datafiler", "2"), items); Assert.Contains(new ConfigurationItem("Hukommelse", "Instant File Initialization", "til"), items); Assert.DoesNotContain(items, i => i.Name == "Lock Pages in Memory"); // unknown on this build: not part of the fingerprint } [Theory] [InlineData("cost threshold for parallelism", 5L)] [InlineData("max server memory (MB)", 2147483647L)] [InlineData("default trace enabled", 1L)] [InlineData("an option nobody knows", null)] public void Defaults_are_known_for_the_documented_options(string option, long? expected) => Assert.Equal(expected, ConfigurationFingerprint.DefaultValue(option)); }