# `internal/db/testdata/` — CI snapshot ## `prod-snapshot.sql` Schema-only `pg_dump` of paliad's prod DB (youpc-supabase paliad schema) plus the rows of `paliad.applied_migrations` that match this branch's on-disk migration set. **Purpose.** Lets CI's migration smoke (`.gitea/workflows/test.yaml`) restore a Postgres scratch DB to "paliad at HEAD-of-snapshot" without having to replay 131 migrations from scratch. ApplyMigrations on the restored DB sees the applied set and only runs whatever NEW migrations this PR adds — exactly the integration shape we want to test, and the same shape prod sees on every deploy. **Why a snapshot at all.** Running ApplyMigrations from scratch against a fresh `supabase/postgres:15.8.1.060` surfaces multiple fresh-DB idempotence bugs in historical migrations (raw `COMMIT;` in mig 051, missing `CREATE EXTENSION pg_trgm` for mig 037, ALTER POLICY exception-handler gaps in mig 024/027 — the last is fixed in this PR). Fixing them all is a separate cleanup. The snapshot sidesteps them by starting CI from a state where every historical migration is already applied as it was in prod. **Schema scope.** `--schema=paliad` only. Auth schema comes baked into `supabase/postgres`; CI's setup step installs `pg_trgm` before restoring. **Ownership.** `--no-owner --no-privileges` keeps the dump portable across role topologies (CI's supabase_admin / postgres / authenticated / anon don't have to match prod's exact role layout). The role-split smoke relies on `postgres` being a non-superuser, which is true on supabase/postgres by default. **Refresh.** Run `make refresh-snapshot` with `PALIAD_PROD_DATABASE_URL` set to a Postgres URL with `pg_dump` rights on youpc-supabase. The target appends data rows for `paliad.applied_migrations`, strips `\restrict` / `\unrestrict` commands (pg 16 dump → pg 15 restore), and filters out applied-migrations rows for versions beyond the branch's local max. The CI workflow consumes the resulting file verbatim. **Verify a refresh.** Boot a local scratch: ```bash docker run -d --rm --name paliad-snap \ -e POSTGRES_PASSWORD=ci -e POSTGRES_DB=paliad_scratch \ -p 15433:5432 supabase/postgres:15.8.1.060 sleep 5 docker exec -e PGPASSWORD=ci paliad-snap psql -h localhost -U supabase_admin -d paliad_scratch \ -c "GRANT CREATE ON DATABASE paliad_scratch TO postgres;" \ -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" cat internal/db/testdata/prod-snapshot.sql | docker exec -i -e PGPASSWORD=ci paliad-snap \ psql -h localhost -U postgres -d paliad_scratch -v ON_ERROR_STOP=1 TEST_DATABASE_URL="postgres://postgres:ci@localhost:15433/paliad_scratch?sslmode=disable" \ TEST_APP_DATABASE_URL="postgres://postgres:ci@localhost:15433/paliad_scratch?sslmode=disable" \ go test -count=1 -run 'TestMigrations|TestBootSmoke|TestHealthReady_Live' ./internal/db/ ./cmd/server/ docker stop paliad-snap ``` All four named tests must pass. If any fails after a refresh, investigate before merging — usually because a new migration was added to prod that this branch doesn't have on disk yet. **Why is the snapshot not gzipped?** Small enough (~200 KB) that the diff stays human-readable in `git diff` reviews. If it crosses ~1 MB, gzip + decompress-on-restore in CI. **Privacy.** Schema-only dump, no row data from any paliad table (except `paliad.applied_migrations`, which contains migration filenames + checksums — public info already in the repo).