a
    åze‰  ã                   @   s„   d dl Z d dlmZmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZ eG dd„ deƒƒZeG dd	„ d	eƒƒZed
kr€e  ¡  dS )é    N)ÚTestEmailBaseÚparameterize)Úpolicy)ÚEmailMessage)ÚContentManagerÚraw_data_managerc                   @   sÌ   e Zd ZejZeZddddœZdd„ Zdd„ Z	d	d
„ Z
G dd„ deƒZe d d ZG dd„ deƒZe d d ZdefdefdddefdefdddefddddœZdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)S )*ÚTestContentManager)é   ú
text/plain)é   Útext)é   Ú )Z	full_typeZmaintype_onlyÚnull_keyc                 C   sN   d
dd„}t ƒ }| ||¡ |  ¡ }d|d< d|d< |  |j|ddd	¡ d S )Nc                 S   s   | d }||fS ©NúX-Bar-Header© )ÚmsgÚfooÚbarr   r   ú9/usr/lib/python3.9/test/test_email/test_contentmanager.pyÚ
foo_getter   s    zATestContentManager.get_key_as_get_content_key.<locals>.foo_getterr
   úContent-Typer   r   r   ©r   )r   r   )N)r   Úadd_get_handlerÚ_make_messageÚassertEqualÚget_content)ÚselfÚorderÚkeyr   ÚcmÚmr   r   r   Úget_key_as_get_content_key   s    
z-TestContentManager.get_key_as_get_content_keyc                 C   s€   dd„ }dd„ }t ƒ }| ||¡ | j ¡ D ]\}}||kr,| ||¡ q,|  ¡ }d|d< d|d< d	|d
< |  | |¡d	¡ d S )Nc                 S   s   | d S r   r   ©r   r   r   r   Ú
bar_getter!   s    zGTestContentManager.get_key_as_get_content_key_order.<locals>.bar_getterc                 S   s   | d S ©NúX-Foo-Headerr   r$   r   r   r   r   #   s    zGTestContentManager.get_key_as_get_content_key_order.<locals>.foo_getterr
   r   r   r   r   r'   )r   r   Úget_key_paramsÚvaluesr   r   r   )r   r   r    r%   r   r!   Ú
