Blame tools/extra/packager/jsonschema-2.3.0/jsonschema/tests/test_validators.py

Packit 534379
from __future__ import unicode_literals
Packit 534379
import contextlib
Packit 534379
import json
Packit 534379
import pprint
Packit 534379
import textwrap
Packit 534379
Packit 534379
from jsonschema import FormatChecker, ValidationError
Packit 534379
from jsonschema.compat import PY3
Packit 534379
from jsonschema.tests.compat import mock, unittest
Packit 534379
from jsonschema.validators import (
Packit 534379
    RefResolutionError, UnknownType, Draft3Validator,
Packit 534379
    Draft4Validator, RefResolver, create, extend, validator_for, validate,
Packit 534379
)
Packit 534379
Packit 534379
Packit 534379
class TestCreateAndExtend(unittest.TestCase):
Packit 534379
    def setUp(self):
Packit 534379
        self.meta_schema = {"properties": {"smelly": {}}}
Packit 534379
        self.smelly = mock.MagicMock()
Packit 534379
        self.validators = {"smelly": self.smelly}
Packit 534379
        self.types = {"dict": dict}
Packit 534379
        self.Validator = create(
Packit 534379
            meta_schema=self.meta_schema,
Packit 534379
            validators=self.validators,
Packit 534379
            default_types=self.types,
Packit 534379
        )
Packit 534379
Packit 534379
        self.validator_value = 12
Packit 534379
        self.schema = {"smelly": self.validator_value}
Packit 534379
        self.validator = self.Validator(self.schema)
Packit 534379
Packit 534379
    def test_attrs(self):
Packit 534379
        self.assertEqual(self.Validator.VALIDATORS, self.validators)
Packit 534379
        self.assertEqual(self.Validator.META_SCHEMA, self.meta_schema)
Packit 534379
        self.assertEqual(self.Validator.DEFAULT_TYPES, self.types)
Packit 534379
Packit 534379
    def test_init(self):
Packit 534379
        self.assertEqual(self.validator.schema, self.schema)
Packit 534379
Packit 534379
    def test_iter_errors(self):
Packit 534379
        instance = "hello"
Packit 534379
Packit 534379
        self.smelly.return_value = []
Packit 534379
        self.assertEqual(list(self.validator.iter_errors(instance)), [])
Packit 534379
Packit 534379
        error = mock.Mock()
Packit 534379
        self.smelly.return_value = [error]
Packit 534379
        self.assertEqual(list(self.validator.iter_errors(instance)), [error])
Packit 534379
Packit 534379
        self.smelly.assert_called_with(
Packit 534379
            self.validator, self.validator_value, instance, self.schema,
Packit 534379
        )
Packit 534379
Packit 534379
    def test_if_a_version_is_provided_it_is_registered(self):
Packit 534379
        with mock.patch("jsonschema.validators.validates") as validates:
Packit 534379
            validates.side_effect = lambda version: lambda cls: cls
Packit 534379
            Validator = create(meta_schema={"id": "id"}, version="my version")
Packit 534379
        validates.assert_called_once_with("my version")
Packit 534379
        self.assertEqual(Validator.__name__, "MyVersionValidator")
Packit 534379
Packit 534379
    def test_if_a_version_is_not_provided_it_is_not_registered(self):
Packit 534379
        with mock.patch("jsonschema.validators.validates") as validates:
Packit 534379
            create(meta_schema={"id": "id"})
Packit 534379
        self.assertFalse(validates.called)
Packit 534379
Packit 534379
    def test_extend(self):
Packit 534379
        validators = dict(self.Validator.VALIDATORS)
Packit 534379
        new = mock.Mock()
Packit 534379
Packit 534379
        Extended = extend(self.Validator, validators={"a new one": new})
Packit 534379
Packit 534379
        validators.update([("a new one", new)])
Packit 534379
        self.assertEqual(Extended.VALIDATORS, validators)
Packit 534379
        self.assertNotIn("a new one", self.Validator.VALIDATORS)
Packit 534379
Packit 534379
        self.assertEqual(Extended.META_SCHEMA, self.Validator.META_SCHEMA)
Packit 534379
        self.assertEqual(Extended.DEFAULT_TYPES, self.Validator.DEFAULT_TYPES)
Packit 534379
Packit 534379
Packit 534379
class TestIterErrors(unittest.TestCase):
Packit 534379
    def setUp(self):
Packit 534379
        self.validator = Draft3Validator({})
Packit 534379
Packit 534379
    def test_iter_errors(self):
Packit 534379
        instance = [1, 2]
Packit 534379
        schema = {
Packit 534379
            "disallow": "array",
Packit 534379
            "enum": [["a", "b", "c"], ["d", "e", "f"]],
Packit 534379
            "minItems": 3
Packit 534379
        }
Packit 534379
Packit 534379
        got = (e.message for e in self.validator.iter_errors(instance, schema))
Packit 534379
        expected = [
Packit 534379
            "%r is disallowed for [1, 2]" % (schema["disallow"],),
Packit 534379
            "[1, 2] is too short",
Packit 534379
            "[1, 2] is not one of %r" % (schema["enum"],),
Packit 534379
        ]
