codekingpro/portable-devtools
114k
1"""2Test runner for the JSON Schema official test suite3 4Tests comprehensive correctness of each draft's validator.5 6See https://github.com/json-schema-org/JSON-Schema-Test-Suite for details.7"""8 9 10from jsonschema.tests._suite import Suite11import jsonschema12 13SUITE = Suite()14DRAFT3 = SUITE.version(name="draft3")15DRAFT4 = SUITE.version(name="draft4")16DRAFT6 = SUITE.version(name="draft6")17DRAFT7 = SUITE.version(name="draft7")18DRAFT201909 = SUITE.version(name="draft2019-09")19DRAFT202012 = SUITE.version(name="draft2020-12")20 21 22def skip(message, **kwargs):23 def skipper(test):24 if all(value == getattr(test, attr) for attr, value in kwargs.items()):25 return message26 return skipper27 28 29def ecmascript_regex(test):30 if test.subject == "ecmascript-regex":31 return "ECMA regex support will be added in #1142."32 33 34def missing_format(Validator):35 def missing_format(test): # pragma: no cover36 schema = test.schema37 if (38 schema is True39 or schema is False40 or "format" not in schema41 or schema["format"] in Validator.FORMAT_CHECKER.checkers42 or test.valid43 ):44 return45 46 return f"Format checker {schema['format']!r} not found."47 return missing_format48 49 50def complex_email_validation(test):51 if test.subject != "email":52 return53 54 message = "Complex email validation is (intentionally) unsupported."55 return skip(56 message=message,57 description="an invalid domain",58 )(test) or skip(59 message=message,60 description="an invalid IPv4-address-literal",61 )(test) or skip(62 message=message,63 description="dot after local part is not valid",64 )(test) or skip(65 message=message,66 description="dot before local part is not valid",67 )(test) or skip(68 message=message,69 description="two subsequent dots inside local part are not valid",70 )(test)71 72 73def leap_second(test):74 message = "Leap seconds are unsupported."75 return skip(76 message=message,77 subject="time",78 description="a valid time string with leap second",79 )(test) or skip(80 message=message,81 subject="time",82 description="a valid time string with leap second, Zulu",83 )(test) or skip(84 message=message,85 subject="time",86 description="a valid time string with leap second with offset",87 )(test) or skip(88 message=message,89 subject="time",90 description="valid leap second, positive time-offset",91 )(test) or skip(92 message=message,93 subject="time",94 description="valid leap second, negative time-offset",95 )(test) or skip(96 message=message,97 subject="time",98 description="valid leap second, large positive time-offset",99 )(test) or skip(100 message=message,101 subject="time",102 description="valid leap second, large negative time-offset",103 )(test) or skip(104 message=message,105 subject="time",106 description="valid leap second, zero time-offset",107 )(test) or skip(108 message=message,109 subject="date-time",110 description="a valid date-time with a leap second, UTC",111 )(test) or skip(112 message=message,113 subject="date-time",114 description="a valid date-time with a leap second, with minus offset",115 )(test)116 117 118TestDraft3 = DRAFT3.to_unittest_testcase(119 DRAFT3.cases(),120 DRAFT3.format_cases(),121 DRAFT3.optional_cases_of(name="bignum"),122 DRAFT3.optional_cases_of(name="non-bmp-regex"),123 DRAFT3.optional_cases_of(name="zeroTerminatedFloats"),124 Validator=jsonschema.Draft3Validator,125 format_checker=jsonschema.Draft3Validator.FORMAT_CHECKER,126 skip=lambda test: (127 ecmascript_regex(test)128 or missing_format(jsonschema.Draft3Validator)(test)129 or complex_email_validation(test)130 ),131)132 133 134TestDraft4 = DRAFT4.to_unittest_testcase(135 DRAFT4.cases(),136 DRAFT4.format_cases(),137 DRAFT4.optional_cases_of(name="bignum"),138 DRAFT4.optional_cases_of(name="float-overflow"),139 DRAFT4.optional_cases_of(name="id"),140 DRAFT4.optional_cases_of(name="non-bmp-regex"),141 DRAFT4.optional_cases_of(name="zeroTerminatedFloats"),142 Validator=jsonschema.Draft4Validator,143 format_checker=jsonschema.Draft4Validator.FORMAT_CHECKER,144 skip=lambda test: (145 ecmascript_regex(test)146 or leap_second(test)147 or missing_format(jsonschema.Draft4Validator)(test)148 or complex_email_validation(test)149 ),150)151 152 153TestDraft6 = DRAFT6.to_unittest_testcase(154 DRAFT6.cases(),155 DRAFT6.format_cases(),156 DRAFT6.optional_cases_of(name="bignum"),157 DRAFT6.optional_cases_of(name="float-overflow"),158 DRAFT6.optional_cases_of(name="id"),159 DRAFT6.optional_cases_of(name="non-bmp-regex"),160 Validator=jsonschema.Draft6Validator,161 format_checker=jsonschema.Draft6Validator.FORMAT_CHECKER,162 skip=lambda test: (163 ecmascript_regex(test)164 or leap_second(test)165 or missing_format(jsonschema.Draft6Validator)(test)166 or complex_email_validation(test)167 ),168)169 170 171TestDraft7 = DRAFT7.to_unittest_testcase(172 DRAFT7.cases(),173 DRAFT7.format_cases(),174 DRAFT7.optional_cases_of(name="bignum"),175 DRAFT7.optional_cases_of(name="cross-draft"),176 DRAFT7.optional_cases_of(name="float-overflow"),177 DRAFT6.optional_cases_of(name="id"),178 DRAFT7.optional_cases_of(name="non-bmp-regex"),179 DRAFT7.optional_cases_of(name="unknownKeyword"),180 Validator=jsonschema.Draft7Validator,181 format_checker=jsonschema.Draft7Validator.FORMAT_CHECKER,182 skip=lambda test: (183 ecmascript_regex(test)184 or leap_second(test)185 or missing_format(jsonschema.Draft7Validator)(test)186 or complex_email_validation(test)187 ),188)189 190 191TestDraft201909 = DRAFT201909.to_unittest_testcase(192 DRAFT201909.cases(),193 DRAFT201909.optional_cases_of(name="anchor"),194 DRAFT201909.optional_cases_of(name="bignum"),195 DRAFT201909.optional_cases_of(name="cross-draft"),196 DRAFT201909.optional_cases_of(name="float-overflow"),197 DRAFT201909.optional_cases_of(name="id"),198 DRAFT201909.optional_cases_of(name="no-schema"),199 DRAFT201909.optional_cases_of(name="non-bmp-regex"),200 DRAFT201909.optional_cases_of(name="refOfUnknownKeyword"),201 DRAFT201909.optional_cases_of(name="unknownKeyword"),202 Validator=jsonschema.Draft201909Validator,203 skip=skip(204 message="Vocabulary support is still in-progress.",205 subject="vocabulary",206 description=(207 "no validation: invalid number, but it still validates"208 ),209 ),210)211 212 213TestDraft201909Format = DRAFT201909.to_unittest_testcase(214 DRAFT201909.format_cases(),215 name="TestDraft201909Format",216 Validator=jsonschema.Draft201909Validator,217 format_checker=jsonschema.Draft201909Validator.FORMAT_CHECKER,218 skip=lambda test: (219 complex_email_validation(test)220 or ecmascript_regex(test)221 or leap_second(test)222 or missing_format(jsonschema.Draft201909Validator)(test)223 or complex_email_validation(test)224 ),225)226 227 228TestDraft202012 = DRAFT202012.to_unittest_testcase(229 DRAFT202012.cases(),230 DRAFT201909.optional_cases_of(name="anchor"),231 DRAFT202012.optional_cases_of(name="bignum"),232 DRAFT202012.optional_cases_of(name="cross-draft"),233 DRAFT202012.optional_cases_of(name="float-overflow"),234 DRAFT202012.optional_cases_of(name="id"),235 DRAFT202012.optional_cases_of(name="no-schema"),236 DRAFT202012.optional_cases_of(name="non-bmp-regex"),237 DRAFT202012.optional_cases_of(name="refOfUnknownKeyword"),238 DRAFT202012.optional_cases_of(name="unknownKeyword"),239 Validator=jsonschema.Draft202012Validator,240 skip=skip(241 message="Vocabulary support is still in-progress.",242 subject="vocabulary",243 description=(244 "no validation: invalid number, but it still validates"245 ),246 ),247)248 249 250TestDraft202012Format = DRAFT202012.to_unittest_testcase(251 DRAFT202012.format_cases(),252 name="TestDraft202012Format",253 Validator=jsonschema.Draft202012Validator,254 format_checker=jsonschema.Draft202012Validator.FORMAT_CHECKER,255 skip=lambda test: (256 complex_email_validation(test)257 or ecmascript_regex(test)258 or leap_second(test)259 or missing_format(jsonschema.Draft202012Validator)(test)260 or complex_email_validation(test)261 ),262)263 