"""Tests for the render() function and component loading in jinja_bridge. These test functionality added in recent commits (render() API, load_sexp_dir, snake→kebab conversion) that isn't covered by the existing shared/sexp/tests/test_jinja_bridge.py. """ from __future__ import annotations import os import tempfile import pytest from shared.sexp.jinja_bridge import ( render, register_components, load_sexp_dir, _COMPONENT_ENV, ) @pytest.fixture(autouse=True) def _clean_env(): """Clear component env before each test.""" _COMPONENT_ENV.clear() yield _COMPONENT_ENV.clear() # --------------------------------------------------------------------------- # render() — call component by name with Python kwargs # --------------------------------------------------------------------------- class TestRender: def test_basic_render(self): register_components('(defcomp ~badge (&key label) (span :class "badge" label))') html = render("badge", label="New") assert html == 'New' def test_tilde_prefix_optional(self): register_components('(defcomp ~pill (&key text) (em text))') # Both forms should work assert render("pill", text="Hi") == render("~pill", text="Hi") def test_snake_to_kebab_conversion(self): """Python snake_case kwargs should map to sexp kebab-case params.""" register_components(''' (defcomp ~card (&key nav-html link-href) (div :class "card" (a :href link-href nav-html))) ''') html = render("card", nav_html="Nav", link_href="/about") assert 'href="/about"' in html assert "Nav" in html def test_multiple_kwargs(self): register_components(''' (defcomp ~item (&key title price image-url) (div (h3 title) (span price) (img :src image-url))) ''') html = render("item", title="Widget", price="£10", image_url="/img/w.jpg") assert "Widget" in html assert "£10" in html assert 'src="/img/w.jpg"' in html def test_unknown_component_raises(self): with pytest.raises(ValueError, match="Unknown component"): render("nonexistent", label="x") def test_empty_kwargs(self): register_components('(defcomp ~empty () (hr))') html = render("empty") assert html == "