55 lines
2.4 KiB
Python
55 lines
2.4 KiB
Python
"""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."]
|