|
55 | 55 | ) |
56 | 56 | from reflex.utils.format import json_dumps |
57 | 57 | from reflex.utils.token_manager import SocketRecord |
58 | | -from reflex.vars.base import Var, computed_var |
| 58 | +from reflex.vars.base import Field, Var, computed_var, field |
59 | 59 | from tests.units.mock_redis import mock_redis |
60 | 60 |
|
61 | 61 | from .states import GenState |
@@ -306,12 +306,12 @@ def test_base_class_vars(test_state): |
306 | 306 | fields = test_state.get_fields() |
307 | 307 | cls = type(test_state) |
308 | 308 |
|
309 | | - for field in fields: |
310 | | - if field.startswith("_") or field in cls.get_skip_vars(): |
| 309 | + for field_name in fields: |
| 310 | + if field_name.startswith("_") or field_name in cls.get_skip_vars(): |
311 | 311 | continue |
312 | | - prop = getattr(cls, field) |
| 312 | + prop = getattr(cls, field_name) |
313 | 313 | assert isinstance(prop, Var) |
314 | | - assert prop._js_expr.split(".")[-1] == field + FIELD_MARKER |
| 314 | + assert prop._js_expr.split(".")[-1] == field_name + FIELD_MARKER |
315 | 315 |
|
316 | 316 | assert cls.num1._var_type is int |
317 | 317 | assert cls.num2._var_type is float |
@@ -4329,3 +4329,35 @@ class SecondCvState(CvMixin, rx.State): |
4329 | 4329 |
|
4330 | 4330 | assert first_cv is not second_cv |
4331 | 4331 | assert first_cv._static_deps is not second_cv._static_deps |
| 4332 | + |
| 4333 | + |
| 4334 | +@pytest.mark.asyncio |
| 4335 | +async def test_add_dependency_get_state_regression(mock_app: rx.App, token: str): |
| 4336 | + """Ensure that a state class can be fetched separately when it's is explicit dep.""" |
| 4337 | + |
| 4338 | + class DataState(rx.State): |
| 4339 | + """A state with a var.""" |
| 4340 | + |
| 4341 | + data: Field[list[int]] = field(default_factory=lambda: [1, 2, 3]) |
| 4342 | + |
| 4343 | + class StatsState(rx.State): |
| 4344 | + """A state with a computed var depending on DataState.""" |
| 4345 | + |
| 4346 | + @rx.var(cache=True) |
| 4347 | + async def total(self) -> int: |
| 4348 | + data_state = await self.get_state(DataState) |
| 4349 | + return sum(data_state.data) |
| 4350 | + |
| 4351 | + StatsState.computed_vars["total"].add_dependency(StatsState, DataState.data) |
| 4352 | + |
| 4353 | + class OtherState(rx.State): |
| 4354 | + """A state that gets DataState.""" |
| 4355 | + |
| 4356 | + @rx.event |
| 4357 | + async def fetch_data_state(self) -> None: |
| 4358 | + print(await self.get_state(DataState)) |
| 4359 | + |
| 4360 | + mock_app.state_manager.state = mock_app._state = rx.State |
| 4361 | + state = await mock_app.state_manager.get_state(_substate_key(token, OtherState)) |
| 4362 | + other_state = await state.get_state(OtherState) |
| 4363 | + await other_state.fetch_data_state() # Should not raise exception. |
0 commit comments