Der Schnitt aus CLAUDE.md ist durchgehalten: - Fetch (deterministisch, kein LLM): marktguru-Adapter mit geprüftem Ortsbezug (zipCode), Wochen-Cache, robots.txt-Respekt, ehrlicher Regel-4- Abbruch bei fehlendem Beleg statt Krücke. - Kategorisierung (einziger LLM-Ort): geschlossene Liste + Daten-Integrität als Code erzwungen; austauschbar via Protokoll (OpenRouter/Anthropic), mit Drosselung/Retry und ehrlichem Abbruch. - FastAPI-Web-UI als dünne Schicht: Modellauswahl (Liste/Suche/Refresh), Live-Fortschritt, gruppierte Ergebnisse mit Filtern, Ergebnis-Cache. - 36 Tests gegen die Architektur-Regeln (kein Auffüllen, Abbruch, Integrität, geschlossene Liste, Unsicherheit, Schnitt) und die Web-Schicht. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
21 lines
805 B
Python
21 lines
805 B
Python
"""Regel: Kein Auffüllen. Leeres Quellergebnis bleibt leer."""
|
|
|
|
from angebote.fetch import hole_angebote
|
|
from angebote.uebersicht import rendern
|
|
from tests.fakes import FakeQuelle
|
|
|
|
|
|
def test_leere_quelle_fuellt_nicht_auf():
|
|
ergebnis = hole_angebote("60487", [FakeQuelle("leer", [])])
|
|
assert ergebnis.angebote == ()
|
|
# Der Lauf wird ehrlich vermerkt, nicht versteckt:
|
|
assert any("0 Angebote" in h for h in ergebnis.hinweise)
|
|
|
|
|
|
def test_uebersicht_zeigt_keine_erfundenen_beispiele():
|
|
ergebnis = hole_angebote("60487", [FakeQuelle("leer", [])])
|
|
text = rendern(ergebnis, [])
|
|
# Jede Gruppe steht da -- aber leer, als "keine Angebote", nicht aufgefüllt.
|
|
assert text.count("_keine Angebote_") >= 1
|
|
# Keine Beispieldaten:
|
|
assert "€" not in text or "Preis fehlt" in text
|