
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
=X                 @   s  d dl mZ d dlmZ d dlZd dlmZmZ d dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZmZ G dd de
jZG d	d
 d
e
jZG dd de
jZG dd de
jZG dd deZG dd dee
jZG dd dee
jZG dd de
jZx:ejD ]0Z e fddZ!dj e Z"e"e!_#e$ee"e! [!qW G dd de
jZ%G dd de
jZ&G dd de
jZ'G d d! d!eZ(G d"d# d#e(e
jZ)G d$d% d%e(e
jZ*d&d' Z+dS )(    )deque)contextmanagerN)FormatCheckerValidationError)mockunittest)	RefResolutionErrorUnknownTypeDraft3ValidatorDraft4ValidatorRefResolvercreateextendvalidator_forvalidatec               @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestCreateAndExtendc             C   sh   ddi ii| _ tj | _d| ji| _dti| _t| j | j| jd| _d| _	d| j	i| _
| j| j
| _d S )N
propertiessmellydict)meta_schema
validatorsZdefault_types   )r   r   Z	MagicMockr   r   r   typesr   	Validatorvalidator_valueschema	validator)self r   %/usr/lib/python3.6/test_validators.pysetUp   s    

zTestCreateAndExtend.setUpc             C   s:   | j | jj| j | j | jj| j | j | jj| j d S )N)assertEqualr   
VALIDATORSr   META_SCHEMAr   DEFAULT_TYPESr   )r   r   r   r   
test_attrs   s    zTestCreateAndExtend.test_attrsc             C   s   | j | jj| j d S )N)r!   r   r   )r   r   r   r   	test_init"   s    zTestCreateAndExtend.test_initc             C   sl   d}g | j _| jt| jj|g  tj }|g| j _| jt| jj||g | j j| j| j	|| j
 d S )NZhello)r   return_valuer!   listr   iter_errorsr   MockZassert_called_withr   r   )r   instanceerrorr   r   r   test_iter_errors%   s    
z$TestCreateAndExtend.test_iter_errorsc             C   sL   t jd }dd |_tddidd}W d Q R X |jd | j|jd d S )	Nzjsonschema.validators.validatesc             S   s   dd S )Nc             S   s   | S )Nr   )clsr   r   r   <lambda>5   s    zfTestCreateAndExtend.test_if_a_version_is_provided_it_is_registered.<locals>.<lambda>.<locals>.<lambda>r   )versionr   r   r   r/   5   s    zTTestCreateAndExtend.test_if_a_version_is_provided_it_is_registered.<locals>.<lambda>id z
my version)r   r0   ZMyVersionValidator)r   patchside_effectr   assert_called_once_withr!   __name__)r   	validatesr   r   r   r   .test_if_a_version_is_provided_it_is_registered3   s
    

zBTestCreateAndExtend.test_if_a_version_is_provided_it_is_registeredc          
   C   s4   t jd}tddid W d Q R X | j|j d S )Nzjsonschema.validators.validatesr1   )r   )r   r3   r   assertFalsecalled)r   r7   r   r   r   6test_if_a_version_is_not_provided_it_is_not_registered:   s    zJTestCreateAndExtend.test_if_a_version_is_not_provided_it_is_not_registeredc             C   s|   t | jj}tj }t| jd|id}|jd|fg | j|j| | jd| jj | j|j	| jj	 | j|j
| jj
 d S )Nz	a new one)r   )r   r   r"   r   r*   r   updater!   ZassertNotInr#   r$   )r   r   newZExtendedr   r   r   test_extend?   s    zTestCreateAndExtend.test_extendN)
r6   
__module____qualname__r    r%   r&   r-   r8   r;   r>   r   r   r   r   r      s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )TestIterErrorsc             C   s   t i | _d S )N)r
   r   )r   r   r   r   r    N   s    zTestIterErrors.setUpc             C   sr   ddg}ddddgddd	ggd
