1
0

test_component_state.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """Ensure that Components returned by ComponentState.create have independent State classes."""
  2. import pytest
  3. import reflex as rx
  4. from reflex.components.base.bare import Bare
  5. from reflex.utils.exceptions import ReflexRuntimeError
  6. def test_component_state():
  7. """Create two components with independent state classes."""
  8. class CS(rx.ComponentState):
  9. count: int = 0
  10. def increment(self):
  11. self.count += 1
  12. @classmethod
  13. def get_component(cls, *children, **props):
  14. return rx.el.div(
  15. *children,
  16. **props,
  17. )
  18. cs1, cs2 = CS.create("a", id="a"), CS.create("b", id="b")
  19. assert isinstance(cs1, rx.Component)
  20. assert isinstance(cs2, rx.Component)
  21. assert cs1.State is not None
  22. assert cs2.State is not None
  23. assert cs1.State != cs2.State
  24. assert issubclass(cs1.State, CS)
  25. assert issubclass(cs1.State, rx.State)
  26. assert issubclass(cs2.State, CS)
  27. assert issubclass(cs2.State, rx.State)
  28. assert CS._per_component_state_instance_count == 2
  29. assert isinstance(cs1.State.increment, rx.event.EventHandler)
  30. assert cs1.State.increment != cs2.State.increment
  31. assert len(cs1.children) == 1
  32. assert cs1.children[0].render() == Bare.create("a").render()
  33. assert cs1.id == "a"
  34. assert len(cs2.children) == 1
  35. assert cs2.children[0].render() == Bare.create("b").render()
  36. assert cs2.id == "b"
  37. def test_init_component_state() -> None:
  38. """Ensure that ComponentState subclasses cannot be instantiated directly."""
  39. class CS(rx.ComponentState):
  40. @classmethod
  41. def get_component(cls, *children, **props):
  42. return rx.el.div()
  43. with pytest.raises(ReflexRuntimeError):
  44. CS()
  45. class SubCS(CS):
  46. pass
  47. with pytest.raises(ReflexRuntimeError):
  48. SubCS()