From 8934bfbeb6a655c96e5d0a24ec04e5df3d48ac97 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 29 Apr 2025 16:42:01 -0700 Subject: [PATCH 1/3] fail on using rxcond on event handlers or event spec --- reflex/event.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/reflex/event.py b/reflex/event.py index afb03367cb5..900f3e65278 100644 --- a/reflex/event.py +++ b/reflex/event.py @@ -14,6 +14,7 @@ Annotated, Any, Generic, + NoReturn, Protocol, TypedDict, TypeVar, @@ -1683,6 +1684,16 @@ def get_fn_signature(fn: Callable) -> inspect.Signature: class EventVar(ObjectVar, python_types=(EventSpec, EventHandler)): """Base class for event vars.""" + def bool(self) -> NoReturn: + """Get the boolean value of the var. + + Raises: + TypeError: EventVar cannot be converted to a boolean. + """ + raise TypeError( + f"Cannot convert {self._js_expr} of type {type(self).__name__} to bool." + ) + @dataclasses.dataclass( eq=False, @@ -1759,6 +1770,16 @@ def no_args(): class EventChainVar(BuilderFunctionVar, python_types=EventChain): """Base class for event chain vars.""" + def bool(self) -> NoReturn: + """Get the boolean value of the var. + + Raises: + TypeError: EventChainVar cannot be converted to a boolean. + """ + raise TypeError( + f"Cannot convert {self._js_expr} of type {type(self).__name__} to bool." + ) + @dataclasses.dataclass( eq=False, From 6ac8bf4f965120d07e8a913c9f5a219269f5bf92 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:16:33 +0000 Subject: [PATCH 2/3] Add unit tests for EventVar and EventChainVar bool() methods Co-Authored-By: khaleel@reflex.dev --- tests/units/test_event.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/units/test_event.py b/tests/units/test_event.py index 5f3db2272be..82fd078e3b3 100644 --- a/tests/units/test_event.py +++ b/tests/units/test_event.py @@ -483,3 +483,32 @@ def get_handler(self, arg: Var[str]): w = Wrapper() _ = rx.input(on_change=w.get_handler) + + +def test_event_var_bool_conversion(): + """Test that EventVar and EventChainVar cannot be converted to booleans.""" + + class S(BaseState): + @event + def s(self): + pass + + handler_var = Var.create(S.s) + with pytest.raises(TypeError) as err: + handler_var.bool() + assert "Cannot convert" in str(err.value) + assert "to bool" in str(err.value) + + def _args_spec() -> tuple: + return () + + chain_var = Var.create( + EventChain( + events=[S.s()], + args_spec=_args_spec, + ) + ) + with pytest.raises(TypeError) as err: + chain_var.bool() + assert "Cannot convert" in str(err.value) + assert "to bool" in str(err.value) From 4a67dffd145defedf4d45300f03df4b442e62264 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:22:36 +0000 Subject: [PATCH 3/3] Update test to verify event handlers fail when used in rx.cond() Co-Authored-By: khaleel@reflex.dev --- tests/units/test_event.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/units/test_event.py b/tests/units/test_event.py index 82fd078e3b3..d72fe477261 100644 --- a/tests/units/test_event.py +++ b/tests/units/test_event.py @@ -485,8 +485,9 @@ def get_handler(self, arg: Var[str]): _ = rx.input(on_change=w.get_handler) -def test_event_var_bool_conversion(): - """Test that EventVar and EventChainVar cannot be converted to booleans.""" +def test_event_var_in_rx_cond(): + """Test that EventVar and EventChainVar cannot be used in rx.cond().""" + from reflex.components.core.cond import cond as rx_cond class S(BaseState): @event @@ -495,7 +496,7 @@ def s(self): handler_var = Var.create(S.s) with pytest.raises(TypeError) as err: - handler_var.bool() + rx_cond(handler_var, rx.text("True"), rx.text("False")) assert "Cannot convert" in str(err.value) assert "to bool" in str(err.value) @@ -509,6 +510,6 @@ def _args_spec() -> tuple: ) ) with pytest.raises(TypeError) as err: - chain_var.bool() + rx_cond(chain_var, rx.text("True"), rx.text("False")) assert "Cannot convert" in str(err.value) assert "to bool" in str(err.value)