Slice 1 of docs/design-paliad-test-strategy-2026-05-19.md — the test infrastructure that would have caught mig 098 (digit-regex) and mig 099 (missing audit_reason) before the deploy hit prod. Three new files + one route addition: - Makefile: `make verify-migrations` (alias `verify-mig`) runs the per-migration dry-run + boot smoke against TEST_DATABASE_URL. Fails fast with a clear error if TEST_DATABASE_URL is unset so CI can't silently pass a missing env var. `make test` and `make test-go` cover the rest of the short / full Go suites. - internal/db/migrate_test.go (TestMigrations_DryRun): walks every pending *.up.sql in numeric order, applies each inside its own BEGIN..ROLLBACK transaction, fails on the first SQL error with the file name + Postgres error. "Pending" = greater than the scratch DB's current tracker version, so fresh-DB CI runs verify everything while developer scratch DBs only re-verify the new pending migration. Always non-destructive — the rollback runs even on success. - cmd/server/main_smoke_test.go (TestBootSmoke): boots the apply path end-to-end, asserts (a) db.ApplyMigrations returns nil, (b) the tracker advanced to the highest *.up.sql version on disk with dirty=false, (c) GET /healthz on the registered mux returns 200. The dry-run catches per-migration syntax errors; this catches the apply+bind path the container actually runs. - internal/handlers/handlers.go: adds a GET /healthz public route — a no-auth, no-DB liveness probe. Used by the boot smoke; also safe for any future orchestrator or uptime check. Both live-DB tests gate on TEST_DATABASE_URL and skip cleanly without it, matching the rest of paliad's live-DB test pattern. Verification: go build ./... clean, go vet ./... clean, go test -short ./internal/... ./cmd/... clean (all packages pass, live-DB tests skip), bun run build clean (2436 i18n keys unchanged). Per CLAUDE.md inventor → coder gate, NOT self-merged.
74 lines
3.3 KiB
Makefile
74 lines
3.3 KiB
Makefile
# Paliad — developer entrypoints.
|
|
#
|
|
# Targets here are the gate tier from the test-strategy design
|
|
# (docs/design-paliad-test-strategy-2026-05-19.md). Slice 1 lands:
|
|
#
|
|
# make verify-migrations — dry-run every pending migration (BEGIN..ROLLBACK)
|
|
# plus the full boot smoke (apply + tracker
|
|
# advances + /healthz returns 200).
|
|
# make verify-mig — alias for verify-migrations.
|
|
# make test — short test pass: go test ./internal/... -short
|
|
# plus the cmd/server package. Includes the
|
|
# live-DB tests when TEST_DATABASE_URL is set,
|
|
# skips them otherwise.
|
|
# make test-go — go test ./... -race (full Go suite).
|
|
#
|
|
# Future slices will extend this with:
|
|
# make test-frontend — bun test (Slice 3 / Slice 6)
|
|
# make e2e — Playwright golden-path suite (Slice 4)
|
|
#
|
|
# All targets are idempotent. None of them write to the filesystem outside
|
|
# the test runner's working dirs. None of them touch internal/db/migrations/
|
|
# files.
|
|
|
|
.PHONY: help verify-migrations verify-mig test test-go
|
|
|
|
help:
|
|
@echo "Paliad — developer targets"
|
|
@echo ""
|
|
@echo " verify-migrations Dry-run pending migrations + boot smoke (needs TEST_DATABASE_URL)"
|
|
@echo " verify-mig Alias for verify-migrations"
|
|
@echo " test Short test pass — covers gate tier"
|
|
@echo " test-go Full Go suite with race detector"
|
|
@echo ""
|
|
@echo "Set TEST_DATABASE_URL to enable live-DB tests. Example:"
|
|
@echo " export TEST_DATABASE_URL=postgres://paliad:...@localhost:11833/paliad_test"
|
|
|
|
# Gate target — the test that would have caught mig 098 / mig 099 before
|
|
# deploy. Combines:
|
|
# - TestMigrations_DryRun (internal/db): per-migration BEGIN..ROLLBACK
|
|
# - TestBootSmoke (cmd/server): apply-end-to-end + tracker advances
|
|
# + /healthz 200
|
|
#
|
|
# Requires TEST_DATABASE_URL. Without it, both tests skip and the target
|
|
# is effectively a no-op — guard against that explicitly so CI doesn't
|
|
# silently green a missing env var.
|
|
verify-migrations:
|
|
@if [ -z "$$TEST_DATABASE_URL" ]; then \
|
|
echo "ERROR: TEST_DATABASE_URL is not set."; \
|
|
echo " The migration gate cannot run without a scratch DB."; \
|
|
echo " Set TEST_DATABASE_URL to a Postgres URL the test can"; \
|
|
echo " open transactions against, e.g."; \
|
|
echo " export TEST_DATABASE_URL=postgres://paliad:PW@localhost:11833/paliad_test"; \
|
|
exit 2; \
|
|
fi
|
|
@echo "==> migration dry-run (per-mig BEGIN..ROLLBACK)"
|
|
go test -count=1 -run TestMigrations_DryRun ./internal/db/
|
|
@echo "==> boot smoke (apply + tracker + /healthz)"
|
|
go test -count=1 -run TestBootSmoke ./cmd/server/
|
|
|
|
verify-mig: verify-migrations
|
|
|
|
# Gate-tier test pass. -short skips the slow live-DB tests when the
|
|
# author opts out via `if testing.Short() { t.Skip(...) }`; today most of
|
|
# paliad's live-DB tests gate on TEST_DATABASE_URL instead, so -short is
|
|
# forward-compatible rather than load-bearing.
|
|
test:
|
|
go test -short ./internal/... ./cmd/...
|
|
|
|
# Full Go suite with race detection. Slower but catches concurrent-map
|
|
# regressions that -short would skip; intended for the merge-to-main gate
|
|
# (full suite, not per-PR).
|
|
test-go:
|
|
go test -race ./...
|