d}dd | j j||D }d|d f dd|d f g}| jt|t| d S )N      arrayabcdef   )disallowenumminItemsc             s   s   | ]}|j V  qd S )N)message).0rI   r   r   r   	<genexpr>Y   s    z2TestIterErrors.test_iter_errors.<locals>.<genexpr>z%r is disallowed for [1, 2]rL   z[1, 2] is too shortz[1, 2] is not one of %rrM   )r   r)   r!   sorted)r   r+   r   ZgotZexpectedr   r   r   r-   Q   s    zTestIterErrors.test_iter_errorsc             C   s\   ddgddd}dddid	did
ddddgddi}t | jj||}| jt|d d S )NrC   rB      spam)foobarbazquuxr   typestringrN   
            )maximumrM   )rU   rV   rW   )r(   r   r)   r!   len)r   r+   r   errorsr   r   r   0test_iter_errors_multiple_failures_one_validatora   s    z?TestIterErrors.test_iter_errors_multiple_failures_one_validatorN)r6   r?   r@   r    r-   rb   r   r   r   r   rA   M   s   rA   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) TestValidationErrorMessagesc          
   O   s<   |j dt | jt}t||f|| W d Q R X |jjS )Nr.   )
setdefaultr
   assertRaisesr   r   	exceptionrO   )r   r+   r   argskwargsrI   r   r   r   message_forp   s    z'TestValidationErrorMessages.message_forc             C   s&   | j dddid}| j|dd  d S )NrB   rY   rZ   )r+   r   z1 is not of type %r)ri   r!   )r   rO   r   r   r   test_single_type_failurev   s    z4TestValidationErrorMessages.test_single_type_failurec             C   s(   | j dddgid}| j|dd  d S )NrB   rY   rZ   )r+   r   z1 is not of type %r)ri   r!   )r   rO   r   r   r   test_single_type_list_failurez   s    z9TestValidationErrorMessages.test_single_type_list_failurec             C   s.   d}| j ddt|id}| j|d|  d S )NrZ   objectrB   rY   )r+   r   z1 is not of type %r, %r)rZ   rl   )ri   r(   r!   )r   r   rO   r   r   r   test_multiple_type_failure~   s    z6TestValidationErrorMessages.test_multiple_type_failurec             C   s8   dddigi}| j dd|gid}| j|d|f  d S )NrY   minimumrK   rB   )r+   r   z1 is not of type %r)ri   r!   )r   rY   rO   r   r   r   &test_object_without_title_type_failure   s    zBTestValidationErrorMessages.test_object_without_title_type_failurec             C   s8   d}d|ddgi}| j d|d}| j|d|f  d S )NZFoorY   rK   )namern   rB   )r+   r   z1 is not of type %r)ri   r!   )r   rp   r   rO   r   r   r   "test_object_with_name_type_failure   s    z>TestValidationErrorMessages.test_object_with_name_type_failurec             C   s"   | j dddid}| j|d d S )NrB   rn   rC   )r+   r   z1 is less than the minimum of 2)ri   r!   )r   rO   r   r   r   test_minimum   s    z(TestValidationErrorMessages.test_minimumc             C   s"   | j dddid}| j|d d S )NrB   r_   r   )r+   r   z"1 is greater than the maximum of 0)ri   r!   )r   rO   r   r   r   test_maximum   s    z(TestValidationErrorMessages.test_maximumc             C   s<   d\}}d||ii}| j ddi|}| j|d||f  d S )NrV   rU   ZdependenciesrC   z%r is a dependency of %r)rV   rU   )ri   r!   )r   ZdependZonr   rO   r   r   r   5test_dependencies_failure_has_single_element_not_list   s    zQTestValidationErrorMessages.test_dependencies_failure_has_single_element_not_listc             C   s$   | j dgg dd}| jd| d S )NrC   F)itemsadditionalItemsz(2 was unexpected))ri   assertIn)r   rO   r   r   r   #test_additionalItems_single_failure   s    z?TestValidationErrorMessages.test_additionalItems_single_failurec             C   s(   | j dddgg dd}| jd| d S )NrB   rC   rK   F)ru   rv   z(1, 2, 3 were unexpected))ri   rw   )r   rO   r   r   r   &test_additionalItems_multiple_failures   s    zBTestValidationErrorMessages.test_additionalItems_multiple_failuresc             C   s2   d}ddi}| j |di|}| jd|f | d S )NrU   additionalPropertiesFrC   z(%r was unexpected))ri   rw   )r   Z
