using SQLInsight.Connectivity; using SQLInsight.Core.SyntheticChecks; using SQLInsight.Servers.Synthetic; namespace SQLInsight.IntegrationTests; /// The SQL login + query check against a real instance, with the least-privilege agent login. [Collection(SqlServerTestGroup.Name)] [Trait("Category", "Integration")] public class SyntheticSqlCheckTests(SqlServerFixture sql) { private sealed class NoBusinessConnector : IBusinessConnectorLocator { public BusinessConnectorInstallation? Find() => null; } private static SyntheticCheckRunner Runner() => new(new SqlConnectionFactory(), new NoBusinessConnector(), new ProcessRunner(), TimeProvider.System); private SyntheticCheckSettings Settings(string? query = null, string? database = null) => new() { Server = sql.Server, Authentication = "SqlLogin", UserName = SqlServerFixture.AgentLogin, TrustServerCertificate = true, Query = query, Database = database, }; [Fact] public async Task Login_and_query_with_response_time() { var result = await Runner().RunAsync(new SyntheticCheckRun(SyntheticCheckKind.Sql, Settings(), TimeSpan.FromSeconds(30), SqlServerFixture.AgentPassword), CancellationToken.None); var inDatabase = await Runner().RunAsync(new SyntheticCheckRun(SyntheticCheckKind.Sql, Settings("SELECT name FROM sys.objects", SqlServerFixture.TestDatabase), TimeSpan.FromSeconds(30), SqlServerFixture.AgentPassword), CancellationToken.None); Assert.True(result.Success, result.Message); Assert.Contains("Login og forespørgsel lykkedes", result.Message, StringComparison.Ordinal); Assert.Contains(result.Details, d => d.Name == "Rækker" && d.Value == "1"); Assert.True(inDatabase.Success, inDatabase.Message); } [Fact] public async Task A_wrong_password_and_a_query_without_rights_fail_with_the_reason() { var login = await Runner().RunAsync(new SyntheticCheckRun(SyntheticCheckKind.Sql, Settings(), TimeSpan.FromSeconds(30), "forkert"), CancellationToken.None); var denied = await Runner().RunAsync(new SyntheticCheckRun(SyntheticCheckKind.Sql, Settings("SELECT Secret FROM dbo.CustomerData", SqlServerFixture.TestDatabase), TimeSpan.FromSeconds(30), SqlServerFixture.AgentPassword), CancellationToken.None); var noPassword = await Runner().RunAsync(new SyntheticCheckRun(SyntheticCheckKind.Sql, Settings(), TimeSpan.FromSeconds(30)), CancellationToken.None); Assert.False(login.Success); Assert.StartsWith("Login på SQL Server fejlede", login.Message, StringComparison.Ordinal); Assert.False(denied.Success); // the least-privilege login can not read customer data Assert.StartsWith("Forespørgslen fejlede", denied.Message, StringComparison.Ordinal); Assert.False(noPassword.Success); } }