Packit 534379
        self.assertEqual(sorted(got), sorted(expected))
Packit 534379
Packit 534379
    def test_iter_errors_multiple_failures_one_validator(self):
Packit 534379
        instance = {"foo": 2, "bar": [1], "baz": 15, "quux": "spam"}
Packit 534379
        schema = {
Packit 534379
            "properties": {
Packit 534379
                "foo": {"type": "string"},
Packit 534379
                "bar": {"minItems": 2},
Packit 534379
                "baz": {"maximum": 10, "enum": [2, 4, 6, 8]},
Packit 534379
            }
Packit 534379
        }
Packit 534379
Packit 534379
        errors = list(self.validator.iter_errors(instance, schema))
Packit 534379
        self.assertEqual(len(errors), 4)
Packit 534379
Packit 534379
Packit 534379
class TestValidationErrorMessages(unittest.TestCase):
Packit 534379
    def message_for(self, instance, schema, *args, **kwargs):
Packit 534379
        kwargs.setdefault("cls", Draft3Validator)
Packit 534379
        with self.assertRaises(ValidationError) as e:
Packit 534379
            validate(instance, schema, *args, **kwargs)
Packit 534379
        return e.exception.message
Packit 534379
Packit 534379
    def test_single_type_failure(self):
Packit 534379
        message = self.message_for(instance=1, schema={"type": "string"})
Packit 534379
        self.assertEqual(message, "1 is not of type %r" % "string")
Packit 534379
Packit 534379
    def test_single_type_list_failure(self):
Packit 534379
        message = self.message_for(instance=1, schema={"type": ["string"]})
Packit 534379
        self.assertEqual(message, "1 is not of type %r" % "string")
Packit 534379
Packit 534379
    def test_multiple_type_failure(self):
Packit 534379
        types = ("string", "object")
Packit 534379
        message = self.message_for(instance=1, schema={"type": list(types)})
Packit 534379
        self.assertEqual(message, "1 is not of type %r, %r" % types)
Packit 534379
Packit 534379
    def test_object_without_title_type_failure(self):
Packit 534379
        type = {"type": [{"minimum": 3}]}
Packit 534379
        message = self.message_for(instance=1, schema={"type": [type]})
Packit 534379
        self.assertEqual(message, "1 is not of type %r" % (type,))
Packit 534379
Packit 534379
    def test_object_with_name_type_failure(self):
Packit 534379
        name = "Foo"
Packit 534379
        schema = {"type": [{"name": name, "minimum": 3}]}
Packit 534379
        message = self.message_for(instance=1, schema=schema)
Packit 534379
        self.assertEqual(message, "1 is not of type %r" % (name,))
Packit 534379
Packit 534379
    def test_dependencies_failure_has_single_element_not_list(self):
Packit 534379
        depend, on = "bar", "foo"
Packit 534379
        schema = {"dependencies": {depend: on}}
Packit 534379
        message = self.message_for({"bar": 2}, schema)
Packit 534379
        self.assertEqual(message, "%r is a dependency of %r" % (on, depend))
Packit 534379
Packit 534379
    def test_additionalItems_single_failure(self):
Packit 534379
        message = self.message_for(
Packit 534379
            [2], {"items": [], "additionalItems": False},
Packit 534379
        )
Packit 534379
        self.assertIn("(2 was unexpected)", message)
Packit 534379
Packit 534379
    def test_additionalItems_multiple_failures(self):
Packit 534379
        message = self.message_for(
Packit 534379
            [1, 2, 3], {"items": [], "additionalItems": False}
Packit 534379
        )
Packit 534379
        self.assertIn("(1, 2, 3 were unexpected)", message)
Packit 534379
Packit 534379
    def test_additionalProperties_single_failure(self):
Packit 534379
        additional = "foo"
Packit 534379
        schema = {"additionalProperties": False}
Packit 534379
        message = self.message_for({additional: 2}, schema)
Packit 534379
        self.assertIn("(%r was unexpected)" % (additional,), message)
Packit 534379
Packit 534379
    def test_additionalProperties_multiple_failures(self):
Packit 534379
        schema = {"additionalProperties": False}
Packit 534379
        message = self.message_for(dict.fromkeys(["foo", "bar"]), schema)
Packit 534379
Packit 534379
        self.assertIn(repr("foo"), message)
Packit 534379
        self.assertIn(repr("bar"), message)
Packit 534379
        self.assertIn("were unexpected)", message)
Packit 534379
Packit 534379
    def test_invalid_format_default_message(self):
Packit 534379
        checker = FormatChecker(formats=())
Packit 534379
        check_fn = mock.Mock(return_value=False)
Packit 534379
        checker.checks("thing")(check_fn)
Packit 534379
Packit 534379
        schema = {"format": "thing"}
Packit 534379
        message = self.message_for("bla", schema, format_checker=checker)
Packit 534379
Packit 534379
        self.assertIn(repr("bla"), message)
