Skip to content

Commit 0d1b06a

Browse files
committed
add more cyclic tests
1 parent 6f7b7f7 commit 0d1b06a

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

tests/validators/test_definitions_recursive.py

+92
Original file line numberDiff line numberDiff line change
@@ -895,3 +895,95 @@ class Model:
895895
'url': f'https://errors.pydantic.dev/{pydantic_version}/v/dataclass_type',
896896
}
897897
]
898+
899+
900+
def test_cyclic_data() -> None:
901+
cyclic_data = {}
902+
cyclic_data['b'] = {'a': cyclic_data}
903+
904+
schema = core_schema.definitions_schema(
905+
core_schema.definition_reference_schema('a'),
906+
[
907+
core_schema.typed_dict_schema(
908+
{
909+
'b': core_schema.typed_dict_field(
910+
core_schema.nullable_schema(core_schema.definition_reference_schema('b'))
911+
)
912+
},
913+
ref='a',
914+
),
915+
core_schema.typed_dict_schema(
916+
{
917+
'a': core_schema.typed_dict_field(
918+
core_schema.nullable_schema(core_schema.definition_reference_schema('a'))
919+
)
920+
},
921+
ref='b',
922+
),
923+
],
924+
)
925+
926+
validator = SchemaValidator(schema)
927+
928+
with pytest.raises(ValidationError) as exc_info:
929+
validator.validate_python(cyclic_data)
930+
931+
assert exc_info.value.title == 'typed-dict'
932+
assert exc_info.value.errors(include_url=False) == [
933+
{
934+
'type': 'recursion_loop',
935+
'loc': ('b', 'a'),
936+
'msg': 'Recursion error - cyclic reference detected',
937+
'input': cyclic_data,
938+
}
939+
]
940+
941+
942+
def test_cyclic_data_threeway() -> None:
943+
cyclic_data = {}
944+
cyclic_data['b'] = {'c': {'a': cyclic_data}}
945+
946+
schema = core_schema.definitions_schema(
947+
core_schema.definition_reference_schema('a'),
948+
[
949+
core_schema.typed_dict_schema(
950+
{
951+
'b': core_schema.typed_dict_field(
952+
core_schema.nullable_schema(core_schema.definition_reference_schema('b'))
953+
)
954+
},
955+
ref='a',
956+
),
957+
core_schema.typed_dict_schema(
958+
{
959+
'c': core_schema.typed_dict_field(
960+
core_schema.nullable_schema(core_schema.definition_reference_schema('c'))
961+
)
962+
},
963+
ref='b',
964+
),
965+
core_schema.typed_dict_schema(
966+
{
967+
'a': core_schema.typed_dict_field(
968+
core_schema.nullable_schema(core_schema.definition_reference_schema('a'))
969+
)
970+
},
971+
ref='c',
972+
),
973+
],
974+
)
975+
976+
validator = SchemaValidator(schema)
977+
978+
with pytest.raises(ValidationError) as exc_info:
979+
validator.validate_python(cyclic_data)
980+
981+
assert exc_info.value.title == 'typed-dict'
982+
assert exc_info.value.errors(include_url=False) == [
983+
{
984+
'type': 'recursion_loop',
985+
'loc': ('b', 'c', 'a'),
986+
'msg': 'Recursion error - cyclic reference detected',
987+
'input': cyclic_data,
988+
}
989+
]

0 commit comments

Comments
 (0)