sqlinsight-pro/tests/SQLInsight.Collectors.Tests/SqlSelectionTests.cs
Claude 15907401a9
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: Always On availability groups and SQL Agent jobs
- Availability group collector (replica and database replica states,
  queues, commit times) and rules: SQLI-AG-001 unhealthy/disconnected
  replica or suspended data movement (scripts HADR RESUME), SQLI-AG-002
  secondary behind (estimated data loss and redo time)
- SQL Agent collector using only granted msdb tables (no EXECUTE on msdb
  functions): SQLI-JOB-001 failed job with the failing step's message
  (backup/CHECKDB jobs are High), SQLI-JOB-002 SQL Agent not running
- Integration tests create a real availability group (CLUSTER_TYPE NONE)
  and a failing job in the test container (HADR and Agent enabled)

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

79 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SQLInsight.Collectors.Concurrency;
using SQLInsight.Collectors.Databases;
using SQLInsight.Core.Instances;
namespace SQLInsight.Collectors.Tests;
/// <summary>
/// The version-specific SQL that cannot be run in CI (SQL Server 2000–2016 have no containers).
/// </summary>
public class SqlSelectionTests
{
private static InstanceInfo Instance(string version) => new()
{
ServerName = "x",
Version = SqlServerVersion.Parse(version),
Edition = "Standard",
EngineEdition = EngineEdition.Standard,
};
[Theory]
[InlineData("8.00.2039", "master.dbo.sysprocesses WHERE spid = 1")]
[InlineData("9.00.5000.00", "sys.databases WHERE database_id = 2")]
[InlineData("10.50.6000.34", "sqlserver_start_time")]
public void Start_time_source_per_version(string version, string expected)
{
Assert.Contains(expected, Db.StartTimeExpression(SqlServerVersion.Parse(version)), StringComparison.Ordinal);
}
[Fact]
public void Blocking_on_2008_counts_transactions_without_open_transaction_count()
{
var sql = BlockingCollector.BuildSql2005(SqlServerVersion.Parse("10.50.6000.34"));
Assert.Contains("sys.dm_tran_session_transactions", sql, StringComparison.Ordinal);
Assert.DoesNotContain("open_transaction_count", sql, StringComparison.Ordinal);
Assert.DoesNotContain("s.database_id", sql, StringComparison.Ordinal);
}
[Fact]
public void Databases_on_2012_detect_availability_groups_and_skip_checkdb_property()
{
var instance = Instance("11.0.7001.0");
var sql = DatabaseCollector.BuildSql2005(instance, InstanceCapabilities.From(instance));
Assert.Contains("sys.dm_hadr_database_replica_states", sql, StringComparison.Ordinal);
Assert.DoesNotContain("LastGoodCheckDbTime", sql, StringComparison.Ordinal);
}
[Fact]
public void Databases_on_2005_do_not_touch_hadr()
{
var instance = Instance("9.00.5000.00");
var sql = DatabaseCollector.BuildSql2005(instance, InstanceCapabilities.From(instance));
Assert.DoesNotContain("hadr", sql, StringComparison.OrdinalIgnoreCase);
Assert.DoesNotContain("replica_id", sql, StringComparison.Ordinal);
}
[Fact]
public void Deadlock_file_read_continues_from_last_position_with_escaped_literal()
{
var sql = DeadlockCollector.BuildFileSql("/var/opt/mssql/log/system_health_0_1'2.xel", 12345);
Assert.Contains("N'/var/opt/mssql/log/system_health_0_1''2.xel', 12345", sql, StringComparison.Ordinal);
}
}
public class AgentJobTimeTests
{
[Theory]
[InlineData(20260929, 130507, "2026-09-29 13:05:07")]
[InlineData(20260101, 5, "2026-01-01 00:00:05")]
public void Converts_msdb_run_date_and_time(int date, int time, string expected)
{
Assert.Equal(DateTime.Parse(expected, System.Globalization.CultureInfo.InvariantCulture), SQLInsight.Collectors.Instance.AgentJobCollector.ToDateTime(date, time));
}
}