Packit 534379
        self.assertIn(repr("thing"), message)
Packit 534379
        self.assertIn("is not a", message)
Packit 534379
Packit 534379
Packit 534379
class TestErrorReprStr(unittest.TestCase):
Packit 534379
Packit 534379
    message = "hello"
Packit 534379
Packit 534379
    def setUp(self):
Packit 534379
        self.error = ValidationError(
Packit 534379
            message=self.message,
Packit 534379
            validator="type",
Packit 534379
            validator_value="string",
Packit 534379
            instance=5,
Packit 534379
            schema={"type": "string"},
Packit 534379
        )
Packit 534379
Packit 534379
    def assertShows(self, message):
Packit 534379
        if PY3:
Packit 534379
            message = message.replace("u'", "'")
Packit 534379
        message = textwrap.dedent(message).rstrip("\n")
Packit 534379
Packit 534379
        message_line, _, rest = str(self.error).partition("\n")
Packit 534379
        self.assertEqual(message_line, self.message)
Packit 534379
        self.assertEqual(rest, message)
Packit 534379
Packit 534379
    def test_repr(self):
Packit 534379
        self.assertEqual(
Packit 534379
            repr(self.error),
Packit 534379
            "<ValidationError: %r>" % self.message,
Packit 534379
        )
Packit 534379
Packit 534379
    def test_unset_error(self):
Packit 534379
        error = ValidationError("message")
Packit 534379
        self.assertEqual(str(error), "message")
Packit 534379
Packit 534379
        kwargs = {
Packit 534379
            "validator": "type",
Packit 534379
            "validator_value": "string",
Packit 534379
            "instance": 5,
Packit 534379
            "schema": {"type": "string"}
Packit 534379
        }
Packit 534379
        # Just the message should show if any of the attributes are unset
Packit 534379
        for attr in kwargs:
Packit 534379
            k = dict(kwargs)
Packit 534379
            del k[attr]
Packit 534379
            error = ValidationError("message", **k)
Packit 534379
            self.assertEqual(str(error), "message")
Packit 534379
Packit 534379
    def test_empty_paths(self):
Packit 534379
        self.error.path = self.error.schema_path = []
Packit 534379
        self.assertShows(
Packit 534379
            """
Packit 534379
            Failed validating u'type' in schema:
Packit 534379
                {u'type': u'string'}
Packit 534379
Packit 534379
            On instance:
Packit 534379
                5
Packit 534379
            """
Packit 534379
        )
Packit 534379
Packit 534379
    def test_one_item_paths(self):
Packit 534379
        self.error.path = [0]
Packit 534379
        self.error.schema_path = ["items"]
Packit 534379
        self.assertShows(
Packit 534379
            """
Packit 534379
            Failed validating u'type' in schema:
Packit 534379
                {u'type': u'string'}
Packit 534379
Packit 534379
            On instance[0]:
Packit 534379
                5
Packit 534379
            """
Packit 534379
        )
Packit 534379
Packit 534379
    def test_multiple_item_paths(self):
Packit 534379
        self.error.path = [0, "a"]
Packit 534379
        self.error.schema_path = ["items", 0, 1]
Packit 534379
        self.assertShows(
Packit 534379
            """
Packit 534379
            Failed validating u'type' in schema[u'items'][0]:
Packit 534379
                {u'type': u'string'}
Packit 534379
Packit 534379
            On instance[0][u'a']:
Packit 534379
                5
Packit 534379
            """
Packit 534379
        )
Packit 534379
Packit 534379
    def test_uses_pprint(self):
Packit 534379
        with mock.patch.object(pprint, "pformat") as pformat:
Packit 534379
            str(self.error)
Packit 534379
            self.assertGreater(pformat.call_count, 1)  # schema + instance
Packit 534379
Packit 534379
Packit 534379
class TestValidationErrorDetails(unittest.TestCase):
Packit 534379
    # TODO: These really need unit tests for each individual validator, rather
Packit 534379
    #       than just these higher level tests.
Packit 534379
    def test_anyOf(self):
Packit 534379
        instance = 5
Packit 534379
        schema = {
Packit 534379
            "anyOf": [
Packit 534379
                {"minimum": 20},
Packit 534379
                {"type": "string"}
Packit 534379
            ]
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft4Validator(schema)
Packit 534379
        errors = list(validator.iter_errors(instance))
Packit 534379
        self.assertEqual(len(errors), 1)
Packit 534379
        e = errors[0]
Packit 534379
Packit 534379
        self.assertEqual(e.validator, "anyOf")
Packit 534379
        self.assertEqual(list(e.schema_path), ["anyOf"])
Packit 534379
        self.assertEqual(e.validator_value, schema["anyOf"])
Packit 534379
        self.assertEqual(e.instance, instance)
Packit 534379
        self.assertEqual(e.schema, schema)
Packit 534379
        self.assertEqual(list(e.path), [])
Packit 534379
        self.assertEqual(len(e.context), 2)
Packit 534379
Packit 534379
        e1, e2 = sorted_errors(e.context)
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "minimum")
Packit 534379
        self.assertEqual(list(e1.schema_path), [0, "minimum"])
