youtube_abschrift_korrigieren/tests/test_aenderungen.py
dschlueter 95bdc660ca fix: Änderungsbericht erkennt Apostrophe im Wort; output/ ignorieren
- „Bahrs“ → „Bahr’s“ ist jetzt eine Änderung; ’ ' ` gelten als gleich,
  Anführungszeichen am Wortrand zählen weiterhin nicht
- Prüfmarken auch englisch: [check: …]
- output/ (eigene Ergebnisse und Testläufe) in .gitignore

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:33:04 +02:00

119 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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("<h2>Korrigierter Text</h2>")[1]
body = re.sub(r"<del[^>]*>.*?</del>|<span class=orig>.*?</span>", "", 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 "<span class=check>[prüfen: Ghard]</span>" in page
assert "1 Prüfmarken" in page
def test_render_html_shows_text_original_and_paragraphs():
raw = "die gedeiliche Zusammenarbeit <b> ist gut heute neuer Absatz"
corrected = "Die gedeihliche Zusammenarbeit <b> 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 "<del title='gestrichen'>heute</del>" in page
assert "&lt;b&gt;" in page and "<b>" not in page.split("<body>")[1]
assert "Rede &amp; Co" in page
assert page.split("<h2>Korrigierter Text</h2>")[1].count("<p>") == 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