1
+ import dataclasses
2
+
1
3
import pytest
4
+ from sqlalchemy .orm import DeclarativeBase , Mapped , MappedAsDataclass , mapped_column
2
5
from typing_extensions import assert_type
3
6
4
7
import reflex as rx
5
8
from reflex .utils .types import GenericType
6
9
from reflex .vars .base import Var
7
10
from reflex .vars .object import LiteralObjectVar , ObjectVar
11
+ from reflex .vars .sequence import ArrayVar
8
12
9
13
10
14
class Bare :
@@ -32,14 +36,44 @@ class Base(rx.Base):
32
36
quantity : int = 0
33
37
34
38
39
+ class SqlaBase (DeclarativeBase , MappedAsDataclass ):
40
+ """Sqlalchemy declarative mapping base class."""
41
+
42
+ pass
43
+
44
+
45
+ class SqlaModel (SqlaBase ):
46
+ """A sqlalchemy model with a single attribute."""
47
+
48
+ __tablename__ : str = "sqla_model"
49
+
50
+ id : Mapped [int ] = mapped_column (primary_key = True , autoincrement = True , init = False )
51
+ quantity : Mapped [int ] = mapped_column (default = 0 )
52
+
53
+
54
+ @dataclasses .dataclass
55
+ class Dataclass :
56
+ """A dataclass with a single attribute."""
57
+
58
+ quantity : int = 0
59
+
60
+
35
61
class ObjectState (rx .State ):
36
- """A reflex state with bare and base objects ."""
62
+ """A reflex state with bare, base and sqlalchemy base vars ."""
37
63
38
64
bare : rx .Field [Bare ] = rx .field (Bare ())
65
+ bare_optional : rx .Field [Bare | None ] = rx .field (None )
39
66
base : rx .Field [Base ] = rx .field (Base ())
67
+ base_optional : rx .Field [Base | None ] = rx .field (None )
68
+ sqlamodel : rx .Field [SqlaModel ] = rx .field (SqlaModel ())
69
+ sqlamodel_optional : rx .Field [SqlaModel | None ] = rx .field (None )
70
+ dataclass : rx .Field [Dataclass ] = rx .field (Dataclass ())
71
+ dataclass_optional : rx .Field [Dataclass | None ] = rx .field (None )
72
+
73
+ base_list : rx .Field [list [Base ]] = rx .field ([Base ()])
40
74
41
75
42
- @pytest .mark .parametrize ("type_" , [Base , Bare ])
76
+ @pytest .mark .parametrize ("type_" , [Base , Bare , SqlaModel , Dataclass ])
43
77
def test_var_create (type_ : GenericType ) -> None :
44
78
my_object = type_ ()
45
79
var = Var .create (my_object )
@@ -49,7 +83,7 @@ def test_var_create(type_: GenericType) -> None:
49
83
assert quantity ._var_type is int
50
84
51
85
52
- @pytest .mark .parametrize ("type_" , [Base , Bare ])
86
+ @pytest .mark .parametrize ("type_" , [Base , Bare , SqlaModel , Dataclass ])
53
87
def test_literal_create (type_ : GenericType ) -> None :
54
88
my_object = type_ ()
55
89
var = LiteralObjectVar .create (my_object )
@@ -59,7 +93,7 @@ def test_literal_create(type_: GenericType) -> None:
59
93
assert quantity ._var_type is int
60
94
61
95
62
- @pytest .mark .parametrize ("type_" , [Base , Bare ])
96
+ @pytest .mark .parametrize ("type_" , [Base , Bare , SqlaModel , Dataclass ])
63
97
def test_guess (type_ : GenericType ) -> None :
64
98
my_object = type_ ()
65
99
var = Var .create (my_object )
@@ -70,7 +104,7 @@ def test_guess(type_: GenericType) -> None:
70
104
assert quantity ._var_type is int
71
105
72
106
73
- @pytest .mark .parametrize ("type_" , [Base , Bare ])
107
+ @pytest .mark .parametrize ("type_" , [Base , Bare , SqlaModel , Dataclass ])
74
108
def test_state (type_ : GenericType ) -> None :
75
109
attr_name = type_ .__name__ .lower ()
76
110
var = getattr (ObjectState , attr_name )
@@ -80,7 +114,7 @@ def test_state(type_: GenericType) -> None:
80
114
assert quantity ._var_type is int
81
115
82
116
83
- @pytest .mark .parametrize ("type_" , [Base , Bare ])
117
+ @pytest .mark .parametrize ("type_" , [Base , Bare , SqlaModel , Dataclass ])
84
118
def test_state_to_operation (type_ : GenericType ) -> None :
85
119
attr_name = type_ .__name__ .lower ()
86
120
original_var = getattr (ObjectState , attr_name )
@@ -100,3 +134,29 @@ def test_typing() -> None:
100
134
# Base
101
135
var = ObjectState .base
102
136
_ = assert_type (var , ObjectVar [Base ])
137
+ optional_var = ObjectState .base_optional
138
+ _ = assert_type (optional_var , ObjectVar [Base | None ])
139
+ list_var = ObjectState .base_list
140
+ _ = assert_type (list_var , ArrayVar [list [Base ]])
141
+ list_var_0 = list_var [0 ]
142
+ _ = assert_type (list_var_0 , ObjectVar [Base ])
143
+
144
+ # Sqla
145
+ var = ObjectState .sqlamodel
146
+ _ = assert_type (var , ObjectVar [SqlaModel ])
147
+ optional_var = ObjectState .sqlamodel_optional
148
+ _ = assert_type (optional_var , ObjectVar [SqlaModel | None ])
149
+ list_var = ObjectState .base_list
150
+ _ = assert_type (list_var , ArrayVar [list [Base ]])
151
+ list_var_0 = list_var [0 ]
152
+ _ = assert_type (list_var_0 , ObjectVar [Base ])
153
+
154
+ # Dataclass
155
+ var = ObjectState .dataclass
156
+ _ = assert_type (var , ObjectVar [Dataclass ])
157
+ optional_var = ObjectState .dataclass_optional
158
+ _ = assert_type (optional_var , ObjectVar [Dataclass | None ])
159
+ list_var = ObjectState .base_list
160
+ _ = assert_type (list_var , ArrayVar [list [Base ]])
161
+ list_var_0 = list_var [0 ]
162
+ _ = assert_type (list_var_0 , ObjectVar [Base ])
0 commit comments