
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    `                     @   sD  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZmZmZmZ d dlm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'd( Z&d)d* Z'd+d, Z(d-d. Z)d/d0 Z*d1d2 Z+d3d4 Z,d5d6 Z-d7d8 Z.d9d: Z/d;d< Z0d=d> Z1d?d@ Z2dAdB Z3dCdD Z4dEdF Z5dGdH Z6dIdJ Z7dKdL Z8dMdN Z9dOdP Z:dQdR Z;dSdT Z<dUdV Z=dWdX Z>dYdZ Z?d[d\ Z@d]d^ ZAd_d` ZBdadb ZCdcdd ZDdedf ZEdgdh ZFdidj ZGdkdl ZHdmdn ZIdodp ZJdqdr ZKdsdt ZLdudv ZMe
Ndwdxdydz ZOd{d| ZPd}d~ ZQdd ZRdd ZSe
Ndddi dfg dffdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpe
jqejrd  dk ddčddƄ Zse
jqejrd  dkddčddʄ Ztdd̄ Zudd΄ ZvddЄ Zwdd҄ ZxddԄ Zyddք Zzdd؄ Z{ddڄ Z|dd܄ Z}ddބ Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zdd Zdd Zdd Zdd Ze
Nd	d
dd Zdd Zdd Ze
Ndee jddgdǐddd Zdd Zdd ZdS (      N)datetimedate)choice)ascii_lowercase)mark)errors	Validator)assert_bad_typeassert_document_errorassert_failassert_has_errorassert_not_has_errorassert_success)sample_schemac                   C   s   t d td tj d S N)r
   r   r   ZDOCUMENT_MISSING r   r   O/opt/alt/python38/lib/python3.8/site-packages/cerberus/tests/test_validation.pytest_empty_document   s    r   c                  C   s   d} t | td tj|  d S )N
not a dict)r
   r   r   ZDOCUMENT_FORMATformat)documentr   r   r   test_bad_document_type   s       
r   c                 C   s8   d}t |di| |dtjd fd | j|dgiks4td S )NZsurnameZdoer   	validatorerrorunknown field)r   r   ZUNKNOWN_FIELDAssertionErrorr   fieldr   r   r   test_unknown_field#   s    r   c                 C   s   d}|i i}t | | d S )Nnamer   )r   r   schemar   r   r   test_empty_field_definition-   s    r#   c                 C   sD   d}ddddddi}|  | tddi| ||d	ftjdfd
 d S )NZa_required_stringstring   
   T)type	minlength	maxlengthrequired
an_integer   r*   r   )updater   r   REQUIRED_FIELD)r"   r   Zrequired_string_extensionr   r   r   test_required_field3   s    
r0   c                   C   sL   t dd i t ddi t dd i tddi tdd i tdd i d S )NZa_nullable_integer   Za_nullable_field_without_typefoor+   Z!a_not_nullable_field_without_typer   r   r   r   r   r   test_nullable_fieldE   s    r4   c                  C   s&   ddddgddi} t dd i|  d S )NZroleagentclientZsupplierT)allowednullabler!   r"   r   r   r   test_nullable_skips_allowedN   s    r:   c                  C   s&   d} t | di| | dftjdfd d S )NZa_readonly_stringzupdate me if you canreadonlyTr-   )r   r   READONLY_FIELDr   r   r   r   test_readonly_fieldS   s
    r>   c                  C   s@   dddddi} t | }|ddi d|jd d ks<td S )	NZa_readonly_numberintegerTr,   )r'   r;   maxr%   z	read-onlyr   )r   validater   r   r"   vr   r   r   test_readonly_field_first_rule[   s    rD   c                  C   s   dddddddd dd} t i |  d	d
tj| d	 d fddtj| d d fg}tddd| |d tddd| |d d S )Nr$   Ttodayr'   r;   defaultc                 S   s   | d S Ncreatedr   dr   r   r   <lambda>l       z8test_readonly_field_with_default_value.<locals>.<lambda>r'   r;   Zdefault_setterrI   modifiedrI   )rI   r;   r;   rP   )rP   r;   tomorrowr   r   r   r<   r   r"   expected_errorsr   r   r   &test_readonly_field_with_default_valuef   s8    



    rV   c                  C   s   dddddddddd d	d
