import unittest
import time
from meshchatx.src.backend.markdown_renderer import MarkdownRenderer
class TestMarkdownRenderer(unittest.TestCase):
def test_basic_render(self):
self.assertEqual(MarkdownRenderer.render(""), "")
self.assertIn("
Bold", MarkdownRenderer.render("**Bold**"))
self.assertIn("Italic ", MarkdownRenderer.render("*Italic*"))
def test_links(self):
rendered = MarkdownRenderer.render("[Google](https://google.com)")
self.assertIn('href="https://google.com"', rendered)
self.assertIn("Google", rendered)
def test_code_blocks(self):
code = "```python\nprint('hello')\n```"
rendered = MarkdownRenderer.render(code)
self.assertIn("", rendered)
self.assertIn("strike", rendered)
def test_paragraphs(self):
md = "Para 1\n\nPara 2"
rendered = MarkdownRenderer.render(md)
self.assertIn("alert(1)",
"",
'',
"",
]
for s in cases:
r = MarkdownRenderer.render(s)
self.assertNotIn("", r, msg=s)
self.assertIn("<", r, msg=s)
def test_xss_event_handlers(self):
cases = [
' ',
'
',
'x ',
'',
]
for s in cases:
r = MarkdownRenderer.render(s)
self.assertNotIn(" alert(1))")
self.assertNotIn("data:", r)
self.assertIn('href="#"', r)
def test_xss_link_href_vbscript(self):
r = MarkdownRenderer.render("[click](vbscript:msgbox(1))")
self.assertNotIn("vbscript:", r)
self.assertIn('href="#"', r)
def test_safe_links_preserved(self):
r = MarkdownRenderer.render("[link](https://example.com/path)")
self.assertIn('href="https://example.com/path"', r)
r = MarkdownRenderer.render("[link](/relative)")
self.assertIn('href="/relative"', r)
r = MarkdownRenderer.render("[link](#anchor)")
self.assertIn('href="#anchor"', r)
def test_redos_safe_repeated_markers(self):
t0 = time.perf_counter()
MarkdownRenderer.render("*" * 8000)
MarkdownRenderer.render("#" * 8000)
MarkdownRenderer.render("`" * 8000)
MarkdownRenderer.render("[](" * 2000 + "x" * 2000 + ")" * 2000)
elapsed = time.perf_counter() - t0
self.assertLess(elapsed, 2.0, "ReDoS or excessive backtracking suspected")
def test_malformed_unclosed_markdown(self):
cases = [
"**bold no close",
"```\ncode no close",
"*italic",
"`code",
"___under",
"[unclosed link](url",
"
self.assertIsInstance(r, str)
self.assertNotIn(" normal text",
"**bold** and [link](javascript:x) end",
"\u202eRTL override",
]
for s in cases:
r = MarkdownRenderer.render(s)
self.assertIsInstance(r, str)
self.assertNotIn("