Coverage for tests / test_aliases.py: 100%
107 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-06-10 09:40 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-06-10 09:40 +0000
1import pytest 1abcdefgh
2from pydantic import BaseModel, ValidationError 1abcdefgh
3from pydantic import Field as PField 1abcdefgh
4from sqlmodel import Field, SQLModel 1abcdefgh
6""" 1abcdefgh
7Alias tests for SQLModel and Pydantic compatibility
8"""
11class PydanticUser(BaseModel): 1abcdefgh
12 full_name: str = PField(alias="fullName") 1abcdefgh
15class SQLModelUser(SQLModel): 1abcdefgh
16 full_name: str = Field(alias="fullName") 1abcdefgh
19# Models with config (validate_by_name=True)
20class PydanticUserWithConfig(PydanticUser): 1abcdefgh
21 model_config = {"validate_by_name": True} 1abcdefgh
24class SQLModelUserWithConfig(SQLModelUser): 1abcdefgh
25 model_config = {"validate_by_name": True} 1abcdefgh
28@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser]) 1abcdefgh
29def test_create_with_field_name(model: type[PydanticUser] | type[SQLModelUser]): 1abcdefgh
30 with pytest.raises(ValidationError): 2~ abbbcbdbebfbgb
31 model(full_name="Alice") 2~ abbbcbdbebfbgb
34@pytest.mark.parametrize("model", [PydanticUserWithConfig, SQLModelUserWithConfig]) 1abcdefgh
35def test_create_with_field_name_with_config( 1abcdefgh
36 model: type[PydanticUserWithConfig] | type[SQLModelUserWithConfig],
37):
38 user = model(full_name="Alice") 2hbibjbkblbmbnbob
39 assert user.full_name == "Alice" 2hbibjbkblbmbnbob
42@pytest.mark.parametrize( 1abcdefgh
43 "model",
44 [PydanticUser, SQLModelUser, PydanticUserWithConfig, SQLModelUserWithConfig],
45)
46def test_create_with_alias( 1abcdefgh
47 model: type[PydanticUser]
48 | type[SQLModelUser]
49 | type[PydanticUserWithConfig]
50 | type[SQLModelUserWithConfig],
51):
52 user = model(fullName="Bob") # using alias 2pbqbrbsbtbubvbwb
53 assert user.full_name == "Bob" 2pbqbrbsbtbubvbwb
56@pytest.mark.parametrize("model", [PydanticUserWithConfig, SQLModelUserWithConfig]) 1abcdefgh
57def test_create_with_both_prefers_alias( 1abcdefgh
58 model: type[PydanticUserWithConfig] | type[SQLModelUserWithConfig],
59):
60 user = model(full_name="IGNORED", fullName="Charlie") 2xbybzbAbBbCbDbEb
61 assert user.full_name == "Charlie" # alias should take precedence 2xbybzbAbBbCbDbEb
64@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser]) 1abcdefgh
65def test_dict_default_uses_field_names( 1abcdefgh
66 model: type[PydanticUser] | type[SQLModelUser],
67):
68 user = model(fullName="Dana") 1WXYZ0123
69 data = user.model_dump() 1WXYZ0123
70 assert "full_name" in data 1WXYZ0123
71 assert "fullName" not in data 1WXYZ0123
72 assert data["full_name"] == "Dana" 1WXYZ0123
75@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser]) 1abcdefgh
76def test_dict_by_alias_uses_aliases( 1abcdefgh
77 model: type[PydanticUser] | type[SQLModelUser],
78):
79 user = model(fullName="Dana") 1456789!#
80 data = user.model_dump(by_alias=True) 1456789!#
81 assert "fullName" in data 1456789!#
82 assert "full_name" not in data 1456789!#
83 assert data["fullName"] == "Dana" 1456789!#
86@pytest.mark.parametrize("model", [PydanticUser, SQLModelUser]) 1abcdefgh
87def test_json_by_alias( 1abcdefgh
88 model: type[PydanticUser] | type[SQLModelUser],
89):
90 user = model(fullName="Frank") 1$%'()*+,
91 json_data = user.model_dump_json(by_alias=True) 1$%'()*+,
92 assert ('"fullName":"Frank"' in json_data) or ('"fullName": "Frank"' in json_data) 1$%'()*+,
93 assert "full_name" not in json_data 1$%'()*+,
96class PydanticUserV2(BaseModel): 1abcdefgh
97 first_name: str = PField(validation_alias="firstName", serialization_alias="f_name") 1abcdefgh
100class SQLModelUserV2(SQLModel): 1abcdefgh
101 first_name: str = Field(validation_alias="firstName", serialization_alias="f_name") 1abcdefgh
104@pytest.mark.parametrize("model", [PydanticUserV2, SQLModelUserV2]) 1abcdefgh
105def test_create_with_validation_alias( 1abcdefgh
106 model: type[PydanticUserV2] | type[SQLModelUserV2],
107):
108 user = model(firstName="John") 2FbGbHbIbJbKbLbMb
109 assert user.first_name == "John" 2FbGbHbIbJbKbLbMb
112@pytest.mark.parametrize("model", [PydanticUserV2, SQLModelUserV2]) 1abcdefgh
113def test_serialize_with_serialization_alias( 1abcdefgh
114 model: type[PydanticUserV2] | type[SQLModelUserV2],
115):
116 user = model(firstName="Jane") 1OPQRSTUV
117 data = user.model_dump(by_alias=True) 1OPQRSTUV
118 assert "f_name" in data 1OPQRSTUV
119 assert "firstName" not in data 1OPQRSTUV
120 assert "first_name" not in data 1OPQRSTUV
121 assert data["f_name"] == "Jane" 1OPQRSTUV
124def test_schema_extra_validation_alias_sqlmodel_v2(): 1abcdefgh
125 class M(SQLModel): 1-./:;=?@
126 f: str = Field(schema_extra={"validation_alias": "f_alias"}) 1-./:;=?@
128 m = M.model_validate({"f_alias": "asd"}) 1-./:;=?@
129 assert m.f == "asd" 1-./:;=?@
132def test_schema_extra_serialization_alias_sqlmodel_v2(): 1abcdefgh
133 class M(SQLModel): 1ijklmnop
134 f: str = Field(schema_extra={"serialization_alias": "f_out"}) 1ijklmnop
136 m = M(f="x") 1ijklmnop
137 data = m.model_dump(by_alias=True) 1ijklmnop
138 assert "f_out" in data 1ijklmnop
139 assert "f" not in data 1ijklmnop
140 assert data["f_out"] == "x" 1ijklmnop
143def test_alias_plus_validation_alias_prefers_validation_alias_sqlmodel_v2(): 1abcdefgh
144 class M(SQLModel): 1[]^_`{|}
145 first_name: str = Field(alias="fullName", validation_alias="v_name") 1[]^_`{|}
147 m = M.model_validate({"fullName": "A", "v_name": "B"}) 1[]^_`{|}
148 assert m.first_name == "B" 1[]^_`{|}
151def test_alias_plus_serialization_alias_prefers_serialization_alias_sqlmodel_v2(): 1abcdefgh
152 class M(SQLModel): 1qrstuvwx
153 first_name: str = Field(alias="fullName", serialization_alias="f_name") 1qrstuvwx
155 m = M(fullName="Z") 1qrstuvwx
156 data = m.model_dump(by_alias=True) 1qrstuvwx
157 assert "f_name" in data 1qrstuvwx
158 assert "fullName" not in data 1qrstuvwx
159 assert data["f_name"] == "Z" 1qrstuvwx
162def test_alias_generator_works_sqlmodel_v2(): 1abcdefgh
163 class M(SQLModel): 1yzABCDEF
164 model_config = {"alias_generator": lambda s: "gen_" + s} 1yzABCDEF
165 f: str = Field() 1yzABCDEF
167 m = M.model_validate({"gen_f": "ok"}) 1yzABCDEF
168 assert m.f == "ok" 1yzABCDEF
169 data = m.model_dump(by_alias=True) 1yzABCDEF
170 assert "gen_f" in data and data["gen_f"] == "ok" 1yzABCDEF
173def test_alias_generator_with_explicit_alias_prefers_field_alias_sqlmodel_v2(): 1abcdefgh
174 class M(SQLModel): 1GHIJKLMN
175 model_config = {"alias_generator": lambda s: "gen_" + s} 1GHIJKLMN
176 f: str = Field(alias="custom") 1GHIJKLMN
178 m = M.model_validate({"custom": "ok"}) 1GHIJKLMN
179 assert m.f == "ok" 1GHIJKLMN
180 data = m.model_dump(by_alias=True) 1GHIJKLMN
181 assert "custom" in data and "gen_f" not in data 1GHIJKLMN