precedencer"   r   r   r   Ú get_key_as_get_content_key_order    s    z3TestContentManager.get_key_as_get_content_key_orderc                 C   sP   t ƒ }|  ¡ }d|d< |  td¡ | |¡ W d   ƒ n1 sB0    Y  d S )Nr
   r   )r   r   ÚassertRaisesRegexÚKeyErrorr   ©r   r!   r"   r   r   r   Ú:test_get_content_raises_if_unknown_mimetype_and_no_default0   s
    zMTestContentManager.test_get_content_raises_if_unknown_mimetype_and_no_defaultc                   @   s   e Zd ZdS )úTestContentManager.BaseThingN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   Ú	BaseThing7   s   r5   Ú.r0   c                   @   s   e Zd ZdS )úTestContentManager.ThingNr1   r   r   r   r   ÚThing:   s   r8   r7   r   r	   )r   r7   )r   r8   é   é   )é   r0   )é   r5   é   )é	   zbuiltins.str)é
   Ústr)é   N)ÚtypeÚ	full_pathÚqualnameÚnameZ	base_typeZbase_full_pathZbase_qualnameÚ	base_nameZstr_typeZstr_full_pathZstr_namer   c                 C   s`   ddd„}t ƒ }| ||¡ |  ¡ }|  ¡ }|j||dd |  |d d¡ |  | ¡ |¡ d S )Nc                 S   s   || d< |   |¡ d S r&   ©Úset_payload)r   Úobjr   r   r   r   Ú
foo_setterN   s    zATestContentManager.set_key_as_set_content_key.<locals>.foo_setterr   r   r'   )N)r   Úadd_set_handlerr   r8   Úset_contentr   Úget_payload)r   r   r    rJ   r!   r"   Úmsg_objr   r   r   Úset_key_as_set_content_keyM   s    
z-TestContentManager.set_key_as_set_content_keyc           	      C   sŠ   dd„ }dd„ }t ƒ }| ||¡ | j ¡ D ]\}}||kr,| ||¡ q,|  ¡ }|  ¡ }| ||¡ |  |d d¡ |  | ¡ |¡ d S )Nc                 S   s   d| d< |   |¡ d S )Nr   úX-FooBar-HeaderrG   ©r   rI   r   r   r   rJ   Z   s    zGTestContentManager.set_key_as_set_content_key_order.<locals>.foo_setterc                 S   s   d| d< d S )Nr   rP   r   rQ   r   r   r   Ú
bar_setter]   s    zGTestContentManager.set_key_as_set_content_key_order.<locals>.bar_setterrP   r   )	r   rK   r(   r)   r   r8   rL   r   rM   )	r   r   r    rJ   rR   r!   r*   r"   rN   r   r   r   Ú set_key_as_set_content_key_orderY   s    z3TestContentManager.set_key_as_set_content_key_orderc                 C   sT   t ƒ }|  ¡ }|  ¡ }|  t| j¡ | ||¡ W d   ƒ n1 sF0    Y  d S ©N)r   r   r8   r,   r-   Útestobject_full_pathrL   )r   r!   r"   rN   r   r   r   Ú6test_set_content_raises_if_unknown_type_and_no_defaultj   s
    zITestContentManager.test_set_content_raises_if_unknown_type_and_no_defaultc                 C   sP   t ƒ }|  ¡ }d|d< |  t¡ | |d¡ W d   ƒ n1 sB0    Y  d S )Nzmultipart/foor   Útest)r   r   ÚassertRaisesÚ	TypeErrorrL   r.   r   r   r   Ú.test_set_content_raises_if_called_on_multipartq   s
    zATestContentManager.test_set_content_raises_if_called_on_multipartc                 C   sŒ   |   ¡ }d|d< d|d< d|d< | d¡ tƒ }| tdd	„ ¡ |jd
|d |  |d ¡ |  |d ¡ |  |d d¡ |  | ¡ ¡ d S )Nr   zContent-Fooz	text/htmlr   rW   ÚToÚabcc                  _   s   d S rT   r   )ÚargsÚkwr   r   r   Ú<lambda>   ó    zITestContentManager.test_set_content_calls_clear_content.<locals>.<lambda>Úxyz)Úcontent_manager)	r   rH   r   rK   r@   rL   ZassertIsNoner   rM   )r   r"   r!   r   r   r   Ú$test_set_content_calls_clear_contentx   s    
z7TestContentManager.test_set_content_calls_clear_contentN)r2   r3   r4   r   Údefaultr   Úmessager(   r#   r+   r/   r@   r5   Zbaseobject_full_pathr8   rU   Zset_key_paramsrO   rS   rV   rZ   rc   r   r   r   r   r   	   s>   ýôr   c                   @   sî  e Zd ZejjdedZe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)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Z d3d4„ Z!d5d6„ Z"d7d8„ Z#d9d:„ Z$d;d<„ Z%d=d>„ Z&d?d@„ Z'dAdB„ Z(dCdD„ Z)dEdF„ Z*dGdH„ Z+dIdJ„ Z,dKdL„ Z-dMdN„ Z.dOdP„ Z/dQdR„ Z0dSdT„ Z1dUdV„ Z2dWdX„ Z3dYdZ„ Z4d[d\„ Z5d]d^„ Z6d_d`„ Z7dadb„ Z8dcdd„ Z9dedfdgdheƒ difeƒ djfdkœZ:dldm„ Z;dndo„ Z<dpdq„ Z=drds„ Z>dtdu„ Z?dvS )wÚTestRawDataManageré<   )Úmax_line_lengthrb   c                 C   s&   |   t d¡¡}|  t |¡d¡ d S )NúJ            Content-Type: text/plain

            Basic text.
            zBasic text.
©Ú_str_msgÚtextwrapÚdedentr   r   r   ©r   r"   r   r   r   Útest_get_text_plain”   s    z&TestRawDataManager.test_get_text_plainc                 C   s&   |   t d¡¡}|  t |¡d¡ d S )NzP            Content-Type: text/html

            <p>Basic text.</p>
            z<p>Basic text.</p>