additionalr   rO   r   r   r   (test_additionalProperties_single_failure   s    zDTestValidationErrorMessages.test_additionalProperties_single_failurec             C   sN   ddi}| j tjddg|}| jtd| | jtd| | jd| d S )Nrz   FrU   rV   zwere unexpected))ri   r   fromkeysrw   repr)r   r   rO   r   r   r   +test_additionalProperties_multiple_failures   s
    zGTestValidationErrorMessages.test_additionalProperties_multiple_failuresc             C   sl   t f d}tjdd}|jd| ddi}| jd||d}| jtd| | jtd| | jd| d S )	N)ZformatsF)r'   thingformatZbla)format_checkerzis not a)r   r   r*   Zchecksri   rw   r}   )r   ZcheckerZcheck_fnr   rO   r   r   r   #test_invalid_format_default_message   s    
z?TestValidationErrorMessages.test_invalid_format_default_messagec             C   s   ddddiddidd}| j ddi|td	}| j|d
jtdtdtd | j ddd|td	}| j|djtdtdtdtd d S )Nrl   FrY   rZ   )z^abc$z^def$)rY   rz   patternPropertieszebra{   )r.   z,{} does not match any of the regexes: {}, {}z^abc$z^def$i  )r   fishz.{}, {} do not match any of the regexes: {}, {}r   )ri   r   r!   r   r}   )r   r   rO   r   r   r   1test_additionalProperties_false_patternProperties   s     zMTestValidationErrorMessages.test_additionalProperties_false_patternPropertiesN)r6   r?   r@   ri   rj   rk   rm   ro   rq   rr   rs   rt   rx   ry   r{   r~   r   r   r   r   r   r   rc   o   s   rc   c               @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestValidationErrorDetailsc             C   s  d}dddiddigi}t |}t|j|}| jt|d |d }| j|jd | j|j|d  | j|j| | j|j| | j	|j
 | j|jtg  | j|jtg  | j|jtg  | j|jtdg | j|jtdg | j|jtdg | jt|jd	 t|j\}}| j|jd | j|j|d d d  | j|j| | j|j|d d  | j|j
| | j|jtg  | j|jtg  | j|jtg  | j|jtddg | j|jtddg | j|jtdddg | j|j | j|jd | j|j|d d d  | j|j| | j|j|d d  | j|j
| | j|jtg  | j|jtg  | j|jtg  | j|jtddg | j|jtddg | j|jtdddg | jt|jd d S )
N   anyOfrn      rY   rZ   rB   r   rC   )r   r(   r)   r!   r`   r   r   r+   r   assertIsNoneparentpathr   relative_pathabsolute_pathschema_pathrelative_schema_pathabsolute_schema_pathcontextsorted_errorsassertIsr9   )r   r+   r   r   ra   rI   e1e2r   r   r   
test_anyOf   s\    z%TestValidationErrorDetails.test_anyOfc             C   s  ddi}dddiddddgiidgi}t |}t|j|}| jt|d |d	 }| j|jd | j|j|d  | j|j| | j|j| | j	|j
 | j|jtg  | j|jtg  | j|jtg  | j|jtdg | j|jtdg | j|jtdg | jt|jd t|j\}}| j|jd | j|j|d d	 d  | j|j| | j|j|d d	  | j|j
| | j|jtg  | j|jtg  | j|jtg  | j|jtd	dg | j|jtd	dg | j|jtdd	dg | j|j | j|jd | j|jdg | j|jd | j|jddgi | j|j
| | j|jtdg | j|jtdg | j|jtdg | j|jtdd
ddg | j|jtdd
ddg | j|jtddd
ddg | j|j d S )NrU   rB   rY   integerrl   rM   rC   )rY   r   r   r   )r
   r(   r)   r!   r`   r   r   r+   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   )r   r+   r   r   ra   rI   r   r   r   r   r   	test_type   sd    z$TestValidationErrorDetails.test_typec       	      C   s  ddgddd}dddid	did