Packit 534379
        self.assertEqual(e1.validator_value, schema["anyOf"][0]["minimum"])
Packit 534379
        self.assertEqual(e1.instance, instance)
Packit 534379
        self.assertEqual(e1.schema, schema["anyOf"][0])
Packit 534379
        self.assertEqual(list(e1.path), [])
Packit 534379
        self.assertEqual(len(e1.context), 0)
Packit 534379
Packit 534379
        self.assertEqual(e2.validator, "type")
Packit 534379
        self.assertEqual(list(e2.schema_path), [1, "type"])
Packit 534379
        self.assertEqual(e2.validator_value, schema["anyOf"][1]["type"])
Packit 534379
        self.assertEqual(e2.instance, instance)
Packit 534379
        self.assertEqual(e2.schema, schema["anyOf"][1])
Packit 534379
        self.assertEqual(list(e2.path), [])
Packit 534379
        self.assertEqual(len(e2.context), 0)
Packit 534379
Packit 534379
    def test_type(self):
Packit 534379
        instance = {"foo": 1}
Packit 534379
        schema = {
Packit 534379
            "type": [
Packit 534379
                {"type": "integer"},
Packit 534379
                {
Packit 534379
                    "type": "object",
Packit 534379
                    "properties": {
Packit 534379
                        "foo": {"enum": [2]}
Packit 534379
                    }
Packit 534379
                }
Packit 534379
            ]
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = list(validator.iter_errors(instance))
Packit 534379
        self.assertEqual(len(errors), 1)
Packit 534379
        e = errors[0]
Packit 534379
Packit 534379
        self.assertEqual(e.validator, "type")
Packit 534379
        self.assertEqual(list(e.schema_path), ["type"])
Packit 534379
        self.assertEqual(e.validator_value, schema["type"])
Packit 534379
        self.assertEqual(e.instance, instance)
Packit 534379
        self.assertEqual(e.schema, schema)
Packit 534379
        self.assertEqual(list(e.path), [])
Packit 534379
        self.assertEqual(len(e.context), 2)
Packit 534379
Packit 534379
        e1, e2 = sorted_errors(e.context)
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "type")
Packit 534379
        self.assertEqual(list(e1.schema_path), [0, "type"])
Packit 534379
        self.assertEqual(e1.validator_value, schema["type"][0]["type"])
Packit 534379
        self.assertEqual(e1.instance, instance)
Packit 534379
        self.assertEqual(e1.schema, schema["type"][0])
Packit 534379
        self.assertEqual(list(e1.path), [])
Packit 534379
        self.assertEqual(len(e1.context), 0)
Packit 534379
Packit 534379
        self.assertEqual(e2.validator, "enum")
Packit 534379
        self.assertEqual(
Packit 534379
            list(e2.schema_path),
Packit 534379
            [1, "properties", "foo", "enum"]
Packit 534379
        )
Packit 534379
        self.assertEqual(
Packit 534379
            e2.validator_value,
Packit 534379
            schema["type"][1]["properties"]["foo"]["enum"]
Packit 534379
        )
Packit 534379
        self.assertEqual(e2.instance, instance["foo"])
Packit 534379
        self.assertEqual(e2.schema, schema["type"][1]["properties"]["foo"])
Packit 534379
        self.assertEqual(list(e2.path), ["foo"])
Packit 534379
        self.assertEqual(len(e2.context), 0)
Packit 534379
Packit 534379
    def test_single_nesting(self):
Packit 534379
        instance = {"foo": 2, "bar": [1], "baz": 15, "quux": "spam"}
Packit 534379
        schema = {
Packit 534379
            "properties": {
Packit 534379
                "foo": {"type": "string"},
Packit 534379
                "bar": {"minItems": 2},
Packit 534379
                "baz": {"maximum": 10, "enum": [2, 4, 6, 8]},
Packit 534379
            }
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = validator.iter_errors(instance)
Packit 534379
        e1, e2, e3, e4 = sorted_errors(errors)
Packit 534379
Packit 534379
        self.assertEqual(list(e1.path), ["bar"])
Packit 534379
        self.assertEqual(list(e2.path), ["baz"])
Packit 534379
        self.assertEqual(list(e3.path), ["baz"])
Packit 534379
        self.assertEqual(list(e4.path), ["foo"])
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "minItems")
Packit 534379
        self.assertEqual(e2.validator, "enum")
Packit 534379
        self.assertEqual(e3.validator, "maximum")
Packit 534379
        self.assertEqual(e4.validator, "type")
Packit 534379
Packit 534379
    def test_multiple_nesting(self):
Packit 534379
        instance = [1, {"foo": 2, "bar": {"baz": [1]}}, "quux"]
