Skip to content

Commit 2a3d37e

Browse files
committed
test for conflicting field names and attempted mocking
1 parent f2368a4 commit 2a3d37e

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

tests/validators/test_model.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,3 +1260,67 @@ def __init__(self, **data):
12601260
"outer: {'a': 2, 'b': {'b': 3}}",
12611261
"inner: {'validated_data': ValidatedData(model_dict={'a': 1, 'b': 3}, fields_set={'b'})}",
12621262
]
1263+
1264+
1265+
class BadValidatedData:
1266+
"""
1267+
Attempt to confuse validation with a mock of ValidatedData should fail
1268+
"""
1269+
1270+
def __init__(self, model_dict: Dict[str, Any], fields_set: Set[str]):
1271+
self.model_dict = model_dict
1272+
self.fields_set = fields_set
1273+
1274+
1275+
def test_custom_init_mock():
1276+
calls = []
1277+
1278+
class Model:
1279+
def __init__(self, **kwargs):
1280+
validated_data = kwargs['validated_data']
1281+
self.a = validated_data.model_dict['a']
1282+
calls.append(repr(validated_data))
1283+
1284+
v = SchemaValidator(
1285+
core_schema.model_schema(
1286+
Model,
1287+
core_schema.typed_dict_schema(
1288+
{'a': core_schema.typed_dict_field(core_schema.int_schema())}, return_fields_set=True
1289+
),
1290+
custom_init=True,
1291+
)
1292+
)
1293+
1294+
m = v.validate_python({'a': 2})
1295+
assert m.a == 2
1296+
assert calls == ["ValidatedData(model_dict={'a': 2}, fields_set={'a'})"]
1297+
1298+
with pytest.raises(ValidationError, match=r'Field required \[type=missing,'):
1299+
v.validate_python({'validated_data': BadValidatedData({'a': 2}, {'a'})})
1300+
1301+
1302+
def test_custom_init_validated_data_field():
1303+
calls = []
1304+
1305+
class Model:
1306+
def __init__(self, **kwargs):
1307+
validated_data = kwargs['validated_data']
1308+
self.validated_data = validated_data.model_dict['validated_data']
1309+
calls.append(repr(validated_data))
1310+
1311+
v = SchemaValidator(
1312+
core_schema.model_schema(
1313+
Model,
1314+
core_schema.typed_dict_schema(
1315+
{'validated_data': core_schema.typed_dict_field(core_schema.int_schema())}, return_fields_set=True
1316+
),
1317+
custom_init=True,
1318+
)
1319+
)
1320+
1321+
m = v.validate_python({'validated_data': 2})
1322+
assert m.validated_data == 2
1323+
assert calls == ["ValidatedData(model_dict={'validated_data': 2}, fields_set={'validated_data'})"]
1324+
1325+
with pytest.raises(ValidationError, match='Input should be a valid integer'):
1326+
v.validate_python({'validated_data': BadValidatedData({'a': 2}, {'a'})})

0 commit comments

Comments
 (0)