ddddgddi}t |}|j|}t|\}}}}| j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jtdg | j|jd	 | j|jd | j|jd | j|jd d S )NrC   rB   rS   rT   )rU   rV   rW   rX   r   rY   rZ   rN   r[   r\   r]   r^   )r_   rM   )rU   rV   rW   rV   rW   rU   rM   r_   )	r
   r)   r   r!   r   r   r   r   r   )	r   r+   r   r   ra   r   r   e3e4r   r   r   test_single_nestingj  s0    
z.TestValidationErrorDetails.test_single_nestingc             C   s  ddddgiddg}dddgddd	gid
ddiddiddddd}t |}|j|}t|\}}}}}	}
| j|jtg  | j|jtdg | j|jtddg | j|jtdddg | j|	jtdddg | j|
jtddg | j|jtdg | j|jtddg | jt|jddddg | jt|jddddddg | jt|	jddddddg | jt|
jddddg | j|jd | j|jd | j|jd | j|jd | j|	jd | j|
jd d S )NrB   rC   rW   )rU   rV   rX   rZ   rl   rM   rK   rD   requiredTrN   )rV   rW   )rY   r   )rY   ru   r   rV   rU   rY   ru   r   )	r
   r)   r   r!   r   r   r   r(   r   )r   r+   r   r   ra   r   r   r   r   Ze5Ze6r   r   r   test_multiple_nesting  sD    

z0TestValidationErrorDetails.test_multiple_nestingc             C   sB  dddddgddiddd	d
iidddgiiddgdd	d
iid}dddddddiididi}t |}|j|\}| j|jtdg | j|jtdddg |j\}| j|jtdddg | j|jtdddddddddg	 |j\}| j|jtdddddg | j|jtdddddddddddddddg d S )NZnoder   rl   rp   childrenrY   rZ   z^.*$z$refz#/definitions/node)rY   r   )rp   r   )rY   r   r   root)ZdefinitionsrY   r   r   rE   Zabr   r   r   )r   r)   r!   r   r   r   r   )r   r   r+   r   rI   r   r   r   r   r   test_recursive  sp    
z)TestValidationErrorDetails.test_recursivec             C   s~   ddd}ddddi}t |}|j|}t|\}}| j|jtdg | j|jtdg | j|jd	 | j|jd
 d S )NrV   rC   )rV   rU   rz   r   r   )rY   rn   rU   rY   rn   )r
   r)   r   r!   r   r   r   )r   r+   r   r   ra   r   r   r   r   r   test_additionalProperties$  s    

z4TestValidationErrorDetails.test_additionalPropertiesc             C   s   ddd}dddiddidi}t |}|j|}t|\}}| j|jtd	g | j|jtd
g | j|jd | j|jd d S )NrB   rC   )rV   rU   r   rY   rZ   rn   r   rV   rU   )r
   r)   r   r!   r   r   r   )r   r+   r   r   ra   r   r   r   r   r   test_patternProperties2  s    

z1TestValidationErrorDetails.test_patternPropertiesc             C   s~   ddg}g dddd}t |}|j|}t|\}}| j|jtdg | j|jtdg | j|jd | j|jd	 d S )
NrU   rB   r   r   )rY   rn   )ru   rv   r   rY   rn   )r
   r)   r   r!   r   r   r   )r   r+   r   r   ra   r   r   r   r   r   test_additionalItemsE  s    
