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