81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
"""Tests for Markdown renderer."""
|
|||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from volumen.markdown import render
|
||
|
|
|
||
|
|
|
||
|
|
class TestBasicRendering:
|
||
|
|
def test_renders_bold(self) -> None:
|
||
|
|
assert "<strong>bold</strong>" in render("**bold**")
|
||
|
|
|
||
|
|
def test_renders_italic(self) -> None:
|
||
|
|
result = render("*italic*")
|
||
|
|
assert "<em>italic</em>" in result
|
||
|
|
|
||
|
|
def test_renders_heading(self) -> None:
|
||
|
|
assert "<h1" in render("# Title")
|
||
|
|
|
||
|
|
def test_renders_paragraph(self) -> None:
|
||
|
|
result = render("Simple paragraph.")
|
||
|
|
assert "<p>" in result
|
||
|
|
|
||
|
|
def test_renders_link(self) -> None:
|
||
|
|
result = render("[link](https://example.com)")
|
||
|
|
assert '<a href="https://example.com"' in result
|
||
|
|
|
||
|
|
def test_renders_unordered_list(self) -> None:
|
||
|
|
result = render("- one\n- two\n")
|
||
|
|
assert "<ul>" in result
|
||
|
|
assert "<li>one</li>" in result
|
||
|
|
|
||
|
|
|
||
|
|
class TestGFMFeatures:
|
||
|
|
def test_renders_gfm_table(self) -> None:
|
||
|
|
table = "| A | B |\n|---|---|\n| 1 | 2 |\n"
|
||
|
|
assert "<table" in render(table)
|
||
|
|
|
||
|
|
def test_renders_fenced_code_block(self) -> None:
|
||
|
|
code = "```python\nprint(1)\n```\n"
|
||
|
|
html = render(code)
|
||
|
|
assert "<pre" in html or "<code" in html
|
||
|
|
|
||
|
|
def test_renders_task_list(self) -> None:
|
||
|
|
md = "- [x] Done\n- [ ] Todo\n"
|
||
|
|
result = render(md)
|
||
|
|
assert "checkbox" in result.lower() or "checked" in result.lower()
|
||
|
|
|
||
|
|
def test_renders_strikethrough(self) -> None:
|
||
|
|
result = render("~~strike~~")
|
||
|
|
assert "<del>" in result
|
||
|
|
|
||
|
|
|
||
|
|
class TestFigureWrapping:
|
||
|
|
def test_image_with_title_wrapped_in_figure(self) -> None:
|
||
|
|
result = render('')
|
||
|
|
assert "<figure>" in result
|
||
|
|
|
||
|
|
def test_image_without_title_no_wrapping(self) -> None:
|
||
|
|
result = render("")
|
||
|
|
assert "<figure>" not in result
|
||
|
|
|
||
|
|
def test_figure_includes_figcaption(self) -> None:
|
||
|
|
result = render('')
|
||
|
|
assert "<figcaption>" in result
|
||
|
|
assert "caption" in result
|
||
|
|
|
||
|
|
|
||
|
|
class TestEdgeCases:
|
||
|
|
def test_empty_input(self) -> None:
|
||
|
|
result = render("")
|
||
|
|
assert isinstance(result, str)
|
||
|
|
assert result == ""
|
||
|
|
|
||
|
|
def test_plain_text(self) -> None:
|
||
|
|
result = render("Hello world")
|
||
|
|
assert "Hello world" in result
|
||
|
|
|
||
|
|
def test_html_passthrough(self) -> None:
|
||
|
|
result = render("<span>inline</span>")
|
||
|
|
assert "<span>" in result
|