@@ -1260,3 +1260,67 @@ def __init__(self, **data):
1260
1260
"outer: {'a': 2, 'b': {'b': 3}}" ,
1261
1261
"inner: {'validated_data': ValidatedData(model_dict={'a': 1, 'b': 3}, fields_set={'b'})}" ,
1262
1262
]
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