"""Test: Excalidraw inline embed (#479)"""
import re
def test_excalidraw_extension_regex():
"""Verify _EXCALIDRAW_EXTS regex is defined."""
with open('static/ui.js') as f:
src = f.read()
assert '_EXCALIDRAW_EXTS' in src, "Missing _EXCALIDRAW_EXTS regex"
assert '.excalidraw' in src, "Excalidraw regex should match .excalidraw"
def test_excalidraw_media_handler():
"""Verify MEDIA: .excalidraw files trigger inline loading."""
with open('static/ui.js') as f:
src = f.read()
assert 'excalidraw-inline-load' in src, "Missing excalidraw-inline-load class"
assert 'excalidraw_loading' in src, "Missing excalidraw_loading i18n key usage"
def test_loadExcalidrawInline_function():
"""Verify loadExcalidrawInline lazy-load function exists."""
with open('static/ui.js') as f:
src = f.read()
assert 'function loadExcalidrawInline' in src, "Missing loadExcalidrawInline function"
def test_excalidraw_json_validation():
"""Verify Excalidraw handler validates JSON format."""
with open('static/ui.js') as f:
src = f.read()
func = src[src.find('function loadExcalidrawInline'):src.find('function loadExcalidrawInline') + 2000]
assert 'JSON.parse' in func, "Should parse JSON"
assert 'excalidraw_invalid' in func, "Should handle invalid format"
assert "data.type!=='excalidraw'" in func, "Should validate type field is 'excalidraw'"
def test_excalidraw_size_cap():
"""Verify Excalidraw inline rendering has a size cap."""
with open('static/ui.js') as f:
src = f.read()
func = src[src.find('function loadExcalidrawInline'):src.find('function loadExcalidrawInline') + 2000]
assert 'EXCALIDRAW_MAX_SIZE' in func, "Should have EXCALIDRAW_MAX_SIZE constant"
assert 'excalidraw_too_large' in func, "Should use excalidraw_too_large i18n for oversized files"
def test_excalidraw_error_handling():
"""Verify Excalidraw error handling."""
with open('static/ui.js') as f:
src = f.read()
func = src[src.find('function loadExcalidrawInline'):src.find('function loadExcalidrawInline') + 3500]
assert 'excalidraw_error' in func, "Should use excalidraw_error i18n on fetch failure"
def test_excalidraw_svg_renderer_exists():
"""Verify SVG renderer for Excalidraw elements exists."""
with open('static/ui.js') as f:
src = f.read()
assert 'function _renderExcalidrawCanvases()' in src, "Missing _renderExcalidrawCanvases function"
start = src.find('function _renderExcalidrawCanvases()')
end = src.find('// ── PDF inline preview', start)
render = src[start:end if end != -1 else start + 8000]
assert '"}]}
#
# Defense: string colors/fonts must flow through an HTML attribute escaper;
# numeric fields (strokeWidth, fontSize, x/y/width/height, point coords) must
# be coerced via Number()/isFinite gates so they cannot carry strings.
def _excalidraw_render_block():
with open('static/ui.js') as f:
src = f.read()
start = src.find('function _renderExcalidrawCanvases')
assert start != -1, '_renderExcalidrawCanvases not found'
# End at next sibling section
end = src.find('// ── PDF inline preview', start)
assert end != -1, 'end marker not found'
return src[start:end]
def test_excalidraw_string_color_fields_are_attribute_escaped():
"""strokeColor / backgroundColor flow into stroke="..." / fill="..." in
SVG attributes. They must run through an HTML attribute escaper before
interpolation, otherwise a value like 'red"/>