B
    v9að9  ã               @   s¶   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dlm
Z
 dd„ ZG dd„ dejƒZG dd„ deƒZG d	d
„ d
ejƒZG dd„ dejƒZedkr²e ¡  dS )é    N)Úheaderregistryc             C   s   |   ¡ }| |¡ |S )N)ÚcopyÚupdate)Zbase_defaultsZdifferencesÚdefaults© r   ú!/usr/lib/python3.7/test_policy.pyÚmake_defaults   s    
r   c               @   sº  e Zd ZdZdddddddœZe ¡ Ze ddej	j
jdej	j
jdejjd	œ¡ ej	 
¡ Zej	jeei ƒej	jeei ƒej	jeed
diƒej	jeedddœƒej	jeedddœƒej	jeeddiƒeeei ƒiZejee d< 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 G d"d#„ d#ƒZ!G d$d%„ d%e"ƒZ#d&d'„ Z$d(d)„ Z%G d*d+„ d+ej	j
ƒZ&d,d-„ Z'd.d/„ Z(d0d1„ Z)G d2d3„ d3ƒZ*d4d5„ Z+d6d7„ Z,d8d9„ Z-d:d;„ Z.d<d=„ Z/dS )>ÚPolicyAPITestsTéN   Ú
Z8bitFN)Úmax_line_lengthÚlinesepZcte_typeÚraise_on_defectÚmangle_from_Úmessage_factoryZlong)Úutf8r   Úheader_factoryZrefold_sourceÚcontent_managerr   r   r   z
)r   r   )r   r   r   r   c             C   sf   x`| j  ¡ D ]R\}}xH| ¡ D ]<\}}| j||d  |  t||ƒ|d |¡¡ W d Q R X qW qW d S )N)ÚpolicyÚattrz2change {} docs/docstrings if defaults have changed)ÚpoliciesÚitemsÚsubTestÚassertEqualÚgetattrÚformat)Úselfr   Úexpectedr   Úvaluer   r   r   Útest_defaultsB   s    zPolicyAPITests.test_defaultsc             C   s€   xz| j  ¡ D ]l\}}xbt|ƒD ]V}| j||d> | d¡sRtttjj	|ƒt
jƒrVwn|  ||d |¡¡ W d Q R X qW qW d S )N)r   r   Ú_z{} is not fully tested)r   r   Údirr   Ú
startswithÚ
isinstancer   Úemailr   ÚEmailPolicyÚtypesÚFunctionTypeÚassertInr   )r   r   r   r   r   r   r   Útest_all_attributes_coveredJ   s    
z*PolicyAPITests.test_all_attributes_coveredc          	   C   sL   |   t¡}tj ¡  W d Q R X t|jƒ}d}x|D ]}|  ||¡ q4W d S )N)ÚfoldÚfold_binaryZheader_fetch_parseÚheader_source_parseÚheader_store_parse)ÚassertRaisesÚ	TypeErrorr$   r   ÚPolicyÚstrZ	exceptionr(   )r   ÚcmÚmsgZabstract_methodsÚmethodr   r   r   Útest_abcV   s    

zPolicyAPITests.test_abcc             C   sp   xj| j  ¡ D ]\\}}x4|D ],}|  t|d ¡ t||d ƒ W d Q R X qW |  td¡ d |_W d Q R X qW d S )Nz.*read-onlyzno attribute.*foo)r   r   ÚassertRaisesRegexÚAttributeErrorÚsetattrÚfoo)r   r   r   r   r   r   r   Útest_policy_is_immutableb   s    
z'PolicyAPITests.test_policy_is_immutablec             C   sT   xN| j  ¡ D ]@\}}dd„ |D ƒ}|jf |Ž}x|D ]}|  t||ƒ¡ q4W qW d S )Nc             S   s   i | ]
}d |“qS )Nr   )Ú.0r   r   r   r   ú
<dictcomp>n   s    zDPolicyAPITests.test_set_policy_attrs_when_cloned.<locals>.<dictcomp>)r   r   ÚcloneZassertIsNoner   )r   Úpolicyclassr   Ztestattrdictr   r   r   r   r   Ú!test_set_policy_attrs_when_clonedj   s
    
z0PolicyAPITests.test_set_policy_attrs_when_clonedc          
   C   sT   xN| j D ]D}|  t¡ |d d W d Q R X |  t¡ |d d W d Q R X qW d S )N)Z this_keyword_should_not_be_valid)Znewtline)r   r.   r/   )r   r>   r   r   r   Ú*test_reject_non_policy_keyword_when_calleds   s
    z9PolicyAPITests.test_reject_non_policy_keyword_when_calledc             C   sÚ   | j  ¡ }tjjjdd}tjjjdd}|| }|jdd x&| ¡ D ]\}}|  t	||ƒ|¡ qHW || }|jdd x&| ¡ D ]\}}|  t	||ƒ|¡ q„W |tjj }x&| ¡ D ]\}}|  t	||ƒ|¡ q¸W d S )Néd   )r   é2   )
Úpolicy_defaultsr   r$   r   Údefaultr=   r   r   r   r   )r   r   Úp1Úp2Zaddedr   r   r   r   r   Útest_policy_additionz   s    
z#PolicyAPITests.test_policy_additionc             C   sj   d}t j ¡ }d|d< t jjjdd}t jjjd d}|  | d|d ¡|¡ |  | d|d ¡|¡ d S )NzSubject: =?utf-8?q?=C3=A1?=
õ   Ã¡ÚSubjectr   )r   )r$   ÚmessageÚEmailMessager   rD   r=   r   r*   )r   r   r3   rE   rF   r   r   r   Útest_fold_zero_max_line_lengthŠ   s    
z-PolicyAPITests.test_fold_zero_max_line_lengthc             C   sh   G dd„ dƒ}|ƒ }t ƒ }tj ¡ }| ||¡ |  |j|g¡ t ƒ }| ||¡ |  |j||g¡ d S )Nc               @   s   e Zd Zdd„ ZdS )z2PolicyAPITests.test_register_defect.<locals>.Dummyc             S   s
   g | _ d S )N)Údefects)r   r   r   r   Ú__init__˜   s    z;PolicyAPITests.test_register_defect.<locals>.Dummy.__init__N)Ú__name__Ú
__module__Ú__qualname__rN   r   r   r   r   ÚDummy—   s   rR   )Úobjectr$   r   r%   Úregister_defectr   rM   )r   rR   ÚobjÚdefectr   Údefect2r   r   r   Útest_register_defect–   s    
z#PolicyAPITests.test_register_defectc               @   s   e Zd Zdd„ ZdS )zPolicyAPITests.MyObjc             C   s
   g | _ d S )N)rM   )r   r   r   r   rN   ¤   s    zPolicyAPITests.MyObj.__init__N)rO   rP   rQ   rN   r   r   r   r   ÚMyObj£   s   rY   c               @   s   e Zd ZdS )zPolicyAPITests.MyDefectN)rO   rP   rQ   r   r   r   r   ÚMyDefect§   s   rZ   c          	   C   s@   |   ¡ }|  d¡}|  | jd¡ tjj ||¡ W d Q R X d S )Nzthe telly is broken)rY   rZ   r6   r$   r   ÚstrictÚhandle_defect)r   r9   rV   r   r   r   Ú#test_handle_defect_raises_on_strictª   s    
z2PolicyAPITests.test_handle_defect_raises_on_strictc             C   sb   |   ¡ }|  d¡}tjj ||¡ |  |j|g¡ |  d¡}tjj ||¡ |  |j||g¡ d S )NÚoneÚtwo)rY   rZ   r$   r   rD   r\   r   rM   )r   r9   Údefect1rW   r   r   r   Ú#test_handle_defect_registers_defect°   s    

z2PolicyAPITests.test_handle_defect_registers_defectc                   s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )zPolicyAPITests.MyPolicyNc                s   t ƒ j|dg i|—Ž d S )NrM   )ÚsuperrN   )r   ÚargsÚkw)Ú	__class__r   r   rN   »   s    z PolicyAPITests.MyPolicy.__init__c             C   s   | j  |¡ d S )N)rM   Úappend)r   rU   rV   r   r   r   rT   ½   s    z'PolicyAPITests.MyPolicy.register_defect)rO   rP   rQ   rM   rN   rT   Ú__classcell__r   r   )re   r   ÚMyPolicy¹   s   rh   c          	   C   sD   |   ¡ }|  d¡}|  | jd¡ | jdd ||¡ W d Q R X d S )Nzthe telly is brokenT)r   )rY   rZ   r6   rh   r\   )r   r9   rV   r   r   r   Ú,test_overridden_register_defect_still_raisesÀ   s    
z;PolicyAPITests.test_overridden_register_defect_still_raisesc             C   s~   |   ¡ }|  d¡}|  ¡ }| ||¡ |  |j|g¡ |  |jg ¡ |  d¡}| ||¡ |  |j||g¡ |  |jg ¡ d S )Nr^   r_   )rY   rZ   rh   r\   r   rM   )r   r9   r`   Z	my_policyrW   r   r   r   Ú%test_overridden_register_defect_worksÆ   s    

