1+ from typing import Type , Union
2+
3+ import pytest
4+ from pydantic import VERSION , BaseModel , ValidationError
5+ from pydantic import Field as PField
6+ from sqlmodel import Field , SQLModel
7+
8+
9+ # -----------------------------------------------------------------------------------
10+ # Models
11+
12+
13+ class PydanticUser (BaseModel ):
14+ full_name : str = PField (alias = "fullName" )
15+
16+
17+ class SQLModelUser (SQLModel ):
18+ full_name : str = Field (alias = "fullName" )
19+
20+
21+ # Models with config (validate_by_name=True)
22+
23+
24+ if VERSION .startswith ("2." ):
25+
26+ class PydanticUserWithConfig (PydanticUser ):
27+ model_config = {"validate_by_name" : True }
28+
29+ class SQLModelUserWithConfig (SQLModelUser ):
30+ model_config = {"validate_by_name" : True }
31+
32+ else :
33+
34+ class PydanticUserWithConfig (PydanticUser ):
35+ class Config :
36+ allow_population_by_field_name = True
37+
38+ class SQLModelUserWithConfig (SQLModelUser ):
39+ class Config :
40+ allow_population_by_field_name = True
41+
42+
43+ # -----------------------------------------------------------------------------------
44+ # Tests
45+
46+ # Test validate by name
47+
48+
49+ @pytest .mark .parametrize ("model" , [PydanticUser , SQLModelUser ])
50+ def test_create_with_field_name (model : Union [Type [PydanticUser ], Type [SQLModelUser ]]):
51+ with pytest .raises (ValidationError ):
52+ model (full_name = "Alice" )
53+
54+
55+ @pytest .mark .parametrize ("model" , [PydanticUserWithConfig , SQLModelUserWithConfig ])
56+ def test_create_with_field_name_with_config (
57+ model : Union [Type [PydanticUserWithConfig ], Type [SQLModelUserWithConfig ]],
58+ ):
59+ user = model (full_name = "Alice" )
60+ assert user .full_name == "Alice"
61+
62+
63+ # Test validate by alias
64+
65+
66+ @pytest .mark .parametrize (
67+ "model" ,
68+ [PydanticUser , SQLModelUser , PydanticUserWithConfig , SQLModelUserWithConfig ],
69+ )
70+ def test_create_with_alias (
71+ model : Union [
72+ Type [PydanticUser ],
73+ Type [SQLModelUser ],
74+ Type [PydanticUserWithConfig ],
75+ Type [SQLModelUserWithConfig ],
76+ ],
77+ ):
78+ user = model (fullName = "Bob" ) # using alias
79+ assert user .full_name == "Bob"
80+
81+
82+ # Test validate by name and alias
83+
84+
85+ @pytest .mark .parametrize ("model" , [PydanticUserWithConfig , SQLModelUserWithConfig ])
86+ def test_create_with_both_prefers_alias (
87+ model : Union [Type [PydanticUserWithConfig ], Type [SQLModelUserWithConfig ]],
88+ ):
89+ user = model (full_name = "IGNORED" , fullName = "Charlie" )
90+ assert user .full_name == "Charlie" # alias should take precedence
91+
92+
93+ # Test serialize
94+
95+
96+ @pytest .mark .parametrize ("model" , [PydanticUser , SQLModelUser ])
97+ def test_dict_default_uses_field_names (
98+ model : Union [Type [PydanticUser ], Type [SQLModelUser ]],
99+ ):
100+ user = model (fullName = "Dana" )
101+ data = user .dict ()
102+ assert "full_name" in data
103+ assert "fullName" not in data
104+ assert data ["full_name" ] == "Dana"
105+
106+
107+ # Test serialize by alias
108+
109+
110+ @pytest .mark .parametrize ("model" , [PydanticUser , SQLModelUser ])
111+ def test_dict_default_uses_aliases (
112+ model : Union [Type [PydanticUser ], Type [SQLModelUser ]],
113+ ):
114+ user = model (fullName = "Dana" )
115+ data = user .dict (by_alias = True )
116+ assert "fullName" in data
117+ assert "full_name" not in data
118+ assert data ["fullName" ] == "Dana"
119+
120+
121+ # Test json by alias
122+
123+
124+ @pytest .mark .parametrize ("model" , [PydanticUser , SQLModelUser ])
125+ def test_json_by_alias (
126+ model : Union [Type [PydanticUser ], Type [SQLModelUser ]],
127+ ):
128+ user = model (fullName = "Frank" )
129+ json_data = user .json (by_alias = True )
130+ assert ('"fullName":"Frank"' in json_data ) or ('"fullName": "Frank"' in json_data )
131+ assert "full_name" not in json_data
132+
133+
134+ class PydanticUserV2 (BaseModel ):
135+ first_name : str = PField (
136+ validation_alias = "firstName" , serialization_alias = "f_name"
137+ )
138+
139+
140+ class SQLModelUserV2 (SQLModel ):
141+ first_name : str = Field (
142+ validation_alias = "firstName" , serialization_alias = "f_name"
143+ )
144+
145+
146+ @pytest .mark .parametrize ("model" , [PydanticUserV2 , SQLModelUserV2 ])
147+ def test_create_with_validation_alias (model : Union [Type [PydanticUserV2 ], Type [SQLModelUserV2 ]]):
148+ user = model (firstName = "John" )
149+ assert user .first_name == "John"
150+
151+
152+ @pytest .mark .parametrize ("model" , [PydanticUserV2 , SQLModelUserV2 ])
153+ def test_serialize_with_serialization_alias (
154+ model : Union [Type [PydanticUserV2 ], Type [SQLModelUserV2 ]]
155+ ):
156+ user = model (firstName = "Jane" )
157+ data = user .dict (by_alias = True )
158+ assert "f_name" in data
159+ assert "firstName" not in data
160+ assert "first_name" not in data
161+ assert data ["f_name" ] == "Jane"
0 commit comments