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();
}
}