Eine Zeichnung ist eine Datei, kein neues Ding – das ist die ganze Entscheidung dahinter. .excalidraw ist JSON; damit erbt sie Ordner, Gruppenordner, Papierkorb, Versionen, Freigabelinks, interne Freigaben und die Suche. Keine neue Tabelle, kein zweites Rechtemodell. Gespeichert wird über denselben Upload wie alles andere, wie beim Text-Editor in der Vorschau. Drei Sorgen, alle nachgemessen statt gehofft: Das Hauptbündel wächst von 484,11 auf 485,22 kB – das Zeichenbrett ist ein eigenes Stück (584 kB + 142 kB CSS) und wird nachgeladen wie der PDF-Betrachter. Wer nie zeichnet, holt es nie. Die Schriften: Die Richtlinie ist default-src 'self' ohne font-src, Excalidraw hätte seine handgezeichneten Schriften von aussen geladen und still eine Ersatzschrift gezeigt. Sie werden jetzt beim Bauen kopiert und über window.EXCALIDRAW_ASSET_PATH gefunden – gesetzt im Modul, nicht per Inline-Skript, das wäre von derselben Richtlinie blockiert. Xiaolai bleibt draussen: 13 der 14 MB für die chinesische Schrift. Die Reihenfolge der Dateiarten: .excalidraw wird vor code und text geprüft, sonst öffnete eine Zeichnung im Texteditor als Zahlenkolonne (json steht in codeExt). Kein gleichzeitiges Arbeiten. Die Komponente könnte es, aber den Transport bringt sie nicht mit – das wäre ein zweiter Dienst neben Aether. Solange es ihn nicht gibt, überschreibt der Zweite den Ersten. Zwei Dinge fangen das ab: Vor dem Speichern wird geprüft, ob sich die Fassung geändert hat, und dann gefragt statt überschrieben. Und Zeichnungen behalten ihre Fassungen von der ersten Minute an. Der zweite Punkt ist erst durch den Selbsttest aufgefallen: Versionierung ist sonst bewusst aus (Migration 000006), damit der Speicher nicht vollläuft. Für Zeichnungen stimmt die Rechnung nicht – sie werden in sich immer wieder bearbeitet und sind ein paar Kilobyte gross. Ohne sie wäre die Warnung im Editor ein Versprechen ohne Deckung gewesen. Neuer Selbsttest mit 12 Prüfungen: Er prüft die These nach, auf der alles beruht – wenn eine Zeichnung wirklich eine Datei ist, muss sie können, was Dateien können. Nebenbei: db-tests.sh liess je Lauf ein anonymes Postgres-Volume liegen (rund 49 MB). `docker rm -v` nimmt es jetzt mit; zehn verwaiste entfernt. Geprüft: go build/vet sauber, alle 15 Go-Pakete grün, 255 Prüfungen der acht Selbsttest-Suiten grün, 48 Vitest-Tests, tsc sauber. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
53 lines
1.9 KiB
Bash
Executable File
53 lines
1.9 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() {
|
||
# -v nimmt das anonyme Volume mit. Ohne das blieb je Lauf eines liegen
|
||
# (rund 49 MB); nach zehn Laeufen waren es ein halbes Gigabyte, das
|
||
# niemandem gehoerte und in keiner Uebersicht auftauchte.
|
||
docker rm -f -v "$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"
|