"""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 assert "

  • Item 2
  • " in out def test_simple_star_list(self): out = render_pm_body("* A\n* B") assert "A" in out assert "
  • B
  • " in out def test_list_with_paragraph_around(self): body = "Vor der Liste.\n\n- Item 1\n- Item 2\n\nNach der Liste." out = render_pm_body(body) 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 "30 %
    " 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