Dynamic vars initialization unit tests(#880)

This commit is contained in:
Elijah Ahianyo 2023-04-26 21:41:47 +00:00 committed by GitHub
parent 5ad3882898
commit 29945504bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 28 deletions

View File

@ -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):

View File

@ -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",

View File

@ -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