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>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-12 22:32:28 +02:00
1 parent 2cc02941b9
commit 76176a45bc
4 files changed
+456 -7

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
#!/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"