z4PolicyAPITests.test_overridden_register_defect_worksc             C   s>   t jj dd¡}|  |jd¡ |  |tj¡ |  |tj	¡ d S )NZTestÚtest)
r$   r   rD   r   r   ÚnameÚassertIsInstancer   ÚUnstructuredHeaderZ
BaseHeader)r   Úhr   r   r   Útest_default_header_factoryÒ   s    z*PolicyAPITests.test_default_header_factoryc               @   s   e Zd ZejjZdS )zPolicyAPITests.FooN)rO   rP   rQ   r   rn   Úparser   r   r   r   ÚFooØ   s   rr   c             C   sx   t j ¡ }t j ¡ }|j d| j¡ | dd¡}|  || j¡ |  |tj	¡ | dd¡}|  || j¡ |  |tj	¡ d S )Nr9   rk   )
r$   r   r%   r   Úmap_to_typerr   rm   ZassertNotIsInstancer   rn   )r   Úpolicy1Úpolicy2ro   r   r   r   Ú$test_each_Policy_gets_unique_factoryÛ   s    

z3PolicyAPITests.test_each_Policy_gets_unique_factoryc             C   sZ   t j ¡ }| ¡ }|j d| j¡ | dd¡}|  || j¡ | dd¡}|  || j¡ d S )Nr9   rk   )r$   r   r%   r=   r   rs   rr   rm   )r   rt   ru   ro   r   r   r   Útest_clone_copies_factoryæ   s    
z(PolicyAPITests.test_clone_copies_factoryc             C   sH   t j ¡ }|j}|t jj }|  |j|¡ t jj| }|  |j|¡ d S )N)r$   r   r%   r   r[   r   )r   ZmypolicyZ	myfactoryÚ	newpolicyr   r   r   Ú"test_new_factory_overrides_defaultï   s    
z1PolicyAPITests.test_new_factory_overrides_defaultc             C   s:   t jjt jj }|  |jt jjj¡ |  |jddi¡ d S )Nr   T)r$   r   rD   r[   r   r   r%   Ú__dict__)r   rx   r   r   r   Ú6test_adding_default_policies_preserves_default_factory÷   s    zEPolicyAPITests.test_adding_default_policies_preserves_default_factoryc             C   s,   t jjjdd}| dd¡}|  |d¡ d S )Né   )r   rI   u   Ä…Ä…Ä…Ä…Ä…Ä…Ä…Ä…Ä…Ä…Ä…Ä…zúSubject: 
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
 =?utf-8?q?=C4=85?=
)r$   r   rD   r=   r*   r   )r   r   Úactualr   r   r   Ú*test_non_ascii_chars_do_not_cause_inf_loopý   s
    z9PolicyAPITests.test_non_ascii_chars_do_not_cause_inf_loop)0rO   rP   rQ   ZlongMessageZcompat32_defaultsr   rC   r   r$   r   r%   r   r   rJ   rK   Z