z/TestValidationErrorDetails.test_additionalItemsc             C   s   dddg}i gdddd}t |}|j|}t|\}}| j|jtdg | j|jtdg | j|jd	 | j|jd
 d S )NrU   rV   rB   r   r   )rY   rn   )ru   rv   rC   rY   rn   )r
   r)   r   r!   r   r   r   )r   r+   r   r   ra   r   r   r   r   r   test_additionalItems_with_itemsV  s    

z:TestValidationErrorDetails.test_additionalItems_with_itemsN)r6   r?   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   BJ"6br   c               @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )ValidatorTestMixinc             C   s,   t j | _i | _t j | _| j| j| _d S )N)r   r*   r+   r   resolvervalidator_classr   )r   r   r   r   r    i  s    

zValidatorTestMixin.setUpc             C   sD   t g }tjj| jd|d | j| jj| j| j W d Q R X d S )Nr)   )r'   )	iterr   r3   rl   r   
assertTrueis_validr+   r   )r   ra   r   r   r   test_valid_instances_are_valido  s
    z1ValidatorTestMixin.test_valid_instances_are_validc             C   sJ   t tj g}tjj| jd|d | j| jj| j| j	 W d Q R X d S )Nr)   )r'   )
r   r   r*   r3   rl   r   r9   r   r+   r   )r   ra   r   r   r   $test_invalid_instances_are_not_validy  s
    z7ValidatorTestMixin.test_invalid_instances_are_not_validc             C   s0   t j t j t j   }}}t|||id d S )N)r+   r   )r   r*   r   )r   r+   Zmy_propertyZmy_valuer   r   r   (test_non_existent_properties_are_ignored  s    z;ValidatorTestMixin.test_non_existent_properties_are_ignoredc             C   s   | j | jjt d S )N)ZassertIsInstancer   r   r   )r   r   r   r   .test_it_creates_a_ref_resolver_if_not_provided  s    zAValidatorTestMixin.test_it_creates_a_ref_resolver_if_not_providedc             C   sz   t di }dtj i}tjj|d>}dddif|_| jt | j||dj	d  W d Q R X W d Q R X |j
|d  d S )Nr2   z$refresolveZurlrY   r   )r   )r   r   r*   r3   rl   r'   re   r   r   r   r5   )r   r   r   r   r   r   r   #test_it_delegates_to_a_ref_resolver  s    
(z6ValidatorTestMixin.test_it_delegates_to_a_ref_resolverc                sP   G  fdddt }| }ddi} jt  j||djd W dQ R X dS )zc
        Legacy RefResolvers support only the context manager form of
        resolution.

        c                   s   e Zd Ze fddZdS )zXValidatorTestMixin.test_it_delegates_to_a_legacy_ref_resolver.<locals>.LegacyRefResolverc             3   s    j |d ddiV  d S )Nzthe refrY   r   )r!   )thisref)r   r   r   	resolving  s    zbValidatorTestMixin.test_it_delegates_to_a_legacy_ref_resolver.<locals>.LegacyRefResolver.resolvingN)r6   r?   r@   r   r   r   )r   r   r   LegacyRefResolver  s   r   z$refzthe ref)r   N)rl   re   r   r   r   )r   r   r   r   r   )r   r   *test_it_delegates_to_a_legacy_ref_resolver  s
    z=ValidatorTestMixin.test_it_delegates_to_a_legacy_ref_resolverc             C   s   | j | jjdd d S )NrU   rZ   )r   r   is_type)r   r   r   r   #test_is_type_is_true_for_valid_type  s    z6ValidatorTestMixin.test_is_type_is_true_for_valid_typec             C   s   | j | jjdd d S )NrU   rD   )r9   r   r   )r   r   r   r   &test_is_type_is_false_for_invalid_type  s    z9ValidatorTestMixin.test_is_type_is_false_for_invalid_typec             C   s,   | j | jjdd | j | jjdd d S )NTr   Znumber)r9   r   r   )r   r   r   r   ,test_is_type_evades_bool_inheriting_from_int  s    z?ValidatorTestMixin.test_is_type_evades_bool_inheriting_from_intc          
   C   s*   | j t | jjdt  W d Q R X d S )NrU   )re   r	   r   r   rl   )r   r   r   r   .test_is_type_raises_exception_for_unknown_type  s    zAValidatorTestMixin.test_is_type_raises_exception_for_unknown_typeN)r6   r?   r@   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   h  s   