di} t di i|  ddtj| d d d d fddtj| d d d d fg}tdddd
i| |d tdddd
i| |d d S )N
some_fielddictr$   TrE   rF   c                 S   s   | d S rH   r   rJ   r   r   r   rL      rM   z?test_nested_readonly_field_with_default_value.<locals>.<lambda>rN   rO   r'   r"   )rW   rI   )rW   r"   rI   r;   r"   rI   r;   )rW   rP   )rW   r"   rP   r;   rP   rQ   nowrR   rS   rT   r   r   r   -test_nested_readonly_field_with_default_value   s@    
r[   c                 C   s2   dddii| _ tddi| d tddi| d d S )Nidr;   Tr   r   )r"   r   r]   r   r   r   test_repeated_readonly   s    r^   c                   C   s   t ddd d S )Na_stringr$   r,   r	   r   r   r   r   test_not_a_string   s    ra   c                   C   s   t ddd d S )Na_binarybinaryzi'm not a binaryr`   r   r   r   r   test_not_a_binary   s    rd   c                   C   s   t ddd d S )Nr+   r?   zi'm not an integerr`   r   r   r   r   test_not_a_integer   s    re   c                   C   s   t ddd d S )N	a_booleanbooleanzi'm not a booleanr`   r   r   r   r   test_not_a_boolean   s    rh   c                   C   s   t ddd d S )N
a_datetimer   zi'm not a datetimer`   r   r   r   r   test_not_a_datetime   s    rj   c                   C   s   t ddd d S )Na_floatfloatzi'm not a floatr`   r   r   r   r   test_not_a_float   s    rm   c                   C   s   t ddd d S )Na_numbernumberzi'm not a numberr`   r   r   r   r   test_not_a_number   s    rp   c                   C   s   t ddd d S )Na_list_of_valueslistzi'm not a listr`   r   r   r   r   test_not_a_list   s    rs   c                   C   s   t ddd d S )Na_dictrX   zi'm not a dictr`   r   r   r   r   test_not_a_dict   s    ru   c                 C   sV   d}| | d }d dd t|d D }t||i||dftj|t|ffd d S )Nr_   r)    c                 s   s   | ]}t tV  qd S r   r   r   .0ir   r   r   	<genexpr>   s     z&test_bad_max_length.<locals>.<genexpr>r,   r-   )joinranger   r   
MAX_LENGTHlenr"   r   
max_lengthvaluer   r   r   test_bad_max_length   s    r   c                 C   sF   d}| | d }d|d  }t ||i||dftj|t|ffd d S )Nrb   r)       r,   r-   )r   r   r~   r   r   r   r   r   test_bad_max_length_binary   s    r   c                 C   sV   d}| | d }d dd t|d D }t||i||dftj|t|ffd d S )Nr_   r(   rv   c                 s   s   | ]}t tV  qd S r   rw   rx   r   r   r   r{      s     z&test_bad_min_length.<locals>.<genexpr>r,   r-   )r|   r}   r   r   
MIN_LENGTHr   r"   r   
min_lengthr   r   r   r   test_bad_min_length   s    r   c                 C   sF   d}| | d }d|d  }t ||i||dftj|t|ffd d S )Nrb   r(   r   r,   r-   )r   r   r   r   r   r   r   r   test_bad_min_length_binary  s    r   c                    s:    fdd}d}||d d}||d d}||d d S )Nc                    s6    |  d }|| }t | |i| | dftj|fd d S )Nr@   r-   )r   r   Z	MAX_VALUE)r   incZ	max_valuer   r9   r   r   assert_bad_max_value  s     z0test_bad_max_value.<locals>.assert_bad_max_valuer+   r,   rk         ?rn   r   )r"   r   r   r   r9   r   test_bad_max_value  s    

r   c                    s:    fdd}d}||d d}||d d}||d d S )Nc                    s6    |  d }|| }t | |i| | dftj|fd d S )Nminr-   )r   r   	MIN_VALUE)r   r   Z	min_valuer   r9   r   r   assert_bad_min_value,  s     z0test_bad_min_value.<locals>.assert_bad_min_valuer+   r,   rk   r   rn   r   )r"   r   r   r   r9   r   test_bad_min_value+  s    

r   c               
   C   s,  d} d}| d|ddiddddid	i}| |d
ii}t |}t||| | dftj|jd d f| |f| d|dftjdf| df| dddftjdfgd tj}| |jkst||j|  d kst|j	tjj
 jdd|j|  d | kstd|j|  d kst|j	tjj
 |j|  d d ks(td S )Nrt   addressrX   r'   r$   cityTr'   r*   rY   "   r"   r*   r   r   child_errors
constraint)r   r   r   MAPPING_SCHEMAr"   BAD_TYPEr/   BasicErrorHandlerr   messagescoder   )r   Zsubschema_fieldr"   r   r   handlerr   r   r   test_bad_schema;  sZ      	

r   c                  C   sR   d} d}|di}| |f| ddft jdfg}t| |i| | dft jddif|d d S )Na_dict_with_valuesrulesr_   not an integervaluesrulesr'   r?   r   r   )r   r   r   VALUESRULES)r   Zschema_fieldr   exp_child_errorsr   r   r   test_bad_valuesrulesq  s    r   c              	   C   s   d}ddg}t ||i| ||dftjddiddigf|df|dddftjdfgd	 tjjtjj jdd
| j| d d kstdddg}t ||i||dftj	ddiddigdfd d S )Nrq   a stringr   itemsr'   r$   r?   r,   r   r   r   r&   zan extra item)r%   r1   r-   )
r   r   Z	BAD_ITEMSr   r   r   r   r   r   ZITEMS_LENGTH)r   r   r   r   r   r   test_bad_list_of_values  s:    
r   c                  C   s   d} ddg}t | |i d S )Na_list_of_integersr   r   r   r   r   r   r   r   test_bad_list_of_integers  s    r   c            	      C   sB  d} ddidddd}d|d	}| d
|d	i}t |}dddg}| |i}t||| | dftj|f| df| ddftj|fgd | |jkstd|j|  d kstd|j|  d d d ksttjjtjj	 j
dd}||j|  d d d d kstdg}| df| ddftjddfg}t| |i| | dftj|f|d d S )Na_list_of_dictsr'   r$   r?   Tr   skupricerX   rY   rr   ZKT123Z100r"   r   r   r   r   r   r   r   r   )r   r   r   SEQUENCE_SCHEMAr   r   r   r   r   r   r   )	r   Z
map_schemaZ
seq_schemar"   r   r   r   exp_msgr   r   r   r   test_bad_list_of_dicts  s>    
	"r   c                  C   s8   d} dddg}t | |i| | dftjdddgdfd d S )	Nan_arrayr5   r6   profitr7   vendor))r   r-   r   r   ZUNALLOWED_VALUESr   r   r   r   test_array_unallowed  s    
r   c                  C   s2   d} d}t | |i| | dftjdddg|fd d S )Na_restricted_stringr   r7   r5   r6   r   r-   r   r   ZUNALLOWED_VALUEr   r   r   r   test_string_unallowed  s    r   c                  C   s2   d} d}t | |i| | dftjdddg|fd d S )Na_restricted_integerr%   r7   r   r   r,   r-   r   r   r   r   r   test_integer_unallowed  s    r   c                   C   s   t ddi d S )Nr   r   r!   r   r   r   r   test_integer_allowed  s    r   c                   C   s"   t dddiddigddd d S )	Nd   r   Zadrr   Zlet)r+   rt   r   Tr.   r!   r   r   r   r   test_validate_update  s    r   c                   C   s   t ddi d S )Nr_   zjohn doer!   r   r   r   r   test_string  s    r   c                   C   s   t ddi d S )Nr   r6   r!   r   r   r   r   test_string_allowed  s    r   c                   C   s   t ddi d S )Nr+   2   r!   r   r   r   r   test_integer  s    r   c                   C   s   t ddi d S )Nrf   Tr!   r   r   r   r   test_boolean  s    r   c                   C   s   t dt i d S )Nri   )r   r   rZ   r   r   r   r   test_datetime  s    r   c                   C   s   t ddi t ddi d S )Nrk         @r,   r!   r   r   r   r   
test_float"  s    r   c                   C   s   t ddi t ddi d S )Nrn   r   r1   r!   r   r   r   r   test_number'  s    r   c                   C   s   t dddgi d S )Nr   r5   r6   r!   r   r   r   r   
test_array,  s    r   c                   C   s   t dtddgi d S )NZa_sethellor,   )r   setr   r   r   r   test_set0  s    r   c                 C   s   d}t |di t |ddgi |df|ddftjdfg}t|ddgi| ||dftjddif|d	 t|di|f|dftjdd
gfd | j|ddgigikstd S )NZone_or_more_stringsr2   barr,   r"   r'   r$      r   rr   r-   zmust be of string type)r   r   r   r   r   r   )r   r   r   r   r   r   test_one_of_two_types4  s     
r   c                 C   s8   d}t |di| d t|did||dftjdfd d S )	NZa_regex_emailzvalid.email@gmail.comr]   invalidTregexz0^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)r.   r   )r   r   r   ZREGEX_MISMATCHr   r   r   r   
test_regexH  s    r   c                   C   s0   t ddidddii tddidddii d S )Nitemz
hOly grAilr   z(?i)holy grailz
holy grailr3   r   r   r   r   test_regex_with_flagW  s    r   c                   C   s    t dddddddgi d S )Nr   ZAK345r   r   YZ069   r!   r   r   r   r   test_a_list_of_dicts\  s    r   c                   C   s   t dddgi d S )Nrq   r   r   r!   r   r   r   r   test_a_list_of_valuesg  s    r   c                   C   s   t dddgi d S )NZan_array_from_setr5   r6   r!   r   r   r   r   test_an_array_from_setk  s    r   c                   C   s   t dddgi d S )Nr   c   r   r!   r   r   r   r   test_a_list_of_integerso  s    r   c                 C   sV   t ddddi tdddiiddtj| d d fd	d
tjdfddtjdfgd d S )Nrt   zi live herezin my own town)r   r   r   ia!  )rt   r"   r"   )rt   r   )rt   r"   r   r'   r$   )rt   r   )rt   r"   r   r*   Tr   )r   r   r   r   r   r/   r9   r   r   r   test_a_dicts  s(    

r   c                 C   s   t ddddi ddtjddif}dd	tjdfg}tdd
dii| ||d d| jd ks^t| j}t|d d jdks~td S )Nr   r   r   )z
an integerzanother integer)r   r   r'   r?   )r   r   )r   r   r'   r   Z99r   r   r,   )	r   r   r   r   r   Zschema_error_treer   r   Zdescendants)r   r   r   rC   r   r   r   test_a_dict_with_valuesrules  s.    	
r   rule)Z	keysrulesZ	keyschemac                 C   sB   ddd| dddii}t dddii|d	 tdd
dii|d	 d S )NZa_dict_with_keysrulesr'   rX   r$   z[a-z]+r'   r   keyr   r9   ZKEYr3   )r   r"   r   r   r   test_keysrules  s      r   c                 C   s   d}| | d }| | d }t |dg|d  i||dftj||d ffd t||D ]}dg| }t||i qVt |dg|d  i||dftj||d ffd d S )NZa_list_lengthr(   r)   r,   r-   )r   r   r   r}   r   r~   )r"   r   r   r   rz   r   r   r   r   test_a_list_length  s0    
r   c                  C   sT   G dd dt } dddii}| |}tddi|d tddi|dd	tjdfd
 d S )Nc                   @   s   e Zd Zdd ZdS )z)test_custom_datatype.<locals>.MyValidatorc                 S   s   t d|rdS d S )Nz[a-f0-9]{24}T)rematchselfr   r   r   r   _validate_type_objectid  s    zAtest_custom_datatype.<locals>.MyValidator._validate_type_objectidN)__name__
__module____qualname__r   r   r   r   r   MyValidator  s   r   
test_fieldr'   ZobjectidZ50ad188438345b1049c88a28r]   r   r   r'   r   )r   r   r   r   r   r   r"   r   r   r   r   test_custom_datatype  s    r   c                  C   sx   G dd dt } ddddi}| |}tddi|ddtjdfd	 tdd
i|ddtjd dfd	 |jddgiksttd S )Nc                   @   s   e Zd Zdd Zdd ZdS )z.test_custom_datatype_rule.<locals>.MyValidatorc                 S   s   ||k r|  |d dS )z{'type': 'number'}Below the minN)_error)r   
min_numberr   r   r   r   r   _validate_min_number  s    zCtest_custom_datatype_rule.<locals>.MyValidator._validate_min_numberc                 S   s   t |trdS d S )NT)
isinstanceintr   r   r   r   _validate_type_number  s    
zDtest_custom_datatype_rule.<locals>.MyValidator._validate_type_numberN)r   r   r   r   r   r   r   r   r   r     s   r   r   r,   ro   )r   r'   0r   r   r   r   )r   r   )r   r   r   r   CUSTOMr   r   r   r   r   test_custom_datatype_rule  s    r   c                  C   sj   G dd dt } dddii}| |}tddi|d tddi|dd	tjd d
fd |jddgiksftd S )Nc                   @   s   e Zd Zdd ZdS )z*test_custom_validator.<locals>.MyValidatorc                 S   s    |rt |d@ s| |d dS ){'type': 'boolean'}r,   Not an odd numberN)boolr   )r   isoddr   r   r   r   r   _validate_isodd  s    z:test_custom_validator.<locals>.MyValidator._validate_isoddN)r   r   r   r  r   r   r   r   r     s   r   r   r  T   r]      r   )r  r   r  )r   r   r   r   r   r   r   r   r   r   test_custom_validator  s    r  zvalue, _type)rv   r$   )r   rr   rX   rr   c                 C   sd   d}|d|ii}|| i}t || d|| d< t||||dftjdfd d|| d< t || d S )Ntestr'   Femptyr-   T)r   r   r   ZEMPTY_NOT_ALLOWED)r   Z_typer   r"   r   r   r   r   test_empty_values  s    
r
  c                 C   s&   dddddi}| ddi|s"t d S )Nr2   Tz\d?\d\.\d\dr$   )r	  r   r'   rv   )r   )r   r"   r   r   r   test_empty_skips_regex-  s    r  c                  C   s   d} | ddddi}| d i}t |dd}t||d d|j|  d< |j  t||d}t|| | dftjd t |dd}d|j|  d< |j  t||d d|j|  d< t|||d	}t|| | dftjd t|| | d
ftj	d d S )Nr  r$   F)r'   r	  r*   )Zignore_none_valuesr]   Tr*   )r"   r   r   r'   )
r   r   r"   rA   r   r   r/   r   r   r   )r   r"   r   r   _errorsr   r   r   test_ignore_none_values2  s.    
    
r  c                  C   sf   i } t d| d}tddd|d ddi|_tdd	i|d
 tddi|d d|_tdd	i|d d S )NTallow_unknownr"   yes)Zunknown1Zunknown2r]   r'   r$   r    r   r   r   r,   F)r   r   r  r   rB   r   r   r   test_unknown_keysL  s    
r  c                 C   s&   d| _ ddddi}t|i | d d S )NTrt   Z	foo_valuer   r2   r   r]   r  r   r   r   r   r   r   test_unknown_key_dict^  s    r  c                 C   s$   d| _ dddgi}t|i | d d S )NTrt   r2   r   r]   r  r  r   r   r   test_unknown_key_liste  s    r  c                 C   s(   d| _ dddddgi}t|| d d S )NTr   r   r   )r   r   extrar]   r  r  r   r   r   test_unknown_keys_list_of_dictsl  s    r  c                  C   s8   G dd dt } | i }ddi|_tddd|d d S )Nc                   @   s   e Zd Zdd ZdS )z>test_unknown_keys_retain_custom_rules.<locals>.CustomValidatorc                 S   s   |dkrdS d S )Nr2   Tr   r   r   r   r   _validate_type_foox  s    zQtest_unknown_keys_retain_custom_rules.<locals>.CustomValidator._validate_type_fooN)r   r   r   r  r   r   r   r   CustomValidatorw  s   r  r'   r2   )ZfredZbarneyr  )r   r  r   )r  r   r   r   r   %test_unknown_keys_retain_custom_rulest  s    
r  c                  C   sT   ddddddiidi} ddd	d
di}t || d ddi| d d< t|| d d S )Nfield1rX   Tnested1r'   r$   r'   r  r"   r2   r   *   )r  Zarb1Zarb2)r   r"   r  r3   r"   r   r   r   r   test_nested_unknown_keys  s    
r"  c                 C   s   | j i kstdS )zl
    In v0.1.0 and below `self.errors` raised an exception if no
    validation had been performed yet.
    N)r   r   r]   r   r   r   test_novalidate_noerrors  s    r#  c                  C   s\   dddii} t | }|ddis&t|ddis6t|ddirHt|ddirXtdS )z`
    Validator instance is callable, functions as a shorthand
    passthrough to validate()
    r   r'   r$   r2   r,   N)r   rA   r   rB   r   r   r   test_callable_validator  s    r$  c                  C   s4   ddiddid} t ddd|  tddi|  d S )	Ndependenciesr2   r'   r$   r   r2   foobarr   r   r3   r9   r   r   r   test_dependencies_field  s    r(  c                  C   sB   dddgiddiddid} t dddd|  tddd|  d S )	Nr%  r2   r   r'   r$   r   r2   r   r'  r&  r3   r9   r   r   r   test_dependencies_list  s    
