#!/usr/bin/env bash # Server-Tests gegen PostgreSQL in Docker (→ KONZEPT.md 14.2: SQLite oder PostgreSQL). # # scripts/postgres-test.sh # ganze Testsuite # scripts/postgres-test.sh -k bundle # weitere Argumente gehen an pytest # POSTGRES_IMAGE=postgres:16.10 scripts/postgres-test.sh # scripts/postgres-test.sh --compose # die dauerhafte PostgreSQL aus docker-compose.yml nutzen # # Startet einen Wegwerf-Container (Daten im Speicher), führt Migrationen und # Tests aus, je Test eine eigene Datenbank, und entfernt den Container danach. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" if [[ "${1:-}" == "--compose" ]]; then shift (cd "$ROOT" && docker compose up -d --wait postgres >/dev/null) echo "PostgreSQL aus docker-compose.yml (127.0.0.1:55432)" cd "$ROOT/server" exec env HUGIN_TEST_POSTGRES="postgresql+psycopg://hugin:hugin@127.0.0.1:55432/postgres" \ uv run pytest -q -p no:warnings "$@" fi IMAGE="${POSTGRES_IMAGE:-postgres:17.6}" NAME="hugin-postgres-test-$$" PASSWORD="hugin-test" docker run -d --rm --name "$NAME" -e POSTGRES_PASSWORD="$PASSWORD" -e POSTGRES_USER=hugin \ --tmpfs /var/lib/postgresql/data -p 127.0.0.1::5432 "$IMAGE" >/dev/null trap 'rc=$?; docker rm -f "$NAME" >/dev/null 2>&1 || true; exit $rc' EXIT PORT="$(docker port "$NAME" 5432/tcp | head -1 | sed 's/.*://')" for _ in $(seq 60); do docker exec "$NAME" pg_isready -U hugin -q 2>/dev/null && break sleep 0.5 done docker exec "$NAME" pg_isready -U hugin -q || { echo "PostgreSQL startet nicht"; exit 1; } echo "PostgreSQL $(docker exec "$NAME" postgres --version | awk '{print $3}') auf Port $PORT" cd "$ROOT/server" HUGIN_TEST_POSTGRES="postgresql+psycopg://hugin:$PASSWORD@127.0.0.1:$PORT/postgres" \ uv run pytest -q -p no:warnings "$@"