rj   rn   r   r   r   Útest_get_text_htmlœ   s    ÿz%TestRawDataManager.test_get_text_htmlc                 C   s,   |   t d¡ d¡¡}|  t |¡d¡ d S )Nu\               Content-Type: text/plain; charset=latin1

            BasÃ¬c tÃ«xt.
            Úlatin1õ   BasÃ¬c tÃ«xt.
)Z
_bytes_msgrl   rm   Úencoder   r   r   rn   r   r   r   Útest_get_text_plain_latin1¥   s    üz-TestRawDataManager.test_get_text_plain_latin1c                 C   s&   |   t d¡¡}|  t |¡d¡ d S )Nz™            Content-Type: text/plain; charset="latin-1"
            Content-Transfer-Encoding: quoted-printable

            Bas=ECc t=EBxt.
            rr   rj   rn   r   r   r   Ú+test_get_text_plain_latin1_quoted_printable­   s    z>TestRawDataManager.test_get_text_plain_latin1_quoted_printablec                 C   s&   |   t d¡¡}|  t |¡d¡ d S )Nz‘            Content-Type: text/plain; charset="utf8"
            Content-Transfer-Encoding: base64

            QmFzw6xjIHTDq3h0Lgo=
            rr   rj   rn   r   r   r   Útest_get_text_plain_utf8_base64¶   s    z2TestRawDataManager.test_get_text_plain_utf8_base64c                 C   s&   |   t d¡¡}|  t |¡d¡ d S )NúŸ            Content-Type: text/plain; charset="utf8"
            Content-Transfer-Encoding: quoted-printable

            Bas=c3=acc t=c3=abxt=fd.
            u   BasÃ¬c tÃ«xtï¿½.
rj   rn   r   r   r   Ú-test_get_text_plain_bad_utf8_quoted_printable¿   s    z@TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printablec                 C   s*   |   t d¡¡}|  tj|ddd¡ d S )Nrw   Úignore©Úerrorsrr   rj   rn   r   r   r   Ú;test_get_text_plain_bad_utf8_quoted_printable_ignore_errorsÈ   s    ÿzNTestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable_ignore_errorsc                 C   s*   |   t d¡¡}|  tj|ddd¡ d S )Nu“               Content-Type: text/plain; charset="utf8"
            Content-Transfer-Encoding: base64

            QmFzw6xjIHTDq3h0LgoÃ¿=
            ry   rz   rr   rj   rn   r   r   r   Ú8test_get_text_plain_utf8_base64_recoverable_bad_CTE_dataÒ   s    ÿzKTestRawDataManager.test_get_text_plain_utf8_base64_recoverable_bad_CTE_datac                 C   sL   |   t d¡¡}|  t¡ tj|dd W d   ƒ n1 s>0    Y  d S )Nri   ry   r   ©rk   rl   rm   rX   rY   r   r   rn   r   r   r   Útest_get_text_invalid_keywordÜ   s    z0TestRawDataManager.test_get_text_invalid_keywordc              	   C   sn   t  d¡}d ¡ D ]V}| j|d6 |  | |d ¡¡}|  t |¡d¡ W d   ƒ q1 s^0    Y  qd S )Nzu            Content-Type: {}
            Content-Transfer-Encoding: base64

            Ym9ndXMgZGF0YQ==
            zaudio image video application)Úmaintypez/foos
   bogus data)	rl   rm   ÚsplitÚsubTestrk   Úformatr   r   r   )r   Útemplater€   r"   r   r   r   Útest_get_non_textå   s
    
z$TestRawDataManager.test_get_non_textc                 C   sL   |   t d¡¡}|  t¡ tj|dd W d   ƒ n1 s>0    Y  d S )Nz|            Content-Type: image/jpg
            Content-Transfer-Encoding: base64

            Ym9ndXMgZGF0YQ==
            ry   rz   r~   rn   r   r   r   Ú!test_get_non_text_invalid_keywordñ   s    z4TestRawDataManager.test_get_non_text_invalid_keywordc                 C   sH   |   t d¡¡}|  t¡ t |¡ W d   ƒ n1 s:0    Y  d S )Nzm            Content-Type: multipart/mixed; boundary="==="

            --===
            --===--
            )rk   rl   rm   rX   r-   r   r   rn   r   r   r   Útest_get_raises_on_multipartû   s    z/TestRawDataManager.test_get_raises_on_multipartc              	   C   sª   t  d¡}d ¡ D ]’}| j|dr |  | |¡¡}t |¡}|  || j	¡ |  
t |¡d¡ |  
|d d¡ |  
|d jd jd	¡ W d   ƒ q1 sš0    Y  qd S )
Nz±            Content-Type: message/{}

            To: foo@example.com
            From: bar@example.com
            Subject: example

            an example message
            úrfc822 external-body©Úsubtypezan example message
Útoúfoo@example.comÚfromr   r   )rl   rm   r   r‚   rk   rƒ   r   r   ÚassertIsInstancere   r   Z	addressesÚusername)r   r„   rŠ   r"   Zsub_msgr   r   r   Ú)test_get_message_rfc822_and_external_body  s    
	
