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