using Npgsql; namespace Azaion.Missions.E2E.Fixtures; /// /// Class-scoped DB reset (xUnit ). /// Truncates all schema tables between test classes so read-path scenarios /// (AC-1, AC-2, AC-4) start from a known state. /// /// /// CASCADE is used so FK chains (mission → waypoint, mission → media) flush /// in one round-trip. Sequence resets are explicit because TRUNCATE alone /// does not reset SERIAL/BIGSERIAL counters when RESTART IDENTITY is omitted. /// public sealed class DbResetFixture : IDisposable { public DbResetFixture() { ResetDatabase(TestEnvironment.DbSideChannel); } public void Dispose() { /* No-op — TRUNCATE is the only state owned. */ } public static void ResetDatabase(string connectionString) { using var conn = new NpgsqlConnection(connectionString); conn.Open(); using var cmd = conn.CreateCommand(); cmd.CommandText = """ DO $$ DECLARE t TEXT; BEGIN FOR t IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename NOT LIKE 'pg_%' LOOP EXECUTE format('TRUNCATE TABLE %I RESTART IDENTITY CASCADE', t); END LOOP; END $$; """; cmd.ExecuteNonQuery(); } }