ÿz<TestRawDataManager.test_get_message_rfc822_and_external_bodyc                 C   s.   |   t d¡¡}|  t |¡d d… d¡ d S )NzÈ            Content-Type: message/partial

            To: foo@example.com
            From: bar@example.com
            Subject: example

            The real body is in another message.
            r?   s
   To: foo@exrj   rn   r   r   r   Ú9test_get_message_non_rfc822_or_external_body_yields_bytes  s    	zLTestRawDataManager.test_get_message_non_rfc822_or_external_body_yields_bytesc                 C   s\   |   ¡ }d}t ||¡ |  t|ƒt d¡¡ |  |jdd d¡|¡ |  | 	¡ |¡ d S )NúSimple message.
z‹            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 7bit

            Simple message.
            T©Údecodeúutf-8©
r   r   rL   r   r@   rl   rm   rM   r”   r   ©r   r"   Úcontentr   r   r   Útest_set_text_plain%  s    z&TestRawDataManager.test_set_text_plainc                 C   s\   |   ¡ }d}t ||¡ |  t|ƒt d¡¡ |  |jdd d¡d¡ |  | 	¡ d¡ d S )Nr   zp            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 7bit


            Tr“   r•   Ú
r–   r—   r   r   r   Útest_set_text_plain_null2  s    z+TestRawDataManager.test_set_text_plain_nullc                 C   s`   |   ¡ }d}tj||dd |  t|ƒt d¡¡ |  |jdd d¡|¡ |  | 	¡ |¡ d S )Nz<p>Simple message.</p>
Úhtmlr‰   z‘            Content-Type: text/html; charset="utf-8"
            Content-Transfer-Encoding: 7bit

            <p>Simple message.</p>
            Tr“   r•   r–   r—   r   r   r   Útest_set_text_html?  s    z%TestRawDataManager.test_set_text_htmlc                 C   s`   |   ¡ }d}tj||dd |  t|ƒt d¡¡ |  |jdd d¡|¡ |  | 	¡ |¡ d S )Nr’   úlatin-1©Úcharsetz            Content-Type: text/plain; charset="iso-8859-1"
            Content-Transfer-Encoding: 7bit

            Simple message.
            Tr“   r•   r–   r—   r   r   r   Útest_set_text_charset_latin_1L  s    z0TestRawDataManager.test_set_text_charset_latin_1c                 C   s\   |   ¡ }d}t ||¡ |  t|ƒt d¡¡ |  |jdd d¡|¡ |  | 	¡ |¡ d S )NzTSimple but long message that is over 78 characters long to force transfer encoding.
zé            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: quoted-printable

            Simple but long message that is over 78 characters long to =
            force transfer encoding.
            Tr“   r•   r–   r—   r   r   r   Ú(test_set_text_plain_long_line_heuristicsY  s    z;TestRawDataManager.test_set_text_plain_long_line_heuristicsc                 C   sb   |   ¡ }d}t ||¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )Nu7   et lÃ  il est montÃ© sur moi et il commence Ã  m'Ã©to.
u²               Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 8bit

            et lÃ  il est montÃ© sur moi et il commence Ã  m'Ã©to.
            r•   Tr“   ©r   r   rL   r   Úbytesrl   rm   rs   rM   r”   r   r—   r   r   r   Ú5test_set_text_short_line_minimal_non_ascii_heuristicsh  s    ûzHTestRawDataManager.test_set_text_short_line_minimal_non_ascii_heuristicsc                 C   sb   |   ¡ }d}t ||¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )Nus   j'ai un problÃ¨me de python. il est sorti de son vivarium.  et lÃ  il est montÃ© sur moi et il commence Ã  m'Ã©to.
a*              Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: quoted-printable

            j'ai un probl=C3=A8me de python. il est sorti de son vivari=
            um.  et l=C3=A0 il est mont=C3=A9 sur moi et il commence =
            =C3=A0 m'=C3=A9to.
            r•   Tr“   r£   r—   r   r   r   Ú4test_set_text_long_line_minimal_non_ascii_heuristicsu  s    ùzGTestRawDataManager.test_set_text_long_line_minimal_non_ascii_heuristicsc                 C   sb   |   ¡ }d}t ||¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )Nu}   









j'ai un problÃ¨me de python. il est sorti de son vivarium.  et lÃ  il est montÃ© sur moi et il commence Ã  m'Ã©to.
a@              Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: quoted-printable
            










            j'ai un probl=C3=A8me de python. il est sorti de son vivari=
            um.  et l=C3=A0 il est mont=C3=A9 sur moi et il commence =
            =C3=A0 m'=C3=A9to.
            r•   Tr“   r£   r—   r   r   r   Ú=test_set_text_11_lines_long_line_minimal_non_ascii_heuristics†  s    ùzPTestRawDataManager.test_set_text_11_lines_long_line_minimal_non_ascii_heuristicsc                 C   sb   |   ¡ }d}t ||¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )Nõ   Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘.
