E2E Sub-B: Adapter ↔ Frontend Cross-Validation #52

Closed
opened 2026-04-09 09:02:10 +02:00 by tobias · 1 comment
Owner

Sub-Issue von #50.

Zweck

Sub-Issue B des E2E-Test-Umbrellas. Cross-Validation pro aktivem BL gegen eine manuell aus der Frontend-Suche kuratierte Drucksache als externe Ground Truth.

Datei

  • webapp/tests/integration/test_frontend_xref.py
  • webapp/tests/integration/ground_truth.py (Daten-Sample-Helper)

Was getestet wird

Für jeden aktiven BL ist genau ein Drucksachen-Tupel im GROUND_TRUTH-Array kuratiert mit:

@dataclass
class GroundTruth:
    bundesland: str
    drucksache: str             # z.B. "8/6390"
    title_substring: str        # "Krisenmechanismus"
    expected_fraktionen: set[str]  # {"CDU"}
    datum: str                  # ISO "2026-03-18"
    pdf_url_substring: str      # "dokument/" oder ähnlich
    frontend_search_url: str    # https://www.dokumentation.landtag-mv.de/parldok/  (Doku!)

Test:

@pytest.mark.integration
@pytest.mark.parametrize("gt", GROUND_TRUTH, ids=lambda g: g.bundesland)
async def test_adapter_finds_known_drucksache(gt):
    adapter = ADAPTERS[gt.bundesland]
    doc = await adapter.get_document(gt.drucksache)
    assert doc is not None
    assert gt.title_substring in doc.title
    assert gt.expected_fraktionen <= set(doc.fraktionen)
    assert doc.datum == gt.datum
    assert gt.pdf_url_substring in doc.link

Ground-Truth-Kuration (Pflicht-Schritt vor Test-Lauf)

Für jeden aktiven BL muss der Implementierer einmal:

  1. Die offizielle Frontend-Suche des Landtags öffnen
  2. Eine echte Drucksache aussuchen (idealerweise einen klar parteinahen Antrag der letzten 6 Monate)
  3. Title, Drucksache-Nr, Datum, Fraktionen ablesen
  4. Ein GroundTruth-Tupel ins ground_truth.py aufnehmen
  5. Den frontend_search_url als Doku reinschreiben damit der nächste Wartende weiss, woher das Sample stammt

Pro BL ein Tupel — bei Schema-Drift schlägt der jeweilige Test mit klarer Diff-Meldung fehl.

Bug-Klassen

Deckt 14 (get_document() Cross-Bundesland-Match) und ist die Versicherung gegen Adapter-Output-Drift bei beliebigen Schema-Änderungen.

Akzeptanzkriterien

  • GROUND_TRUTH-Array mit ≥ 1 Eintrag pro aktivem BL
  • Alle Tests grün
  • Bei einem manipulierten Adapter (falscher base_url) schlägt der jeweilige BL-Test mit klarer Fehlermeldung fehl
  • Wartungs-Doku im Modul-Docstring: wie man ein neues Sample hinzufügt
Sub-Issue von #50. ## Zweck Sub-Issue B des E2E-Test-Umbrellas. Cross-Validation pro aktivem BL gegen eine **manuell aus der Frontend-Suche kuratierte** Drucksache als externe Ground Truth. ## Datei - `webapp/tests/integration/test_frontend_xref.py` - `webapp/tests/integration/ground_truth.py` (Daten-Sample-Helper) ## Was getestet wird Für jeden aktiven BL ist genau **ein** Drucksachen-Tupel im `GROUND_TRUTH`-Array kuratiert mit: ```python @dataclass class GroundTruth: bundesland: str drucksache: str # z.B. "8/6390" title_substring: str # "Krisenmechanismus" expected_fraktionen: set[str] # {"CDU"} datum: str # ISO "2026-03-18" pdf_url_substring: str # "dokument/" oder ähnlich frontend_search_url: str # https://www.dokumentation.landtag-mv.de/parldok/ (Doku!) ``` Test: ```python @pytest.mark.integration @pytest.mark.parametrize("gt", GROUND_TRUTH, ids=lambda g: g.bundesland) async def test_adapter_finds_known_drucksache(gt): adapter = ADAPTERS[gt.bundesland] doc = await adapter.get_document(gt.drucksache) assert doc is not None assert gt.title_substring in doc.title assert gt.expected_fraktionen <= set(doc.fraktionen) assert doc.datum == gt.datum assert gt.pdf_url_substring in doc.link ``` ## Ground-Truth-Kuration (Pflicht-Schritt vor Test-Lauf) Für jeden aktiven BL muss der Implementierer einmal: 1. Die offizielle Frontend-Suche des Landtags öffnen 2. Eine echte Drucksache aussuchen (idealerweise einen klar parteinahen Antrag der letzten 6 Monate) 3. Title, Drucksache-Nr, Datum, Fraktionen ablesen 4. Ein `GroundTruth`-Tupel ins `ground_truth.py` aufnehmen 5. Den `frontend_search_url` als Doku reinschreiben damit der nächste Wartende weiss, woher das Sample stammt Pro BL ein Tupel — bei Schema-Drift schlägt der jeweilige Test mit klarer Diff-Meldung fehl. ## Bug-Klassen Deckt 14 (get_document() Cross-Bundesland-Match) und ist die Versicherung gegen Adapter-Output-Drift bei beliebigen Schema-Änderungen. ## Akzeptanzkriterien - [ ] `GROUND_TRUTH`-Array mit ≥ 1 Eintrag pro aktivem BL - [ ] Alle Tests grün - [ ] Bei einem manipulierten Adapter (falscher `base_url`) schlägt der jeweilige BL-Test mit klarer Fehlermeldung fehl - [ ] Wartungs-Doku im Modul-Docstring: wie man ein neues Sample hinzufügt
Author
Owner

Sub-B erledigt — tests/integration/test_frontend_xref.py + ground_truth.py mit kuratiertem Sample pro aktivem BL. Commit 73a7f76. NRW-Sample noch placeholder, andere 9 BL kuratiert.

Sub-B erledigt — tests/integration/test_frontend_xref.py + ground_truth.py mit kuratiertem Sample pro aktivem BL. Commit 73a7f76. NRW-Sample noch placeholder, andere 9 BL kuratiert.
Sign in to join this conversation.
No description provided.