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