u               Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 8bit

            Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘.
            r•   Tr“   r£   r—   r   r   r   Ú*test_set_text_maximal_non_ascii_heuristics˜  s    ûz=TestRawDataManager.test_set_text_maximal_non_ascii_heuristicsc                 C   sb   |   ¡ }d}t ||¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )Nu   









Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘.
u£               Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 8bit
            










            Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘.
            r•   Tr“   r£   r—   r   r   r   Ú3test_set_text_11_lines_maximal_non_ascii_heuristics¥  s    ûzFTestRawDataManager.test_set_text_11_lines_maximal_non_ascii_heuristicsc                 C   sb   |   ¡ }d}t ||¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )NuÂ   Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘.
a¶              Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: base64

            w6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TDqcOoxJnD
            tsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TDqcOo
            xJnDtsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOgw6TD
            qcOoxJnDtsWRw6HDoMOkw6nDqMSZw7bFkcOhw6DDpMOpw6jEmcO2xZHDocOg
            w6TDqcOoxJnDtsWRLgo=
            r•   Tr“   r£   r—   r   r   r   Ú4test_set_text_long_line_maximal_non_ascii_heuristics²  s    	÷
zGTestRawDataManager.test_set_text_long_line_maximal_non_ascii_heuristicsc                 C   sb   |   ¡ }d}t |d¡ |  t|ƒt d¡ d¡¡ |  |jdd 	d¡|¡ |  | 
¡ |¡ d S )NuÌ   









Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘Ã¡Ã Ã¤Ã©Ã¨Ä™Ã¶Å‘.
ak              Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: quoted-printable
            










            =C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=
            =A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=
            =C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=
            =A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=
            =C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=
            =91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=
            =C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=
            =A4=C3=A9=C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=
            =C3=A8=C4=99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=
            =99=C3=B6=C5=91=C3=A1=C3=A0=C3=A4=C3=A9=C3=A8=C4=99=C3=B6=
            =C5=91.
            r•   Tr“   r£   r—   r   r   r   Ú=test_set_text_11_lines_long_line_maximal_non_ascii_heuristicsÅ  s    ñzPTestRawDataManager.test_set_text_11_lines_long_line_maximal_non_ascii_heuristicsc                 C   sF   |   ¡ }|  t¡  tj|ddd W d   ƒ n1 s80    Y  d S )Nr¨   Ú7bit©Úcte©r   rX   ÚUnicodeErrorr   rL   rn   r   r   r   Ú,test_set_text_non_ascii_with_cte_7bit_raisesä  s    z?TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_raisesc                 C   sF   |   ¡ }|  t¡  tj|ddd W d   ƒ n1 s80    Y  d S )Nr¨   ÚasciirŸ   r°   rn   r   r   r   Ú1test_set_text_non_ascii_with_charset_ascii_raisesé  s    zDTestRawDataManager.test_set_text_non_ascii_with_charset_ascii_raisesc                 C   sH   |   ¡ }|  t¡" tj|dddd W d   ƒ n1 s:0    Y  d S )Nr¨   r­   r³   )r¯   r    r°   rn   r   r   r   Ú>test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raisesî  s    zQTestRawDataManager.test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raisesc                 C   s¶   |   ¡ }d|d< |   ¡ }d|d< d|d< d|d< | d¡ t ||¡ |  t|ƒt d	¡¡ | d
¡}|  || j	¡ |  t|ƒt|ƒ¡ |  | 
¡ | j	¡ |  t| 
¡ ƒt|ƒ¡ d S )NzForwarded messageÚSubjectzpython@vivarium.orgr[   úpolice@monty.orgÚFromzget back in your boxzOr face the comfy chair.a               Subject: Forwarded message
            Content-Type: message/rfc822
            Content-Transfer-Encoding: 8bit

            To: python@vivarium.org
            From: police@monty.org
            Subject: get back in your box
            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 7bit
            MIME-Version: 1.0

            Or face the comfy chair.
            r   )r   rL   r   r   r@   rl   rm   rM   rŽ   re   r   )r   r"   r˜   Úpayloadr   r   r   Útest_set_messageó  s    

