@@ -241,6 +241,24 @@ def test_validate_assignment():
241
241
assert v .validate_assignment ('field_a' , b'abc' , {'field_a' : 'test' }) == ({'field_a' : 'abc' }, {'field_a' })
242
242
243
243
244
+ def test_validate_assignment_strict_field ():
245
+ v = SchemaValidator (
246
+ {
247
+ 'type' : 'typed-dict' ,
248
+ 'return_fields_set' : True ,
249
+ 'fields' : {'field_a' : {'schema' : {'type' : 'str' , 'strict' : True }}},
250
+ }
251
+ )
252
+
253
+ assert v .validate_python ({'field_a' : 'test' }) == ({'field_a' : 'test' }, {'field_a' })
254
+
255
+ with pytest .raises (ValidationError ) as exc_info :
256
+ v .validate_assignment ('field_a' , b'abc' , {'field_a' : 'test' })
257
+ assert exc_info .value .errors () == [
258
+ {'input_value' : b'abc' , 'kind' : 'str_type' , 'loc' : ['field_a' ], 'message' : 'Input should be a valid string' }
259
+ ]
260
+
261
+
244
262
def test_validate_assignment_functions ():
245
263
calls = []
246
264
@@ -336,6 +354,24 @@ def test_validate_assignment_allow_extra_validate():
336
354
]
337
355
338
356
357
+ def test_validate_assignment_with_strict ():
358
+ v = SchemaValidator (
359
+ {'type' : 'typed-dict' , 'fields' : {'x' : {'schema' : {'type' : 'str' }}, 'y' : {'schema' : {'type' : 'int' }}}}
360
+ )
361
+
362
+ r = v .validate_python ({'x' : 'a' , 'y' : '123' })
363
+ assert r == {'x' : 'a' , 'y' : 123 }
364
+
365
+ assert v .validate_assignment ('y' , '124' , r ) == {'x' : 'a' , 'y' : 124 }
366
+
367
+ with pytest .raises (ValidationError ) as exc_info :
368
+ v .validate_assignment ('y' , '124' , r , True )
369
+
370
+ assert exc_info .value .errors () == [
371
+ {'kind' : 'int_type' , 'loc' : ['y' ], 'message' : 'Input should be a valid integer' , 'input_value' : '124' }
372
+ ]
373
+
374
+
339
375
def test_json_error ():
340
376
v = SchemaValidator (
341
377
{'type' : 'typed-dict' , 'fields' : {'field_a' : {'schema' : {'type' : 'list' , 'items_schema' : 'int' }}}}
@@ -1211,3 +1247,25 @@ def wrap_function(input_value, *, validator, **kwargs):
1211
1247
assert v .validate_test ({'x' : ['foo' ]}) == {'x' : '1' }
1212
1248
assert v .validate_test ({'x' : ['foo' , 'bar' ]}) == {'x' : '2' }
1213
1249
assert v .validate_test ({'x' : {'a' : 'b' }}) == {'x' : "{'a': 'b'}" }
1250
+
1251
+
1252
+ def test_frozen_field ():
1253
+ v = SchemaValidator (
1254
+ {
1255
+ 'type' : 'typed-dict' ,
1256
+ 'fields' : {
1257
+ 'name' : {'schema' : {'type' : 'str' }},
1258
+ 'age' : {'schema' : {'type' : 'int' }},
1259
+ 'is_developer' : {'schema' : {'type' : 'bool' }, 'default' : True , 'frozen' : True },
1260
+ },
1261
+ }
1262
+ )
1263
+ r1 = v .validate_python ({'name' : 'Samuel' , 'age' : '36' })
1264
+ assert r1 == {'name' : 'Samuel' , 'age' : 36 , 'is_developer' : True }
1265
+ r2 = v .validate_assignment ('age' , '35' , r1 )
1266
+ assert r2 == {'name' : 'Samuel' , 'age' : 35 , 'is_developer' : True }
1267
+ with pytest .raises (ValidationError ) as exc_info :
1268
+ v .validate_assignment ('is_developer' , False , r2 )
1269
+ assert exc_info .value .errors () == [
1270
+ {'kind' : 'frozen' , 'loc' : ['is_developer' ], 'message' : 'Field is frozen' , 'input_value' : False }
1271
+ ]
0 commit comments