reflex/tests/middleware/test_hydrate_middleware.py
Elijah Ahianyo e8387c8e26
Fix Event chaining in the on_load event handler return not working (#773)
* Fix Event chaining in the on_load event handler return not working

* added async tests

* addressed comments
2023-04-06 22:26:43 -07:00

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