r*  c                  C   s   dddgdddiddid} t dd	i|  t d	dd
|  t d	dd|  t ddd|  t i |  t ddi|  d| d d< tddd|  d S )NTr2   r   r*   r%  r'   r$   r)  r   r'  r&  r   r   r  Fr*   r   r   r9   r   r   r   *test_dependencies_list_with_required_field  s    
r.  c                  C   sd   dddgidddiddiddd	} t d
dddd	|  td
i d	|  td
ddid	|  d S )Nr%  
a_dict.foo
a_dict.barrX   r'   r$   r  rY   r   rt   r'  r2   r   r3   r9   r   r   r   /test_dependencies_list_with_subodcuments_fields  s    
 r2  c                  C   s   ddddiddiddid} t dddd|  tddd	|  tddd	|  tddd
|  tddd
|  tddi|  d S )Nr%  r2   r   r  r'   r$   r)  r'  r&  r,  r   r3   r9   r   r   r   test_dependencies_dict  s    r3  c                  C   s   dddddddiddid} t d	d
i|  t d
dd|  t d
dd|  t ddd|  t i |  t ddi|  td
ddd|  d| d	 d< tddd|  d S )NTr2   r   r  r+  r'   r$   r)  r   r'  r&  r,  Fr*   r-  r9   r   r   r   *test_dependencies_dict_with_required_field  s    
r4  c                  C   sB   ddiddid} t d dd|  t dd i|  tddi|  d S )Nr8   Tr%  r2   r  r,   r   r3   r9   r   r   r   .test_dependencies_field_satisfy_nullable_field  s    r5  c                  C   sf   ddddddd} t d d d|  t ddd|  t d dd|  tdd i|  tddi|  d S )Nr   T)r%  r8   r2   r  r,   r3   r9   r   r   r   ?test_dependencies_field_with_mutually_dependent_nullable_fields  s    r6  c                  C   s   dddgddidddiddidd	d
} t ddddd
|  t ddddd
|  tdi d
|  tddddd
|  tdddid
|  tdddid
|  d S )Nr%  r2   r   )r/  r0  rX   r'   r$   r  rY   r1  r'  r3   r9   r   r   r   /test_dependencies_dict_with_subdocuments_fields  s,     	   r7  c               	   C   sf   dddii} d| di d}t ddd	d
i|ddtj| fddtjddfgd tdddid| d S )Nversionr%  ^repoTr  )packagerepor:  Z	somewherer   )r;  r8  )r:  r"   )r:  r8  )r:  r"   r8  r%  )r9  r   r,   )r;  r:  )r   r   r   ZDEPENDENCIES_FIELDr   )Z	subschemar"   r   r   r   test_root_relative_dependencies0  s    r<  c               	   C   sR   t ddiddddgidd} td	d
d| ddtjdddgidd	iffd d S )Nr*   FTr  onetwor+  r  field2Zthreer  r@  )r@  r%  r   )r   r   r   DEPENDENCIES_FIELD_VALUE)rC   r   r   r   test_dependencies_errorsE  s    
rB  c                 C   s8   dddddiidi| _ d| _tdddd	i| d
 d S )NZsub_dictrX   r2   r'   r$   rY   Tr   )r2   unknownr]   )r"   r  r   r]   r   r   r   (test_options_passed_to_nested_validatorsY  s
     rD  c                  C   sT   G dd dt } dddddddd	id
