test_object.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import pytest
  2. from typing_extensions import assert_type
  3. import reflex as rx
  4. from reflex.utils.types import GenericType
  5. from reflex.vars.base import Var
  6. from reflex.vars.object import LiteralObjectVar, ObjectVar
  7. class Bare:
  8. """A bare class with a single attribute."""
  9. quantity: int = 0
  10. @rx.serializer
  11. def serialize_bare(obj: Bare) -> dict:
  12. """A serializer for the bare class.
  13. Args:
  14. obj: The object to serialize.
  15. Returns:
  16. A dictionary with the quantity attribute.
  17. """
  18. return {"quantity": obj.quantity}
  19. class Base(rx.Base):
  20. """A reflex base class with a single attribute."""
  21. quantity: int = 0
  22. class ObjectState(rx.State):
  23. """A reflex state with bare and base objects."""
  24. bare: rx.Field[Bare] = rx.field(Bare())
  25. base: rx.Field[Base] = rx.field(Base())
  26. @pytest.mark.parametrize("type_", [Base, Bare])
  27. def test_var_create(type_: GenericType) -> None:
  28. my_object = type_()
  29. var = Var.create(my_object)
  30. assert var._var_type is type_
  31. quantity = var.quantity
  32. assert quantity._var_type is int
  33. @pytest.mark.parametrize("type_", [Base, Bare])
  34. def test_literal_create(type_: GenericType) -> None:
  35. my_object = type_()
  36. var = LiteralObjectVar.create(my_object)
  37. assert var._var_type is type_
  38. quantity = var.quantity
  39. assert quantity._var_type is int
  40. @pytest.mark.parametrize("type_", [Base, Bare])
  41. def test_guess(type_: GenericType) -> None:
  42. my_object = type_()
  43. var = Var.create(my_object)
  44. var = var.guess_type()
  45. assert var._var_type is type_
  46. quantity = var.quantity
  47. assert quantity._var_type is int
  48. @pytest.mark.parametrize("type_", [Base, Bare])
  49. def test_state(type_: GenericType) -> None:
  50. attr_name = type_.__name__.lower()
  51. var = getattr(ObjectState, attr_name)
  52. assert var._var_type is type_
  53. quantity = var.quantity
  54. assert quantity._var_type is int
  55. @pytest.mark.parametrize("type_", [Base, Bare])
  56. def test_state_to_operation(type_: GenericType) -> None:
  57. attr_name = type_.__name__.lower()
  58. original_var = getattr(ObjectState, attr_name)
  59. var = original_var.to(ObjectVar, type_)
  60. assert var._var_type is type_
  61. var = original_var.to(ObjectVar)
  62. assert var._var_type is type_
  63. def test_typing() -> None:
  64. # Bare
  65. var = ObjectState.bare.to(ObjectVar)
  66. _ = assert_type(var, ObjectVar[Bare])
  67. # Base
  68. var = ObjectState.base
  69. _ = assert_type(var, ObjectVar[Base])