"""Tests for aenderungen.py (change report raw transcript -> corrected text).""" import html import re import sys from pathlib import Path import pytest import aenderungen as ae def changes(raw, corrected): return [(tag, " ".join(old), " ".join(new)) for tag, old, new in ae.compare(raw, corrected).changes()] def report_text(page): """Corrected text as shown in the report, without original/deleted words.""" body = page.split("

Korrigierter Text

")[1] body = re.sub(r"]*>.*?|.*?", "", body) return html.unescape(re.sub(r"<[^>]+>", " ", body)).split() @pytest.mark.parametrize("raw, corrected", [ ("das ist gut", "Das ist gut."), # case, punctuation ("all das zerstritten", "All das – zerstritten."), # dash only ("wie z.B. hier", "wie z. B. hier"), # split abbreviation ("eins zwei", "eins\n\nzwei"), # paragraph break ]) def test_expected_edits_are_no_changes(raw, corrected): assert changes(raw, corrected) == [] @pytest.mark.parametrize("raw, corrected", [ ("gibt's", "gibt’s"), # apostrophe variants ("er sagte Frieden", "Er sagte ‚Frieden‘."), # quotes at the edges ]) def test_apostrophes_and_quotes_unchanged(raw, corrected): assert changes(raw, corrected) == [] def test_apostrophe_inside_word_is_a_change(): assert changes("Egon Bahrs Politik", "Egon Bahr’s Politik") == [ ("replace", "Bahrs", "Bahr’s"), ] def test_english_review_marks(): comparison = ae.compare("his name is Kocher", "His name is Kocher [check: Kocha].") assert list(comparison.changes()) == [] assert sum(len(m) for m in comparison.marks.values()) == 1 def test_replace_insert_delete(): raw = "die gedeiliche Zusammenarbeit war das gut heute" corrected = "die gedeihliche Zusammenarbeit war doch gut" assert changes(raw, corrected) == [ ("replace", "gedeiliche", "gedeihliche"), ("replace", "das", "doch"), ("delete", "heute", ""), ] assert changes("ein Wort", "ein neues Wort") == [("insert", "", "neues")] def test_change_summary_counts_and_sorts(): raw = "Kremmel und Kremmel und Bar" corrected = "Kreml und Kreml und Bahr" assert ae.change_summary(ae.compare(raw, corrected)) == [ ("Kremmel", "Kreml", 2), ("Bar", "Bahr", 1), ] def test_review_marks_are_not_changes_but_shown(): corrected = "Er heißt Gerhard [prüfen: Ghard] Kocher." comparison = ae.compare("Er heißt Gerhard Kocher", corrected) assert list(comparison.changes()) == [] page = ae.render_html(comparison, "t") assert "[prüfen: Ghard]" in page assert "1 Prüfmarken" in page def test_render_html_shows_text_original_and_paragraphs(): raw = "die gedeiliche Zusammenarbeit ist gut heute neuer Absatz" corrected = "Die gedeihliche Zusammenarbeit ist gut.\n\nNeuer Absatz." page = ae.render_html(ae.compare(raw, corrected), "Rede & Co") assert report_text(page) == corrected.split() assert "title='Original: gedeiliche'" in page assert "heute" in page assert "<b>" in page and "" not in page.split("")[1] assert "Rede & Co" in page assert page.split("

Korrigierter Text

")[1].count("

") == 2 def test_report_path(): assert ae.report_path(Path("a/rede.korrigiert.txt")) == Path("a/rede.aenderungen.html") assert ae.report_path(Path("out.txt")) == Path("out.aenderungen.html") def test_cli(tmp_path, monkeypatch, capsys): raw = tmp_path / "rede.vtt" raw.write_text( "WEBVTT\n\n00:00:01.000 --> 00:00:02.000\ndas Kremmel heute\n", encoding="utf-8" ) corrected = tmp_path / "rede.korrigiert.txt" corrected.write_text("Das Kreml heute.\n", encoding="utf-8") monkeypatch.setattr(sys, "argv", ["aenderungen.py", "-a", str(raw), "-b", str(corrected)]) ae.main() assert (tmp_path / "rede.aenderungen.html").is_file() out = capsys.readouterr().out assert "1× „Kremmel“ → „Kreml“" in out def test_cli_missing_file(tmp_path, monkeypatch, capsys): monkeypatch.setattr(sys, "argv", ["aenderungen.py", "-a", "fehlt.txt", "-b", "fehlt.txt"]) with pytest.raises(SystemExit): ae.main() assert "Datei nicht gefunden" in capsys.readouterr().err