Browse Source

assert that .render returns jsonable values (#4708)

* assert that .render returns jsonable values

* render component default
Khaleel Al-Adhami 3 months ago
parent
commit
58e63f387f

+ 1 - 1
reflex/.templates/jinja/web/pages/utils.js.jinja2

@@ -90,7 +90,7 @@
                 break;
         {% endfor %}
             default:
-                return {{ component.default }};
+                return {{ render(component.default) }};
                 break;
         }
     })()

+ 17 - 0
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:

+ 2 - 2
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():