#!/usr/bin/env bash
# ============================================================================
# RLS integration-test runner (KAR-779 / R61)
# ============================================================================
# Spins a throwaway Postgres 17, loads the bootstrap schema + RLS policies +
# the test fixture, then runs the gated RLS isolation test against it.
#
#   ./scripts/rls-test/run.sh
#
# Die Ladereihenfolge und die Testliste stehen in load-schema.sh und werden
# mit dem CI-Job (.github/workflows/rls.yml) GETEILT — zwei Kopien wuerden
# auseinanderlaufen und CI pruefte dann ein anderes Schema als lokal.
# Benoetigt Docker + die devDependencies des Repos (`pg`).
# ============================================================================
set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
CONTAINER="kadi-rls-test-pg"
PORT="${RLS_TEST_PORT:-55432}"
PGPASSWORD_VAL="rlstest"

cleanup() { docker rm -f "$CONTAINER" >/dev/null 2>&1 || true; }
trap cleanup EXIT

cleanup
echo "▶ starting Postgres 17 (port $PORT)…"
docker run -d --name "$CONTAINER" \
  -e POSTGRES_PASSWORD="$PGPASSWORD_VAL" -e POSTGRES_DB=rlstest \
  -p "$PORT:5432" postgres:17-alpine >/dev/null

echo "▶ waiting for readiness…"
for _ in $(seq 1 40); do
  if docker exec "$CONTAINER" pg_isready -U postgres -d rlstest >/dev/null 2>&1; then break; fi
  sleep 1
done

PSQL=(docker exec -i "$CONTAINER" psql -U postgres -d rlstest -v ON_ERROR_STOP=1 -q)

psql_exec() { "${PSQL[@]}" < "$1" >/dev/null; }

# shellcheck source=scripts/rls-test/load-schema.sh
source "$ROOT/scripts/rls-test/load-schema.sh"
load_rls_schema

export RLS_TEST_DATABASE_URL="postgresql://postgres:${PGPASSWORD_VAL}@127.0.0.1:${PORT}/rlstest"
echo "▶ running RLS isolation tests…"
cd "$ROOT"
npx vitest run "${RLS_TEST_FILES[@]}"

# Zweite Phase: erst jetzt das interne Zugriffsmodell anwenden und dagegen
# pruefen. Reihenfolge ist zwingend — die Migration hebt genau die Isolation
# auf, die oben nachgewiesen wurde.
apply_internal_open_access
echo "▶ running open-access model tests…"
npx vitest run "${RLS_OPEN_MODEL_TEST_FILES[@]}"
