sqlinsight-pro/tests/SQLInsight.Core.Tests/InstanceCapabilitiesTests.cs
Claude f8aa0c307b
Some checks are pending
CI / Build og unit tests (push) Waiting to run
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
Fase 0: solution structure, capability model, rule engine, least-privilege script
- .NET 10 solution with Core, Connectivity, Rules, Contracts, Agent, Web and Hub
- Capability model gating collectors and rules by SQL Server version (2000 and later);
  rules that cannot run are reported as not measurable, never as passed
- Connectivity via Microsoft.Data.SqlClient with ODBC fallback for legacy instances,
  hardened monitoring session settings valid back to SQL Server 2000
- Support lifecycle rule (SQLI-VER-001) with lifecycle data shipped as a rule pack
- Version-aware least-privilege permissions script, verified by integration tests
  against SQL Server in Docker (reads monitoring sources, cannot read customer data)
- Forgejo Actions CI, contributing guide, code of conduct, issue templates,
  legacy version notes

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

85 lines
3 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.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);
}
}