z#TestRawDataManager.test_set_messagec                 C   s®   |   ¡ }d|d< |   ¡ }d|d< d|d< d|d< | d¡ t ||¡ |  t|ƒt d	¡ d
¡¡ |  |j| j	j
dt d¡¡ |  | ¡ | j¡ |  t| ¡ ƒt|ƒ¡ d S )NzEscape reportr¶   r·   r[   zvictim@monty.orgr¸   ZHelpu:   j'ai un problÃ¨me de python. il est sorti de son vivarium.u«              Subject: Escape report
            Content-Type: message/rfc822
            Content-Transfer-Encoding: 8bit

            To: police@monty.org
            From: victim@monty.org
            Subject: Help
            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 8bit
            MIME-Version: 1.0

            j'ai un problÃ¨me de python. il est sorti de son vivarium.
            r•   )ZmaxheaderlenaÐ              Subject: Escape report
            Content-Type: message/rfc822
            Content-Transfer-Encoding: 8bit

            To: police@monty.org
            From: victim@monty.org
            Subject: Help
            Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: base64
            MIME-Version: 1.0

            aidhaSB1biBwcm9ibMOobWUgZGUgcHl0aG9uLiBpbCBlc3Qgc29ydGkgZGUgc29uIHZpdmFyaXVt
            Lgo=
            )r   rL   r   r   r¤   rl   rm   rs   Z	as_stringr   rh   rŽ   r   re   r@   r—   r   r   r   Ú4test_set_message_with_non_ascii_and_coercion_to_7bit  s     
óÿzGTestRawDataManager.test_set_message_with_non_ascii_and_coercion_to_7bitc                 C   sZ  |   ¡ }|   ¡ }d ¡ D ]œ}d ¡ D ]Ž}| j||dl |  t¡ }|j|||d W d   ƒ n1 sh0    Y  t|jƒ}|  ||¡ |  ||¡ W d   ƒ q$1 s¨0    Y  q$qd}d ¡ D ]’}| j||dn |  t¡ }|j|||d W d   ƒ n1 s0    Y  t|jƒ}|  ||¡ |  ||¡ W d   ƒ qÂ1 sJ0    Y  qÂd S )Nzquoted-printable base64rˆ   )r¯   rŠ   r®   úexternal-bodyz8bit binary)	r   r   r‚   rX   Ú
ValueErrorrL   r@   Ú	exceptionZassertIn)r   r"   r˜   r¯   rŠ   ÚarÚexcr   r   r   Ú#test_set_message_invalid_cte_raises@  s$    .
.0
z6TestRawDataManager.test_set_message_invalid_cte_raisesc              	   C   sš   dt dƒtdƒfD ]‚}| j|db |  ¡ }t ||dd¡ |  t|ƒt 	d¡¡ |  |j
dd|¡ |  | ¡ |¡ W d   ƒ q1 sŠ0    Y  qd S )Ns   bogus content)r˜   ÚimageÚjpegz¡                    Content-Type: image/jpeg
                    Content-Transfer-Encoding: base64

                    Ym9ndXMgY29udGVudA==
                    Tr“   )Ú	bytearrayÚ
memoryviewr‚   r   r   rL   r   r@   rl   rm   rM   r   )r   r˜   r"   r   r   r   Útest_set_image_jpgT  s    þz%TestRawDataManager.test_set_image_jpgc                 C   sb   |   ¡ }d}|j|dddd |  t|ƒt d¡ d¡¡ |  |jdd	|¡ |  | ¡ |¡ d S )
Nót   bÿgus	con
tent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzZaudioZaifzquoted-printabler®   a              Content-Type: audio/aif
            Content-Transfer-Encoding: quoted-printable
            MIME-Version: 1.0

            b=FFgus=09con=0At=0Dent=20zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
            zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrž   Tr“   ©	r   rL   r   r¤   rl   rm   rs   rM   r   r—   r   r   r   Ú,test_set_audio_aif_with_quoted_printable_cted  s    	úz?TestRawDataManager.test_set_audio_aif_with_quoted_printable_ctec                 C   sj   |   ¡ }d}|j|dddd |  t|ƒt d¡ d¡d d	 ¡ |  |jd
d|¡ |  | ¡ |¡ d S )NrÇ   ZvideoZmpegÚbinaryr®   z~            Content-Type: video/mpeg
            Content-Transfer-Encoding: binary
            MIME-Version: 1.0

            r³   s7   bÿgus	con
