예제 #1
0
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},
    )
예제 #2
0
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',
    )
예제 #3
0
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',
    )