[REF-1404] router_data not updated when processing events (#2255)

This commit is contained in:
Masen Furer 2023-12-04 16:45:22 -08:00 committed by GitHub
parent eb79da8538
commit 0bbae2d3d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 5 deletions

View File

@ -41,6 +41,11 @@ def DynamicRoute():
id="token",
),
rx.input(value=DynamicState.page_id, is_read_only=True, id="page_id"),
rx.input(
value=DynamicState.router.page.raw_path,
is_read_only=True,
id="raw_path",
),
rx.link("index", href="/", id="link_index"),
rx.link("page_X", href="/static/x", id="link_page_x"),
rx.link(
@ -183,11 +188,13 @@ async def test_on_load_navigate(
link = driver.find_element(By.ID, "link_page_next")
page_id_input = driver.find_element(By.ID, "page_id")
raw_path_input = driver.find_element(By.ID, "raw_path")
assert link
assert page_id_input
assert dynamic_route.poll_for_value(page_id_input) == str(ix)
assert dynamic_route.poll_for_value(raw_path_input) == f"/page/{ix}/"
await poll_for_order(exp_order)
# manually load the next page to trigger client side routing in prod mode

View File

@ -1084,9 +1084,6 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
# Get the function to process the event.
fn = functools.partial(handler.fn, state)
# Clean the state before processing the event.
self._clean()
# Wrap the function in a try/except block.
try:
# Handle async functions.

View File

@ -28,7 +28,7 @@ from reflex.components import Box, Component, Cond, Fragment, Text
from reflex.event import Event
from reflex.middleware import HydrateMiddleware
from reflex.model import Model
from reflex.state import BaseState, State, StateManagerRedis, StateUpdate
from reflex.state import BaseState, RouterData, State, StateManagerRedis, StateUpdate
from reflex.style import Style
from reflex.utils import format
from reflex.vars import ComputedVar
@ -961,6 +961,14 @@ async def test_dynamic_route_var_route_change_completed_on_load(
name=f"{state.get_full_name()}.{constants.CompileVars.ON_LOAD_INTERNAL}",
val=exp_val,
)
exp_router_data = {
"headers": {},
"ip": client_ip,
"sid": sid,
"token": token,
**on_load_internal.router_data,
}
exp_router = RouterData(exp_router_data)
process_coro = process(
app,
event=on_load_internal,
@ -977,6 +985,7 @@ async def test_dynamic_route_var_route_change_completed_on_load(
f"comp_{arg_name}": exp_val,
constants.CompileVars.IS_HYDRATED: False,
# "side_effect_counter": exp_index,
"router": exp_router,
}
},
events=[

View File

@ -1837,7 +1837,9 @@ async def test_background_task_no_block(mock_app: rx.App, token: str):
assert mock_app.event_namespace is not None
emit_mock = mock_app.event_namespace.emit
assert json.loads(emit_mock.mock_calls[0].args[1]) == {
first_ws_message = json.loads(emit_mock.mock_calls[0].args[1])
assert first_ws_message["delta"]["background_task_state"].pop("router") is not None
assert first_ws_message == {
"delta": {
"background_task_state": {
"order": ["background_task:start"],
@ -2405,6 +2407,7 @@ async def test_preprocess(app_module_mock, token, test_state, expected, mocker):
assert isinstance(update, StateUpdate)
updates.append(update)
assert len(updates) == 1
assert updates[0].delta["state"].pop("router") is not None
assert updates[0].delta == exp_is_hydrated(state, False)
events = updates[0].events
@ -2446,6 +2449,7 @@ async def test_preprocess_multiple_load_events(app_module_mock, token, mocker):
assert isinstance(update, StateUpdate)
updates.append(update)
assert len(updates) == 1
assert updates[0].delta["state"].pop("router") is not None
assert updates[0].delta == exp_is_hydrated(state, False)
events = updates[0].events