mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
67609d71c0
Add migrations.Rollback(ctx, db, dir, steps): reverses the N most recently applied migrations, newest first, each in its own committed transaction under the same advisory lock Apply uses. Down SQL lives in migrations/down/<version>.sql (a subdirectory, so Apply's *.sql glob over the main directory is untouched); a missing down file for a migration being rolled back is a hard error rather than a silent partial reversal. Wire it into cmd/migrate as --rollback=N. Add down files for all six existing migrations, each dropping objects in FK-safe reverse dependency order. Adversarial review: could not run the new integration test (TestPostgreSQLMigrationsRollBackAndReapplyCleanly, gated behind COSMIC_CLASH_POSTGRES_DSN / scripts/run_postgres_integration.sh) against a real database in this sandbox - Docker Desktop's own overlayfs ran out of space pulling postgres:17-alpine, unrelated to this change. Verified instead by hand-tracing every DROP against its forward migration's FK graph, confirming Apply's directory glob does not pick up the down/ subdirectory, and a clean go build/vet/test -tags integration. Worth an explicit real run before this is trusted in CI.
25 lines
615 B
Go
25 lines
615 B
Go
package migrations
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
)
|
|
|
|
func TestApplyRejectsMissingDatabaseOrDirectory(t *testing.T) {
|
|
if err := Apply(context.Background(), nil, "."); err == nil {
|
|
t.Fatal("nil database accepted")
|
|
}
|
|
if err := Apply(context.Background(), nil, ""); err == nil {
|
|
t.Fatal("empty directory accepted")
|
|
}
|
|
}
|
|
|
|
func TestRollbackRejectsMissingDatabaseDirectoryOrSteps(t *testing.T) {
|
|
if err := Rollback(context.Background(), nil, ".", 1); err == nil {
|
|
t.Fatal("nil database accepted")
|
|
}
|
|
if err := Rollback(context.Background(), nil, "", 1); err == nil {
|
|
t.Fatal("empty directory accepted")
|
|
}
|
|
}
|