using Microsoft.Data.SqlClient; namespace ZB.MOM.WW.Secrets.Replicator.SqlServer.Tests.Live; /// /// Shared connection details for the env-gated live SQL-Server suite. /// /// /// Gated on SECRETS_SQLSERVER_CONNSTR and skips cleanly when it is unset, matching the family /// live-test idiom — the offline suite must stay runnable on any machine. Set it to a database the /// test is allowed to create and drop a schema in, for example: /// Server=10.100.0.35,31433;Database=ZbSecretsTest;User Id=sa;Password=...;TrustServerCertificate=True. /// public static class LiveSqlServer { /// Environment variable holding the live connection string. public const string ConnectionStringVariable = "SECRETS_SQLSERVER_CONNSTR"; /// The configured connection string, or when the suite is not enabled. public static string? ConnectionString => Environment.GetEnvironmentVariable(ConnectionStringVariable); /// Whether the live suite should run. public static bool IsEnabled => !string.IsNullOrWhiteSpace(ConnectionString); /// Skip reason shown when the suite is not enabled. public const string SkipReason = "Live SQL-Server suite disabled; set SECRETS_SQLSERVER_CONNSTR to enable."; /// /// Builds options against a throwaway schema so parallel runs and repeat runs cannot collide, /// and so a failed run leaves no trace in a shared database. /// /// The unique schema name for this test. /// Options targeting that schema. public static SqlServerSecretsOptions OptionsFor(string schemaName) => new() { ConnectionString = ConnectionString!, SchemaName = schemaName, }; /// Generates a unique, allow-list-legal schema name for one test class. /// A fresh schema name. public static string NewSchemaName() => $"zbtest_{Guid.NewGuid():N}"[..32]; /// Drops the throwaway schema and its tables. /// The schema to drop. /// A task that completes when the schema is gone. public static async Task DropSchemaAsync(string schemaName) { if (!IsEnabled) { return; } await using var connection = new SqlConnection(ConnectionString); await connection.OpenAsync(); await using SqlCommand command = connection.CreateCommand(); command.CommandText = $""" IF OBJECT_ID(N'[{schemaName}].[secret]', N'U') IS NOT NULL DROP TABLE [{schemaName}].[secret]; IF OBJECT_ID(N'[{schemaName}].[schema_version]', N'U') IS NOT NULL DROP TABLE [{schemaName}].[schema_version]; IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = N'{schemaName}') EXEC(N'DROP SCHEMA [{schemaName}]'); """; await command.ExecuteNonQueryAsync(); } }