using SQLInsight.Core.Instances; namespace SQLInsight.Core.Tests; public class InstanceCapabilitiesTests { private static InstanceInfo Instance(string version, bool? hadr = null) => new() { ServerName = "test", Version = SqlServerVersion.Parse(version), Edition = "Enterprise Edition", EngineEdition = EngineEdition.Enterprise, IsHadrEnabled = hadr, }; [Fact] public void Sql2000_has_no_version_gated_capabilities() { var capabilities = InstanceCapabilities.From(Instance("8.00.2039")); Assert.Empty(capabilities.All); } [Fact] public void Sql2005_has_dmvs_but_no_extended_events() { var capabilities = InstanceCapabilities.From(Instance("9.00.5000.00")); Assert.True(capabilities.Has(Capability.DynamicManagementViews)); Assert.True(capabilities.Has(Capability.ViewServerStatePermission)); Assert.False(capabilities.Has(Capability.ExtendedEvents)); } [Fact] public void Sql2008_has_system_health_without_file_target() { var capabilities = InstanceCapabilities.From(Instance("10.0.6000.29")); Assert.True(capabilities.Has(Capability.SystemHealthSession)); Assert.False(capabilities.Has(Capability.SystemHealthFileTarget)); } [Theory] [InlineData("13.0.4001.0", false)] // 2016 SP1 [InlineData("13.0.5026.0", true)] // 2016 SP2 [InlineData("14.0.1000.169", true)] public void LastGoodCheckDbTime_requires_2016_sp2(string version, bool expected) { Assert.Equal(expected, InstanceCapabilities.From(Instance(version)).Has(Capability.LastGoodCheckDbTime)); } [Fact] public void Query_store_starts_with_2016() { Assert.False(InstanceCapabilities.From(Instance("12.0.6024.0")).Has(Capability.QueryStore)); Assert.True(InstanceCapabilities.From(Instance("13.0.6300.2")).Has(Capability.QueryStore)); } [Fact] public void Granular_permissions_start_with_2022() { Assert.False(InstanceCapabilities.From(Instance("15.0.4355.3")).Has(Capability.GranularServerPermissions)); Assert.True(InstanceCapabilities.From(Instance("16.0.4135.4")).Has(Capability.GranularServerPermissions)); } [Theory] [InlineData("15.0.4355.3", true, true)] [InlineData("15.0.4355.3", false, false)] [InlineData("15.0.4355.3", null, false)] [InlineData("10.50.6000.34", true, false)] // property cannot be true before 2012; ignore bad data public void Hadr_requires_both_version_and_runtime_setting(string version, bool? hadr, bool expected) { Assert.Equal(expected, InstanceCapabilities.From(Instance(version, hadr)).Has(Capability.HadrEnabled)); } [Fact] public void Missing_lists_only_absent_capabilities() { var capabilities = InstanceCapabilities.From(Instance("11.0.7001.0")); var missing = capabilities.Missing([Capability.ExtendedEvents, Capability.QueryStore, Capability.LastActualPlan]); Assert.Equal([Capability.QueryStore, Capability.LastActualPlan], missing); } } public class QueryStatsMemoryColumnsTests { [Theory] [InlineData("13.0.4001.0", false)] [InlineData("13.0.5026.0", true)] [InlineData("14.0.1000.169", false)] [InlineData("14.0.3015.40", true)] [InlineData("15.0.2000.5", true)] public void Available_from_2016_sp2_and_2017_cu3(string version, bool expected) { var info = new InstanceInfo { ServerName = "x", Version = SqlServerVersion.Parse(version), Edition = "e", EngineEdition = EngineEdition.Standard }; Assert.Equal(expected, InstanceCapabilities.From(info).Has(Capability.QueryStatsMemoryColumns)); } }