maboto/tests/test_fetch_kein_auffuellen.py
Jeuner 39b8a98bc2 Initiale Implementierung: Angebots-Übersicht (Fetch + Kategorisierung + Web-UI)
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>
2026-06-03 09:29:59 +02:00

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