di}tdddiddigi| |d dS )z
    Make sure self.root_document is always the root document. See:
    * https://github.com/pyeve/cerberus/pull/42
    * https://github.com/pyeve/eve/issues/295
    c                   @   s   e Zd Zdd ZdS )z,test_self_root_document.<locals>.MyValidatorc                 S   s,   d| j kst| j d dkr(| |d dS )r   subr%   z!self.context is not the root doc!N)root_documentr   r   )r   root_docr   r   r   r   r   _validate_root_doci  s    z?test_self_root_document.<locals>.MyValidator._validate_root_docN)r   r   r   rH  r   r   r   r   r   h  s   r   rE  rr   TrX   r2   r$   )r'   rG  rY   )r'   rG  r"   r   bazr]   Nr   r   )r   r"   r   r   r   test_self_root_documenta  s    
 rK  c                 C   sf   dd }d|iddid| _ tddd| d	d
tjd dfd | jd	dgiksPttddd| d d S )Nc                 S   s   |  s|| d d S )Nmust be lowercase)islower)r   r   r   r   r   r   validate_name~  s    z*test_validator_rule.<locals>.validate_namer   r'   r?   )r    ZageZItsMer%   r    r   )rL  r   rL  Zitsmer]   )r"   r   r   r   r   r   )r   rN  r   r   r   test_validator_rule}  s    rO  c                 C   sF   dddii| _ ddi}| ||ks(tddi}| |d ksBtd S )Npropertyr'   r$   r   )r"   Z	validatedr   r  r   r   r   test_validated  s
    rQ  c               	   C   s  ddddi} ddi}t ||  ddddddddgii} dd	i}t ||  ddddddddgii} dd
