def test_dictionary(self): with pytest.raises(TypeError): # noinspection PyTypeChecker Dictionary({'foo': UnicodeString()}, additional_validator='Not a validator') # type: ignore field = Dictionary({ 'foo': UnicodeString(), 'bar': Integer(), 'baz': UnicodeString(), }) assert field.errors(['foo', 'bar', 'baz']) == [Error(message='Not a dict')] assert field.errors( ('foo', 'bar', 'baz')) == [Error(message='Not a dict')] assert field.errors({'foo', 'bar', 'baz'}) == [Error(message='Not a dict')] assert field.errors({ 'foo': 'Hello', 'bar': 12, 'baz': True }) == [ Error(message='Not a unicode string', pointer='baz'), ] assert field.errors({ 'foo': 'Hello', 'bar': 12, 'baz': 'Goodbye' }) == [] class V(AdditionalCollectionValidator[Mapping[HashableType, AnyType]]): def errors(self, value): if value['foo'] != value['baz']: return [ Error('Value foo does not match value baz', pointer='foo') ] return [] field = field.extend(additional_validator=V()) assert field.errors({ 'foo': 'Hello', 'bar': 12, 'baz': 'Goodbye' }) == [ Error(message='Value foo does not match value baz', pointer='foo'), ] assert field.errors({'foo': 'Hello', 'bar': 12, 'baz': 'Hello'}) == []
def test_dictionary_ordering(self): # type: () -> None schema1 = Dictionary( OrderedDict(( ('foo', UnicodeString()), ('bar', Boolean()), ('baz', List(Integer())), )), optional_keys=('foo', ), description='Hello, world', ) assert schema1.introspect()['contents'] == { 'baz': List(Integer()).introspect(), 'foo': UnicodeString().introspect(), 'bar': Boolean().introspect(), } assert schema1.introspect()['display_order'] == ['foo', 'bar', 'baz'] schema2 = schema1.extend( OrderedDict(( ('bar', Integer()), ('qux', Set(UnicodeString())), ('moon', Tuple(Decimal(), UnicodeString())), ))) assert schema2.introspect()['contents'] == { 'baz': List(Integer()).introspect(), 'foo': UnicodeString().introspect(), 'moon': Tuple(Decimal(), UnicodeString()).introspect(), 'bar': Integer().introspect(), 'qux': Set(UnicodeString()).introspect(), } assert schema2.introspect()['display_order'] == [ 'foo', 'bar', 'baz', 'qux', 'moon' ] assert not schema1.errors({'bar': True, 'foo': 'Hello', 'baz': [15]}) errors = schema1.errors({ 'baz': 'Nope', 'foo': False, 'bar': ['Heck nope'] }) assert errors == [ Error(code='INVALID', pointer='foo', message='Not a unicode string'), Error(code='INVALID', pointer='bar', message='Not a boolean'), Error(code='INVALID', pointer='baz', message='Not a list'), ] assert not schema2.errors( { 'bar': 91, 'foo': 'Hello', 'qux': {'Yes'}, 'baz': [15], 'moon': (decimal.Decimal('15.25'), 'USD') }, ) errors = schema2.errors({ 'baz': 'Nope', 'foo': False, 'bar': ['Heck nope'], 'qux': 'Denied', 'moon': 72 }) assert errors == [ Error(code='INVALID', pointer='foo', message='Not a unicode string'), Error(code='INVALID', pointer='bar', message='Not an integer'), Error(code='INVALID', pointer='baz', message='Not a list'), Error(code='INVALID', pointer='qux', message='Not a set or frozenset'), Error(code='INVALID', pointer='moon', message='Not a tuple'), ]
def test_dictionary_extension(self): # type: () -> None schema1 = Dictionary( { 'foo': UnicodeString(), 'bar': Boolean(), }, optional_keys=('foo', ), description='Hello, world', ) schema2 = schema1.extend( { 'bar': Integer(), 'baz': List(Integer()), }, optional_keys=('baz', ), ) schema3 = schema1.extend( { 'bar': Integer(), 'baz': List(Integer()), }, optional_keys=('baz', ), allow_extra_keys=True, description='Goodbye, universe', replace_optional_keys=True, ) self.assertEqual( Dictionary( { 'foo': UnicodeString(), 'bar': Integer(), 'baz': List(Integer()), }, optional_keys=( 'foo', 'baz', ), allow_extra_keys=False, description='Hello, world', ).introspect(), schema2.introspect(), ) self.assertEqual( Dictionary( { 'foo': UnicodeString(), 'bar': Integer(), 'baz': List(Integer()), }, optional_keys=('baz', ), allow_extra_keys=True, description='Goodbye, universe', ).introspect(), schema3.introspect(), ) assert 'display_order' not in schema1.introspect() assert 'display_order' not in schema2.introspect() assert 'display_order' not in schema3.introspect()