def test_default_none_nonnullable(default): bar_schema = {'type': 'string', 'nullable': False} bar_schema.update(default) schema = {'foo': {'type': 'string'}, 'bar': bar_schema} document = {'foo': 'foo_value', 'bar': None} expected = {'foo': 'foo_value', 'bar': 'bar_value'} assert_normalized(document, expected, schema)
def test_default_missing(default): bar_schema = {'type': 'string'} bar_schema.update(default) schema = {'foo': {'type': 'string'}, 'bar': bar_schema} document = {'foo': 'foo_value'} expected = {'foo': 'foo_value', 'bar': 'bar_value'} assert_normalized(document, expected, schema)
def test_issue_250_no_type_fail_pass_on_other(): # https://github.com/pyeve/cerberus/issues/250 schema = { 'list': {'schema': {'allow_unknown': True, 'schema': {'a': {'type': 'string'}}}} } document = {'list': 1} assert_normalized(document, document, schema)
def test_coercion_of_sequence_items(validator): # https://github.com/pyeve/cerberus/issues/161 schema = {'a_list': {'type': 'list', 'schema': {'type': 'float', 'coerce': float}}} document = {'a_list': [3, 4, 5]} expected = {'a_list': [3.0, 4.0, 5.0]} assert_normalized(document, expected, schema, validator) for x in validator.document['a_list']: assert isinstance(x, float)
def test_default_none_default_value(): schema = { 'foo': {'type': 'string'}, 'bar': {'type': 'string', 'nullable': True, 'default': None}, } document = {'foo': 'foo_value'} expected = {'foo': 'foo_value', 'bar': None} assert_normalized(document, expected, schema)
def test_coerce_in_keysrules(): # https://github.com/pyeve/cerberus/issues/155 schema = { 'thing': {'type': 'dict', 'keysrules': {'coerce': int, 'type': 'integer'}} } document = {'thing': {'5': 'foo'}} expected = {'thing': {5: 'foo'}} assert_normalized(document, expected, schema)
def test_normalization_with_rules_set(): # https://github.com/pyeve/cerberus/issues/283 rules_set_registry.add('foo', {'default': 42}) assert_normalized({}, {'bar': 42}, {'bar': 'foo'}) rules_set_registry.add('foo', {'default_setter': lambda _: 42}) assert_normalized({}, {'bar': 42}, {'bar': 'foo'}) rules_set_registry.add('foo', {'type': 'integer', 'nullable': True}) assert_success({'bar': None}, {'bar': 'foo'})
def test_nullables_fail_coerce_on_non_null_values(validator): def failing_coercion(value): raise Exception("expected to fail") schema = {'foo': {'coerce': failing_coercion, 'nullable': True, 'type': 'integer'}} document = {'foo': None} assert_normalized(document, document, schema) validator({'foo': 2}, schema) assert errors.COERCION_FAILED in validator._errors
def test_purge_readonly(): schema = { 'description': {'type': 'string', 'maxlength': 500}, 'last_updated': {'readonly': True}, } validator = Validator(schema=schema, purge_readonly=True) document = {'description': 'it is a thing'} expected = deepcopy(document) document['last_updated'] = 'future' assert_normalized(document, expected, validator=validator)
def test_depending_default_setters(): schema = { 'a': {'type': 'integer'}, 'b': {'type': 'integer', 'default_setter': lambda d: d['a'] + 1}, 'c': {'type': 'integer', 'default_setter': lambda d: d['b'] * 2}, 'd': {'type': 'integer', 'default_setter': lambda d: d['b'] + d['c']}, } document = {'a': 1} expected = {'a': 1, 'b': 2, 'c': 4, 'd': 6} assert_normalized(document, expected, schema)
def test_coerce_in_listitems(): schema = {'things': {'type': 'list', 'items': [{'coerce': int}, {'coerce': str}]}} document = {'things': ['1', 2]} expected = {'things': [1, '2']} assert_normalized(document, expected, schema) validator = Validator(schema) document['things'].append(3) assert not validator(document) assert validator.document['things'] == document['things']
def test_purge_unknown_in_subschema(): schema = { 'foo': { 'type': 'dict', 'schema': {'foo': {'type': 'string'}}, 'purge_unknown': True, } } document = {'foo': {'bar': ''}} expected = {'foo': {}} assert_normalized(document, expected, schema)
def test_default_missing_in_subschema(default): bar_schema = {'type': 'string'} bar_schema.update(default) schema = { 'thing': { 'type': 'dict', 'schema': {'foo': {'type': 'string'}, 'bar': bar_schema}, } } document = {'thing': {'foo': 'foo_value'}} expected = {'thing': {'foo': 'foo_value', 'bar': 'bar_value'}} assert_normalized(document, expected, schema)
def test_allow_unknown_with_purge_unknown_subdocument(): validator = Validator(purge_unknown=True) schema = { 'foo': { 'type': 'dict', 'schema': {'bar': {'type': 'string'}}, 'allow_unknown': True, } } document = {'foo': {'bar': 'baz', 'corge': False}, 'thud': 'xyzzy'} expected = {'foo': {'bar': 'baz', 'corge': False}} assert_normalized(document, expected, schema, validator)
def test_issue_250_no_type_pass_on_list(): # https://github.com/pyeve/cerberus/issues/250 schema = { 'list': { 'schema': { 'allow_unknown': True, 'type': 'dict', 'schema': {'a': {'type': 'string'}}, } } } document = {'list': [{'a': 'known', 'b': 'unknown'}]} assert_normalized(document, document, schema)
def test_defaults_in_allow_unknown_schema(): schema = {'meta': {'type': 'dict'}, 'version': {'type': 'string'}} allow_unknown = { 'type': 'dict', 'schema': { 'cfg_path': {'type': 'string', 'default': 'cfg.yaml'}, 'package': {'type': 'string'}, }, } validator = Validator(schema=schema, allow_unknown=allow_unknown) document = {'version': '1.2.3', 'plugin_foo': {'package': 'foo'}} expected = { 'version': '1.2.3', 'plugin_foo': {'package': 'foo', 'cfg_path': 'cfg.yaml'}, } assert_normalized(document, expected, schema, validator)
def test_allow_unknown_with_purge_unknown(): validator = Validator(purge_unknown=True) schema = {'foo': {'type': 'dict', 'allow_unknown': True}} document = {'foo': {'bar': True}, 'bar': 'foo'} expected = {'foo': {'bar': True}} assert_normalized(document, expected, schema, validator)
def test_coerce_chain(): drop_prefix = lambda x: x[2:] # noqa: E731 upper = lambda x: x.upper() # noqa: E731 schema = {'foo': {'coerce': [hex, drop_prefix, upper]}} assert_normalized({'foo': 15}, {'foo': 'F'}, schema)
def test_coerce_in_dictschema(): schema = {'thing': {'type': 'dict', 'schema': {'amount': {'coerce': int}}}} document = {'thing': {'amount': '2'}} expected = {'thing': {'amount': 2}} assert_normalized(document, expected, schema)
def test_nullables_dont_fail_coerce(): schema = {'foo': {'coerce': int, 'nullable': True, 'type': 'integer'}} document = {'foo': None} assert_normalized(document, document, schema)
def test_coerce(): schema = {'amount': {'coerce': int}} document = {'amount': '1'} expected = {'amount': 1} assert_normalized(document, expected, schema)
def test_coerce_unknown(): schema = {'foo': {'schema': {}, 'allow_unknown': {'coerce': int}}} document = {'foo': {'bar': '0'}} expected = {'foo': {'bar': 0}} assert_normalized(document, expected, schema)
def test_rename_handler(): validator = Validator(allow_unknown={'rename_handler': int}) schema = {} document = {'0': 'foo'} expected = {0: 'foo'} assert_normalized(document, expected, schema, validator)
def test_purge_unknown(): validator = Validator(purge_unknown=True) schema = {'foo': {'type': 'string'}} document = {'bar': 'foo'} expected = {} assert_normalized(document, expected, schema, validator)
def test_default_existent(default): bar_schema = {'type': 'string'} bar_schema.update(default) schema = {'foo': {'type': 'string'}, 'bar': bar_schema} document = {'foo': 'foo_value', 'bar': 'non_default'} assert_normalized(document, document.copy(), schema)
def test_coerce_in_listschema(): schema = {'things': {'type': 'list', 'schema': {'coerce': int}}} document = {'things': ['1', '2', '3']} expected = {'things': [1, 2, 3]} assert_normalized(document, expected, schema)
def test_coerce_in_dictschema_in_listschema(): item_schema = {'type': 'dict', 'schema': {'amount': {'coerce': int}}} schema = {'things': {'type': 'list', 'schema': item_schema}} document = {'things': [{'amount': '2'}]} expected = {'things': [{'amount': 2}]} assert_normalized(document, expected, schema)
def test_default_none_nullable(default): bar_schema = {'type': 'string', 'nullable': True} bar_schema.update(default) schema = {'foo': {'type': 'string'}, 'bar': bar_schema} document = {'foo': 'foo_value', 'bar': None} assert_normalized(document, document.copy(), schema)