Test-Suite: Vollständigkeits-Audit + Ausbau (Phase 2 nach #50) #134

Open
opened 2026-04-20 01:06:32 +02:00 by tobias · 4 comments
Owner

Kontext

Die Test-Suite ist organisch mit den Features gewachsen und hat mehrere Epochen:

  1. Original Unit-Suite (#46, #91) — 12 Testfiles, ca. 2.500 LOC, 219 Tests, tests/conftest.py stubbt fitz/bs4/openai/pydantic_settings
  2. E2E Functional Acceptance (#50 Umbrella, #51-54 Sub-A-D) — tests/integration/, 285 Tests, marker-opt-in
  3. Playwright-UI-Tests (#120) — tests/e2e/test_ui.py, marker e2e

Seit #50 closed (2026-03-?) wurden diverse Features live ohne dediziertes Test-Backfill:

Feature Issue Test-Status
Clustering/Netzwerk-Graph #105/#108 keine Tests
v3→v4 Embedding-Migration #123, ADR 0006 keine WRITE/READ-Pattern-Tests
E-Mail-Digest #124 keine Tests für app/mail.py
RSS/Atom-Feed #125 nur Smoke-Test
Typen-Normalisierung #127 keine Tests für app/drucksache_typen.py
Bookmarks/Comments #94 nur indirekt
NRW-Protokoll-Parser v5 #106 19/19 laut MEMORY, aber kein pytest-Fixture-Test

Dazu fehlen Tests für zentrale Kern-Module:

  • app/database.py — Source of Truth, keine dedizierte Test-Datei
  • app/mail.py — SMTP + Template-Rendering, kein Test
  • app/clustering.py — kein Test
  • app/drucksache_typen.py — kein Test
  • app/wahlperioden.py — kein Test

Aufgabe

Phase 1 — Bestandsaufnahme (Audit)

  • Module-→-Test-Matrix: pro app/*.py Coverage-Lücken identifizieren (Glob + coverage.py gegen tests/)
  • Bug-Klassen-Review: letzte 20 Commits / geschlossene Bugs durchgehen, prüfen ob jeder Fix einen Regressions-Test hat
  • Integration-Suite-Gesundheit: pytest -m integration laufen lassen, xfails/Skips dokumentieren, outdated Ground-Truth-Samples (tests/integration/ground_truth.py) aktualisieren
  • E2E-Playwright-Lauf: pytest -m e2e gegen Prod, kaputte Selektoren dokumentieren

Phase 2 — Lücken schließen (Prioritätsreihenfolge)

  • test_database.py — Migrations, Assessment-Schreib-/Lese-Pfad, assessment_versions, email_subscriptions
  • test_drucksache_typen.py — Normalisierungs-Regeln pro BL, inkl. bekannte Grenzfälle (TH „Antrag gemäß § 79 GO", Gesetzentwurf-Varianten)
  • test_mail.py — Template-Rendering mit Fixture-Subscription, Unsubscribe-Token-Generierung, SMTP-Call gestubbed
  • test_clustering.py — Embedding-Nähe-Output deterministisch für Fixture-Corpus
  • test_embeddings_v3_v4.py — WRITE-Modell-Switch produziert neue Chunks, READ liest nur gewünschtes Modell, Dual-Read während Reindex
  • test_protokoll_parser.py — NRW v5 mit MMP18-119-Fixture (19/19-Garantie), optional MMP-Samples anderer BL als xfail bis v6
  • test_rss.py — Atom-Validität gegen feedparser, Inhalts-Dedup, Cache-Header

Phase 3 — Struktur & Hygiene

  • Marker-System prüfen: aktuell integration/slow/e2e — ggf. weitere (llm für Cost-Tests, network für HTTP-freie Varianten)
  • Coverage-Baseline dokumentieren (.coveragerc, Zielwert z.B. ≥ 70% pro Kern-Modul)
  • CI-Triggers klären: welche Tests in Pre-Commit, welche nightly (vgl. Sub-Issue-Plan in docs/archive/plan-keen-pondering-puddle.md)
  • ADR 0007 schreiben: „Test-Taxonomie" (Unit / Integration / E2E / Property / Smoke) mit Abgrenzungs-Regeln

Akzeptanzkriterien

  • Audit-Ergebnis als Markdown-Kommentar im Issue (Coverage-Lücken + Bug-ohne-Regressions-Test-Liste)
  • Jedes in Phase 2 genannte Modul hat eine passende test_*.py-Datei (Kern-Pfade, keine 100%-Coverage-Jagd)
  • pytest -m integration grün oder dokumentiert-xfail
  • ADR 0007 in webapp/docs/adr/

Nicht-Ziele (bewusst)

  • Keine 100%-Coverage — Fokus auf kritische Pfade + Bug-Klassen, nicht auf Trivialzeilen
  • Keine Mutation-Tests (Folge-Issue wenn relevant)
  • Keine LLM-Output-Quality-Tests (separate Eval-Suite)
  • Keine Performance-/Load-Tests

Bezug

  • Umbrella-Issue #50 (closed) — dessen Sub-Issues #51-54 sind die Grundlage, hier geht es um die zweite Welle nach 4 Wochen Weiterentwicklung
  • ADR 0003 (Sub-D Citation-Property-Tests) als Vorlage für ADR 0007
## Kontext Die Test-Suite ist organisch mit den Features gewachsen und hat mehrere Epochen: 1. **Original Unit-Suite** (#46, #91) — 12 Testfiles, ca. 2.500 LOC, 219 Tests, `tests/conftest.py` stubbt `fitz`/`bs4`/`openai`/`pydantic_settings` 2. **E2E Functional Acceptance** (#50 Umbrella, #51-54 Sub-A-D) — `tests/integration/`, 285 Tests, marker-opt-in 3. **Playwright-UI-Tests** (#120) — `tests/e2e/test_ui.py`, marker `e2e` Seit #50 closed (2026-03-?) wurden diverse Features live ohne dediziertes Test-Backfill: | Feature | Issue | Test-Status | |---|---|---| | Clustering/Netzwerk-Graph | #105/#108 | keine Tests | | v3→v4 Embedding-Migration | #123, ADR 0006 | keine WRITE/READ-Pattern-Tests | | E-Mail-Digest | #124 | keine Tests für `app/mail.py` | | RSS/Atom-Feed | #125 | nur Smoke-Test | | Typen-Normalisierung | #127 | keine Tests für `app/drucksache_typen.py` | | Bookmarks/Comments | #94 | nur indirekt | | NRW-Protokoll-Parser v5 | #106 | 19/19 laut MEMORY, aber kein pytest-Fixture-Test | Dazu fehlen Tests für zentrale Kern-Module: - `app/database.py` — Source of Truth, keine dedizierte Test-Datei - `app/mail.py` — SMTP + Template-Rendering, kein Test - `app/clustering.py` — kein Test - `app/drucksache_typen.py` — kein Test - `app/wahlperioden.py` — kein Test ## Aufgabe **Phase 1 — Bestandsaufnahme (Audit)** - [ ] Module-→-Test-Matrix: pro `app/*.py` Coverage-Lücken identifizieren (Glob + `coverage.py` gegen `tests/`) - [ ] Bug-Klassen-Review: letzte 20 Commits / geschlossene Bugs durchgehen, prüfen ob jeder Fix einen Regressions-Test hat - [ ] Integration-Suite-Gesundheit: `pytest -m integration` laufen lassen, xfails/Skips dokumentieren, outdated Ground-Truth-Samples (`tests/integration/ground_truth.py`) aktualisieren - [ ] E2E-Playwright-Lauf: `pytest -m e2e` gegen Prod, kaputte Selektoren dokumentieren **Phase 2 — Lücken schließen (Prioritätsreihenfolge)** - [ ] `test_database.py` — Migrations, Assessment-Schreib-/Lese-Pfad, `assessment_versions`, `email_subscriptions` - [ ] `test_drucksache_typen.py` — Normalisierungs-Regeln pro BL, inkl. bekannte Grenzfälle (TH „Antrag gemäß § 79 GO", Gesetzentwurf-Varianten) - [ ] `test_mail.py` — Template-Rendering mit Fixture-Subscription, Unsubscribe-Token-Generierung, SMTP-Call gestubbed - [ ] `test_clustering.py` — Embedding-Nähe-Output deterministisch für Fixture-Corpus - [ ] `test_embeddings_v3_v4.py` — WRITE-Modell-Switch produziert neue Chunks, READ liest nur gewünschtes Modell, Dual-Read während Reindex - [ ] `test_protokoll_parser.py` — NRW v5 mit MMP18-119-Fixture (19/19-Garantie), optional MMP-Samples anderer BL als xfail bis v6 - [ ] `test_rss.py` — Atom-Validität gegen feedparser, Inhalts-Dedup, Cache-Header **Phase 3 — Struktur & Hygiene** - [ ] Marker-System prüfen: aktuell `integration`/`slow`/`e2e` — ggf. weitere (`llm` für Cost-Tests, `network` für HTTP-freie Varianten) - [ ] Coverage-Baseline dokumentieren (`.coveragerc`, Zielwert z.B. ≥ 70% pro Kern-Modul) - [ ] CI-Triggers klären: welche Tests in Pre-Commit, welche nightly (vgl. Sub-Issue-Plan in `docs/archive/plan-keen-pondering-puddle.md`) - [ ] ADR 0007 schreiben: „Test-Taxonomie" (Unit / Integration / E2E / Property / Smoke) mit Abgrenzungs-Regeln ## Akzeptanzkriterien - Audit-Ergebnis als Markdown-Kommentar im Issue (Coverage-Lücken + Bug-ohne-Regressions-Test-Liste) - Jedes in Phase 2 genannte Modul hat eine passende `test_*.py`-Datei (Kern-Pfade, keine 100%-Coverage-Jagd) - `pytest -m integration` grün oder dokumentiert-xfail - ADR 0007 in `webapp/docs/adr/` ## Nicht-Ziele (bewusst) - Keine 100%-Coverage — Fokus auf kritische Pfade + Bug-Klassen, nicht auf Trivialzeilen - Keine Mutation-Tests (Folge-Issue wenn relevant) - Keine LLM-Output-Quality-Tests (separate Eval-Suite) - Keine Performance-/Load-Tests ## Bezug - Umbrella-Issue #50 (closed) — dessen Sub-Issues #51-54 sind die Grundlage, hier geht es um die *zweite Welle* nach 4 Wochen Weiterentwicklung - ADR 0003 (Sub-D Citation-Property-Tests) als Vorlage für ADR 0007
Author
Owner

Phase 1 — Audit-Ergebnis

Coverage-Zahlen (pytest-cov, nur Unit-Suite — ohne integration/e2e)

Overall: 26% (1087/4113 Statements abgedeckt) — irreführend niedrig, weil main.py (1% von 680 LOC) und parlamente.py (25% von 1425 LOC) als größte Module die Bilanz ziehen. Kern-Domain-Module sehen besser aus.

Modul LOC Coverage Status
__init__.py 0 100%
auswertungen.py 85 95% ✓ solide
auth.py 121 22% ⚠ unterdeckt
bundeslaender.py 27 100%
clustering.py 141 0% keine Tests
config.py 35 100% ✓ (trivial)
database.py 299 0% Source-of-Truth ohne Test
drucksache_typen.py 27 85%
embeddings.py 338 54% ⚠ mittel
mail.py 122 0% #124 ohne Tests
main.py 680 1% ⚠ Routes fast ungetestet (Smoke-Tests skipped)
models.py 78 100% ✓ (Pydantic-DTOs)
parlamente.py 1425 25% ⚠ Adapter-Hot-Spots ungetestet
parteien.py 108 97%
queue.py 158 31%
reindex_embeddings.py 126 0% Utility ungetestet
report.py 131 44%
validators.py 15 100%
wahlperioden.py 18 100%
wahlprogramme.py 98 16%

Zero-Coverage-Liste (Top-Prioritäten Phase 2)

  1. database.py (299 LOC, 0%) — ⚠ kritisch: jede Migration, jeder Write-Pfad, jede Versionierung (assessment_versions) bricht stillschweigend
  2. mail.py (122 LOC, 0%) — ⚠ produktiv (#124 gerade aktiviert): Template-Rendering + Unsubscribe-Token ohne Test
  3. clustering.py (141 LOC, 0%)#105 live, aber ohne Fixture-basierte Nähe-Assertion
  4. reindex_embeddings.py (126 LOC, 0%) — Risiko: v3→v4-Migration war manuell (#123)
  5. main.py (680 LOC, 1%) — Smoke-Tests sind ssssssss = 8× skip. Vermutlich Fixtures kaputt. Prio klären.

Bug-Fixes der letzten 30 Commits — Regressions-Test-Bilanz

Stichprobe aus git log auf Fix-Commits:

Commit Bug Regressions-Test?
3e71547 PRAGMA cursor braucht fetchall() vor iteration nein
5ec0b08 normalizePartei scope-Fehler in showDetail n.a. (Frontend-JS)
49c1b92 JWT azp statt aud bei Keycloak Public Clients nein (keine auth-Fixture)
ed64399 NameError in get_relevant_quotes_for_antrag test_embeddings.py (nach #60)
1414057 CDU-PDF AssertionError Fallback nein
5ea507b PFLICHT-FRAKTIONEN = alle LT-Fraktionen nein (Prompt-Assertion fehlt)
038ebd6 NRW-Titel + Regierungsfraktionen-Pflicht nein

Befund: ~5 von 7 Fix-Commits ohne dedizierte Regressions-Tests. Typisches Muster: Fix im Code, Test nachgezogen nur bei Issues mit explizitem "Test"-AK.

Integration-Suite-Gesundheit

  • 285 Tests collected unter integration/e2e Markern
  • tests/integration/:
    • test_adapters_live.py (240 LOC) — Reachability + Type-Filter pro aktives BL
    • test_frontend_xref.py (105 LOC) — ground-truth-Kuration pro BL, 172 LOC in ground_truth.py
    • test_wahlprogramme_indexed.py (313 LOC) — Indexing-Status + Inhalts-Marker
    • test_citations_substring.py (500 LOC) — Property-Verification
  • tests/e2e/test_ui.py (210 LOC) — Playwright (#120)

Nächster Schritt Phase 1 (offen): pytest -m integration gegen Live-System laufen und xfails/flaky-Tests dokumentieren. Macht derzeit Lärm wegen Backend-Outage-Anfälligkeit; als separater Lauf vor Phase 2 einplanen.

Nächste Schritte

Priorität für Phase 2 (nach Zero-Coverage + Bug-Risiko):

  1. test_database.py — Migrations + Write-Pfade + assessment_versions
  2. test_mail.py — Template-Render + Unsubscribe-Token
  3. test_drucksache_typen.py — existiert nicht, wird durch test_parlamente.py nur indirekt abgedeckt
  4. test_protokoll_parser.py — NRW v5 19/19-Fixture (#106 Garantie)
  5. test_clustering.py — Fixture-Corpus mit deterministischer Nähe-Matrix
  6. test_embeddings_v3_v4.py — WRITE/READ-Pattern-Test (ADR 0006)

Bug-Regression-Backfill: vor Phase 2 die 5 ungedeckten Fix-Commits durchgehen, Mini-Tests nachziehen (1-2h Aufwand).


Erzeugt autonom im Rahmen der "offene Punkte autonom abarbeiten"-Session 2026-04-20.

## Phase 1 — Audit-Ergebnis ### Coverage-Zahlen (pytest-cov, nur Unit-Suite — ohne integration/e2e) **Overall: 26% (1087/4113 Statements abgedeckt)** — irreführend niedrig, weil `main.py` (1% von 680 LOC) und `parlamente.py` (25% von 1425 LOC) als größte Module die Bilanz ziehen. Kern-Domain-Module sehen besser aus. | Modul | LOC | Coverage | Status | |---|--:|--:|:--| | `__init__.py` | 0 | 100% | ✓ | | `auswertungen.py` | 85 | **95%** | ✓ solide | | `auth.py` | 121 | 22% | ⚠ unterdeckt | | `bundeslaender.py` | 27 | **100%** | ✓ | | `clustering.py` | 141 | **0%** | ❌ keine Tests | | `config.py` | 35 | **100%** | ✓ (trivial) | | `database.py` | 299 | **0%** | ❌ Source-of-Truth ohne Test | | `drucksache_typen.py` | 27 | 85% | ✓ | | `embeddings.py` | 338 | 54% | ⚠ mittel | | `mail.py` | 122 | **0%** | ❌ #124 ohne Tests | | `main.py` | 680 | **1%** | ⚠ Routes fast ungetestet (Smoke-Tests skipped) | | `models.py` | 78 | **100%** | ✓ (Pydantic-DTOs) | | `parlamente.py` | 1425 | 25% | ⚠ Adapter-Hot-Spots ungetestet | | `parteien.py` | 108 | **97%** | ✓ | | `queue.py` | 158 | 31% | ⚠ | | `reindex_embeddings.py` | 126 | **0%** | ❌ Utility ungetestet | | `report.py` | 131 | 44% | ⚠ | | `validators.py` | 15 | **100%** | ✓ | | `wahlperioden.py` | 18 | **100%** | ✓ | | `wahlprogramme.py` | 98 | 16% | ⚠ | ### Zero-Coverage-Liste (Top-Prioritäten Phase 2) 1. **`database.py` (299 LOC, 0%)** — ⚠ kritisch: jede Migration, jeder Write-Pfad, jede Versionierung (`assessment_versions`) bricht stillschweigend 2. **`mail.py` (122 LOC, 0%)** — ⚠ produktiv (#124 gerade aktiviert): Template-Rendering + Unsubscribe-Token ohne Test 3. **`clustering.py` (141 LOC, 0%)** — #105 live, aber ohne Fixture-basierte Nähe-Assertion 4. **`reindex_embeddings.py` (126 LOC, 0%)** — Risiko: v3→v4-Migration war manuell (#123) 5. **`main.py` (680 LOC, 1%)** — Smoke-Tests sind `ssssssss` = 8× skip. Vermutlich Fixtures kaputt. Prio klären. ### Bug-Fixes der letzten 30 Commits — Regressions-Test-Bilanz Stichprobe aus `git log` auf Fix-Commits: | Commit | Bug | Regressions-Test? | |---|---|---| | `3e71547` | PRAGMA cursor braucht fetchall() vor iteration | ❌ nein | | `5ec0b08` | normalizePartei scope-Fehler in showDetail | n.a. (Frontend-JS) | | `49c1b92` | JWT azp statt aud bei Keycloak Public Clients | ❌ nein (keine auth-Fixture) | | `ed64399` | NameError in get_relevant_quotes_for_antrag | ✓ `test_embeddings.py` (nach #60) | | `1414057` | CDU-PDF AssertionError Fallback | ❌ nein | | `5ea507b` | PFLICHT-FRAKTIONEN = alle LT-Fraktionen | ❌ nein (Prompt-Assertion fehlt) | | `038ebd6` | NRW-Titel + Regierungsfraktionen-Pflicht | ❌ nein | **Befund:** ~5 von 7 Fix-Commits ohne dedizierte Regressions-Tests. Typisches Muster: Fix im Code, Test nachgezogen nur bei Issues mit explizitem "Test"-AK. ### Integration-Suite-Gesundheit - **285 Tests collected** unter `integration`/`e2e` Markern - `tests/integration/`: - `test_adapters_live.py` (240 LOC) — Reachability + Type-Filter pro aktives BL - `test_frontend_xref.py` (105 LOC) — ground-truth-Kuration pro BL, 172 LOC in `ground_truth.py` - `test_wahlprogramme_indexed.py` (313 LOC) — Indexing-Status + Inhalts-Marker - `test_citations_substring.py` (500 LOC) — Property-Verification - `tests/e2e/test_ui.py` (210 LOC) — Playwright (#120) **Nächster Schritt Phase 1 (offen):** `pytest -m integration` gegen Live-System laufen und xfails/flaky-Tests dokumentieren. Macht derzeit Lärm wegen Backend-Outage-Anfälligkeit; als separater Lauf vor Phase 2 einplanen. ### Nächste Schritte **Priorität für Phase 2** (nach Zero-Coverage + Bug-Risiko): 1. `test_database.py` — Migrations + Write-Pfade + `assessment_versions` 2. `test_mail.py` — Template-Render + Unsubscribe-Token 3. `test_drucksache_typen.py` — existiert nicht, wird durch `test_parlamente.py` nur indirekt abgedeckt 4. `test_protokoll_parser.py` — NRW v5 19/19-Fixture (#106 Garantie) 5. `test_clustering.py` — Fixture-Corpus mit deterministischer Nähe-Matrix 6. `test_embeddings_v3_v4.py` — WRITE/READ-Pattern-Test (ADR 0006) **Bug-Regression-Backfill:** vor Phase 2 die 5 ungedeckten Fix-Commits durchgehen, Mini-Tests nachziehen (1-2h Aufwand). --- _Erzeugt autonom im Rahmen der "offene Punkte autonom abarbeiten"-Session 2026-04-20._
Author
Owner

Phase 2 — Fortschritt (2/6 Module)

Fertig via Sonnet-Sub-Agent:

  • tests/test_drucksache_typen.py — 48 Tests, 100% Coverage (27/27 Statements)
  • tests/test_mail.py — 30 Tests, 86% Coverage (106/123 Statements; unkovered: _send_sync/send_mail echte SMTP-Calls, __main__-Block — vertretbar für Unit-Suite)

Nebenbefund: app/mail.py fehlte from __future__ import annotations für Python-3.9-Kompat — ergänzt.

Unit-Suite: 206 → 284 Tests (+78), alle grün, 13 skipped unverändert, keine Regressions.

Noch offen (Phase 2 Queue):

  • tests/test_database.py — 299 LOC, 0% → Ziel 60%+
  • tests/test_clustering.py — 141 LOC, 0%
  • tests/test_protokoll_parser.py — NRW v5 Fixture (#106)
  • tests/test_embeddings_v3_v4.py — WRITE/READ-Pattern (ADR 0006)
  • Phase 3 (Struktur & Hygiene): Marker-Review, .coveragerc, ADR 0007 Test-Taxonomie

Bug-Regression-Backfill (aus Phase-1-Audit, 5 Fix-Commits ohne Test):

  • 3e71547 PRAGMA cursor fetchall() vor iteration
  • 49c1b92 JWT azp statt aud bei Keycloak Public Clients
  • 1414057 CDU-PDF AssertionError Fallback
  • 5ea507b PFLICHT-FRAKTIONEN = alle LT-Fraktionen
  • 038ebd6 NRW-Titel + Regierungsfraktionen-Pflicht

Issue bleibt offen für den Rest. Nächster Dispatch nach Abschluss der aktuellen UI-Welle.

## Phase 2 — Fortschritt (2/6 Module) **Fertig via Sonnet-Sub-Agent:** - `tests/test_drucksache_typen.py` — 48 Tests, **100% Coverage** (27/27 Statements) - `tests/test_mail.py` — 30 Tests, **86% Coverage** (106/123 Statements; unkovered: `_send_sync`/`send_mail` echte SMTP-Calls, `__main__`-Block — vertretbar für Unit-Suite) **Nebenbefund:** `app/mail.py` fehlte `from __future__ import annotations` für Python-3.9-Kompat — ergänzt. **Unit-Suite:** 206 → 284 Tests (+78), alle grün, 13 skipped unverändert, keine Regressions. **Noch offen (Phase 2 Queue):** - [ ] `tests/test_database.py` — 299 LOC, 0% → Ziel 60%+ - [ ] `tests/test_clustering.py` — 141 LOC, 0% - [ ] `tests/test_protokoll_parser.py` — NRW v5 Fixture (#106) - [ ] `tests/test_embeddings_v3_v4.py` — WRITE/READ-Pattern (ADR 0006) - [ ] Phase 3 (Struktur & Hygiene): Marker-Review, `.coveragerc`, ADR 0007 Test-Taxonomie **Bug-Regression-Backfill** (aus Phase-1-Audit, 5 Fix-Commits ohne Test): - [ ] `3e71547` PRAGMA cursor fetchall() vor iteration - [ ] `49c1b92` JWT azp statt aud bei Keycloak Public Clients - [ ] `1414057` CDU-PDF AssertionError Fallback - [ ] `5ea507b` PFLICHT-FRAKTIONEN = alle LT-Fraktionen - [ ] `038ebd6` NRW-Titel + Regierungsfraktionen-Pflicht Issue bleibt offen für den Rest. Nächster Dispatch nach Abschluss der aktuellen UI-Welle.
Author
Owner

Phase 2 — 4/6 Module abgedeckt

Diese Runde:

  • tests/test_database.py — 38 Tests, 56% Coverage (0→56)
  • tests/test_clustering.py — 38 Tests, 82% Coverage (0→82)

Unit-Suite: 314 → 390 Tests (+76), alle grün, 13 skipped unverändert

Phase 2 Gesamtstand (kumuliert):

Modul Coverage Tests
drucksache_typen 100% 48
mail 86% 30
clustering 82% 38
database 56% 38
reindex_embeddings 0%
protokoll_parser (NRW v5 Fixture)

Ungedeckte Pfade in database.py (44% Miss): create_job, get_job, update_job, get_user_jobs, search_assessments, import_json_assessments, get_monitoring_new_today, add_comment, get_comments, delete_comment, upsert_vote, get_votes, mark_subscription_sent, get_all_subscriptions_due

Infrastruktur-Hinweise:

  • aiosqlite 0.22.1 in dev-requirements nachgezogen (war lokal nicht installiert)
  • test_mail.py und test_monitoring.py stubben aiosqlitetest_database.py importiert vor der Stub-Injection, damit beide Welten koexistieren

Noch offen:

  • tests/test_protokoll_parser.py — NRW v5 19/19-Fixture
  • tests/test_embeddings_v3_v4.py — WRITE/READ-Pattern (ADR 0006)
  • Phase 3 (ADR 0007, .coveragerc)
  • 5 Bug-Regression-Backfills aus Phase 1
## Phase 2 — 4/6 Module abgedeckt **Diese Runde:** - `tests/test_database.py` — 38 Tests, **56% Coverage** (0→56) - `tests/test_clustering.py` — 38 Tests, **82% Coverage** (0→82) **Unit-Suite:** 314 → 390 Tests (+76), alle grün, 13 skipped unverändert **Phase 2 Gesamtstand (kumuliert):** | Modul | Coverage | Tests | |---|--:|--:| | `drucksache_typen` | 100% | 48 | | `mail` | 86% | 30 | | `clustering` | **82%** | 38 | | `database` | **56%** | 38 | | `reindex_embeddings` | 0% | ⏳ | | `protokoll_parser` (NRW v5 Fixture) | — | ⏳ | **Ungedeckte Pfade in `database.py` (44% Miss):** `create_job`, `get_job`, `update_job`, `get_user_jobs`, `search_assessments`, `import_json_assessments`, `get_monitoring_new_today`, `add_comment`, `get_comments`, `delete_comment`, `upsert_vote`, `get_votes`, `mark_subscription_sent`, `get_all_subscriptions_due` **Infrastruktur-Hinweise:** - `aiosqlite 0.22.1` in dev-requirements nachgezogen (war lokal nicht installiert) - `test_mail.py` und `test_monitoring.py` stubben `aiosqlite` — `test_database.py` importiert vor der Stub-Injection, damit beide Welten koexistieren **Noch offen:** - [ ] `tests/test_protokoll_parser.py` — NRW v5 19/19-Fixture - [ ] `tests/test_embeddings_v3_v4.py` — WRITE/READ-Pattern (ADR 0006) - [ ] Phase 3 (ADR 0007, `.coveragerc`) - [ ] 5 Bug-Regression-Backfills aus Phase 1
tobias added this to the post-1.0 milestone 2026-04-25 20:59:57 +02:00
Author
Owner

Audit-Update 2026-04-28

Bestandsaufnahme:

  • 27 Module in app/ insgesamt
  • 31 Test-Files in tests/ (= 580 Tests grün, 23 skipped)
  • Coverage-Lücken laut Issue-Liste sind GRÖSSERE Teil schon geschlossen — viele Test-Files existieren bereits:
    • test_database.py, test_drucksache_typen.py, test_mail.py, test_clustering.py, test_embeddings_v3_v4.py, test_redline_parser.py

Echte Lücken nach Audit:

Modul Status
app/wahlperioden.py via test_wahlperioden.py (12 Tests, dieser Commit)
RSS/Atom-Feed (/api/feed.xml) via test_rss.py (14 Tests, vorheriger Commit)
parser_v5_iteration15.py (NRW-Protokoll) offen — Datei lebt nur auf Server, nicht im Repo
app/reindex_embeddings.py offen, Hilfs-Skript
app/sync_abgeordnetenwatch.py offen, Hilfs-Skript

Phase 3 (Struktur & Hygiene): offen — ADR 0007 ist noch zu schreiben, Coverage-Baseline-File noch nicht angelegt.

Issue bleibt offen, weil Phase 1 + Phase 3 noch fehlen. Phase-2-Items sind weitgehend erledigt.

## Audit-Update 2026-04-28 **Bestandsaufnahme:** - 27 Module in `app/` insgesamt - 31 Test-Files in `tests/` (= 580 Tests grün, 23 skipped) - Coverage-Lücken laut Issue-Liste sind GRÖSSERE Teil schon geschlossen — viele Test-Files existieren bereits: - `test_database.py`, `test_drucksache_typen.py`, `test_mail.py`, `test_clustering.py`, `test_embeddings_v3_v4.py`, `test_redline_parser.py` ✅ **Echte Lücken nach Audit:** | Modul | Status | |---|---| | `app/wahlperioden.py` | ❌ → ✅ via `test_wahlperioden.py` (12 Tests, dieser Commit) | | RSS/Atom-Feed (`/api/feed.xml`) | ❌ → ✅ via `test_rss.py` (14 Tests, vorheriger Commit) | | `parser_v5_iteration15.py` (NRW-Protokoll) | offen — Datei lebt nur auf Server, nicht im Repo | | `app/reindex_embeddings.py` | offen, Hilfs-Skript | | `app/sync_abgeordnetenwatch.py` | offen, Hilfs-Skript | **Phase 3 (Struktur & Hygiene):** offen — ADR 0007 ist noch zu schreiben, Coverage-Baseline-File noch nicht angelegt. Issue bleibt offen, weil Phase 1 + Phase 3 noch fehlen. Phase-2-Items sind weitgehend erledigt.
Sign in to join this conversation.
No description provided.