Private
Public Access
0
0
Files
manual_slop/tests/test_markdown_render_robust.py
T

82 lines
3.0 KiB
Python

from unittest.mock import patch
from src.markdown_helper import MarkdownRenderer
from src.markdown_table import parse_tables
def _mock_table_calls(mock_imgui):
mock_imgui.TableFlags_ = type("T", (), {"borders": 1, "row_bg": 2, "resizable": 4})()
mock_imgui.begin_table.return_value = True
mock_imgui.table_next_column = lambda: None
mock_imgui.table_next_row = lambda: None
mock_imgui.table_headers_row = lambda: None
mock_imgui.text = lambda *a, **k: None
mock_imgui.end_table = lambda: None
def test_tables_in_crlf_text_all_get_masked():
text = (
"# Title\r\n"
"\r\n"
"| A | B |\r\n"
"|---|---|\r\n"
"| 1 | 2 |\r\n"
"\r\n"
"Some prose.\r\n"
"\r\n"
"| X | Y |\r\n"
"|---|---|\r\n"
"| 3 | 4 |\r\n"
)
blocks = parse_tables(text)
assert len(blocks) == 2
with patch("src.markdown_helper.imgui_md") as mock_md, patch("src.markdown_helper.imgui") as mock_imgui, patch("src.markdown_table.imgui") as mock_table_imgui:
_mock_table_calls(mock_table_imgui)
MarkdownRenderer().render(text, context_id="t")
full = "".join(str(c) for c in mock_md.render.call_args_list)
for needle in ["| A | B |", "|---|", "| 1 | 2 |", "| X | Y |", "| 3 | 4 |"]:
assert needle not in full, f"Raw table text leaked to imgui_md: {needle!r} in calls: {full!r}"
def test_duplicate_table_content_both_get_replaced():
text = (
"| A | B |\r\n"
"|---|---|\r\n"
"| 1 | 2 |\r\n"
"\r\n"
"Middle prose.\r\n"
"\r\n"
"| A | B |\r\n"
"|---|---|\r\n"
"| 1 | 2 |\r\n"
)
blocks = parse_tables(text)
assert len(blocks) == 2
with patch("src.markdown_helper.imgui_md") as mock_md, patch("src.markdown_helper.imgui") as mock_imgui, patch("src.markdown_table.imgui") as mock_table_imgui:
_mock_table_calls(mock_table_imgui)
MarkdownRenderer().render(text, context_id="dup")
full = "".join(str(c) for c in mock_md.render.call_args_list)
assert "| A | B |" not in full, f"Raw table text leaked on duplicate: {full!r}"
def test_render_applies_current_syntax_palette(monkeypatch):
"""When a theme is active, the render path should call apply_syntax_palette
so new code-block editors pick up the theme's syntax palette."""
from unittest.mock import patch
from src import theme_2 as theme
class _Tracker:
last_palette = None
last_call = False
def fake_apply(palette_id):
_Tracker.last_palette = palette_id
_Tracker.last_call = True
monkeypatch.setattr(theme, "apply_syntax_palette", fake_apply)
monkeypatch.setattr(theme, "_current_palette", "solarized_dark")
monkeypatch.setattr(theme, "get_syntax_palette_for_theme", lambda n: "dark")
from src.markdown_helper import MarkdownRenderer
with patch("src.markdown_helper.imgui_md") as mock_md, patch("src.markdown_helper.imgui") as mock_imgui, patch("src.markdown_table.imgui") as mock_table_imgui:
_mock_table_calls(mock_table_imgui)
MarkdownRenderer().render("hello world", context_id="p")
assert _Tracker.last_call, "expected apply_syntax_palette to be called"