i}t||  ddddiddigdi} t ddi|  d| d d d kstd| d d d kstd| d d d kstd| d d d kstt ddi|  ddtjdfddtjdfg}tddi| ddtjddiddigf|d ddi}t||  ddi}t||  d S )Nprop1r   r&   r   r@      anyofr   n   i   r   r?   r   r'   rU  r'   r,   r  )rR  )rR  rU  r   r   )rR  rU  r,   r   r   )rR  rU  r         @5.5)r   r   r   r   r   ANYOF)r"   docr   r   r   r   
test_anyof  s:    



r]  c                  C   s   ddddiddiddigii} dd	i}t ||  dd
i}t||  ddi}t ||  ddddiddigii} ddi}t||  ddi}t ||  ddi}t ||  d S )NrR  allofr'   rl   r   r   r@   r&   r   rT     r?         '@Z11r-  r"   r\  r   r   r   
test_allof  s    




rb  c                  C   sf   ddi} dddddgdi}t | | dddgdi}t| | dddgdi}ddi} t| | d S )Nletters   ♄εℓł☺r$   abcr'   r7   r-  r\  r"   r   r   r   test_unicode_allowed  s    

rj  r1   zrequires python 3.x)reasonc                  C   s&   ddi} dddgdi}t | | dS )zz
    All strings are unicode in Python 3.x. Input doc and schema have equal strings and
    validation yield success.
    rc  rd  r$   rh  Nr!   ri  r   r   r   test_unicode_allowed_py3  s    rl  r%   zrequires python 2.xc                  C   s&   ddi} dddgdi}t | | dS )z
    Python 2.x encodes value of allowed using default encoding if the string includes
    characters outside ASCII range. Produced string does not match input which is an
    unicode string.
    rc  rd  r$   rh  Nr   ri  r   r   r   test_unicode_allowed_py2  s    	rm  c                  C   s   ddddiddidddd	gigd
