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
|
@pytest.fixture
|
||||||
def TestState():
|
def test_state():
|
||||||
class TestState(State):
|
class TestState(State):
|
||||||
num: int
|
num: int
|
||||||
|
|
||||||
@ -286,15 +286,15 @@ def test_invalid_prop_type(component1, text: str, number: int):
|
|||||||
component1.create(text=text, number=number)
|
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.
|
"""Test that we can set a Var prop.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
component1: A test component.
|
component1: A test component.
|
||||||
TestState: A test state.
|
test_state: A test state.
|
||||||
"""
|
"""
|
||||||
c1 = component1.create(text="hello", number=TestState.num)
|
c1 = component1.create(text="hello", number=test_state.num)
|
||||||
assert c1.number == TestState.num
|
assert c1.number == test_state.num
|
||||||
|
|
||||||
|
|
||||||
def test_get_controlled_triggers(component1, component2):
|
def test_get_controlled_triggers(component1, component2):
|
||||||
@ -363,36 +363,38 @@ def test_custom_component_wrapper():
|
|||||||
assert isinstance(component, Box)
|
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.
|
"""Test that an invalid event handler raises an error.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
component2: A test component.
|
component2: A test component.
|
||||||
TestState: A test state.
|
test_state: A test state.
|
||||||
"""
|
"""
|
||||||
# Uncontrolled event handlers should not take args.
|
# Uncontrolled event handlers should not take args.
|
||||||
# This is okay.
|
# This is okay.
|
||||||
component2.create(on_click=TestState.do_something)
|
component2.create(on_click=test_state.do_something)
|
||||||
# This is not okay.
|
# This is not okay.
|
||||||
with pytest.raises(ValueError):
|
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.
|
# 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(
|
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(
|
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.
|
# Controlled event handlers should take args.
|
||||||
# This is okay.
|
# This is okay.
|
||||||
component2.create(on_open=TestState.do_something_arg)
|
component2.create(on_open=test_state.do_something_arg)
|
||||||
# This is not okay.
|
# This is not okay.
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
component2.create(on_open=TestState.do_something)
|
component2.create(on_open=test_state.do_something)
|
||||||
with pytest.raises(ValueError):
|
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):
|
def test_get_hooks_nested(component1, component2, component3):
|
||||||
|
@ -52,7 +52,7 @@ def about_page():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def TestState() -> Type[State]:
|
def test_state() -> Type[State]:
|
||||||
"""A default state.
|
"""A default state.
|
||||||
|
|
||||||
Returns:
|
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)}
|
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.
|
"""Test setting the state of an app.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
TestState: The default state.
|
test_state: The default state.
|
||||||
"""
|
"""
|
||||||
app = App(state=TestState)
|
app = App(state=test_state)
|
||||||
assert app.state == TestState
|
assert app.state == test_state
|
||||||
|
|
||||||
# Get a state for a given token.
|
# Get a state for a given token.
|
||||||
token = "token"
|
token = "token"
|
||||||
state = app.state_manager.get_state(token)
|
state = app.state_manager.get_state(token)
|
||||||
assert isinstance(state, TestState)
|
assert isinstance(state, test_state)
|
||||||
assert state.var == 0 # type: ignore
|
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.
|
"""Test setting and getting the state of an app with different tokens.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
TestState: The default state.
|
test_state: The default state.
|
||||||
"""
|
"""
|
||||||
app = App(state=TestState)
|
app = App(state=test_state)
|
||||||
|
|
||||||
# Create two tokens.
|
# Create two tokens.
|
||||||
token1 = "token1"
|
token1 = "token1"
|
||||||
@ -166,6 +166,27 @@ def test_set_and_get_state(TestState: Type[State]):
|
|||||||
assert state2.var == 2 # type: ignore
|
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.asyncio
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"event_tuples",
|
"event_tuples",
|
||||||
|
@ -5,7 +5,7 @@ from plotly.graph_objects import Figure
|
|||||||
|
|
||||||
from pynecone.base import Base
|
from pynecone.base import Base
|
||||||
from pynecone.constants import RouteVar
|
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.middleware.hydrate_middleware import IS_HYDRATED
|
||||||
from pynecone.state import State
|
from pynecone.state import State
|
||||||
from pynecone.utils import format
|
from pynecone.utils import format
|
||||||
@ -722,6 +722,12 @@ def test_add_var(test_state):
|
|||||||
assert test_state.dynamic_dict == {"k1": 5, "k2": 10}
|
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):
|
class InterdependentState(State):
|
||||||
"""A state with 3 vars and 3 computed vars.
|
"""A state with 3 vars and 3 computed vars.
|
||||||
|
|
||||||
@ -740,7 +746,7 @@ class InterdependentState(State):
|
|||||||
|
|
||||||
@ComputedVar
|
@ComputedVar
|
||||||
def v1x2(self) -> int:
|
def v1x2(self) -> int:
|
||||||
"""depends on var v1.
|
"""Depends on var v1.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Var v1 multiplied by 2
|
Var v1 multiplied by 2
|
||||||
@ -749,7 +755,7 @@ class InterdependentState(State):
|
|||||||
|
|
||||||
@ComputedVar
|
@ComputedVar
|
||||||
def v2x2(self) -> int:
|
def v2x2(self) -> int:
|
||||||
"""depends on backend var _v2.
|
"""Depends on backend var _v2.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
backend var _v2 multiplied by 2
|
backend var _v2 multiplied by 2
|
||||||
@ -758,7 +764,7 @@ class InterdependentState(State):
|
|||||||
|
|
||||||
@ComputedVar
|
@ComputedVar
|
||||||
def v1x2x2(self) -> int:
|
def v1x2x2(self) -> int:
|
||||||
"""depends on ComputedVar v1x2.
|
"""Depends on ComputedVar v1x2.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
ComputedVar v1x2 multiplied by 2
|
ComputedVar v1x2 multiplied by 2
|
||||||
|
Loading…
Reference in New Issue
Block a user