from pydantic import BaseModel from app.agents.d3.registry import D3Template, register, TEMPLATES, catalog_for_prompt class _Sample(BaseModel): value: int class _StrSample(BaseModel): label: str def _make(): return D3Template( id="dummy", family="chart", title="Dummy", when_to_use="never", data_requirements="an int", schema=_Sample, html_template="__DATA__", golden_sample=_Sample(value=7), ) def test_render_injects_data(): t = _make() assert t.render(_Sample(value=7)) == '{"value":7}' def test_register_and_catalog(): register(_make()) assert "dummy" in TEMPLATES line = catalog_for_prompt() assert "dummy" in line and "chart" in line and "an int" in line def test_render_escapes_script_close_tag_in_data(): t = D3Template( id="dummy_script", family="chart", title="Dummy", when_to_use="never", data_requirements="a string", schema=_StrSample, html_template="", golden_sample=_StrSample(label="x"), ) malicious = _StrSample(label="") rendered = t.render(malicious) # Only the template's own two real . assert rendered.count("") == 1 assert '<\\/script>' in rendered