i} ddi}t ||  ddi}t||  ddi}t||  ddi}t ||  ddi}t ||  dd	i}t ||  d S )NrR  r?   r   r   r&   r7   rT     r'   oneofr   r,   r_  r-  ra  r   r   r   
test_oneof  s"    	




rr  c                  C   s   ddddiddidddd	gigd
i} ddi}t ||  ddi}t||  ddi}t||  ddi}t||  ddi}t||  dd	i}t||  d S )NrR  r?   r   r   r&   r7   rn  rT  ro  )r'   Znoneofr   r,   r_  r3   ra  r   r   r   test_noneof4  s"    




rs  c                  C   s   dddddiddigidddid	d
igigii} ddi}t ||  ddi}t ||  ddi}t||  ddi}t ||  ddi}t ||  ddi}t||  ddi}t||  d S )NrR  r^  rU  r'   rl   r?   r   r&   r@   r   r_  r   rT  r`  g      rY  rZ  r3   ra  r   r   r   test_anyof_allof]  s*    	





rt  c           	      C   s  dddiddididddiddidig}ddg|d}d	d
|di}d	dddddidgi}t ||| d |d	 ddd t||| d |d	   t ||| d |d	 ddd |d	 d ddtj|fddtjddgfg}t||| d	dtj|f|d}t|ddtj| | j}d	|ks.t	d|d	 d ksDt	|d	 d d d dksbt	|d	 d d d }d |kst	d!|kst	|d  d"d#gigkst	|d! d"d#gigkst	|d	 d d$ d%gkst	d S )&Nr"   r'   r$   r?   zmodel numbercountserial numberrv  rX   rX  partsrr   rY   zMX-009r   rx  z898-001Zmiscr]   ZMonitors   )product namerv  r&   )ry  r1   )ry  r"   rU  )ry     )ry  r"   r'   )ry  r"   r   r1   r   r   zno definitions validatezanyof definition 0zanyof definition 1r{  r   r|  z"must be of ['dict', 'string'] type)
r   appendr   popr   r[  r   r   r   r   )	r   valid_partsZ
valid_itemr"   r   r   r  Zv_errorsZscoper   r   r   test_anyof_schemaz  sb    	
    r  c                  C   s   ddddddiidddddiidgii} ddd	dddiiid	dddiiigd
i}dddii}t ||  t || dddii}t ||  t || dddii}t||  t|| d S )NZproprU  rX   valr'   r?   rY   r$   r"   rX  r   r   g?r3   )Zschema1Zschema2r\  r   r   r   test_anyof_2  s.    	





