Dynamic vars initialization unit tests(#880)
This commit is contained in:
parent
5ad3882898
commit
29945504bc
@ -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):
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user