internal/documents hatte null Tests -- und ist das Paket, dessen Versagen am teuersten ist, weil es **still** ist: Die Volltextsuche findet dann einfach nichts, und das sieht aus wie "steht nicht drin". Acht Tests, nicht auf Abdeckung gezielt, sondern auf die Zustaende, in denen die Schlange haengenbleiben kann, ohne dass es auffaellt: ein Auftrag, der nie aufgibt; ein Auftrag, der nach hartem Abbruch fuer immer auf 'running' steht; ein Text nach alter Regel, der nie erneuert wird. Dazu geloeschte Dateien, erneuter Upload und Complete als Einheit. scripts/db-tests.sh baut eine Wegwerf-Datenbank, spielt die Migrationen ein und laesst die Tests laufen. Ohne das haetten sie sich mangels TEST_DSN immer nur uebersprungen -- Dekoration, genau wie vitest es war. **Gegengeprueft an absichtlich kaputtem Code, und der zweite Versuch blieb gruen:** maxAttempts von 3 auf 9999 gesetzt -- alle Tests weiter in Ordnung, nur die Laufzeit stieg von 0,2 auf 27 Sekunden. Sie schleiften ueber die Konstante und setzten die Zahl voraus, statt sie zu pruefen. So verschwindet eine Entscheidung unbemerkt aus einer Anwendung. Jetzt haelt ein eigener Test die Zahl fest und sagt, wo die Begruendung hingehoert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
50 lines
1.7 KiB
Bash
Executable File
50 lines
1.7 KiB
Bash
Executable File
#!/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() {
|
||
docker rm -f "$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"
|