t
ent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzs=   zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzTr“   rÈ   r—   r   r   r   Ú#test_set_video_mpeg_with_binary_ctez  s    ûø	÷
z6TestRawDataManager.test_set_video_mpeg_with_binary_ctec                 C   sj   |   ¡ }d}|j|dddd |  t|ƒt d¡ d¡d d	 ¡ |  |jd
d|¡ |  | ¡ |¡ d S )NsM   bÿgus	con
tent
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Úapplicationúoctet-streamZ8bitr®   zŠ            Content-Type: application/octet-stream
            Content-Transfer-Encoding: 8bit
            MIME-Version: 1.0

            r³   s   bÿgus	con
t
ent
s=   zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Tr“   rÈ   r—   r   r   r   Ú/test_set_application_octet_stream_with_8bit_cte‹  s    ûúùzBTestRawDataManager.test_set_application_octet_stream_with_8bit_ctec                 C   sV   |   ¡ }d}| jj}tj|||ddƒ|ddƒ|ddƒfd |  t|ƒt d¡¡ d S )	Nr’   r[   rŒ   r¸   r¶   zI'm talking to myself.©Úheaderszù            Content-Type: text/plain; charset="utf-8"
            To: foo@example.com
            From: foo@example.com
            Subject: I'm talking to myself.
            Content-Transfer-Encoding: 7bit

            Simple message.
            )	r   r   Úheader_factoryr   rL   r   r@   rl   rm   ©r   r"   r˜   rÑ   r   r   r   Ú$test_set_headers_from_header_objectsœ  s    ýz7TestRawDataManager.test_set_headers_from_header_objectsc                 C   s6   |   ¡ }d}tj||dd |  t|ƒt d¡¡ d S )Nr’   )zX-Foo-Header: foozX-Bar-Header: barrÏ   zÇ            Content-Type: text/plain; charset="utf-8"
            X-Foo-Header: foo
            X-Bar-Header: bar
            Content-Transfer-Encoding: 7bit

            Simple message.
            )r   r   rL   r   r@   rl   rm   r—   r   r   r   Útest_set_headers_from_strings®  s    z0TestRawDataManager.test_set_headers_from_stringsc                 C   sL   |   ¡ }d}|  td¡  tj||dd W d   ƒ n1 s>0    Y  d S )Nr’   r   )zContent-Type: foo/barrÏ   )r   r,   r½   r   rL   r—   r   r   r   Ú<test_set_headers_with_invalid_duplicate_string_header_raises½  s    zOTestRawDataManager.test_set_headers_with_invalid_duplicate_string_header_raisesc                 C   s\   |   ¡ }d}| jj}|  td¡( tj|||ddƒfd W d   ƒ n1 sN0    Y  d S )Nr’   r   z foo/barrÏ   )r   r   rÑ   r,   r½   r   rL   rÒ   r   r   r   Ú<test_set_headers_with_invalid_duplicate_header_header_raisesÅ  s    ÿzOTestRawDataManager.test_set_headers_with_invalid_duplicate_header_header_raisesc                 C   sZ   |   ¡ }d}|  td¡. tj||dd t|d jƒ W d   ƒ n1 sL0    Y  d S )Nr’   úa@fairly@@invalid@address)zTo: a@fairly@@invalid@addressrÏ   r[   )r   r,   r½   r   rL   ÚprintÚdefectsr—   r   r   r   Ú4test_set_headers_with_defective_string_header_raisesÎ  s
    zGTestRawDataManager.test_set_headers_with_defective_string_header_raisesc                 C   sj   |   ¡ }d}| jj}|  td¡6 tj|||ddƒfd t|d jƒ W d   ƒ n1 s\0    Y  d S )Nr’   r×   r[   rÏ   )	r   r   rÑ   r,   r½   r   rL   rØ   rÙ   rÒ   r   r   r   Ú4test_set_headers_with_defective_header_header_raises×  s    ÿzGTestRawDataManager.test_set_headers_with_defective_header_header_raisesc                 C   s*   |   ¡ }|jddd |  |d d¡ d S )Nr   Úinline©ÚdispositionúContent-Disposition©r   rL   r   rn   r   r   r   Útest_set_disposition_inlineá  s    z.TestRawDataManager.test_set_disposition_inlinec                 C   s*   |   ¡ }|jddd |  |d d¡ d S )Nr   Z
attachmentrÝ   rß   rà   rn   r   r   r   Útest_set_disposition_attachmentæ  s    z2TestRawDataManager.test_set_disposition_attachmentc                 C   s*   |   ¡ }|jddd |  |d d¡ d S )Nr   rÝ   rß   rà   rn   r   r   r   Útest_set_disposition_fooë  s    z+TestRawDataManager.test_set_disposition_fooc                 C   s*   |   ¡ }|jddd |  |d d¡ d S )Nr   úbar.txt©Úfilenamerß   zattachment; filename="bar.txt"rà   rn   r   r   r   Útest_set_filenameó  s
    
