浏览代码

Dynamic vars initialization unit tests(#880)

Elijah Ahianyo 2 年之前
父节点
当前提交
29945504bc
共有 3 个文件被更改,包括 57 次插入28 次删除
  1. 17 15
      tests/components/test_component.py
  2. 30 9
      tests/test_app.py
  3. 10 4
      tests/test_state.py

+ 17 - 15
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):

+ 30 - 9
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",

+ 10 - 4
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