ci / lint-test (push) Successful in 1m5s
setup-test-db.sh wrote .env.test once with the Postgres container's bridge IP baked in, and Docker reassigns those on recreation. The file rotted silently: its stored 172.22.0.18 belongs to **gitea** as of today, and an earlier drift had the suite pointing its TRUNCATE at **postgres-pantry** — which it would have wiped had the credentials happened to match. Root-cause fix: stop persisting a host at all. - scripts/resolve-test-db.sh re-derives the DSN from the live container and rewrites .env.test. Resolution order is TEST_DATABASE_URL, then the container's published host port, then the bridge IP. `docker port postgres-personal` reports 127.0.0.1:5432 since the 2026-08-17 PG17 migration, so loopback is what gets used here — and a loopback address cannot be reassigned to another container, which is the whole point. (Note this supersedes the smarthome CLAUDE.md's "postgres-personal publishes no host port"; that is now stale.) The bridge-IP fallback is kept for a host where the port is not published, and the script never prints the password. - Wired as `pretest:integration`, so npm runs it before every integration run. .env.test becomes a generated artifact rather than stored configuration. - setup-test-db.sh now only creates the database and copies the schema, then delegates to the resolver. - helpers.ts::assertTestDatabase stays and its message now points at the resolver rather than at `docker inspect`. It still earns its place: running vitest directly bypasses the pretest hook, and a stale .env.test would then still be read. Docs: CLAUDE.md gains a Testing section carrying this, the prisma-generate trap for a fresh checkout or worktree, and the frozen-clock rule for tests whose subject is defined relative to "now". AGENTS.md updated for the same, and for lint now being blocking.
36 lines
1.3 KiB
Bash
Executable File
36 lines
1.3 KiB
Bash
Executable File
#!/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
|
|
|
|
# Create test database (ignore error if it already exists)
|
|
docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d postgres \
|
|
-c "CREATE DATABASE $TEST_DB;" 2>/dev/null || true
|
|
|
|
# Wipe and rebuild schema from production (schema only, no data)
|
|
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
|
|
|
|
echo "Schema ready."
|
|
|
|
bash "$(dirname "$0")/resolve-test-db.sh"
|
|
|
|
echo "Integration tests can now run with: npm run test:integration"
|