Packit 534379
        schema = {
Packit 534379
            "type": "string",
Packit 534379
            "items": {
Packit 534379
                "type": ["string", "object"],
Packit 534379
                "properties": {
Packit 534379
                    "foo": {"enum": [1, 3]},
Packit 534379
                    "bar": {
Packit 534379
                        "type": "array",
Packit 534379
                        "properties": {
Packit 534379
                            "bar": {"required": True},
Packit 534379
                            "baz": {"minItems": 2},
Packit 534379
                        }
Packit 534379
                    }
Packit 534379
                }
Packit 534379
            }
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = validator.iter_errors(instance)
Packit 534379
        e1, e2, e3, e4, e5, e6 = sorted_errors(errors)
Packit 534379
Packit 534379
        self.assertEqual(list(e1.path), [])
Packit 534379
        self.assertEqual(list(e2.path), [0])
Packit 534379
        self.assertEqual(list(e3.path), [1, "bar"])
Packit 534379
        self.assertEqual(list(e4.path), [1, "bar", "bar"])
Packit 534379
        self.assertEqual(list(e5.path), [1, "bar", "baz"])
Packit 534379
        self.assertEqual(list(e6.path), [1, "foo"])
Packit 534379
Packit 534379
        self.assertEqual(list(e1.schema_path), ["type"])
Packit 534379
        self.assertEqual(list(e2.schema_path), ["items", "type"])
Packit 534379
        self.assertEqual(
Packit 534379
            list(e3.schema_path), ["items", "properties", "bar", "type"],
Packit 534379
        )
Packit 534379
        self.assertEqual(
Packit 534379
            list(e4.schema_path),
Packit 534379
            ["items", "properties", "bar", "properties", "bar", "required"],
Packit 534379
        )
Packit 534379
        self.assertEqual(
Packit 534379
            list(e5.schema_path),
Packit 534379
            ["items", "properties", "bar", "properties", "baz", "minItems"]
Packit 534379
        )
Packit 534379
        self.assertEqual(
Packit 534379
            list(e6.schema_path), ["items", "properties", "foo", "enum"],
Packit 534379
        )
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "type")
Packit 534379
        self.assertEqual(e2.validator, "type")
Packit 534379
        self.assertEqual(e3.validator, "type")
Packit 534379
        self.assertEqual(e4.validator, "required")
Packit 534379
        self.assertEqual(e5.validator, "minItems")
Packit 534379
        self.assertEqual(e6.validator, "enum")
Packit 534379
Packit 534379
    def test_additionalProperties(self):
Packit 534379
        instance = {"bar": "bar", "foo": 2}
Packit 534379
        schema = {
Packit 534379
            "additionalProperties": {"type": "integer", "minimum": 5}
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = validator.iter_errors(instance)
Packit 534379
        e1, e2 = sorted_errors(errors)
Packit 534379
Packit 534379
        self.assertEqual(list(e1.path), ["bar"])
Packit 534379
        self.assertEqual(list(e2.path), ["foo"])
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "type")
Packit 534379
        self.assertEqual(e2.validator, "minimum")
Packit 534379
Packit 534379
    def test_patternProperties(self):
Packit 534379
        instance = {"bar": 1, "foo": 2}
Packit 534379
        schema = {
Packit 534379
            "patternProperties": {
Packit 534379
                "bar": {"type": "string"},
Packit 534379
                "foo": {"minimum": 5}
Packit 534379
            }
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = validator.iter_errors(instance)
Packit 534379
        e1, e2 = sorted_errors(errors)
Packit 534379
Packit 534379
        self.assertEqual(list(e1.path), ["bar"])
Packit 534379
        self.assertEqual(list(e2.path), ["foo"])
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "type")
Packit 534379
        self.assertEqual(e2.validator, "minimum")
Packit 534379
Packit 534379
    def test_additionalItems(self):
Packit 534379
        instance = ["foo", 1]
Packit 534379
        schema = {
Packit 534379
            "items": [],
Packit 534379
            "additionalItems": {"type": "integer", "minimum": 5}
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = validator.iter_errors(instance)
Packit 534379
        e1, e2 = sorted_errors(errors)
Packit 534379
Packit 534379
        self.assertEqual(list(e1.path), [0])
Packit 534379
        self.assertEqual(list(e2.path), [1])
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "type")
Packit 534379
        self.assertEqual(e2.validator, "minimum")
Packit 534379
Packit 534379
    def test_additionalItems_with_items(self):
Packit 534379
        instance = ["foo", "bar", 1]
Packit 534379
        schema = {
Packit 534379
            "items": [{}],
Packit 534379
            "additionalItems": {"type": "integer", "minimum": 5}
Packit 534379
        }
Packit 534379
Packit 534379
        validator = Draft3Validator(schema)
Packit 534379
        errors = validator.iter_errors(instance)
Packit 534379
        e1, e2 = sorted_errors(errors)
Packit 534379
Packit 534379
        self.assertEqual(list(e1.path), [1])
Packit 534379
        self.assertEqual(list(e2.path), [2])
Packit 534379
Packit 534379
        self.assertEqual(e1.validator, "type")
Packit 534379
        self.assertEqual(e2.validator, "minimum")
