@@ -241,6 +241,24 @@ def test_validate_assignment():
241241 assert v .validate_assignment ('field_a' , b'abc' , {'field_a' : 'test' }) == ({'field_a' : 'abc' }, {'field_a' })
242242
243243
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+
244262def test_validate_assignment_functions ():
245263 calls = []
246264
@@ -336,6 +354,24 @@ def test_validate_assignment_allow_extra_validate():
336354 ]
337355
338356
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+
339375def test_json_error ():
340376 v = SchemaValidator (
341377 {'type' : 'typed-dict' , 'fields' : {'field_a' : {'schema' : {'type' : 'list' , 'items_schema' : 'int' }}}}
@@ -1211,3 +1247,25 @@ def wrap_function(input_value, *, validator, **kwargs):
12111247 assert v .validate_test ({'x' : ['foo' ]}) == {'x' : '1' }
12121248 assert v .validate_test ({'x' : ['foo' , 'bar' ]}) == {'x' : '2' }
12131249 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