ÿz$TestRawDataManager.test_set_filenamec                 C   s,   |   ¡ }|jdddd |  |d d¡ d S )Nr   rÜ   rä   ©rÞ   ræ   rß   zinline; filename="bar.txt"rà   rn   r   r   r   Ú(test_set_filename_and_disposition_inlineù  s    z;TestRawDataManager.test_set_filename_and_disposition_inlinec                 C   s6   |   ¡ }|jddd |  t|ƒt d¡ d¡¡ d S )Nr   u   Ã¡bÃ¡rÃ®.txtrå   a              Content-Type: text/plain; charset="utf-8"
            Content-Transfer-Encoding: 7bit
            Content-Disposition: attachment;
             filename*=utf-8''%C3%A1b%C3%A1r%C3%AE.txt
            MIME-Version: 1.0

            foo
            r³   )r   rL   r   r¤   rl   rm   rs   rn   r   r   r   Útest_set_non_ascii_filenameþ  s
    øz.TestRawDataManager.test_set_non_ascii_filenamec                 C   s4   |   ¡ }|jddddd |  t|ƒt d¡¡ d S )Ns   ASCII-only message.
rÌ   rÍ   r­   )r€   rŠ   r¯   zª            Content-Type: application/octet-stream
            Content-Transfer-Encoding: 7bit
            MIME-Version: 1.0

            ASCII-only message.
            )r   rL   r   r@   rl   rm   rn   r   r   r   Útest_set_content_bytes_cte_7bit  s
    ÿz2TestRawDataManager.test_set_content_bytes_cte_7bit)r˜   r   )r˜   )rœ   )ó   content)rÌ   Zoctet_stream)rì   )rÂ   rÃ   r   )r¼   )Z
text_plainZ	text_htmlZapplication_octet_streamZ
image_jpegZmessage_rfc822Zmessage_external_bodyc                 C   sD   |   ¡ }|j|g|¢R ddiŽ |  |d d¡ |  |d d¡ d S )NrÐ   )zTo: foo@example.comzFrom: bar@simple.netr‹   rŒ   r   zbar@simple.netrà   ©r   rI   Úmimetyper"   r   r   r   Ú!content_object_as_header_receiver!  s    z4TestRawDataManager.content_object_as_header_receiverc                 C   s4   |   ¡ }|j|g|¢R ddiŽ |  |d d¡ d S )NrÞ   rÜ   rß   rà   rí   r   r   r   Ú-content_object_as_disposition_inline_receiver)  s    z@TestRawDataManager.content_object_as_disposition_inline_receiverc                 C   s\   |   ¡ }|j|g|¢R dddœŽ |  |d d¡ |  | ¡ d¡ |  |d jd d¡ d S )NrÜ   u   bÃ¡r.txtrè   rß   u   inline; filename="bÃ¡r.txt"ræ   )r   rL   r   Úget_filenameÚparamsrí   r   r   r   Ú-content_object_as_non_ascii_filename_receiver.  s
    z@TestRawDataManager.content_object_as_non_ascii_filename_receiverc                 C   s4   |   ¡ }|j|g|¢R ddiŽ |  |d d¡ d S )NZcidZsome_random_stuffz
Content-IDrà   rí   r   r   r   Úcontent_object_as_cid_receiver5  s    z1TestRawDataManager.content_object_as_cid_receiverc                 C   sR   |   ¡ }dddœ}|j|g|¢R d|iŽ t|tƒr<d|d< |  |d j|¡ d S )Nu   bÃ¡rra   )r   r\   rò   r•   r    r   )r   rL   Ú
isinstancer@   r   rò   )r   rI   rî   r"   rò   r   r   r   Ú!content_object_as_params_receiver:  s    

z4TestRawDataManager.content_object_as_params_receiverN)@r2   r3   r4   r   rd   Zcloner   r   re   ro   rp   rt   ru   rv   rx   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Ö   rÚ   rÛ   rá   râ   rã   rç   ré   rê   rë   Zcontent_object_paramsrï   rð   ró   rô   rö   r   r   r   r   rf   ‡   s‚   	ÿ				

	

0		
ù
rf   Ú__main__)ZunittestZtest.test_emailr   r   rl   Zemailr   Zemail.messager   Zemail.contentmanagerr   r   r   rf   r2   Úmainr   r   r   r   Ú<module>   s    }     @