Packit 534379
Packit 534379
Packit 534379
class ValidatorTestMixin(object):
Packit 534379
    def setUp(self):
Packit 534379
        self.instance = mock.Mock()
Packit 534379
        self.schema = {}
Packit 534379
        self.resolver = mock.Mock()
Packit 534379
        self.validator = self.validator_class(self.schema)
Packit 534379
Packit 534379
    def test_valid_instances_are_valid(self):
Packit 534379
        errors = iter([])
Packit 534379
Packit 534379
        with mock.patch.object(
Packit 534379
            self.validator, "iter_errors", return_value=errors,
Packit 534379
        ):
Packit 534379
            self.assertTrue(
Packit 534379
                self.validator.is_valid(self.instance, self.schema)
Packit 534379
            )
Packit 534379
Packit 534379
    def test_invalid_instances_are_not_valid(self):
Packit 534379
        errors = iter([mock.Mock()])
Packit 534379
Packit 534379
        with mock.patch.object(
Packit 534379
            self.validator, "iter_errors", return_value=errors,
Packit 534379
        ):
Packit 534379
            self.assertFalse(
Packit 534379
                self.validator.is_valid(self.instance, self.schema)
Packit 534379
            )
Packit 534379
Packit 534379
    def test_non_existent_properties_are_ignored(self):
Packit 534379
        instance, my_property, my_value = mock.Mock(), mock.Mock(), mock.Mock()
Packit 534379
        validate(instance=instance, schema={my_property: my_value})
Packit 534379
Packit 534379
    def test_it_creates_a_ref_resolver_if_not_provided(self):
Packit 534379
        self.assertIsInstance(self.validator.resolver, RefResolver)
Packit 534379
Packit 534379
    def test_it_delegates_to_a_ref_resolver(self):
Packit 534379
        resolver = RefResolver("", {})
Packit 534379
        schema = {"$ref": mock.Mock()}
Packit 534379
Packit 534379
        @contextlib.contextmanager
Packit 534379
        def resolving():
Packit 534379
            yield {"type": "integer"}
Packit 534379
Packit 534379
        with mock.patch.object(resolver, "resolving") as resolve:
Packit 534379
            resolve.return_value = resolving()
Packit 534379
            with self.assertRaises(ValidationError):
Packit 534379
                self.validator_class(schema, resolver=resolver).validate(None)
Packit 534379
Packit 534379
        resolve.assert_called_once_with(schema["$ref"])
Packit 534379
Packit 534379
    def test_is_type_is_true_for_valid_type(self):
Packit 534379
        self.assertTrue(self.validator.is_type("foo", "string"))
Packit 534379
Packit 534379
    def test_is_type_is_false_for_invalid_type(self):
Packit 534379
        self.assertFalse(self.validator.is_type("foo", "array"))
Packit 534379
Packit 534379
    def test_is_type_evades_bool_inheriting_from_int(self):
Packit 534379
        self.assertFalse(self.validator.is_type(True, "integer"))
Packit 534379
        self.assertFalse(self.validator.is_type(True, "number"))
Packit 534379
Packit 534379
    def test_is_type_raises_exception_for_unknown_type(self):
Packit 534379
        with self.assertRaises(UnknownType):
Packit 534379
            self.validator.is_type("foo", object())
Packit 534379
Packit 534379
Packit 534379
class TestDraft3Validator(ValidatorTestMixin, unittest.TestCase):
Packit 534379
    validator_class = Draft3Validator
Packit 534379
Packit 534379
    def test_is_type_is_true_for_any_type(self):
Packit 534379
        self.assertTrue(self.validator.is_valid(mock.Mock(), {"type": "any"}))
Packit 534379
Packit 534379
    def test_is_type_does_not_evade_bool_if_it_is_being_tested(self):
Packit 534379
        self.assertTrue(self.validator.is_type(True, "boolean"))
Packit 534379
        self.assertTrue(self.validator.is_valid(True, {"type": "any"}))
Packit 534379
Packit 534379
    def test_non_string_custom_types(self):
Packit 534379
        schema = {'type': [None]}
Packit 534379
        cls = self.validator_class(schema, types={None: type(None)})
Packit 534379
        cls.validate(None, schema)
Packit 534379
Packit 534379
Packit 534379
class TestDraft4Validator(ValidatorTestMixin, unittest.TestCase):
Packit 534379
    validator_class = Draft4Validator
Packit 534379
Packit 534379
Packit 534379
class TestBuiltinFormats(unittest.TestCase):
Packit 534379
    """
Packit 534379
    The built-in (specification-defined) formats do not raise type errors.
Packit 534379
Packit 534379
    If an instance or value is not a string, it should be ignored.
Packit 534379
Packit 534379
    """
Packit 534379
Packit 534379
Packit 534379
for format in FormatChecker.checkers:
Packit 534379
    def test(self, format=format):
Packit 534379
        v = Draft4Validator({"format": format}, format_checker=FormatChecker())
Packit 534379
        v.validate(123)
Packit 534379
Packit 534379
    name = "test_{0}_ignores_non_strings".format(format)
