Kleine pytest-Suite für Adapter-Parser + Prompt-Formatter #91

Closed
opened 2026-04-10 10:09:34 +02:00 by tobias · 0 comments
Owner

Motivation

Die Codebase ist seit ein paar Monaten WIP, hat keine Tests und in der Adapter-Session 2026-04-08 sind drei Bugs aufgetaucht, die durch fixture-basierte Unit-Tests sofort gefangen worden wären:

  • doctypedoctype_full NameError im PortalaAdapter card-parser (Hot-Fix 1cb030a). Wurde erst auf dem prod-server bemerkt und als verwaister Live-Edit wieder gefunden, als ein späterer Pull mit dem Server-Stand kollidierte.
  • WEV01 vs. WEV06 Hit-Format-Mismatch im LSA-VOLL-Mode (#13/#14, deferred). Wurde erst beim Live-Smoke-Test sichtbar.
  • format_quotes_for_prompt ohne Programm-Quelle — der LLM-Halluzinations-Bug (1b5fd96 + bc7f4a6). Hätte mit einem Snapshot-Test gegen einen Beispiel-Chunk-Set sofort auffallen können.

Scope (klein gehalten, hoher ROI)

  • tests/test_parlamente.py — Fixture-basierte Tests für _hit_to_drucksache, _parse_hit_list_dump, _parse_hit_list_cards, _normalize_fraktion. Fixtures als kleine Dateien unter tests/fixtures/ (1-2 echte HAR-Snippets pro Adapter, anonymisiert wenn nötig).
  • tests/test_embeddings.py — Snapshot-Test für format_quotes_for_prompt mit fake chunks; Test dass _chunk_source_label immer Programm-Name + Seite enthält.
  • tests/test_analyzer.py — JSON-Parser-Edge-Cases (```json-Stripping, leading/trailing whitespace).
  • tests/test_wahlprogramme.pyget_wahlprogramm für jede der 22 indexierten Programme, parteien_mit_wahlprogramm pro Bundesland, Datei-Existenz-Check (info['file'] muss in static/referenzen/ liegen).

Was NICHT in dieser Suite ist

  • Live-HTTP gegen Parlamentsbackends — zu flakig, gehört in eine separate Integration-Suite mit vcrpy / pytest-recording
  • LLM-End-to-End-Analyse — zu teuer, nicht-deterministisch
  • DB-Migrationen — klein genug für Smoke

Akzeptanzkriterien

  • pytest läuft lokal und in CI (falls vorhanden) durch
  • ~25 Tests, alle grün
  • Coverage für die genannten Module ≥80% (cosmetic — wichtiger ist dass die drei Session-Bugs als regression-Test drin sind)
  • requirements-dev.txt mit pytest, pytest-asyncio
  • README oder DOKUMENTATION.md mit pytest als Befehl
## Motivation Die Codebase ist seit ein paar Monaten WIP, hat keine Tests und in der Adapter-Session 2026-04-08 sind drei Bugs aufgetaucht, die durch fixture-basierte Unit-Tests sofort gefangen worden wären: - **`doctype` → `doctype_full` NameError** im PortalaAdapter card-parser (Hot-Fix `1cb030a`). Wurde erst auf dem prod-server bemerkt und als verwaister Live-Edit wieder gefunden, als ein späterer Pull mit dem Server-Stand kollidierte. - **WEV01 vs. WEV06 Hit-Format-Mismatch** im LSA-VOLL-Mode (#13/#14, deferred). Wurde erst beim Live-Smoke-Test sichtbar. - **`format_quotes_for_prompt` ohne Programm-Quelle** — der LLM-Halluzinations-Bug (`1b5fd96` + `bc7f4a6`). Hätte mit einem Snapshot-Test gegen einen Beispiel-Chunk-Set sofort auffallen können. ## Scope (klein gehalten, hoher ROI) - **`tests/test_parlamente.py`** — Fixture-basierte Tests für `_hit_to_drucksache`, `_parse_hit_list_dump`, `_parse_hit_list_cards`, `_normalize_fraktion`. Fixtures als kleine Dateien unter `tests/fixtures/` (1-2 echte HAR-Snippets pro Adapter, anonymisiert wenn nötig). - **`tests/test_embeddings.py`** — Snapshot-Test für `format_quotes_for_prompt` mit fake chunks; Test dass `_chunk_source_label` immer Programm-Name + Seite enthält. - **`tests/test_analyzer.py`** — JSON-Parser-Edge-Cases (` ```json `-Stripping, leading/trailing whitespace). - **`tests/test_wahlprogramme.py`** — `get_wahlprogramm` für jede der 22 indexierten Programme, `parteien_mit_wahlprogramm` pro Bundesland, Datei-Existenz-Check (`info['file']` muss in `static/referenzen/` liegen). ## Was NICHT in dieser Suite ist - Live-HTTP gegen Parlamentsbackends — zu flakig, gehört in eine separate Integration-Suite mit `vcrpy` / `pytest-recording` - LLM-End-to-End-Analyse — zu teuer, nicht-deterministisch - DB-Migrationen — klein genug für Smoke ## Akzeptanzkriterien - [ ] `pytest` läuft lokal und in CI (falls vorhanden) durch - [ ] ~25 Tests, alle grün - [ ] Coverage für die genannten Module ≥80% (cosmetic — wichtiger ist dass die drei Session-Bugs als regression-Test drin sind) - [ ] `requirements-dev.txt` mit `pytest`, `pytest-asyncio` - [ ] README oder DOKUMENTATION.md mit `pytest` als Befehl
Sign in to join this conversation.
No description provided.