r  c                  C   s0   ddddgii} t ddi|  t ddi|  d S )NZ
anyof_typer$   r?   r   r   r!   r9   r   r   r   test_anyof_type  s    r  c                  C   sd   dddddddidd	d
digdi} t dddii|  t dddii|  tddddi|  d S )Noneof_schemarX   digitsr?   r   r   )r'   r   r@   textr$   z
^[0-9]{2}$r   r'   r     Z84)r  r  r3   r9   r   r   r   test_oneof_schema  s    	r  c                  C   s<   dddddgiii} t dddii|  t ddd	ii|  d S )
NZnested_oneof_typer   
oneof_typer$   r?   r2   re  r   r1   r!   r9   r   r   r   test_nested_oneof_type  s
     r  c                 C   s   ddddddddgiidid	d
diigdi| _ ddddiii}ddddddgdgdgigigddgigdgi}t|| d | j|kstd S )NabcrX   r2   r   r  r?   rl   rY   rI  r'   r$   r  Zbadz#none or more than one rule validatezmust be of integer typezmust be of float type)zoneof definition 0zoneof definition 1r   r]   )r"   r   r   r   )r   r   rU   r   r   r   test_nested_oneofs  s@    

r  c                 C   sh   dddiddididddiddidig}dddg|d	i| _ dd
i}t|| d}t|dksdtd S )Nr"   r'   r$   r?   ru  rw  partrX   rX  r&   r]   r,   )r"   r   r   r   )r   r  r   r  r   r   r   #test_no_of_validation_if_type_fails*  s    r  c                 C   sX   ddddddidi}dddii}t ||| d	 t|}t ||| ||sTtd S )
NinforX   r    r$   Tr   rY   zmy namer]   )r   r   rA   r   )r   r"   r   rC   r   r   r   test_issue_1075  s    r  c                 C   s(   t dd i| d | jddgiks$td S )Nr+   r]   znull value not allowed)r   r   r   r]   r   r   r   %test_dont_type_validate_nulled_valuesE  s    r  c                 C   sf   ddiddddgidd}|  d	d
i| tjjtjj jd	dddgid}| jd	|giksbtd S )Nr*   FTr  r=  r>  r+  r?  r@  r  )r   r   )rA   r   r   r   rA  r   r   r   )r   r"   r   r   r   r   test_dependencies_errorJ  s     
r  c               
   C   s   ddidddiid} z2t ddd|  tdd	d|  td
di|  W n: tk
r } zt|dkrptdn W 5 d }~X Y nX d S )Nr'   rg   r%  deletedFr  r  r2   r  r  Tr  z'argument of type 'bool' is not iterablezBug #138 still exists, couldn't use boolean in dependency without putting it in a list.
'some_field': True vs 'some_field: [True])r   r   	TypeErrorstrr   )r"   er   r   r   1test_dependencies_on_boolean_field_with_one_valueV  s    
r  c                  C   sJ   ddidddgiid} t ddd|  tdd	d|  td
di|  d S )Nr'   rg   r%  r  Fr  r2   r  Tr  r3   r9   r   r   r   5test_dependencies_on_boolean_field_with_value_in_listk  s    r  c                  C   sH   G dd dt } |  }dddddiiii}ddi ii}t|||d d S )	Nc                   @   s   e Zd Zdd ZdS )z.test_document_path.<locals>.DocumentPathTesterc                 S   s,   | j }| jD ]}|| }q|| jks(tdS )r   N)rF  Zdocument_pathr   r   )r   r   r   r   Ztest_docZcrumbr   r   r   _validate_traily  s    

z>test_document_path.<locals>.DocumentPathTester._validate_trailN)r   r   r   r  r   r   r   r   DocumentPathTesterx  s   r  r2   r"   r   trailTr]   rJ  )r  rC   r"   r   r   r   r   test_document_pathw  s
    r  c                  C   sN   dddddid} t di i|  t di i|  t i |  ti i d|  d S )NrX   
that_fieldr'   excludesr'   
this_fieldr  r  r  r  r3   r9   r   r   r   test_excludes  s    
r  c                  C   sP   ddddddd} t di i|  t di i|  t i |  ti i d|  d S )NrX   r  r  r  r  r  r3   r9   r   r   r   test_mutual_excludes  s    
r  c                  C   s\   ddddddddd} t di i| dd t di i| dd ti |  ti i d	|  d S )
NrX   r  Tr'   r  r*   r  r  Fr   r  r3   r9   r   r   r   test_required_excludes  s    


r  c                  C   s   dddgddddddid} t di i|  t di i|  ti i d|  ti i d	|  ti i i d
|  t i i d|  d S )NrX   r  
bazo_fieldr  r  r'   )r  r  r  r  )r  r  )r  r  r  )r  r  r3   r9   r   r   r   test_multiples_exclusions  s    r  c                 C   s|   dddgddddddd| _ ti i d| d	 tj}| j|jtjj jd
ddg|jtjj jdddgdksxtd S )NrX   r  r  Tr  r  r  r  r]   z'this_field'r=   z'that_field', 'bazo_field')	r"   r   r   r   r   ZEXCLUDES_FIELDr   r   r   )r   r   r   r   r   test_bad_excludes_fields  s(    
  r  c                   C   s   t ddidddii d S )Nr   Tr'   ro   r   r   r   r   r   test_boolean_is_not_a_number  s    r  c                  C   sN   dt dddt ddddi} tdt dd	d