new_policyZcompat32r   rD   ZSMTPZSMTPUTF8ZHTTPr[   r   r   r)   r5   r:   r?   r@   rG   rL   rX   rY   Ú	ExceptionrZ   r]   ra   rh   ri   rj   rp   rr   rv   rw   ry   r{   r~   r   r   r   r   r	      sl   




			r	   c               @   s   e Zd ZdS )ÚTestExceptionN)rO   rP   rQ   r   r   r   r   r€   
  s   r€   c               @   sz   e Zd ZG dd„ dejjƒZdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestPolicyPropagationc               @   s(   e Zd Zdd„ Ze Z ZZe ZZdS )zTestPolicyPropagation.MyPolicyc             O   s   t dƒ‚d S )Nrk   )r€   )r   rc   rd   r   r   r   Ú	badmethod  s    z(TestPolicyPropagation.MyPolicy.badmethodN)	rO   rP   rQ   r‚   r*   r+   Zheader_fetch_parserr,   r-   r   r   r   r   rh     s   rh   c          	   C   s,   |   td¡ tjd| jd W d Q R X d S )Nz^test$zSubject: test

)r   )r6   r€   r$   Úmessage_from_stringrh   )r   r   r   r   Útest_message_from_string  s    z.TestPolicyPropagation.test_message_from_stringc          	   C   s,   |   td¡ tjd| jd W d Q R X d S )Nz^test$s   Subject: test

)r   )r6   r€   r$   Zmessage_from_bytesrh   )r   r   r   r   Útest_message_from_bytes  s    z-TestPolicyPropagation.test_message_from_bytesc          	   C   s6   t  d¡}|  td¡ tj|| jd W d Q R X d S )NzSubject: test

