File: __init__.py

package info (click to toggle)
python-cerberus 1.3.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 7,532 kB
  • sloc: python: 5,239; makefile: 130
file content (159 lines) | stat: -rw-r--r-- 4,687 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# -*- coding: utf-8 -*-

import re

import pytest

from cerberus import errors, Validator, SchemaError, DocumentError
from cerberus.tests.conftest import sample_schema


def assert_exception(exception, document={}, schema=None, validator=None, msg=None):
    """
    Tests whether a specific exception is raised. Optionally also tests whether the
    exception message is as expected.
    """
    if validator is None:
        validator = Validator()
    if msg is None:
        with pytest.raises(exception):
            validator(document, schema)
    else:
        with pytest.raises(exception, match=re.escape(msg)):
            validator(document, schema)


def assert_schema_error(*args):
    """Tests whether a validation raises an exception due to a malformed schema."""
    assert_exception(SchemaError, *args)


def assert_document_error(*args):
    """Tests whether a validation raises an exception due to a malformed document."""
    assert_exception(DocumentError, *args)


def assert_fail(
    document,
    schema=None,
    validator=None,
    update=False,
    error=None,
    errors=None,
    child_errors=None,
):
    """Tests whether a validation fails."""
    if validator is None:
        validator = Validator(sample_schema)
    result = validator(document, schema, update)
    assert isinstance(result, bool)
    assert not result

    actual_errors = validator._errors

    assert not (error is not None and errors is not None)
    assert not (errors is not None and child_errors is not None), (
        'child_errors can only be tested in ' 'conjunction with the error parameter'
    )
    assert not (child_errors is not None and error is None)
    if error is not None:
        assert len(actual_errors) == 1
        assert_has_error(actual_errors, *error)

        if child_errors is not None:
            assert len(actual_errors[0].child_errors) == len(child_errors)
            assert_has_errors(actual_errors[0].child_errors, child_errors)

    elif errors is not None:
        assert len(actual_errors) == len(errors)
        assert_has_errors(actual_errors, errors)

    return actual_errors


def assert_success(document, schema=None, validator=None, update=False):
    """Tests whether a validation succeeds."""
    if validator is None:
        validator = Validator(sample_schema)
    result = validator(document, schema, update)
    assert isinstance(result, bool)
    if not result:
        raise AssertionError(validator.errors)


def assert_has_error(_errors, d_path, s_path, error_def, constraint, info=()):
    if not isinstance(d_path, tuple):
        d_path = (d_path,)
    if not isinstance(info, tuple):
        info = (info,)

    assert isinstance(_errors, errors.ErrorList)

    for i, error in enumerate(_errors):
        assert isinstance(error, errors.ValidationError)
        try:
            assert error.document_path == d_path
            assert error.schema_path == s_path
            assert error.code == error_def.code
            assert error.rule == error_def.rule
            assert error.constraint == constraint
            if not error.is_group_error:
                assert error.info == info
        except AssertionError:
            pass
        except Exception:
            raise
        else:
            break
    else:
        raise AssertionError(
            """
        Error with properties:
          document_path={doc_path}
          schema_path={schema_path}
          code={code}
          constraint={constraint}
          info={info}
        not found in errors:
        {errors}
        """.format(
                doc_path=d_path,
                schema_path=s_path,
                code=hex(error.code),
                info=info,
                constraint=constraint,
                errors=_errors,
            )
        )
    return i


def assert_has_errors(_errors, _exp_errors):
    assert isinstance(_exp_errors, list)
    for error in _exp_errors:
        assert isinstance(error, tuple)
        assert_has_error(_errors, *error)


def assert_not_has_error(_errors, *args, **kwargs):
    try:
        assert_has_error(_errors, *args, **kwargs)
    except AssertionError:
        pass
    except Exception as e:
        raise e
    else:
        raise AssertionError('An unexpected error occurred.')


def assert_bad_type(field, data_type, value):
    assert_fail(
        {field: value}, error=(field, (field, 'type'), errors.BAD_TYPE, data_type)
    )


def assert_normalized(document, expected, schema=None, validator=None):
    if validator is None:
        validator = Validator(sample_schema)
    assert_success(document, schema, validator)
    assert validator.document == expected