r   c               @   s(   e Zd ZeZdd Zdd Zdd ZdS )TestDraft3Validatorc             C   s    | j | jjtj ddi d S )NrY   any)r   r   r   r   r*   )r   r   r   r   !test_is_type_is_true_for_any_type  s    z5TestDraft3Validator.test_is_type_is_true_for_any_typec             C   s0   | j | jjdd | j | jjdddi d S )NTZbooleanrY   r   )r   r   r   r   )r   r   r   r   6test_is_type_does_not_evade_bool_if_it_is_being_tested  s    zJTestDraft3Validator.test_is_type_does_not_evade_bool_if_it_is_being_testedc             C   s0   dd gi}| j |d td id}|jd | d S )NrY   )r   )r   rY   r   )r   r   r.   r   r   r   test_non_string_custom_types  s    
z0TestDraft3Validator.test_non_string_custom_typesN)r6   r?   r@   r
   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZeZdS )TestDraft4ValidatorN)r6   r?   r@   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )TestBuiltinFormatsz
    The built-in (specification-defined) formats do not raise type errors.

    If an instance or value is not a string, it should be ignored.

    N)r6   r?   r@   __doc__r   r   r   r   r     s   r   c             C   s    t d|it d}|jd d S )Nr   )r   r   )r   r   r   )r   r   vr   r   r   test  s    r   ztest_{0}_ignores_non_stringsc               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestValidatorForc             C   s4   ddi}| j t|t ddi}| j t|t d S )Nz$schemaz&http://json-schema.org/draft-03/schemaz'http://json-schema.org/draft-03/schema#)r   r   r
   )r   r   r   r   r   test_draft_3  s    zTestValidatorFor.test_draft_3c             C   s4   ddi}| j t|t ddi}| j t|t d S )Nz$schemaz&http://json-schema.org/draft-04/schemaz'http://json-schema.org/draft-04/schema#)r   r   r   )r   r   r   r   r   test_draft_4  s    zTestValidatorFor.test_draft_4c             C   s,   t ddidd}ddi}| jt|| d S )Nr1   zmeta schema idZ12)r   r0   z$schema)r   r   r   )r   r   r   r   r   r   test_custom_validator  s    z&TestValidatorFor.test_custom_validatorc             C   s   | j ti t d S )N)r   r   r   )r   r   r   r   %test_validator_for_jsonschema_default  s    z6TestValidatorFor.test_validator_for_jsonschema_defaultc             C   s   | j ti d dd  d S )N)default)r   r   )r   r   r   r   !test_validator_for_custom_default  s    z2TestValidatorFor.test_validator_for_custom_defaultN)r6   r?   r@   r   r   r   r   r   r   r   r   r   r     s
   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )TestValidatec             C   sp   ddi}t jjtd}ti | |j| W d Q R X ddi}t jjtd}ti | |j| W d Q R X d S )Nz$schemaz'http://json-schema.org/draft-03/schema#check_schemaz&http://json-schema.org/draft-03/schema)r   r3   rl   r
   r   r5   )r   r   
chk_schemar   r   r   test_draft3_validator_is_chosen  s    

z,TestValidate.test_draft3_validator_is_chosenc          
   C   s:   ddi}t jjtd}ti | |j| W d Q R X d S )Nz$schemaz'http://json-schema.org/draft-04/schema#r   )r   r3   rl   r   r   r5   )r   r   r   r   r   r   test_draft4_validator_is_chosen  s    
