#!/usr/bin/env bash # Go-Tests laufen lassen, die eine echte Datenbank brauchen. # # Ohne TEST_DSN überspringen sie sich selbst – damit `go test ./...` überall # grün bleibt. Der Preis: Sie laufen dann **nie**, und ein Test, der nie läuft, # ist Dekoration. Dieses Skript ist der Weg, sie doch laufen zu lassen. # # ./scripts/db-tests.sh # alle # ./scripts/db-tests.sh ./internal/documents/ # # Es baut eine Wegwerf-Datenbank, spielt alle Migrationen ein, lässt die Tests # laufen und räumt sie wieder weg. Die Entwicklungsdatenbank wird nicht # angefasst. set -euo pipefail cd "$(dirname "$0")/.." ZIEL="${1:-./...}" DB=aether-dbtest NETZ=aether-dbtest-netz aufraeumen() { # -v nimmt das anonyme Volume mit. Ohne das blieb je Lauf eines liegen # (rund 49 MB); nach zehn Laeufen waren es ein halbes Gigabyte, das # niemandem gehoerte und in keiner Uebersicht auftauchte. docker rm -f -v "$DB" >/dev/null 2>&1 || true docker network rm "$NETZ" >/dev/null 2>&1 || true } trap aufraeumen EXIT aufraeumen docker network create "$NETZ" >/dev/null docker run -d --name "$DB" --network "$NETZ" \ -e POSTGRES_DB=aether -e POSTGRES_USER=aether -e POSTGRES_PASSWORD=probe \ postgres:16-alpine >/dev/null # Auf eine echte Abfrage warten, nicht auf pg_isready: Während initdb läuft, # meldet der einen Server, der gleich wieder verschwindet – und die ersten # Migrationen liefen dann ins Leere. for _ in $(seq 60); do docker exec "$DB" psql -U aether -d aether -tc "SELECT 1" >/dev/null 2>&1 && break sleep 1 done for f in backend/pkg/db/migrations/0*.up.sql; do docker exec -i "$DB" psql -v ON_ERROR_STOP=1 -q -U aether -d aether < "$f" done echo "Migrationen eingespielt." docker run --rm --network "$NETZ" \ -v "$PWD/backend":/src -v "$HOME/go/pkg/mod":/go/pkg/mod -w /src \ -e TEST_DSN="postgres://aether:probe@$DB:5432/aether?sslmode=disable" \ golang:1.25-alpine go test "$ZIEL"