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
|
import pytest
from pydantic_core import SchemaError, SchemaValidator, core_schema
from ..conftest import plain_repr
def test_list_with_def():
v = SchemaValidator(
core_schema.definitions_schema(
core_schema.list_schema(core_schema.definition_reference_schema('foobar')),
[core_schema.int_schema(ref='foobar')],
)
)
assert v.validate_python([1, 2, '3']) == [1, 2, 3]
assert v.validate_json(b'[1, 2, "3"]') == [1, 2, 3]
r = plain_repr(v)
assert r.startswith('SchemaValidator(title="list[int]",')
def test_ignored_def():
v = SchemaValidator(
core_schema.definitions_schema(
core_schema.list_schema(core_schema.int_schema()), [core_schema.int_schema(ref='foobar')]
)
)
assert v.validate_python([1, 2, '3']) == [1, 2, 3]
r = plain_repr(v)
assert r.startswith('SchemaValidator(title="list[int]",')
def test_extract_used_refs_ignores_metadata():
v = SchemaValidator(core_schema.any_schema(metadata={'type': 'definition-ref'}))
assert v.validate_python([1, 2, 3]) == [1, 2, 3]
assert plain_repr(v).endswith('definitions=[],cache_strings=True)')
def test_check_ref_used_ignores_metadata():
v = SchemaValidator(
core_schema.list_schema(
core_schema.int_schema(metadata={'type': 'definition-ref', 'schema_ref': 'foobar'}), ref='foobar'
)
)
assert v.validate_python([1, 2, 3]) == [1, 2, 3]
# assert plain_repr(v).endswith('definitions=[])')
def test_dict_repeat():
v = SchemaValidator(
core_schema.definitions_schema(
core_schema.dict_schema(
core_schema.definition_reference_schema('foobar'), core_schema.definition_reference_schema('foobar')
),
[core_schema.int_schema(ref='foobar')],
)
)
assert v.validate_python({'1': '2', 3: '4'}) == {1: 2, 3: 4}
assert v.validate_json(b'{"1": 2, "3": "4"}') == {1: 2, 3: 4}
# assert plain_repr(v).endswith('definitions=[])')
def test_repeated_ref():
with pytest.raises(SchemaError, match='SchemaError: Duplicate ref: `foobar`'):
SchemaValidator(
schema=core_schema.tuple_positional_schema(
[
core_schema.definitions_schema(
core_schema.definition_reference_schema('foobar'), [core_schema.int_schema(ref='foobar')]
),
core_schema.definitions_schema(
core_schema.definition_reference_schema('foobar'), [core_schema.int_schema(ref='foobar')]
),
]
)
)
def test_repeat_after():
with pytest.raises(SchemaError, match='SchemaError: Duplicate ref: `foobar`'):
SchemaValidator(
schema=core_schema.definitions_schema(
core_schema.tuple_positional_schema(
[
core_schema.definitions_schema(
core_schema.definition_reference_schema('foobar'), [core_schema.int_schema(ref='foobar')]
),
core_schema.definition_reference_schema('foobar'),
]
),
[core_schema.int_schema(ref='foobar')],
)
)
def test_deep():
v = SchemaValidator(
core_schema.typed_dict_schema(
{
'a': core_schema.typed_dict_field(core_schema.int_schema()),
'b': core_schema.typed_dict_field(
core_schema.definitions_schema(
core_schema.typed_dict_schema(
{
'c': core_schema.typed_dict_field(core_schema.int_schema()),
'd': core_schema.typed_dict_field(core_schema.definition_reference_schema('foobar')),
}
),
[core_schema.str_schema(ref='foobar')],
)
),
}
)
)
assert v.validate_python({'a': 1, 'b': {'c': 2, 'd': b'dd'}}) == {'a': 1, 'b': {'c': 2, 'd': 'dd'}}
def test_use_after():
v = SchemaValidator(
core_schema.tuple_positional_schema(
[
core_schema.definitions_schema(
core_schema.definition_reference_schema('foobar'), [core_schema.int_schema(ref='foobar')]
),
core_schema.definition_reference_schema('foobar'),
]
)
)
assert v.validate_python(['1', '2']) == (1, 2)
def test_definition_chain():
v = SchemaValidator(
core_schema.definitions_schema(
core_schema.definition_reference_schema('foo'),
[core_schema.definition_reference_schema(ref='foo', schema_ref='bar'), core_schema.int_schema(ref='bar')],
)
)
assert v.validate_python('1') == 1
def test_forwards_get_default_value():
v = SchemaValidator(
core_schema.definitions_schema(
core_schema.definition_reference_schema('foo'),
[core_schema.with_default_schema(core_schema.int_schema(), default=1, ref='foo')],
)
)
default = v.get_default_value()
assert default is not None
assert default.value == 1
|