z,TestValidate.test_draft4_validator_is_chosenc          
   C   s2   t jjtd}ti i  |ji  W d Q R X d S )Nr   )r   r3   rl   r   r   r5   )r   r   r   r   r   $test_draft4_validator_is_the_default  s    
z1TestValidate.test_draft4_validator_is_the_defaultN)r6   r?   r@   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZddiZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"TestRefResolverr2   zfoo://storedZstoredr   c             C   s,   i | _ | j| ji| _t| j| j | j| _d S )N)referrer
stored_uristored_schemastorer   base_urir   )r   r   r   r   r      s    zTestRefResolver.setUpc             C   s\   t jd }tjj| jd,}| jj|}| j|t j W d Q R X W d Q R X | j|j	 d S )Nr1   Zresolve_remote)
r
   r#   r   r3   rl   r   r   r!   r9   r:   )r   r   Zremoteresolvedr   r   r   6test_it_does_not_retrieve_schema_urls_from_the_network  s
    
"zFTestRefResolver.test_it_does_not_retrieve_schema_urls_from_the_networkc             C   sF   d}dt  i| jd< | jj|}| j|| jd d  W d Q R X d S )Nz#/properties/foorU   r   )rl   r   r   r   r!   )r   r   r   r   r   r   test_it_resolves_local_refs$  s    z+TestRefResolver.test_it_resolves_local_refsc             C   sh   dddid}t j|}|jd}| j||d  W d Q R X |jd}| j||d  W d Q R X d S )Nzhttp://bar/schema#rU   rV   )r1   rE   z#/arE   zhttp://bar/schema#/a)r   from_schemar   r!   )r   r   r   r   r   r   r   #test_it_resolves_local_refs_with_id*  s    
z3TestRefResolver.test_it_resolves_local_refs_with_idc             C   s`   | j j| j}| j|| j W d Q R X ddi| j jd< | j jd}| j|d W d Q R X d S )NrU   r   Z
cached_refzcached_ref#/foo)r   r   r   r   r   r   r!   )r   r   r   r   r   test_it_retrieves_stored_refs2  s
    z-TestRefResolver.test_it_retrieves_stored_refsc             C   sb   d}ddi}t jd6}||jjj_| jj|}| j|d W d Q R X W d Q R X |jjd d S )Nzhttp://bar#bazrW   r   zjsonschema.validators.requestsz
http://bar)	r   r3   getr'   jsonr   r   r!   r5   )r   r   r   Zrequestsr   r   r   r   ,test_it_retrieves_unstored_refs_via_requests:  s     z<TestRefResolver.test_it_retrieves_unstored_refs_via_requestsc             C   s   d}ddi}t jdd V t jd@}tj|jd|jj_| jj|}| j	|d W d Q R X W d Q R X W d Q R X |j
d d S )Nzhttp://bar#bazrW   r   zjsonschema.validators.requestszjsonschema.validators.urlopenutf8z
http://bar)r   r3   r   dumpsencoder'   readr   r   r!   r5   )r   r   r   Zurlopenr   r   r   r   +test_it_retrieves_unstored_refs_via_urlopenD  s    *z;TestRefResolver.test_it_retrieves_unstored_refs_via_urlopenc             C   s   ddi}t j|}| j|jd | j|jd |jd}| j|| W d Q R X |jd}| j|| W d Q R X |jd}| j|| W d Q R X |jd}| j|| W d Q R X d S )Nr1   rU   r2   #zfoo#)r   r   r!   r   resolution_scoper   )r   r   r   r   r   r   r   .test_it_can_construct_a_base_uri_from_a_schemaP  s    
z>TestRefResolver.test_it_can_construct_a_base_uri_from_a_schemac             C   sr   i }t j|}| j|jd | j|jd |jd}| j|| W d Q R X |jd}| j|| W d Q R X d S )Nr2   r   )r   r   r!   r   r   r   )r   r   r   r   r   r   r   9test_it_can_construct_a_base_uri_from_a_schema_without_id^  s    
zITestRefResolver.test_it_can_construct_a_base_uri_from_a_schema_without_idc          
   C   sZ   ddi}d}t j|d}tdi d|id}|j|}| j|| W d Q R X |j| d S )NrU   rV   z	foo://bar)r'   r2   )handlers)r   r*   r   r   r!   r5   )r   r   r   foo_handlerr   r   r   r   r   test_custom_uri_scheme_handlersh  s    z/TestRefResolver.test_custom_uri_scheme_handlersc             C   sZ   d}t j }tdi dd|id}|j| W d Q R X |j| W d Q R X |j| d S )Nz	foo://barr2   TrU   )cache_remoter   )r   r*   r   r   r5   )r   r   r   r   r   r   r   test_cache_remote_onq  s    

z$TestRefResolver.test_cache_remote_onc          
   C   sH   d}t j }tdi dd|id}|j| W d Q R X | j|jd d S )Nz	foo://barr2   FrU   )r   r   rB   )r   r*   r   r   r!   Z
call_count)r   r   r   r   r   r   r   test_cache_remote_off}  s    
z%TestRefResolver.test_cache_remote_offc             C   sh   d}t jtdd}tdi d|id}| jt}|j| W d Q R X W d Q R X | jt|j	d d S )Nz	foo://barzOh no! What's this?)r4   r2   rU   )r   )
r   r*   
ValueErrorr   re   r   r   r!   strrf   )r   r   r   r   errr   r   r   3test_if_you_give_it_junk_you_get_a_resolution_error  s    zCTestRefResolver.test_if_you_give_it_junk_you_get_a_resolution_errorc             C   sF   t di }|j  | jt}|j  W d Q R X | jdt|j d S )Nr2   zFailed to pop the scope)r   Z	pop_scopere   r   rw   r   rf   )r   r   excr   r   r   .test_helpful_error_message_on_failed_pop_scope  s
    
z>TestRefResolver.test_helpful_error_message_on_failed_pop_scopeN)r6   r?   r@   r   r   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s"   

	
	r   c               @   s   e Zd ZdZdd ZdS )UniqueTupleItemsMixinz
    A tuple instance properly formats validation errors for uniqueItems.

    See https://github.com/Julian/jsonschema/pull/224

    c             C   sN   | j ddidtfid}| jt}|jd W d Q R X | jdt|j d S )NZuniqueItemsTrD   )r   r   rB   z(1, 1) has non-unique elements)rB   rB   )r   tuplere   r   r   rw   r   rf   )r   r   rI   r   r   r   )test_it_properly_formats_an_error_message  s    z?UniqueTupleItemsMixin.test_it_properly_formats_an_error_messageN)r6   r?   r@   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZeZdS )TestDraft4UniqueTupleItemsN)r6   r?   r@   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZeZdS )TestDraft3UniqueTupleItemsN)r6   r?   r@   r
   r   r   r   r   r   r     s   r   c             C   s   dd }t | |dS )Nc             S   s    dd | j D dd | jD fS )Nc             S   s   g | ]}t |qS r   )r   )rP   rI   r   r   r   
<listcomp>  s    z.sorted_errors.<locals>.key.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r   )rP   rI   r   r   r   r     s    )r   r   )r,   r   r   r   key  s    zsorted_errors.<locals>.key)r   )rR   )ra   r   r   r   r   r     s    r   ),collectionsr   
contextlibr   r   Z
jsonschemar   r   Zjsonschema.tests.compatr   r   Zjsonschema.validatorsr   r	   r
   r   r   r   r   r   r   ZTestCaser   rA   rc   r   rl   r   r   r   r   Zcheckersr   r   rp   r6   setattrr   r   r   r   r   r   r   r   r   r   r   <module>   s<   ,@"l   O	
 