z^test$)r   )ÚioÚStringIOr6   r€   r$   Zmessage_from_filerh   )r   Úfr   r   r   Útest_message_from_file"  s    
z,TestPolicyPropagation.test_message_from_filec          	   C   s6   t  d¡}|  td¡ tj|| jd W d Q R X d S )Ns   Subject: test

z^test$)r   )r†   ÚBytesIOr6   r€   r$   Zmessage_from_binary_filerh   )r   rˆ   r   r   r   Útest_message_from_binary_file'  s    
z3TestPolicyPropagation.test_message_from_binary_filec          	   C   s6   t jj| jd}|  td¡ | d¡ W d Q R X d S )N)r   z^test$zSubject: test

)r$   ÚparserZParserrh   r6   r€   Zparsestr)r   Úpr   r   r   Útest_parser.  s    z!TestPolicyPropagation.test_parserc          	   C   s6   t jj| jd}|  td¡ | d¡ W d Q R X d S )N)r   z^test$s   Subject: test

)r$   rŒ   ZBytesParserrh   r6   r€   Z
parsebytes)r   r   r   r   r   Útest_bytes_parser3  s    z'TestPolicyPropagation.test_bytes_parserúSubject: test

Nc             C   s*   |d krt jj ¡ n|| _t j|| jdS )N)r   )r$   r   rD   r=   rƒ   )r   Úsourcer   r   r   r   Ú	_make_msg<  s    zTestPolicyPropagation._make_msgc             C   s   |   ¡ }|  |j| j¡ d S )N)r’   ÚassertIsr   )r   r3   r   r   r   Ú(test_parser_propagates_policy_to_message@  s    z>TestPolicyPropagation.test_parser_propagates_policy_to_messagec             C   s6   |   t d¡¡}x | ¡ D ]}|  |j| j¡ qW d S )Na+              Subject: mime test
            MIME-Version: 1.0
            Content-Type: multipart/mixed, boundary="XXX"

            --XXX
            Content-Type: text/plain

            test
            --XXX
            Content-Type: text/plain

            test2
            --XXX--
            )r’   ÚtextwrapÚdedentÚwalkr“   r   )r   r3   Úpartr   r   r   Ú-test_parser_propagates_policy_to_sub_messagesD  s    zCTestPolicyPropagation.test_parser_propagates_policy_to_sub_messagesc             C   sL   | j dtjjjddd}t ¡ }tj |¡}| 	|¡ |  
| ¡ d¡ d S )NzSubject: test
To: foo

ÚX)r   )r   zSubject: testXTo: fooXX)r’   r$   r   rD   r=   r†   r‡   Ú	generatorÚ	GeneratorZflattenr   Úgetvalue)r   r3   ÚsÚgr   r   r   Ú+test_message_policy_propagates_to_generatorW  s    
zATestPolicyPropagation.test_message_policy_propagates_to_generatorc             C   s.   | j dtjjjddd}|  | ¡ d¡ d S )NzSubject: test
To: foo

rš   )r   )r   zSubject: testXTo: fooXX)r’   r$   r   rD   r=   r   Z	as_string)r   r3   r   r   r   Ú%test_message_policy_used_by_as_string_  s    z;TestPolicyPropagation.test_message_policy_used_by_as_string)r   N)rO   rP   rQ   r$   r   r0   rh   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d„ ZdS )ÚTestConcretePoliciesc             C   s    t j ¡ }|  t|jdd¡ d S )NZFromzspam
egg@foo.py)r$   r   r%   r.   Ú
ValueErrorr-   )r   Úinstancer   r   r   Ú(test_header_store_parse_rejects_newlinesg  s    
z=TestConcretePolicies.test_header_store_parse_rejects_newlinesN)rO   rP   rQ   r¥   r   r   r   r   r¢   e  s   r¢   Ú__main__)r†   Úsysr&   r•   ZunittestZemail.policyr$   Zemail.parserZemail.generatorZemail.messager   r   ZTestCaser	   r   r€   r   r¢   rO   Úmainr   r   r   r   Ú<module>   s"    zX	