From 52cbd79fb429d3129c57b53e452570802e0b2372 Mon Sep 17 00:00:00 2001 From: cschlaefke Date: Tue, 3 Nov 2026 16:40:55 +0100 Subject: [PATCH] feat(catalog): run checks.sql in CI and document seed loader result Adds the checks.sql smoke step, the verified CLI result for generated seed content and the created_at/updated_at note for the API. Refs #2 Co-Authored-By: Claude Sonnet 5.5 --- .forgejo/workflows/ci.yml | 5 +++++ docs/katalog-pflege.md | 1 + docs/specs/2-katalog-daten.md | 2 +- supabase/tests/database/06_catalog_foundation.test.sql | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 0ef1afc..88c2a80 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -216,6 +216,11 @@ jobs: run: | test -d supabase/migrations || exit 0 bash .forgejo/scripts/supabase-db-tests.sh + - name: Prüfabfrage checks.sql läuft (KAT-05) + # Nur "läuft ohne Fehler"; der Sollwert SB1 (mindestens 180) ist lokal und in CI nur eine Information. + run: | + test -f supabase/catalog/checks.sql || exit 0 + docker exec -i supabase_db_shuffle psql -U postgres -d postgres -v ON_ERROR_STOP=1 < supabase/catalog/checks.sql - name: Aufräumen if: always() run: npx --yes supabase@${{ env.SUPABASE_CLI_VERSION }} stop --no-backup || true diff --git a/docs/katalog-pflege.md b/docs/katalog-pflege.md index 6582bf7..ed5f888 100644 --- a/docs/katalog-pflege.md +++ b/docs/katalog-pflege.md @@ -109,6 +109,7 @@ Je Regel eine Zeile (Soll, Ist, Status `ok`/`Verstoß`/`Information`). **Abnahme | `db reset` lädt alle Dateien aus `sql_paths` in der angegebenen Reihenfolge | **bestätigt** (Ausgabe `Seeding data from supabase/seed.sql…`, danach die weiteren Dateien in Listenreihenfolge) | | `begin;`/`commit;` in einer Seed-Datei ist zulässig | **bestätigt**: Die Anweisungen laufen, die Daten sind danach da. Trotzdem enthalten die erzeugten Dateien keine, weil die CLI jede Datei als Batch sendet (siehe nächste Zeile) und ein Fehler sie ganz zurückrollt; auf Staging/Prod sorgt `--single-transaction` für dasselbe. | | Fehler in einer Seed-Datei | Die Datei wird **als Ganzes zurückgerollt** (eine Anweisung vor dem Fehler blieb nicht erhalten), `db reset` endet mit Exit-Code 1 und `MigrationSeedError`. | +| Erzeugte Dateien mit echtem Inhalt (Wächter-`do`-Block, Zuordnungs-CTEs) über den Seed-Lader der CLI | **bestätigt**: `db reset` endet mit Exit 0, danach sind 3 Testspiele und je 4 Genre-, Mechanik- und Verlagszuordnungen da. Der Wächter löst bei einem umbenannten Genre den Fehler `startbestand: Genre fehlt in der Datenbank …` aus und lässt alle Zuordnungen unverändert. | | Pfad ohne Treffer in `sql_paths` | Nur die Warnung `no files matched pattern: …`, **kein Fehler**, Exit-Code 0. Ein Tippfehler im Pfad überspringt die Datei also still; nach dem Reset `checks.sql` bzw. die Zeilenzahlen ansehen. | | Datei, die nur Kommentare enthält | läuft ohne Fehler | | psql-Metabefehle (`\i` …) in Seed-Dateien | nicht nutzbar (die Datei wird als SQL-Batch gesendet) | diff --git a/docs/specs/2-katalog-daten.md b/docs/specs/2-katalog-daten.md index 6b37030..654a327 100644 --- a/docs/specs/2-katalog-daten.md +++ b/docs/specs/2-katalog-daten.md @@ -693,7 +693,7 @@ Umgesetzt: B1, B2, B3a, B3, B4 und die beiden CI-Schritte aus D1 (Deno-Tests und - **Branch:** `feature/2a-katalog-datenmodell` statt `feature/2-katalog-fundament` (Vorgabe des Auftrags). - **CLI-Annahmen (R11) geprüft** mit Supabase CLI 3.0.0, Ergebnis in `docs/katalog-pflege.md` 2.7: Reihenfolge und `begin`/`commit` funktionieren; ein Fehler rollt die ganze Datei zurück (Exit 1); ein Pfad ohne Treffer ist nur eine Warnung (Exit 0). Die erzeugten Dateien enthalten kein `begin`/`commit`. - **Nicht in 2a:** `games_visibility_immutable` (2c, wie in 3.4). -- **API-Hinweis für das Frontend:** `catalog_games` ist über PostgREST nicht schreibbar (Fehler 55000 „cannot insert/update view“, zusätzlich fehlen die Rechte). Clients dürfen beim Anlegen oder Ändern von `games` keine `id` mehr senden (42501). Es gibt keine generierten Datenbanktypen im Repo. +- **API-Hinweis für das Frontend:** `catalog_games` ist über PostgREST nicht schreibbar (Fehler 55000 „cannot insert/update view“, zusätzlich fehlen die Rechte). Clients dürfen beim Anlegen oder Ändern von `games` keine `id`, `created_at` und `updated_at` mehr senden (42501; bisher setzte der Trigger `set_updated_at` diese Werte stillschweigend zurück). Ein `toJson()` eines Modells darf deshalb nicht unverändert an `insert`/`update` gehen, sondern nur die erlaubten Spalten (3.2). Es gibt keine generierten Datenbanktypen im Repo. - **Ergänzung `startbestand.sql`:** Ein Wächter am Anfang bricht ab, wenn ein Genre oder eine Mechanik aus der CSV in der Datenbank fehlt; sonst würde der Abgleich der Zuordnungen still Verknüpfungen löschen. - **Ergänzung Testdaten:** `supabase/catalog/testdata/` (fiktives Vokabular und drei Testspiele) erzeugt `supabase/tests/support/*.inc`, die `06_catalog_foundation.test.sql` per `\ir` einbindet; so laufen Idempotenz und `checks.sql` im pgTAP-Test mit den echten erzeugten Skripten. - **`game_links_mark_manual`:** prüft zuerst per `select`, ob das Spiel ein Katalogspiel ist, und schreibt nur dann `manual_fields`. Ohne diese Prüfung scheiterte jede Zuordnung zu einem privaten Spiel mit 42501, weil Nutzer kein Schreibrecht auf `manual_fields` haben. diff --git a/supabase/tests/database/06_catalog_foundation.test.sql b/supabase/tests/database/06_catalog_foundation.test.sql index f2ebd62..60fd89e 100644 --- a/supabase/tests/database/06_catalog_foundation.test.sql +++ b/supabase/tests/database/06_catalog_foundation.test.sql @@ -549,7 +549,7 @@ select is_empty($$select * from snap_rows s where not exists (select 1 from ( select results_eq($$select rule, ist::int, status from checks_result order by rule$$, $$values ('Info'::text, 1, 'Information'::text), ('SB0', 3, 'Information'), ('SB1', 2, 'Verstoß'), ('SB2', 0, 'ok'), ('SB4', 0, 'ok'), ('SB6', 0, 'ok')$$, - 'KAT-05 Kriterium 10: checks.sql meldet für die Testspiele keinen Verstoß (SB1 ist lokal nur Information)'); + 'KAT-05 Kriterium 10: checks.sql meldet für die Testspiele keinen Verstoß bei SB2, SB4, SB6 (SB1 liegt lokal erwartbar unter 180)'); update public.games set min_minutes = null where title = 'Testspiel A'; update public.games set bgg_id = 4711 where title = 'Testspiel B'; update public.games set description = null, description_locale = null where title like 'Testspiel C%';