Files
hermes-webui/tests/test_issue4075_mermaid_lightbox.py
T

89 lines
3.4 KiB
Python

"""Static regression coverage for Mermaid diagram lightbox wiring."""
from pathlib import Path
import re
ROOT = Path(__file__).resolve().parent.parent
UI = ROOT / "static" / "ui.js"
STYLE = ROOT / "static" / "style.css"
def _ui_js() -> str:
return UI.read_text(encoding="utf-8")
def _style_css() -> str:
return STYLE.read_text(encoding="utf-8")
class TestMermaidLightboxHelper:
def test_mermaid_lightbox_has_dedicated_helper(self):
src = _ui_js()
assert re.search(r"function\s+_mountMermaidViewer\(svgEl,\s*options\s*=\s*\{\}\)\s*\{", src)
assert re.search(r"function\s+_openMermaidLightbox\(svgEl\)\s*\{", src)
assert "const viewer = _mountMermaidViewer(clone, {mode:'lightbox'});" in src
assert "mermaid-lightbox-svg" in src
def test_mermaid_render_path_mounts_inline_viewer_shell(self):
src = _ui_js()
assert "const renderedSvg = block.querySelector('svg');" in src
assert "if(renderedSvg) _mountMermaidViewer(renderedSvg, {mode:'inline'});" in src
def test_mermaid_lightbox_reuses_existing_modal_chrome(self):
src = _ui_js()
assert "img-lightbox" in src
assert "img-lightbox-close" in src
assert "_closeImgLightbox(lb)" in src
def test_mermaid_lightbox_rewrites_cloned_svg_ids(self):
src = _ui_js()
assert "const idMap = new Map();" in src
assert "const idPrefix = 'mermaid-lightbox-'" in src
assert "replace(/url\\(#([^)]+)\\)/g" in src
def test_mermaid_lightbox_rewrites_embedded_style_selectors(self):
src = _ui_js()
assert "clone.querySelectorAll('style').forEach(styleEl => {" in src
assert "styleText = styleText.replace(new RegExp(`url\\\\(#${escapedId}\\\\)`" in src
assert "styleText = styleText.replace(new RegExp(`(^|[^\\\\w-])#${escapedId}(?=$|[^\\\\w-])`" in src
class TestDocumentClickDelegate:
def test_delegate_routes_rendered_mermaid_svgs_before_attach_thumb(self):
src = _ui_js()
mermaid_branch = (
" const mermaidSvg = e.target.closest('.mermaid-rendered svg');\n"
" if(mermaidSvg){ _openMermaidLightbox(mermaidSvg); return; }\n"
)
attach_branch = (
" img = e.target.closest('.attach-thumb');\n"
" if(img && img.tagName === 'IMG'){\n"
)
assert mermaid_branch in src
assert attach_branch in src
assert src.index(mermaid_branch) < src.index(attach_branch)
def test_delegate_still_handles_message_images(self):
src = _ui_js()
msg_branch = "let img = e.target.closest('.msg-media-img');\n if(img){ _openImgLightbox(img); return; }"
assert msg_branch in src
class TestMermaidLightboxCss:
def test_rendered_mermaid_svg_advertises_zoom(self):
src = _style_css()
assert ".mermaid-rendered svg{max-width:100%;height:auto;cursor:default;}" in src
def test_lightbox_svg_uses_modal_viewport_limits(self):
src = _style_css()
assert ".mermaid-viewer--lightbox .mermaid-viewer-viewport{max-width:90vw;max-height:90vh;" in src
assert ".img-lightbox .mermaid-lightbox-svg{background:var(--code-bg);cursor:default;}" in src
assert "background:var(--code-bg);" in src
class TestLightboxAria:
def test_lightboxes_set_aria_modal(self):
src = _ui_js()
assert src.count("setAttribute('aria-modal', 'true')") >= 2