ansible-later/testenv/lib/python2.7/site-packages/jsonschema/tests/test_jsonschema_test_suite.py
2019-04-23 13:04:27 +02:00

203 lines
6.1 KiB
Python

"""
Test runner for the JSON Schema official test suite
Tests comprehensive correctness of each draft's validator.
See https://github.com/json-schema-org/JSON-Schema-Test-Suite for details.
"""
import sys
import warnings
from jsonschema import (
Draft3Validator,
Draft4Validator,
Draft6Validator,
Draft7Validator,
draft3_format_checker,
draft4_format_checker,
draft6_format_checker,
draft7_format_checker,
)
from jsonschema.tests._suite import Suite
from jsonschema.validators import _DEPRECATED_DEFAULT_TYPES, create
SUITE = Suite()
DRAFT3 = SUITE.version(name="draft3")
DRAFT4 = SUITE.version(name="draft4")
DRAFT6 = SUITE.version(name="draft6")
DRAFT7 = SUITE.version(name="draft7")
def skip_tests_containing_descriptions(**kwargs):
def skipper(test):
descriptions_and_reasons = kwargs.get(test.subject, {})
return next(
(
reason
for description, reason in descriptions_and_reasons.items()
if description in test.description
),
None,
)
return skipper
def missing_format(checker):
def missing_format(test):
schema = test.schema
if schema is True or schema is False or "format" not in schema:
return
if schema["format"] not in checker.checkers:
return "Format checker {0!r} not found.".format(schema["format"])
return missing_format
is_narrow_build = sys.maxunicode == 2 ** 16 - 1
if is_narrow_build: # pragma: no cover
narrow_unicode_build = skip_tests_containing_descriptions(
maxLength={
"supplementary Unicode":
"Not running surrogate Unicode case, this Python is narrow.",
},
minLength={
"supplementary Unicode":
"Not running surrogate Unicode case, this Python is narrow.",
},
)
else:
def narrow_unicode_build(test): # pragma: no cover
return
TestDraft3 = DRAFT3.to_unittest_testcase(
DRAFT3.tests(),
DRAFT3.optional_tests_of(name="format"),
DRAFT3.optional_tests_of(name="bignum"),
DRAFT3.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft3Validator,
format_checker=draft3_format_checker,
skip=lambda test: (
narrow_unicode_build(test) or
missing_format(draft3_format_checker)(test) or
skip_tests_containing_descriptions(
format={
"case-insensitive T and Z": "Upstream bug in strict_rfc3339",
},
)(test)
),
)
TestDraft4 = DRAFT4.to_unittest_testcase(
DRAFT4.tests(),
DRAFT4.optional_tests_of(name="format"),
DRAFT4.optional_tests_of(name="bignum"),
DRAFT4.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft4Validator,
format_checker=draft4_format_checker,
skip=lambda test: (
narrow_unicode_build(test) or
missing_format(draft4_format_checker)(test) or
skip_tests_containing_descriptions(
format={
"case-insensitive T and Z": "Upstream bug in strict_rfc3339",
},
ref={
"valid tree": "An actual bug, this needs fixing.",
},
refRemote={
"number is valid": "An actual bug, this needs fixing.",
"string is invalid": "An actual bug, this needs fixing.",
},
)(test)
),
)
TestDraft6 = DRAFT6.to_unittest_testcase(
DRAFT6.tests(),
DRAFT6.optional_tests_of(name="format"),
DRAFT6.optional_tests_of(name="bignum"),
DRAFT6.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft6Validator,
format_checker=draft6_format_checker,
skip=lambda test: (
narrow_unicode_build(test) or
missing_format(draft6_format_checker)(test) or
skip_tests_containing_descriptions(
format={
"case-insensitive T and Z": "Upstream bug in strict_rfc3339",
},
ref={
"valid tree": "An actual bug, this needs fixing.",
},
refRemote={
"number is valid": "An actual bug, this needs fixing.",
"string is invalid": "An actual bug, this needs fixing.",
},
)(test)
),
)
TestDraft7 = DRAFT7.to_unittest_testcase(
DRAFT7.tests(),
DRAFT7.format_tests(),
DRAFT7.optional_tests_of(name="bignum"),
DRAFT7.optional_tests_of(name="zeroTerminatedFloats"),
Validator=Draft7Validator,
format_checker=draft7_format_checker,
skip=lambda test: (
narrow_unicode_build(test)
or missing_format(draft7_format_checker)(test)
or skip_tests_containing_descriptions(
ref={
"valid tree": "An actual bug, this needs fixing.",
},
refRemote={
"number is valid": "An actual bug, this needs fixing.",
"string is invalid": "An actual bug, this needs fixing.",
},
)(test)
or skip_tests_containing_descriptions(
**{
"date-time": {
"case-insensitive T and Z":
"Upstream bug in strict_rfc3339",
},
}
)(test)
),
)
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
TestDraft3LegacyTypeCheck = DRAFT3.to_unittest_testcase(
# Interestingly the any part couldn't really be done w/the old API.
(
(test for test in each if test.schema != {"type": "any"})
for each in DRAFT3.tests_of(name="type")
),
name="TestDraft3LegacyTypeCheck",
Validator=create(
meta_schema=Draft3Validator.META_SCHEMA,
validators=Draft3Validator.VALIDATORS,
default_types=_DEPRECATED_DEFAULT_TYPES,
),
)
TestDraft4LegacyTypeCheck = DRAFT4.to_unittest_testcase(
DRAFT4.tests_of(name="type"),
name="TestDraft4LegacyTypeCheck",
Validator=create(
meta_schema=Draft4Validator.META_SCHEMA,
validators=Draft4Validator.VALIDATORS,
default_types=_DEPRECATED_DEFAULT_TYPES,
),
)