def test_non_required_circular_reference(): """ A schema which references itself is allowable, as long as the self reference is not required. This test ensures that such a case is handled. """ schema = { '$ref': 'Node', } definitions = schema_definitions_validator( { 'Node': { 'properties': { 'parent': { '$ref': 'Node' }, 'value': { 'type': STRING }, }, }, }, context={'deferred_references': set()}, ) validator = generate_validator_from_schema( schema, context={'definitions': definitions}, )
def test_nested_references_are_validated(): schema = { '$ref': 'Node', } definitions = schema_definitions_validator( { 'Node': { 'properties': { 'parent': { '$ref': 'Node' }, 'value': { 'type': STRING }, }, }, }, context={'deferred_references': set()}, ) validator = generate_validator_from_schema( schema, context={'definitions': definitions}, ) with pytest.raises(ValidationError) as err: validator({ 'parent': { 'value': 'bar', 'parent': { 'value': 1234, 'parent': { 'value': 'baz', 'parent': { 'value': 54321, }, }, }, }, }) assert_message_in_errors( MESSAGES['type']['invalid'], err.value.detail, 'parent.parent.value', ) assert_message_in_errors( MESSAGES['type']['invalid'], err.value.detail, 'parent.parent.parent.parent.value', )
def test_required_circular_reference(): """ A schema which references itself and has the self reference as a required field can never be valid, since the schema would have to go infinitely deep. This test ensures that we can handle that case without ending up in an infinite recursion situation. """ schema = { '$ref': 'Node', } definitions = schema_definitions_validator( { 'Node': { 'properties': { 'parent': { '$ref': 'Node', 'required': True }, }, }, }, context={'deferred_references': set()}, ) validator = generate_validator_from_schema( schema, context={'definitions': definitions}, ) with pytest.raises(ValidationError) as err: validator({ 'parent': { 'parent': { 'parent': { 'parent': {}, }, }, }, }) assert_message_in_errors( MESSAGES['required']['required'], err.value.detail, 'parent.parent.parent.parent.parent.required', )