sqlinsight-pro/tests/SQLInsight.Core.Tests/InstanceCapabilitiesTests.cs
Claude f1d3f5188e
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 2: plan cache analysis
Collector takes the 50 heaviest statements (CPU, last 24 h), fetches
statement plans as text (dm_exec_query_plan returns NULL for deeply
nested plans) and analyzes them in C#. Rules:
- SQLI-PLAN-001 implicit conversion preventing an index seek
- SQLI-PLAN-002 join without predicate (deliberate CROSS JOIN excluded)
- SQLI-PLAN-003 non-inlined scalar UDF in a heavy statement
- SQLI-PLAN-004 spills to tempdb, SQLI-PLAN-005 oversized memory grants
  (2016 SP2+ / 2017 CU3+ columns, new capability)
Verified against real plans in SQL Server.

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

101 lines
3.6 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);
}
}
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));
}
}