ci: run integration tests on PRs (ephemeral Postgres)
All checks were successful
PR checks / checks (pull_request) Successful in 31s
PR checks / integration (pull_request) Successful in 37s

Adds an `integration` job to PR checks: spins up a throwaway postgres:16
container on a random host port (isolated from prod / pelagia_test / staging),
applies migrations, dev-seeds, and runs `pnpm test:integration` (108 tests).
Container is always torn down via an EXIT trap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hardik 2026-06-21 02:40:59 +05:30
parent 4c53aeecb0
commit 991b7ca5dd

View file

@ -4,6 +4,7 @@ name: PR checks
# - code changes must ship with tests (docs/config/automation are exempt)
# - type-check is clean across the whole project (tests included)
# - unit tests pass
# - integration tests pass against an ephemeral Postgres (migrate + seed)
# Runs on the pms1 host runner. See automation/README.md > "Contribution policy".
on:
@ -56,3 +57,45 @@ jobs:
set -e
export NVM_DIR="$HOME/.nvm"; . "$NVM_DIR/nvm.sh"
cd App && pnpm test # jsdom unit tests, no DB — must pass
integration:
runs-on: host
steps:
- name: Checkout PR
uses: actions/checkout@v4
- name: Integration tests (ephemeral Postgres)
run: |
set -euo pipefail
export NVM_DIR="$HOME/.nvm"; . "$NVM_DIR/nvm.sh"
# Throwaway Postgres per run — isolated from prod / pelagia_test / staging.
# A random host port avoids collisions with the host DB and concurrent runs.
PG="ci-pg-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT:-1}"
cleanup() { docker rm -f "$PG" >/dev/null 2>&1 || true; }
trap cleanup EXIT
docker rm -f "$PG" >/dev/null 2>&1 || true
docker run -d --name "$PG" \
-e POSTGRES_USER=ci -e POSTGRES_PASSWORD=ci -e POSTGRES_DB=pelagia_ci \
-p 127.0.0.1::5432 postgres:16 >/dev/null
for i in $(seq 1 30); do
docker exec "$PG" pg_isready -U ci -d pelagia_ci >/dev/null 2>&1 && break
sleep 1
done
PORT=$(docker inspect --format '{{ (index (index .NetworkSettings.Ports "5432/tcp") 0).HostPort }}' "$PG")
export DATABASE_URL="postgresql://ci:ci@127.0.0.1:${PORT}/pelagia_ci"
# Non-secret placeholders so auth.ts (reads these at module load) boots in dev mode.
export NEXTAUTH_SECRET="ci-secret"
export NEXTAUTH_URL="http://localhost:3000"
export AZURE_AD_CLIENT_ID="placeholder"
export AZURE_AD_CLIENT_SECRET="placeholder"
export AZURE_AD_TENANT_ID="placeholder"
cd App
pnpm install --frozen-lockfile
pnpm db:generate
pnpm db:migrate:deploy # apply migrations to the fresh DB
pnpm db:seed # dev seed — integration tests rely on it
pnpm test:integration # node + real DB — must pass