diff --git a/tests/components/test_component.py b/tests/components/test_component.py index a921498fa..9ef5a0ac4 100644 --- a/tests/components/test_component.py +++ b/tests/components/test_component.py @@ -13,7 +13,7 @@ from pynecone.var import Var @pytest.fixture -def TestState(): +def test_state(): class TestState(State): num: int @@ -286,15 +286,15 @@ def test_invalid_prop_type(component1, text: str, number: int): component1.create(text=text, number=number) -def test_var_props(component1, TestState): +def test_var_props(component1, test_state): """Test that we can set a Var prop. Args: component1: A test component. - TestState: A test state. + test_state: A test state. """ - c1 = component1.create(text="hello", number=TestState.num) - assert c1.number == TestState.num + c1 = component1.create(text="hello", number=test_state.num) + assert c1.number == test_state.num def test_get_controlled_triggers(component1, component2): @@ -363,36 +363,38 @@ def test_custom_component_wrapper(): assert isinstance(component, Box) -def test_invalid_event_handler_args(component2, TestState): +def test_invalid_event_handler_args(component2, test_state): """Test that an invalid event handler raises an error. Args: component2: A test component. - TestState: A test state. + test_state: A test state. """ # Uncontrolled event handlers should not take args. # This is okay. - component2.create(on_click=TestState.do_something) + component2.create(on_click=test_state.do_something) # This is not okay. with pytest.raises(ValueError): - component2.create(on_click=TestState.do_something_arg) + component2.create(on_click=test_state.do_something_arg) # However lambdas are okay. - component2.create(on_click=lambda: TestState.do_something_arg(1)) + component2.create(on_click=lambda: test_state.do_something_arg(1)) component2.create( - on_click=lambda: [TestState.do_something_arg(1), TestState.do_something] + on_click=lambda: [test_state.do_something_arg(1), test_state.do_something] ) component2.create( - on_click=lambda: [TestState.do_something_arg(1), TestState.do_something()] + on_click=lambda: [test_state.do_something_arg(1), test_state.do_something()] ) # Controlled event handlers should take args. # This is okay. - component2.create(on_open=TestState.do_something_arg) + component2.create(on_open=test_state.do_something_arg) # This is not okay. with pytest.raises(ValueError): - component2.create(on_open=TestState.do_something) + component2.create(on_open=test_state.do_something) with pytest.raises(ValueError): - component2.create(on_open=[TestState.do_something_arg, TestState.do_something]) + component2.create( + on_open=[test_state.do_something_arg, test_state.do_something] + ) def test_get_hooks_nested(component1, component2, component3): diff --git a/tests/test_app.py b/tests/test_app.py index f384a3154..6b97bbd66 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -52,7 +52,7 @@ def about_page(): @pytest.fixture() -def TestState() -> Type[State]: +def test_state() -> Type[State]: """A default state. Returns: @@ -119,29 +119,29 @@ def test_add_page_set_route_nested(app: App, index_page, windows_platform: bool) assert set(app.pages.keys()) == {route.strip(os.path.sep)} -def test_initialize_with_state(TestState: Type[State]): +def test_initialize_with_state(test_state): """Test setting the state of an app. Args: - TestState: The default state. + test_state: The default state. """ - app = App(state=TestState) - assert app.state == TestState + app = App(state=test_state) + assert app.state == test_state # Get a state for a given token. token = "token" state = app.state_manager.get_state(token) - assert isinstance(state, TestState) + assert isinstance(state, test_state) assert state.var == 0 # type: ignore -def test_set_and_get_state(TestState: Type[State]): +def test_set_and_get_state(test_state): """Test setting and getting the state of an app with different tokens. Args: - TestState: The default state. + test_state: The default state. """ - app = App(state=TestState) + app = App(state=test_state) # Create two tokens. token1 = "token1" @@ -166,6 +166,27 @@ def test_set_and_get_state(TestState: Type[State]): assert state2.var == 2 # type: ignore +@pytest.mark.asyncio +async def test_dynamic_var_event(test_state): + """Test that the default handler of a dynamic generated var + works as expected. + + Args: + test_state: State Fixture. + """ + test_state = test_state() + test_state.add_var("int_val", int, 0) + result = await test_state._process( + Event( + token="fake-token", + name="test_state.set_int_val", + router_data={"pathname": "/", "query": {}}, + payload={"value": 50}, + ) + ) + assert result.delta == {"test_state": {"int_val": 50}} + + @pytest.mark.asyncio @pytest.mark.parametrize( "event_tuples", diff --git a/tests/test_state.py b/tests/test_state.py index 4b1e43802..4c3e8d868 100644 --- a/tests/test_state.py +++ b/tests/test_state.py @@ -5,7 +5,7 @@ from plotly.graph_objects import Figure from pynecone.base import Base from pynecone.constants import RouteVar -from pynecone.event import Event +from pynecone.event import Event, EventHandler from pynecone.middleware.hydrate_middleware import IS_HYDRATED from pynecone.state import State from pynecone.utils import format @@ -722,6 +722,12 @@ def test_add_var(test_state): assert test_state.dynamic_dict == {"k1": 5, "k2": 10} +def test_add_var_default_handlers(test_state): + test_state.add_var("rand_int", int, 10) + assert "set_rand_int" in test_state.event_handlers + assert isinstance(test_state.event_handlers["set_rand_int"], EventHandler) + + class InterdependentState(State): """A state with 3 vars and 3 computed vars. @@ -740,7 +746,7 @@ class InterdependentState(State): @ComputedVar def v1x2(self) -> int: - """depends on var v1. + """Depends on var v1. Returns: Var v1 multiplied by 2 @@ -749,7 +755,7 @@ class InterdependentState(State): @ComputedVar def v2x2(self) -> int: - """depends on backend var _v2. + """Depends on backend var _v2. Returns: backend var _v2 multiplied by 2 @@ -758,7 +764,7 @@ class InterdependentState(State): @ComputedVar def v1x2x2(self) -> int: - """depends on ComputedVar v1x2. + """Depends on ComputedVar v1x2. Returns: ComputedVar v1x2 multiplied by 2