Packit 534379
    if not PY3:
Packit 534379
        name = name.encode("utf-8")
Packit 534379
    test.__name__ = name
Packit 534379
    setattr(TestBuiltinFormats, name, test)
Packit 534379
    del test  # Ugh py.test. Stop discovering top level tests.
Packit 534379
Packit 534379
Packit 534379
class TestValidatorFor(unittest.TestCase):
Packit 534379
    def test_draft_3(self):
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-03/schema"}
Packit 534379
        self.assertIs(validator_for(schema), Draft3Validator)
Packit 534379
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-03/schema#"}
Packit 534379
        self.assertIs(validator_for(schema), Draft3Validator)
Packit 534379
Packit 534379
    def test_draft_4(self):
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-04/schema"}
Packit 534379
        self.assertIs(validator_for(schema), Draft4Validator)
Packit 534379
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
Packit 534379
        self.assertIs(validator_for(schema), Draft4Validator)
Packit 534379
Packit 534379
    def test_custom_validator(self):
Packit 534379
        Validator = create(meta_schema={"id": "meta schema id"}, version="12")
Packit 534379
        schema = {"$schema": "meta schema id"}
Packit 534379
        self.assertIs(validator_for(schema), Validator)
Packit 534379
Packit 534379
    def test_validator_for_jsonschema_default(self):
Packit 534379
        self.assertIs(validator_for({}), Draft4Validator)
Packit 534379
Packit 534379
    def test_validator_for_custom_default(self):
Packit 534379
        self.assertIs(validator_for({}, default=None), None)
Packit 534379
Packit 534379
Packit 534379
class TestValidate(unittest.TestCase):
Packit 534379
    def test_draft3_validator_is_chosen(self):
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-03/schema#"}
Packit 534379
        with mock.patch.object(Draft3Validator, "check_schema") as chk_schema:
Packit 534379
            validate({}, schema)
Packit 534379
            chk_schema.assert_called_once_with(schema)
Packit 534379
        # Make sure it works without the empty fragment
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-03/schema"}
Packit 534379
        with mock.patch.object(Draft3Validator, "check_schema") as chk_schema:
Packit 534379
            validate({}, schema)
Packit 534379
            chk_schema.assert_called_once_with(schema)
Packit 534379
Packit 534379
    def test_draft4_validator_is_chosen(self):
Packit 534379
        schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
Packit 534379
        with mock.patch.object(Draft4Validator, "check_schema") as chk_schema:
Packit 534379
            validate({}, schema)
Packit 534379
            chk_schema.assert_called_once_with(schema)
Packit 534379
Packit 534379
    def test_draft4_validator_is_the_default(self):
Packit 534379
        with mock.patch.object(Draft4Validator, "check_schema") as chk_schema:
Packit 534379
            validate({}, {})
Packit 534379
            chk_schema.assert_called_once_with({})
Packit 534379
Packit 534379
Packit 534379
class TestRefResolver(unittest.TestCase):
Packit 534379
Packit 534379
    base_uri = ""
Packit 534379
    stored_uri = "foo://stored"
Packit 534379
    stored_schema = {"stored": "schema"}
Packit 534379
Packit 534379
    def setUp(self):
Packit 534379
        self.referrer = {}
Packit 534379
        self.store = {self.stored_uri: self.stored_schema}
Packit 534379
        self.resolver = RefResolver(self.base_uri, self.referrer, self.store)
Packit 534379
Packit 534379
    def test_it_does_not_retrieve_schema_urls_from_the_network(self):
Packit 534379
        ref = Draft3Validator.META_SCHEMA["id"]
Packit 534379
        with mock.patch.object(self.resolver, "resolve_remote") as remote:
Packit 534379
            with self.resolver.resolving(ref) as resolved:
Packit 534379
                self.assertEqual(resolved, Draft3Validator.META_SCHEMA)
Packit 534379
        self.assertFalse(remote.called)
Packit 534379
Packit 534379
    def test_it_resolves_local_refs(self):
Packit 534379
        ref = "#/properties/foo"
Packit 534379
        self.referrer["properties"] = {"foo": object()}
Packit 534379
        with self.resolver.resolving(ref) as resolved:
Packit 534379
            self.assertEqual(resolved, self.referrer["properties"]["foo"])
Packit 534379
Packit 534379
    def test_it_resolves_local_refs_with_id(self):
Packit 534379
        schema = {"id": "foo://bar/schema#", "a": {"foo": "bar"}}
Packit 534379
        resolver = RefResolver.from_schema(schema)
Packit 534379
        with resolver.resolving("#/a") as resolved:
Packit 534379
            self.assertEqual(resolved, schema["a"])
Packit 534379
        with resolver.resolving("foo://bar/schema#/a") as resolved:
Packit 534379
            self.assertEqual(resolved, schema["a"])
Packit 534379
Packit 534379
    def test_it_retrieves_stored_refs(self):
Packit 534379
        with self.resolver.resolving(self.stored_uri) as resolved:
