#!/bin/bash # Creates the personal_test database and copies the production schema into it. # Run once (and after any migration) before integration tests: npm run test:setup # # It no longer writes a host into .env.test. That was the #161 defect: the file # was written once with the container's bridge IP and then rotted as the IP was # reassigned. scripts/resolve-test-db.sh now re-derives the DSN before every # integration run (wired as `pretest:integration`), and this script just calls it # at the end so a fresh setup leaves a usable .env.test behind. set -e PG_CONTAINER=${PG_CONTAINER:-postgres-personal} PG_USER=${PG_USER:-personal} TEST_DB=${TEST_DB:-personal_test} if ! docker inspect "$PG_CONTAINER" >/dev/null 2>&1; then echo "ERROR: Could not find container '$PG_CONTAINER'" exit 1 fi # Drop and recreate, so the schema is rebuilt rather than replayed. Replaying # the dump over an existing database was a silent no-op for every migration: # each CREATE TABLE failed with "already exists" and the old shape survived, so # a new column (0039's expense_metadata.notified_at, 2026-10-03) never reached # the test database. The guard is because this now DROPs: it refuses anything # not named *_test, whatever TEST_DB was set to. case "$TEST_DB" in *_test) ;; *) echo "ERROR: refusing to drop '$TEST_DB' -- the test database must be named *_test"; exit 1 ;; esac docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d postgres -q \ -c "DROP DATABASE IF EXISTS $TEST_DB WITH (FORCE);" \ -c "CREATE DATABASE $TEST_DB;" echo "Copying schema from $PG_USER to $TEST_DB..." docker exec "$PG_CONTAINER" pg_dump -U "$PG_USER" --schema-only "$PG_USER" \ | docker exec -i "$PG_CONTAINER" psql -U "$PG_USER" -d "$TEST_DB" -q -v ON_ERROR_STOP=1 echo "Schema ready." bash "$(dirname "$0")/resolve-test-db.sh" echo "Integration tests can now run with: npm run test:integration"