Files
Aether/scripts/db-tests.sh
T
marcandClaude Opus 5 76176a45bc test(documents): die drei stillen Zustaende der OCR-Warteschlange
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>
2026-09-12 22:32:28 +02:00

50 lines
1.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"