瀏覽代碼

Fix event handler calls to handlers (#899)

Nikhil Rao 2 年之前
父節點
當前提交
a9ee9f6d44
共有 3 個文件被更改,包括 40 次插入2 次删除
  1. 3 1
      pynecone/state.py
  2. 1 1
      scripts/integration.sh
  3. 36 0
      tests/test_state.py

+ 3 - 1
pynecone/state.py

@@ -97,7 +97,9 @@ class State(Base, ABC, extra=pydantic.Extra.allow):
 
         # Convert the event handlers to functions.
         for name, event_handler in self.event_handlers.items():
-            setattr(self, name, event_handler.fn)
+            fn = functools.partial(event_handler.fn, self)
+            fn.__qualname__ = event_handler.fn.__qualname__  # type: ignore
+            setattr(self, name, fn)
 
         # Initialize the mutable fields.
         self._init_mutable_fields()

+ 1 - 1
scripts/integration.sh

@@ -15,7 +15,7 @@ while ! nc -z localhost 3000 || ! lsof -i :8000 >/dev/null; do
       echo "Error: Server process with PID $pid exited early"
       break
   fi
-  if ((wait_time >= 120)); then
+  if ((wait_time >= 200)); then
     echo "Error: Timeout waiting for ports 3000 and 8000 to become available"
     break
   fi

+ 36 - 0
tests/test_state.py

@@ -860,3 +860,39 @@ def test_conditional_computed_vars():
     assert ms._dirty_computed_vars(from_vars={"flag"}) == {"rendered_var"}
     assert ms._dirty_computed_vars(from_vars={"t2"}) == {"rendered_var"}
     assert ms._dirty_computed_vars(from_vars={"t1"}) == {"rendered_var"}
+
+
+def test_event_handlers_convert_to_fns(test_state, child_state):
+    """Test that when the state is initialized, event handlers are converted to fns.
+
+    Args:
+        test_state: A state with event handlers.
+        child_state: A child state with event handlers.
+    """
+    # The class instances should be event handlers.
+    assert isinstance(TestState.do_something, EventHandler)
+    assert isinstance(ChildState.change_both, EventHandler)
+
+    # The object instances should be fns.
+    test_state.do_something()
+
+    child_state.change_both(value="goose", count=9)
+    assert child_state.value == "GOOSE"
+    assert child_state.count == 18
+
+
+def test_event_handlers_call_other_handlers():
+    """Test that event handlers can call other event handlers."""
+
+    class MainState(State):
+        v: int = 0
+
+        def set_v(self, v: int):
+            self.v = v
+
+        def set_v2(self, v: int):
+            self.set_v(v)
+
+    ms = MainState()
+    ms.set_v2(1)
+    assert ms.v == 1