"""Focused attribution parser regressions.""" from __future__ import annotations import os import tempfile import unittest os.environ.setdefault("CONFIG_DIR", tempfile.mkdtemp(prefix="ttvc-conversation-test-config-")) from routes.conversation import _attribution_parse, _fallback_attribute_response class AttributionParserTests(unittest.TestCase): def test_fallback_accepts_mixed_guillemets(self): result = _fallback_attribute_response("Intro. »Ein langer Satz endet hier.‹ Danach.") self.assertEqual([segment["type"] for segment in result["segments"]], ["narration", "dialogue", "narration"]) self.assertIn("Ein langer Satz endet hier.", result["segments"][1]["text"]) def test_repairs_epigraph_split_before_mixed_guillemet_close(self): raw = '{"segments":[' \ '{"speaker":"Schwester Larissa","type":"dialogue","text":"»Von dem Windhager Felsgesteyn bis zur Kueste von Mendena ziehet es sich hin, von Ifirns Eisgebirg bis zu dem dampfenden Waldt der Mohas, und"},' \ '{"speaker":"Narrator","type":"narration","text":"fürwahr, es ist ein seltsam Land. Lieblich bisweilen, mild und voll der guten Menschen. ‹ Zitiert aus dem Buch."}' \ ']}' result = _attribution_parse(raw, "unused") self.assertEqual(len(result["segments"]), 2) dialogue, narration = result["segments"] self.assertEqual(dialogue["speaker"], "Schwester Larissa") self.assertEqual(dialogue["type"], "dialogue") self.assertTrue(dialogue["text"].endswith("Land. Lieblich bisweilen, mild und voll der guten Menschen. ‹")) self.assertEqual(narration["text"], "Zitiert aus dem Buch.") if __name__ == "__main__": unittest.main()