fix(impressum): Pflichtangaben-Beleg = exakter Treffer statt Textpassage

_match_value gibt genau den gematchten Bereich zurück (nur die E-Mail unter
Email, nur die USt-IdNr, nur die Telefonnummer) — nicht mehr ein Fenster/den
umgebenden Satz. Behebt die Wiederholung desselben Anfangssatzes bei Texten
ohne Zeilenumbrüche (BMW = ein Block).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-11 12:25:27 +02:00
parent 5e18df63b1
commit be93859645
2 changed files with 19 additions and 34 deletions
@@ -1,29 +1,22 @@
"""_line_of — Beleg-Ausschnitt pro Pflichtangabe.
"""_match_value — exakter Beleg-Wert pro Pflichtangabe.
Die Pflichtangaben-Tabelle soll GENAU den Treffer zeigen (nur die E-Mail unter
Email, nur die Anschrift unter Anschrift) — nicht die umgebende Textpassage.
Regression: bei Impressum-Texten ohne Zeilenumbrüche (z.B. BMW als ein Block)
zeigte die Pflichtangaben-Tabelle für JEDE MC denselben Anfangssatz. Jetzt wird
ein enges Fenster um den Treffer ausgeschnitten → jede MC zeigt ihren Beleg.
wurde vorher für jede MC derselbe Anfangssatz / ein breites Fenster gezeigt.
"""
from __future__ import annotations
from compliance.services.specialist_agents.impressum.agent import _line_of
from compliance.services.specialist_agents.impressum.agent import _match_value
def test_window_per_match_in_long_block():
text = "A" * 200 + " EMAIL kontakt@bmw.de " + "B" * 200 + " HRB 12345 " + "C" * 200
e_pos = text.index("kontakt@bmw.de")
h_pos = text.index("12345")
email = _line_of(text, e_pos, e_pos + len("kontakt@bmw.de"))
hrb = _line_of(text, h_pos, h_pos + 5)
assert "kontakt@bmw.de" in email
assert "12345" in hrb
assert email != hrb # nicht mehr derselbe Anfangssatz
assert len(email) <= 160
def test_match_value_is_exact_not_context():
text = "X" * 200 + "kontakt@bmw.de" + "Y" * 200
s = text.index("kontakt@bmw.de")
assert _match_value(text, s, s + len("kontakt@bmw.de")) == "kontakt@bmw.de"
def test_short_line_unchanged():
text = "Zeile eins\nkontakt@bmw.de\nZeile drei"
pos = text.index("kontakt@bmw.de")
out = _line_of(text, pos, pos + len("kontakt@bmw.de"))
assert out == "kontakt@bmw.de"
def test_match_value_normalizes_whitespace_and_caps():
assert _match_value("A B\tC", 0, 6) == "A B C"
assert len(_match_value("z" * 300, 0, 300)) == 120