
* Fix Event chaining in the on_load event handler return not working * added async tests * addressed comments
97 lines
2.4 KiB
Python
97 lines
2.4 KiB
Python
from typing import List
|
|
|
|
import pytest
|
|
|
|
from pynecone.app import App
|
|
from pynecone.middleware.hydrate_middleware import HydrateMiddleware
|
|
from pynecone.state import State
|
|
|
|
|
|
class TestState(State):
|
|
"""A test state with no return in handler."""
|
|
|
|
num: int = 0
|
|
|
|
def test_handler(self):
|
|
"""Test handler."""
|
|
self.num += 1
|
|
|
|
|
|
class TestState2(State):
|
|
"""A test state with return in handler."""
|
|
|
|
num: int = 0
|
|
name: str
|
|
|
|
def test_handler(self):
|
|
"""Test handler that calls another handler.
|
|
|
|
Returns:
|
|
Chain of EventHandlers
|
|
"""
|
|
self.num += 1
|
|
return [self.change_name()]
|
|
|
|
def change_name(self):
|
|
"""Test handler to change name."""
|
|
self.name = "random"
|
|
|
|
|
|
class TestState3(State):
|
|
"""A test state with async handler."""
|
|
|
|
num: int = 0
|
|
|
|
async def test_handler(self):
|
|
"""Test handler."""
|
|
self.num += 1
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"state, expected, event_fixture",
|
|
[
|
|
(TestState, {"test_state": {"num": 1}}, "event1"),
|
|
(TestState2, {"test_state2": {"num": 1}}, "event2"),
|
|
(TestState3, {"test_state3": {"num": 1}}, "event3"),
|
|
],
|
|
)
|
|
async def test_preprocess(state, request, event_fixture, expected):
|
|
"""Test that a state hydrate event is processed correctly.
|
|
|
|
Args:
|
|
state: state to process event
|
|
request: pytest fixture request
|
|
event_fixture: The event fixture(an Event)
|
|
expected: expected delta
|
|
"""
|
|
app = App(state=state, load_events={"index": state.test_handler})
|
|
|
|
hydrate_middleware = HydrateMiddleware()
|
|
result = await hydrate_middleware.preprocess(
|
|
app=app, event=request.getfixturevalue(event_fixture), state=state()
|
|
)
|
|
assert isinstance(result, List)
|
|
assert result[0].delta == expected
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_preprocess_multiple_load_events(event1):
|
|
"""Test that a state hydrate event for multiple on-load events is processed correctly.
|
|
|
|
Args:
|
|
event1: an Event.
|
|
"""
|
|
app = App(
|
|
state=TestState,
|
|
load_events={"index": [TestState.test_handler, TestState.test_handler]},
|
|
)
|
|
|
|
hydrate_middleware = HydrateMiddleware()
|
|
result = await hydrate_middleware.preprocess(
|
|
app=app, event=event1, state=TestState()
|
|
)
|
|
assert isinstance(result, List)
|
|
assert result[0].delta == {"test_state": {"num": 1}}
|
|
assert result[1].delta == {"test_state": {"num": 2}}
|