Test-Suite: Vollständigkeits-Audit + Ausbau (Phase 2 nach #50) #134
Labels
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: tobias/gwoe-antragspruefer#134
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Kontext
Die Test-Suite ist organisch mit den Features gewachsen und hat mehrere Epochen:
tests/conftest.pystubbtfitz/bs4/openai/pydantic_settingstests/integration/, 285 Tests, marker-opt-intests/e2e/test_ui.py, markere2eSeit #50 closed (2026-03-?) wurden diverse Features live ohne dediziertes Test-Backfill:
app/mail.pyapp/drucksache_typen.pyDazu fehlen Tests für zentrale Kern-Module:
app/database.py— Source of Truth, keine dedizierte Test-Dateiapp/mail.py— SMTP + Template-Rendering, kein Testapp/clustering.py— kein Testapp/drucksache_typen.py— kein Testapp/wahlperioden.py— kein TestAufgabe
Phase 1 — Bestandsaufnahme (Audit)
app/*.pyCoverage-Lücken identifizieren (Glob +coverage.pygegentests/)pytest -m integrationlaufen lassen, xfails/Skips dokumentieren, outdated Ground-Truth-Samples (tests/integration/ground_truth.py) aktualisierenpytest -m e2egegen Prod, kaputte Selektoren dokumentierenPhase 2 — Lücken schließen (Prioritätsreihenfolge)
test_database.py— Migrations, Assessment-Schreib-/Lese-Pfad,assessment_versions,email_subscriptionstest_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 gestubbedtest_clustering.py— Embedding-Nähe-Output deterministisch für Fixture-Corpustest_embeddings_v3_v4.py— WRITE-Modell-Switch produziert neue Chunks, READ liest nur gewünschtes Modell, Dual-Read während Reindextest_protokoll_parser.py— NRW v5 mit MMP18-119-Fixture (19/19-Garantie), optional MMP-Samples anderer BL als xfail bis v6test_rss.py— Atom-Validität gegen feedparser, Inhalts-Dedup, Cache-HeaderPhase 3 — Struktur & Hygiene
integration/slow/e2e— ggf. weitere (llmfür Cost-Tests,networkfür HTTP-freie Varianten).coveragerc, Zielwert z.B. ≥ 70% pro Kern-Modul)docs/archive/plan-keen-pondering-puddle.md)Akzeptanzkriterien
test_*.py-Datei (Kern-Pfade, keine 100%-Coverage-Jagd)pytest -m integrationgrün oder dokumentiert-xfailwebapp/docs/adr/Nicht-Ziele (bewusst)
Bezug
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) undparlamente.py(25% von 1425 LOC) als größte Module die Bilanz ziehen. Kern-Domain-Module sehen besser aus.__init__.pyauswertungen.pyauth.pybundeslaender.pyclustering.pyconfig.pydatabase.pydrucksache_typen.pyembeddings.pymail.pymain.pymodels.pyparlamente.pyparteien.pyqueue.pyreindex_embeddings.pyreport.pyvalidators.pywahlperioden.pywahlprogramme.pyZero-Coverage-Liste (Top-Prioritäten Phase 2)
database.py(299 LOC, 0%) — ⚠ kritisch: jede Migration, jeder Write-Pfad, jede Versionierung (assessment_versions) bricht stillschweigendmail.py(122 LOC, 0%) — ⚠ produktiv (#124 gerade aktiviert): Template-Rendering + Unsubscribe-Token ohne Testclustering.py(141 LOC, 0%) — #105 live, aber ohne Fixture-basierte Nähe-Assertionreindex_embeddings.py(126 LOC, 0%) — Risiko: v3→v4-Migration war manuell (#123)main.py(680 LOC, 1%) — Smoke-Tests sindssssssss= 8× skip. Vermutlich Fixtures kaputt. Prio klären.Bug-Fixes der letzten 30 Commits — Regressions-Test-Bilanz
Stichprobe aus
git logauf Fix-Commits:3e715475ec0b0849c1b92ed64399test_embeddings.py(nach #60)14140575ea507b038ebd6Befund: ~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
integration/e2eMarkerntests/integration/:test_adapters_live.py(240 LOC) — Reachability + Type-Filter pro aktives BLtest_frontend_xref.py(105 LOC) — ground-truth-Kuration pro BL, 172 LOC inground_truth.pytest_wahlprogramme_indexed.py(313 LOC) — Indexing-Status + Inhalts-Markertest_citations_substring.py(500 LOC) — Property-Verificationtests/e2e/test_ui.py(210 LOC) — Playwright (#120)Nächster Schritt Phase 1 (offen):
pytest -m integrationgegen 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):
test_database.py— Migrations + Write-Pfade +assessment_versionstest_mail.py— Template-Render + Unsubscribe-Tokentest_drucksache_typen.py— existiert nicht, wird durchtest_parlamente.pynur indirekt abgedeckttest_protokoll_parser.py— NRW v5 19/19-Fixture (#106 Garantie)test_clustering.py— Fixture-Corpus mit deterministischer Nähe-Matrixtest_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 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_mailechte SMTP-Calls,__main__-Block — vertretbar für Unit-Suite)Nebenbefund:
app/mail.pyfehltefrom __future__ import annotationsfü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).coveragerc, ADR 0007 Test-TaxonomieBug-Regression-Backfill (aus Phase-1-Audit, 5 Fix-Commits ohne Test):
3e71547PRAGMA cursor fetchall() vor iteration49c1b92JWT azp statt aud bei Keycloak Public Clients1414057CDU-PDF AssertionError Fallback5ea507bPFLICHT-FRAKTIONEN = alle LT-Fraktionen038ebd6NRW-Titel + Regierungsfraktionen-PflichtIssue bleibt offen für den Rest. Nächster Dispatch nach Abschluss der aktuellen UI-Welle.
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):
drucksache_typenmailclusteringdatabasereindex_embeddingsprotokoll_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_dueInfrastruktur-Hinweise:
aiosqlite 0.22.1in dev-requirements nachgezogen (war lokal nicht installiert)test_mail.pyundtest_monitoring.pystubbenaiosqlite—test_database.pyimportiert vor der Stub-Injection, damit beide Welten koexistierenNoch offen:
tests/test_protokoll_parser.py— NRW v5 19/19-Fixturetests/test_embeddings_v3_v4.py— WRITE/READ-Pattern (ADR 0006).coveragerc)Audit-Update 2026-04-28
Bestandsaufnahme:
app/insgesamttests/(= 580 Tests grün, 23 skipped)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:
app/wahlperioden.pytest_wahlperioden.py(12 Tests, dieser Commit)/api/feed.xml)test_rss.py(14 Tests, vorheriger Commit)parser_v5_iteration15.py(NRW-Protokoll)app/reindex_embeddings.pyapp/sync_abgeordnetenwatch.pyPhase 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.