"""Beleg-Fenster: Faktenbasis = Quellumgebung des Ankers (Rollen-Trennung).""" import belege import db from conftest import topic_anlegen def _quelle(topic, tmp_path, text, name="q.md"): p = tmp_path / name p.write_text(text, encoding="utf-8") return db.insert("quellen", topic=topic, art="datei", titel=name, snapshot=str(p), hash=name + str(tmp_path), status="atome") def _atom(topic): return db.insert("atome", topic=topic, titel="T", typ="verfahren", definition="d", status="neu", braucht=db.j([])) def test_fenster_umgibt_anker(tmp_path): topic = topic_anlegen("bel1") text = "vorher " * 100 + "ANKERZITAT HIER" + " nachher" * 300 q = _quelle(topic, tmp_path, text) a = _atom(topic) start = text.index("ANKERZITAT") db.insert("anker", atom_id=a, quelle_id=q, start=start, ende=start + len("ANKERZITAT HIER"), zitat="ANKERZITAT HIER") (f,) = belege.fenster_liste(a) assert "ANKERZITAT HIER" in f assert "vorher" in f and "nachher" in f # Umgebung beidseitig dabei assert len(f) <= 300 + 1200 + 20 # Fenster-Deckel greift def test_merge_fallback_und_fehlende_datei(tmp_path): topic = topic_anlegen("bel2") text = "start " * 50 + "ZITAT-A und gleich daneben ZITAT-B" + " ende" * 50 q = _quelle(topic, tmp_path, text) a = _atom(topic) ia, ib = text.index("ZITAT-A"), text.index("ZITAT-B") db.insert("anker", atom_id=a, quelle_id=q, start=ia, ende=ia + 7, zitat="ZITAT-A") db.insert("anker", atom_id=a, quelle_id=q, start=ib, ende=ib + 7, zitat="ZITAT-B") bloecke = belege.fenster_liste(a) assert len(bloecke) == 1 # überlappende Fenster gemerged assert "ZITAT-A" in bloecke[0] and "ZITAT-B" in bloecke[0] # Anker ohne Span → Zitat-Fallback b = _atom(topic) db.insert("anker", atom_id=b, quelle_id=q, start=-1, ende=-1, zitat="Nur das Zitat.") assert belege.fenster_liste(b) == ["Nur das Zitat."] # Snapshot-Datei fehlt → Zitat-Fallback (nie schlechter als vorher) c = _atom(topic) q2 = db.insert("quellen", topic=topic, art="datei", titel="tot", snapshot=str(tmp_path / "gibts-nicht.md"), hash="tot", status="atome") db.insert("anker", atom_id=c, quelle_id=q2, start=5, ende=10, zitat="Fallback-Zitat.") assert belege.fenster_liste(c) == ["Fallback-Zitat."]