sqlinsight-pro/tests/SQLInsight.Core.Tests/InstanceCapabilitiesTests.cs
Claude edb7410f76
Some checks are pending
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
CI / Build og unit tests (push) Waiting to run
Fase 2: Azure SQL Managed Instance, docs and rule catalog test
- Managed Instance reports 12.0.2000.8 but is evergreen: treated as the
  newest engine with all capabilities; new SelfManagedInfrastructure
  capability so backup, CHECKDB, files, tempdb, memory, patch level and
  lifecycle rules report 'handled by Azure' instead of false findings
- Microsoft Entra ID login (managed identity, service principal, default
  credential chain) via SqlConnection.AccessTokenCallback
- Least-privilege script recognizes Managed Instance; deadlock collector
  falls back to the ring buffer when event files cannot be read
- Web UI shows the right release for Managed Instance
- README and installation docs: notifications and Managed Instance
- Catalog test: 61 rules with unique, well-formed ids

Integration suite green on SQL Server 2017 and 2022.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 08:23:40 +00:00

117 lines
4.5 KiB
C#

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.Equal([Capability.SelfManagedInfrastructure], capabilities.All);
}
[Fact]
public void Managed_instance_is_evergreen_and_not_self_managed()
{
// Azure SQL Managed Instance always reports 12.0.2000.8.
var mi = Instance("12.0.2000.8") with { EngineEdition = EngineEdition.AzureSqlManagedInstance, IsHadrEnabled = true };
var capabilities = InstanceCapabilities.From(mi);
Assert.Equal(SqlServerRelease.AzureSqlManagedInstance, mi.Release);
Assert.True(capabilities.Has(Capability.QueryStore));
Assert.True(capabilities.Has(Capability.GranularServerPermissions));
Assert.True(capabilities.Has(Capability.QueryStatsMemoryColumns));
Assert.False(capabilities.Has(Capability.SelfManagedInfrastructure));
Assert.False(capabilities.Has(Capability.HadrEnabled)); // Azure runs the availability of MI
}
[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));
}
}