92 lines
3.6 KiB
Bash
92 lines
3.6 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Kjører backend-testsuiten (tests/) mot en fullt isolert scratch-database --
|
||
|
|
# opprettet, migrert og ryddet opp automatisk. Rører ALDRI den ekte
|
||
|
|
# teecup_db (egen database + egen rolle, droppet igjen ved slutt).
|
||
|
|
#
|
||
|
|
# Gjenbruker den samme teeoff_db-Postgres-containeren som all manuell
|
||
|
|
# scratch-verifisering i prosjektet har brukt til nå (se CLAUDE.md), men
|
||
|
|
# automatiserer opprettelse/migrering/opprydning i stedet for å gjøre det
|
||
|
|
# for hånd hver gang.
|
||
|
|
#
|
||
|
|
# Bruk: ./scripts/run_backend_tests.sh
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
cd "$(dirname "$0")/.."
|
||
|
|
|
||
|
|
SUFFIX="$(openssl rand -hex 4)"
|
||
|
|
DB_NAME="teecup_pytest_${SUFFIX}"
|
||
|
|
APP_ROLE="teecup_app_pytest_${SUFFIX}"
|
||
|
|
APP_PASSWORD="$(openssl rand -base64 24)"
|
||
|
|
SESSION_SECRET="$(openssl rand -base64 32)"
|
||
|
|
MIGRATIONS_TMPDIR="$(mktemp -d)"
|
||
|
|
PATCHED_002="${MIGRATIONS_TMPDIR}/002_roles_and_grants.sql"
|
||
|
|
|
||
|
|
cleanup() {
|
||
|
|
echo "--- Rydder opp scratch-database ${DB_NAME} og rolle ${APP_ROLE} ---"
|
||
|
|
docker exec teeoff_db psql -U teeoff_admin -d postgres -v ON_ERROR_STOP=1 \
|
||
|
|
-c "DROP DATABASE IF EXISTS ${DB_NAME};" \
|
||
|
|
-c "DROP ROLE IF EXISTS ${APP_ROLE};" >/dev/null
|
||
|
|
rm -rf "${MIGRATIONS_TMPDIR}"
|
||
|
|
}
|
||
|
|
trap cleanup EXIT
|
||
|
|
|
||
|
|
echo "--- Oppretter scratch-database ${DB_NAME} ---"
|
||
|
|
docker exec teeoff_db psql -U teeoff_admin -d postgres -v ON_ERROR_STOP=1 \
|
||
|
|
-c "CREATE DATABASE ${DB_NAME};"
|
||
|
|
|
||
|
|
# Migrasjon 002 hardkoder rollenavnet "teecup_app" -- det navnet finnes
|
||
|
|
# allerede (cluster-globalt, delt mellom ALLE databaser på denne
|
||
|
|
# Postgres-instansen, inkl. den ekte teecup_db). En scratch-testrunde MÅ
|
||
|
|
# derfor bruke sin egen, midlertidige rolle -- ellers hadde testene kjørt
|
||
|
|
# som (og med samme passord som) den ekte runtime-rollen. Samme sed-patch-
|
||
|
|
# mønster som er brukt manuelt i alle tidligere scratch-runder.
|
||
|
|
#
|
||
|
|
# Migrasjonen hardkoder OGSÅ databasenavnet "teecup_db" i én GRANT CONNECT-
|
||
|
|
# setning -- uten patch ville den (uskadelig, men uønsket) gitt CONNECT-
|
||
|
|
# rettighet på den EKTE teecup_db til testrollen. Patches til scratch-
|
||
|
|
# databasenavnet av samme grunn.
|
||
|
|
sed -E "s/\bteecup_app\b/${APP_ROLE}/g; s/\bteecup_db\b/${DB_NAME}/g" \
|
||
|
|
002_roles_and_grants.sql > "${PATCHED_002}"
|
||
|
|
|
||
|
|
echo "--- Kjører migrasjoner ---"
|
||
|
|
for f in [0-9][0-9][0-9]_*.sql; do
|
||
|
|
if [ "$f" = "002_roles_and_grants.sql" ]; then
|
||
|
|
docker cp "${PATCHED_002}" "teeoff_db:/tmp/pytest_${f}"
|
||
|
|
else
|
||
|
|
docker cp "$f" "teeoff_db:/tmp/pytest_${f}"
|
||
|
|
fi
|
||
|
|
docker exec teeoff_db psql -U teeoff_admin -d "${DB_NAME}" -v ON_ERROR_STOP=1 \
|
||
|
|
-v teecup_app_password="${APP_PASSWORD}" \
|
||
|
|
-f "/tmp/pytest_${f}" >/dev/null
|
||
|
|
docker exec teeoff_db rm -f "/tmp/pytest_${f}"
|
||
|
|
done
|
||
|
|
|
||
|
|
echo "--- Setter passord for ${APP_ROLE} ---"
|
||
|
|
# psql sin :'var'-interpolering virker upålitelig i -c-modus (samme klasse
|
||
|
|
# feil som kommentaren i 002_roles_and_grants.sql selv nevner) -- passordet
|
||
|
|
# er selvgenerert base64 uten enkeltfnutter, så det er trygt å sette direkte
|
||
|
|
# i SQL-strengen fremfor å stole på -v her.
|
||
|
|
docker exec teeoff_db psql -U teeoff_admin -d postgres -v ON_ERROR_STOP=1 \
|
||
|
|
-c "ALTER ROLE ${APP_ROLE} PASSWORD '${APP_PASSWORD}';"
|
||
|
|
|
||
|
|
echo "--- Bygger testimage ---"
|
||
|
|
docker build -f Dockerfile.test -t teecup-backend-test . >/dev/null
|
||
|
|
|
||
|
|
echo "--- Kjører pytest (nettverk: teeoff_default, host: teeoff_db) ---"
|
||
|
|
set +e
|
||
|
|
docker run --rm \
|
||
|
|
--network teeoff_default \
|
||
|
|
-e TEECUP_DB_HOST=teeoff_db \
|
||
|
|
-e TEECUP_DB_PORT=5432 \
|
||
|
|
-e TEECUP_DB_NAME="${DB_NAME}" \
|
||
|
|
-e TEECUP_DB_USER="${APP_ROLE}" \
|
||
|
|
-e TEECUP_DB_PASS="${APP_PASSWORD}" \
|
||
|
|
-e TEECUP_SESSION_SECRET="${SESSION_SECRET}" \
|
||
|
|
-e TEECUP_MINIO_ROOT_USER="pytest-unused" \
|
||
|
|
-e TEECUP_MINIO_ROOT_PASSWORD="pytest-unused" \
|
||
|
|
teecup-backend-test
|
||
|
|
TEST_EXIT_CODE=$?
|
||
|
|
set -e
|
||
|
|
|
||
|
|
exit "${TEST_EXIT_CODE}"
|