From 58e63f387fe255ae888edc0637501993b8feb663 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 28 Jan 2025 23:02:14 -0800 Subject: [PATCH] assert that .render returns jsonable values (#4708) * assert that .render returns jsonable values * render component default --- .../.templates/jinja/web/pages/utils.js.jinja2 | 2 +- reflex/components/tags/tag.py | 17 +++++++++++++++++ tests/units/components/core/test_match.py | 4 ++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/reflex/.templates/jinja/web/pages/utils.js.jinja2 b/reflex/.templates/jinja/web/pages/utils.js.jinja2 index 624e3bee8..567ca6e60 100644 --- a/reflex/.templates/jinja/web/pages/utils.js.jinja2 +++ b/reflex/.templates/jinja/web/pages/utils.js.jinja2 @@ -90,7 +90,7 @@ break; {% endfor %} default: - return {{ component.default }}; + return {{ render(component.default) }}; break; } })() diff --git a/reflex/components/tags/tag.py b/reflex/components/tags/tag.py index 8569d5d50..8a6326dc0 100644 --- a/reflex/components/tags/tag.py +++ b/reflex/components/tags/tag.py @@ -65,7 +65,24 @@ class Tag: Yields: Tuple[str, Any]: The field name and value. """ + from reflex.components.component import BaseComponent + for field in dataclasses.fields(self): + value = getattr(self, field.name) + if isinstance(value, list): + children = [] + for child in value: + if isinstance(child, BaseComponent): + children.append(child.render()) + else: + children.append(child) + yield field.name, children + continue + if isinstance(value, BaseComponent): + yield field.name, value.render() + continue + if callable(value) and not isinstance(value, Var): + continue yield field.name, getattr(self, field.name) def add_props(self, **kwargs: Optional[Any]) -> Tag: diff --git a/tests/units/components/core/test_match.py b/tests/units/components/core/test_match.py index e563873ec..b765750ee 100644 --- a/tests/units/components/core/test_match.py +++ b/tests/units/components/core/test_match.py @@ -78,7 +78,7 @@ def test_match_components(): assert fifth_return_value_render["name"] == "RadixThemesText" assert fifth_return_value_render["children"][0]["contents"] == '{"sixth value"}' - default = match_child["default"].render() + default = match_child["default"] assert default["name"] == "RadixThemesText" assert default["children"][0]["contents"] == '{"default value"}' @@ -153,7 +153,7 @@ def test_match_on_component_without_default(): match_comp = Match.create(MatchState.value, *match_case_tuples) default = match_comp.render()["children"][0]["default"] - assert isinstance(default, Fragment) + assert isinstance(default, dict) and default["name"] == Fragment.__name__ def test_match_on_var_no_default():