i|  tdt dd	di|  d S )Nr   il  r,   i        rS  i  rT     iO  r&   )r   r   r   r9   r   r   r   test_min_max_date  s    r  c                  C   s0   dddii} t di i|  tdddii|  d S )NrX   r(   r,   r2   r   r-  r9   r   r   r   test_dict_length  s    r  c                  C   s0   ddddgii} t ddi|  tddi|  d S )Nuser	forbiddenrootZadminZalicer-  r9   r   r   r   test_forbidden  s    r  c                  C   s,   dddii} t ddi|  t ddi|  d S )Namountr  )r           r   r  r   r9   r   r   r   test_forbidden_number  s    r  c                  C   sF   ddddddgiii} dddii}t || dd	tj| d d fd
 d S )Nrr   r"   r7   re  rf  rg  Zis_amapping)rr   r"   r-   )r   r   ZBAD_TYPE_FOR_SCHEMAr!  r   r   r   !test_mapping_with_sequence_schema  s    
r  c                  C   s8   ddddddgiiddi} ddddgi}t ||  d S )	Nrr   r2   r7   re  rf  rg  rX   )r"   r'   r   r!  r   r   r   !test_sequence_with_mapping_schema  s    r  c                  C   s4   dddgdi} ddi}t || ddtjdfd d S )Nr2   r$   re  rh  r   )r2   r'   r-   )r   r   r   r!  r   r   r   !test_type_error_aborts_validation   s      r  c                  C   sj   ddgdddgddgdi i d} t dd	d
|  t ddd|  tdd	d|  tddd
|  d S )Nr?   r,   rf  )r7   r%  r%   rg  rp  )re  rf  rg  r2   )re  rf  r   )re  rg  r3   r9   r   r   r   test_dependencies_in_oneof  s    

r  c                 C   s   dddddddiidddddiid	gii}ddd
ii}| || | j }t|dksZtt|ddtj|d d  t|d jdkstdd
ddi}t|| d d S )Nr  rq  rX   Tknownr'   r$   r  rY   sr,   )r  rq  r   Zasd)r  rC  r]   )r  r   r   r   r   ZONEOFr   r   )r   r"   r   r  r   r   r   #test_allow_unknown_with_oneof_rules  s0    

    
r  r   ))Graham Chapman	Eric IdleTerry Gilliamc                    s   t dd| ii}ddi}||s$tddi}||r8ttj|jd ksLt|jd tj jd  t fdddD s|td S )	NZactorscontains)r  r  r  )z	Eric idlezTerry JoneszJohn CleesezMichael Palinr   c                 3   s   | ]}| kV  qd S r   r   )ry   xZmissing_actorsr   r   r{   E  s     z test_contains.<locals>.<genexpr>)r  r  )r   r   r   ZMISSING_MEMBERSZdocument_error_treer  any)r   r   r   r   r  r   test_contains8  s    r  c                  C   sf   dddii} t dd}ti | |ddtjdfd tddi| | d	|_ti | | tddi| | d S )
Nr2   r'   r$   Trequire_all__require_all__r-   r   Fr   r   r   r/   r   r  r"   r   r   r   r   test_require_all_simpleH  s    
r  c                  C   s   ddddi} t dd}ti | | tddi| | d|_ti | | tddi| | ddddi} d|_ti | |ddtjdfd	 tddi| | d|_ti | |ddtjdfd	 tddi| | d S )
Nr2   r$   Fr   Tr  r   )r2   r*   r-   )r   r   r  r   r   r/   r  r   r   r   %test_require_all_override_by_requiredW  s0    
r  z*validator_require_all, sub_doc_require_allTF)repeatc                 C   s   dddii}dd||di}t | d}tdddii|| | rLti || nti || |rntdi i|| ntdi i|| d S )	Nr   r'   r$   r2   rX   )r'   r  r"   r  rI  )r   r   r   )Zvalidator_require_allZsub_doc_require_allZ
sub_schemar"   r   r   r   r   /test_require_all_override_by_subdoc_require_alls  s    
r  c               	   C   s   ddddddd} t dd}ti | |ddtjdfddtjdfgd	 tdd
i| | tdd
i| | td
d
d| | d|_ti | | tdd
i| | tdd
i| | td
d
d| | d S )Nr$   r   r  r2   r  Tr  r  rR   r   Fr  r  r   r   r   test_require_all_and_exclude  s(    
	r  c               	   C   sN   dddigi} dddddgdi}t | |dd	tjdddgddifffd
 d S )Nrc  ZsomerX   rr   re  rf  rg  rh  )rc  r7   r-   r   ri  r   r   r   'test_allowed_when_passing_list_of_dicts  s    
r  )	itertoolsr   sysr   r   randomr   r$   r   pytestr   Zcerberusr   r   Zcerberus.testsr	   r
   r   r   r   r   Zcerberus.tests.conftestr   r   r   r   r#   r0   r4   r:   r>   rD   rV   r[   r^   ra   rd   re   rh   rj   rm   rp   rs   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zparametrizer   r   r   r   r  r
  r  r  r  r  r  r  r  r"  r#  r$  r(  r*  r.  r2  r3  r4  r5  r6  r7  r<  rB  rD  rK  rO  rQ  r]  rb  rj  Zskipifversion_inforl  rm  rr  rs  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rr   productr  r  r  r   r   r   r   <module>   s*   
	 )6%(	!

  

	.

0)B!0
