3 ]%@sdZddlmZddlmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z yddl m Z Wnek rdZ YnXddlmZmZmZmZmZmZmZmZmZddlmZddlmZmZddlZe jje jj ej!e jj"Z#e j$d e jje#d Z%e jj&e%se'd e jje%d Z(e jje%d dZ)e j*e j+e)dge j,dj-Z.ee. erpej/e.Z.ej0e.Z1WdQRXddZ2ddZ3de(dfddZ4Gddde5Z6Gddde5Z7ddZ8Gddde5Z9e j:d=krd#d$Z;nd%d$Z;e4d&e;d'd(e4d)e8ed*e4d+e4d,Gd-d.d.ejGd6d7d7e5Z?e4d'Gd8d9d9e?ej<Z@e4d0Gd:d;d;e?ej<ZAdS)>z Test runner for the JSON Schema official test suite Tests comprehensive correctness of each draft's validator. See https://github.com/json-schema/JSON-Schema-Test-Suite for details. )closing)DecimalN)pypy_version_info) FormatError SchemaErrorValidationErrorDraft3ValidatorDraft4Validator FormatCheckerdraft3_format_checkerdraft4_format_checkervalidate)PY3)mockunittestZJSON_SCHEMA_TEST_SUITEjsonzCan't find the JSON-Schema-Test-Suite directory. Set the 'JSON_SCHEMA_TEST_SUITE' environment variable or run the tests from alongside a checkout of the suite.testsbinZjsonschema_suiteZremotes)stdoutcs:|rfdd}nfdd}ts0|jd}||_|S)Ncs(t|di}tfd|ji|dS)Nvalidator_kwargscls)getattrr validator_class)selfkwargs)dataschema0/usr/lib/python3.6/test_jsonschema_test_suite.py test_case=s zmake_case..test_casec s>t|di}|jttfd|ji|WdQRXdS)Nrr)r assertRaisesrr r)rr)rrrrrAs  zutf-8)rencode__name__)rrvalidnamerr)rrr make_case;s r%cCs,|dk r(|||}|dk r(tj||}|S)N)rskip)r&rcasetestreasonrrr maybe_skipMs  r*cs(rtjjfdd}|S)Nc sttj}xtjtjjD]}||kr2q$tjjtjj|\}}tj d}t |}xt j |D]}xz|dD]n}d|t |tjdd|df} t||  st| t|d|d|d | d } t| ||} t|| | qxWqjWWdQRXq$W|S) Nrz test_%s_%s_%sz[\W ]+_ descriptionrrr#)rrr#r$)setglobZiglobospathjoinsplitextbasename itertoolscountopenrloadnextresubhasattrAssertionErrorr%r*setattr) Z test_classZignoredfilenameZ validatingr-idZ test_filer'r(r$r)basedir ignore_globr& tests_globrradd_test_methodsYs,  "z)load_json_cases..add_test_methods)r1r2r3)rDrCrBr&rEr)rBrCr&rDrload_json_casesUsrFc@s eZdZejedddZdS) TypesMixinz-In Python 3 json.load always produces unicodecCs|jddijddS)Ntypestringsfoo)rr )rrrr$test_string_a_bytestring_is_a_string{sz/TypesMixin.test_string_a_bytestring_is_a_stringN)r" __module__ __qualname__rZskipIfrrJrrrrrGzsrGc@seZdZddZdS) DecimalMixinc Csddi}|j|dtttfid}x(ddtdtdgD]}|j|q8Wx6digddgD]$}|jt|j|WdQRXqZWdS) NrHZnumber)typesr,g?fooT)rintfloatrr r r)rr validatorr#Zinvalidrrr"test_it_can_validate_with_decimalss z/DecimalMixin.test_it_can_validate_with_decimalsN)r"rKrLrTrrrrrMsrMcsfdd}|S)NcsJ|djd}|jkr"dj|S|dkrFtdk rFtddd krFdSdS) NrformatzFormat checker {0!r} not found.z date-timer, z4datetime.datetime is broken on this version of PyPy.)r,rW)getZcheckersrUr)r'r(rU)checkerrrmissing_formats  z&missing_format..missing_formatr)rYrZr)rYrrZs rZc@s,eZdZddZddZddZddZd S) FormatMixincCs"|jdditd}|jddS)NrUZcarrot)format_checkerZbugs)rr r )rrSrrr7test_it_returns_true_for_formats_it_does_not_know_aboutszCFormatMixin.test_it_returns_true_for_formats_it_does_not_know_aboutcCs|ji}|j|jdS)N)rZ assertIsNoner\)rrSrrr,test_it_does_not_validate_formats_by_defaults z8FormatMixin.test_it_does_not_validate_formats_by_defaultc Cstjtd}|jddi|d}|jd|jjddt}td|d|j_ |j t }|jdWdQRX|j |j j|dS)N)specrUrP)r\Zbaraoeu)cause)rMockr rr checkassert_called_once_with ValueErrorr side_effectr rassertIs exceptionra)rrYrSracmrrr2test_it_validates_formats_if_a_checker_is_provideds   z>FormatMixin.test_it_validates_formats_if_a_checker_is_providedc Cstjtd}|jddi|d}|jdddg|jjdddgdt}td|d |j_ |j t }|jdddgWdQRX|j |j j|dS) N)r_rUrP)r\r,rVr`)ra)rrbr rr rcrdrerrfr rrgrhra)rrYrSrarirrr%test_it_validates_formats_of_any_types  z1FormatMixin.test_it_validates_formats_of_any_typeN)r"rKrLr]r^rjrlrrrrr[sr[rVr,cCsd|dkrdSdS)Nzsupplementary Unicoder.z:Not running surrogate Unicode case, this Python is narrow.r)r'r(rrrnarrow_unicode_builds rncCsdS)Nr)r'r(rrrrnsz draft3/*.jsonzdraft3/refRemote.json)r&rCzdraft3/optional/format.json)r&zdraft3/optional/bignum.jsonz)draft3/optional/zeroTerminatedFloats.jsonc@s0eZdZeZdeiZddZddZddZ dS) TestDraft3r\cCs |jddi}|jtjdS)NrHany)rr rrb)rrSrrr#test_any_type_is_valid_for_type_anysz.TestDraft3.test_any_type_is_valid_for_type_anyc Cs2|jttidddii|jdWdQRXdS)N propertiesr(T)r)r rr r)rrrrtest_invalid_propertiess z"TestDraft3.test_invalid_propertiesc Cs0|jttdgddi|jdWdQRXdS)Nr,minItems1)r)r rr r)rrrrtest_minItems_invalid_strings z'TestDraft3.test_minItems_invalid_stringN) r"rKrLrrr rrqrsrvrrrrros  roz draft4/*.jsonzdraft4/refRemote.jsonzdraft4/optional/format.jsonzdraft4/optional/bignum.jsonz)draft4/optional/zeroTerminatedFloats.jsonc@s(eZdZeZdeiZddZddZdS) TestDraft4r\c Cs2|jttidddii|jdWdQRXdS)Nrrr(T)r)r rr r)rrrrrss z"TestDraft4.test_invalid_propertiesc Cs0|jttdgddi|jdWdQRXdS)Nr,rtru)r)r rr r)rrrrrv s z'TestDraft4.test_minItems_invalid_stringN) r"rKrLr rr rrsrvrrrrrws rwc@seZdZddZddZdS)RemoteRefResolutionMixincCs,tjd}|j}|j|j_|j|jdS)Nzjsonschema.validators.requests)rpatchstartresolverXrfZ addCleanupstop)rryZrequestsrrrsetUps  zRemoteRefResolutionMixin.setUpcCs&|jd\}}}tjfdtj|iS)Nzhttp://localhost:1234/zjson.return_value) partitionrrbREMOTESrX)rZ referencer-rrrr{sz RemoteRefResolutionMixin.resolveN)r"rKrLr}r{rrrrrxsrxc@seZdZeZdS)Draft3RemoteResolutionN)r"rKrLrrrrrrrsrc@seZdZeZdS)Draft4RemoteResolutionN)r"rKrLr rrrrrr srii)B__doc__ contextlibrZdecimalrr0rior6r1r; subprocesssysr ImportErrorZ jsonschemarrrrr r r r r Zjsonschema.compatrZjsonschema.tests.compatrrr2r3dirname__file__pardirZ REPO_ROOTgetenvZSUITEisdirreZ TESTS_DIRZJSONSCHEMA_SUITEPopen executablePIPErZremotes_stdout TextIOWrapperr9rr%r*rFobjectrGrMrZr[ maxunicodernZTestCaserorwrxrrrrrrs   ,   %0