Packit 534379
            self.assertIs(resolved, self.stored_schema)
Packit 534379
Packit 534379
        self.resolver.store["cached_ref"] = {"foo": 12}
Packit 534379
        with self.resolver.resolving("cached_ref#/foo") as resolved:
Packit 534379
            self.assertEqual(resolved, 12)
Packit 534379
Packit 534379
    def test_it_retrieves_unstored_refs_via_requests(self):
Packit 534379
        ref = "http://bar#baz"
Packit 534379
        schema = {"baz": 12}
Packit 534379
Packit 534379
        with mock.patch("jsonschema.validators.requests") as requests:
Packit 534379
            requests.get.return_value.json.return_value = schema
Packit 534379
            with self.resolver.resolving(ref) as resolved:
Packit 534379
                self.assertEqual(resolved, 12)
Packit 534379
        requests.get.assert_called_once_with("http://bar")
Packit 534379
Packit 534379
    def test_it_retrieves_unstored_refs_via_urlopen(self):
Packit 534379
        ref = "http://bar#baz"
Packit 534379
        schema = {"baz": 12}
Packit 534379
Packit 534379
        with mock.patch("jsonschema.validators.requests", None):
Packit 534379
            with mock.patch("jsonschema.validators.urlopen") as urlopen:
Packit 534379
                urlopen.return_value.read.return_value = (
Packit 534379
                    json.dumps(schema).encode("utf8"))
Packit 534379
                with self.resolver.resolving(ref) as resolved:
Packit 534379
                    self.assertEqual(resolved, 12)
Packit 534379
        urlopen.assert_called_once_with("http://bar")
Packit 534379
Packit 534379
    def test_it_can_construct_a_base_uri_from_a_schema(self):
Packit 534379
        schema = {"id": "foo"}
Packit 534379
        resolver = RefResolver.from_schema(schema)
Packit 534379
        self.assertEqual(resolver.base_uri, "foo")
Packit 534379
        with resolver.resolving("") as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
        with resolver.resolving("#") as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
        with resolver.resolving("foo") as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
        with resolver.resolving("foo#") as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
Packit 534379
    def test_it_can_construct_a_base_uri_from_a_schema_without_id(self):
Packit 534379
        schema = {}
Packit 534379
        resolver = RefResolver.from_schema(schema)
Packit 534379
        self.assertEqual(resolver.base_uri, "")
Packit 534379
        with resolver.resolving("") as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
        with resolver.resolving("#") as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
Packit 534379
    def test_custom_uri_scheme_handlers(self):
Packit 534379
        schema = {"foo": "bar"}
Packit 534379
        ref = "foo://bar"
Packit 534379
        foo_handler = mock.Mock(return_value=schema)
Packit 534379
        resolver = RefResolver("", {}, handlers={"foo": foo_handler})
Packit 534379
        with resolver.resolving(ref) as resolved:
Packit 534379
            self.assertEqual(resolved, schema)
Packit 534379
        foo_handler.assert_called_once_with(ref)
Packit 534379
Packit 534379
    def test_cache_remote_on(self):
Packit 534379
        ref = "foo://bar"
Packit 534379
        foo_handler = mock.Mock()
Packit 534379
        resolver = RefResolver(
Packit 534379
            "", {}, cache_remote=True, handlers={"foo": foo_handler},
Packit 534379
        )
Packit 534379
        with resolver.resolving(ref):
Packit 534379
            pass
Packit 534379
        with resolver.resolving(ref):
Packit 534379
            pass
Packit 534379
        foo_handler.assert_called_once_with(ref)
Packit 534379
Packit 534379
    def test_cache_remote_off(self):
Packit 534379
        ref = "foo://bar"
Packit 534379
        foo_handler = mock.Mock()
Packit 534379
        resolver = RefResolver(
Packit 534379
            "", {}, cache_remote=False, handlers={"foo": foo_handler},
Packit 534379
        )
Packit 534379
        with resolver.resolving(ref):
Packit 534379
            pass
Packit 534379
        with resolver.resolving(ref):
Packit 534379
            pass
Packit 534379
        self.assertEqual(foo_handler.call_count, 2)
Packit 534379
Packit 534379
    def test_if_you_give_it_junk_you_get_a_resolution_error(self):
Packit 534379
        ref = "foo://bar"
Packit 534379
        foo_handler = mock.Mock(side_effect=ValueError("Oh no! What's this?"))
Packit 534379
        resolver = RefResolver("", {}, handlers={"foo": foo_handler})
Packit 534379
        with self.assertRaises(RefResolutionError) as err:
Packit 534379
            with resolver.resolving(ref):
Packit 534379
                pass
Packit 534379
        self.assertEqual(str(err.exception), "Oh no! What's this?")
Packit 534379
Packit 534379
Packit 534379
def sorted_errors(errors):
Packit 534379
    def key(error):
Packit 534379
        return (
Packit 534379
            [str(e) for e in error.path],
Packit 534379
            [str(e) for e in error.schema_path]
Packit 534379
        )
Packit 534379
    return sorted(errors, key=key)