"""Tests für app.pm_render — Python-Spiegelbild des JS-Mini-Markdown-Renderers.""" import pytest try: from app.pm_render import render_pm_body _HAS_RENDER = True except ImportError: _HAS_RENDER = False pytestmark = pytest.mark.skipif(not _HAS_RENDER, reason="app.pm_render nicht importierbar") class TestEmptyAndNone: def test_empty_returns_empty(self): assert render_pm_body("") == "" def test_none_returns_empty(self): assert render_pm_body(None) == "" class TestPlainParagraph: def test_single_paragraph(self): out = render_pm_body("Ein einzelner Satz.") assert out == '
Ein einzelner Satz.
' def test_two_paragraphs(self): out = render_pm_body("Erster Satz.\n\nZweiter Satz.") assert "Erster Satz" in out assert "Zweiter Satz" in out assert out.count("Zeile B" in out
class TestHtmlEscape:
def test_lt_gt_escaped(self):
out = render_pm_body("Vergleich a < b > c.")
assert "<" in out and ">" in out
assert "" not in out # nichts wird zu echten Tags
def test_amp_escaped(self):
out = render_pm_body("Tom & Jerry")
assert "&" in out
class TestBold:
def test_double_star_to_strong(self):
out = render_pm_body("Wert: **30 %**")
assert "30 %" in out
def test_double_underscore_to_strong(self):
out = render_pm_body("Wert: __wichtig__")
assert "wichtig" in out
def test_no_bold_across_newline(self):
"""**...** mit Newline dazwischen wird nicht gemarkt."""
out = render_pm_body("**erste\nZeile**")
assert "" not in out
class TestItalic:
def test_single_star_to_em(self):
out = render_pm_body("Das ist *betont*.")
assert "betont" in out
def test_single_underscore_to_em(self):
out = render_pm_body("Das ist _wichtig_.")
assert "wichtig" in out
def test_underscore_in_word_not_em(self):
"""snake_case darf nicht als em gerendert werden."""
out = render_pm_body("Variable my_var hier.")
assert "" not in out
def test_star_between_words_not_em(self):
"""Ein * zwischen Wort-Charaktern ist kein em-Marker."""
out = render_pm_body("Datei: foo*bar.txt")
assert "" not in out
class TestBoldAndItalicCombined:
def test_bold_first_then_italic(self):
out = render_pm_body("**fett** und *kursiv*.")
assert "fett" in out
assert "kursiv" in out
class TestLists:
def test_simple_dash_list(self):
out = render_pm_body("- Item 1\n- Item 2")
assert " Item 1" in out
def test_dash_in_word_not_list(self):
"""Ein Bindestrich mitten im Wort ist kein Bullet."""
out = render_pm_body("Halb-leer ist halb-voll.")
assert "Item 1" in out
assert "
" in out
# Keine rohen ** mehr
assert "**" not in out
def test_no_bold_when_unmatched(self):
body = "Ein *einfacher Stern."
out = render_pm_body(body)
# Unmatched * darf nicht als em gerendert werden
assert "" not in out
A" in out
assert "
30 %