"""Unit tests for the Lexical JSON → HTML renderer.""" from __future__ import annotations import pytest from blog.bp.blog.ghost.lexical_renderer import ( render_lexical, _wrap_format, _align_style, _FORMAT_BOLD, _FORMAT_ITALIC, _FORMAT_STRIKETHROUGH, _FORMAT_UNDERLINE, _FORMAT_CODE, _FORMAT_SUBSCRIPT, _FORMAT_SUPERSCRIPT, _FORMAT_HIGHLIGHT, ) # --------------------------------------------------------------------------- # _wrap_format # --------------------------------------------------------------------------- class TestWrapFormat: def test_no_format(self): assert _wrap_format("hello", 0) == "hello" def test_bold(self): assert _wrap_format("x", _FORMAT_BOLD) == "x" def test_italic(self): assert _wrap_format("x", _FORMAT_ITALIC) == "x" def test_strikethrough(self): assert _wrap_format("x", _FORMAT_STRIKETHROUGH) == "x" def test_underline(self): assert _wrap_format("x", _FORMAT_UNDERLINE) == "x" def test_code(self): assert _wrap_format("x", _FORMAT_CODE) == "x" def test_subscript(self): assert _wrap_format("x", _FORMAT_SUBSCRIPT) == "x" def test_superscript(self): assert _wrap_format("x", _FORMAT_SUPERSCRIPT) == "x" def test_highlight(self): assert _wrap_format("x", _FORMAT_HIGHLIGHT) == "x" def test_bold_italic(self): result = _wrap_format("x", _FORMAT_BOLD | _FORMAT_ITALIC) assert "" in result assert "" in result def test_all_flags(self): all_flags = ( _FORMAT_BOLD | _FORMAT_ITALIC | _FORMAT_STRIKETHROUGH | _FORMAT_UNDERLINE | _FORMAT_CODE | _FORMAT_SUBSCRIPT | _FORMAT_SUPERSCRIPT | _FORMAT_HIGHLIGHT ) result = _wrap_format("x", all_flags) for tag in ["strong", "em", "s", "u", "code", "sub", "sup", "mark"]: assert f"<{tag}>" in result assert f"" in result # --------------------------------------------------------------------------- # _align_style # --------------------------------------------------------------------------- class TestAlignStyle: def test_no_format(self): assert _align_style({}) == "" def test_format_zero(self): assert _align_style({"format": 0}) == "" def test_left(self): assert _align_style({"format": 1}) == ' style="text-align: left"' def test_center(self): assert _align_style({"format": 2}) == ' style="text-align: center"' def test_right(self): assert _align_style({"format": 3}) == ' style="text-align: right"' def test_justify(self): assert _align_style({"format": 4}) == ' style="text-align: justify"' def test_string_format(self): assert _align_style({"format": "center"}) == ' style="text-align: center"' def test_unmapped_int(self): assert _align_style({"format": 99}) == "" # --------------------------------------------------------------------------- # render_lexical — text nodes # --------------------------------------------------------------------------- class TestRenderLexicalText: def test_empty_doc(self): assert render_lexical({"root": {"children": []}}) == "" def test_plain_text(self): doc = {"root": {"children": [ {"type": "text", "text": "hello"} ]}} assert render_lexical(doc) == "hello" def test_html_escape(self): doc = {"root": {"children": [ {"type": "text", "text": ""} ]}} result = render_lexical(doc) assert "