o
    7÷dL˜  ã                	   @   sF  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	m
Z
mZ d dlmZ d dlmZmZmZ ddlT e j e j e¡¡Zdd	„ 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jƒZG dd„ dejƒZG dd„ dejƒZ G dd„ dejƒZ!e j "edd¡Z#dhZ$g Z%e  &e#¡D ]^Z'e j (e'¡\Z)Z*e)e$v rµq¦e*dkre j "e#e)d ¡Z+e,e j "e#e'¡dƒZ'e' -¡ Z.W d  ƒ n1 sÜw   Y  e,e+dƒZ'e /e'¡Z0W d  ƒ n1 söw   Y  e% 1e)e.e0d œ¡ q¦d!d"„ Z2e
G d#d$„ d$ejƒƒZ3G d%d&„ d&ejƒZ4d'd(„ Z5dS ))é    Né   )ÚparametrizeÚparametrize_classÚ	slow_test)ÚBytesIO)Ú	MagicMockÚMockÚpatché   )Ú*c                 C   s   t | tƒr|  t ¡ ¡} | S ©N)Ú
isinstanceÚstrÚencodeÚsysÚgetfilesystemencoding)Úval© r   úuC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\multipart/tests/test_multipart.pyÚforce_bytes   s   
r   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S )Ú	TestFieldc                 C   s   t dƒ| _d S ©NÚfoo)ÚFieldÚf©Úselfr   r   r   ÚsetUp    ó   zTestField.setUpc                 C   s   |   | jjd¡ d S r   )ÚassertEqualr   Ú
field_namer   r   r   r   Ú	test_name#   ó   zTestField.test_namec                 C   s    | j  d¡ |  | j jd¡ d S ©Nó   test123©r   Úwriter   Úvaluer   r   r   r   Ú	test_data&   ó   zTestField.test_datac                 C   s<   | j  d¡ |  | j jd¡ | j  d¡ |  | j jd¡ d S )Nó   testó   123r$   r%   r   r   r   r   Útest_cache_expiration*   s   zTestField.test_cache_expirationc                 C   ó*   | j  d¡ | j  ¡  |  | j jd¡ d S r#   )r   r&   Úfinalizer   r'   r   r   r   r   Útest_finalize0   ó   
zTestField.test_finalizec                 C   r-   r#   )r   r&   Úcloser   r'   r   r   r   r   Ú
test_close5   r0   zTestField.test_closec                 C   sF   t  dd¡}|  |jd¡ |  |jd¡ t  dd ¡}|  |jd ¡ d S ©Ns   names   value)r   Ú
from_valuer   r    r'   )r   r   Úf2r   r   r   Útest_from_value:   s
   zTestField.test_from_valuec                 C   s(   t  dd¡}t  dd¡}|  ||¡ d S r3   )r   r4   r   )r   Úf1r5   r   r   r   Útest_equalityB   s   zTestField.test_equalityc                 C   s,   t  dd¡}|  |dk¡ |  d|k¡ d S )Nó   fooó   bar)r   r4   ÚassertFalse©r   r   r   r   r   Útest_equality_with_otherH   s   z"TestField.test_equality_with_otherc                 C   s0   t dƒ}|  |jd¡ | ¡  |  |jd ¡ d S )Nr9   ó    )r   r   r'   Zset_noner<   r   r   r   Útest_set_noneM   s   zTestField.test_set_noneN)Ú__name__Ú
__module__Ú__qualname__r   r!   r(   r,   r/   r2   r6   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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 )ÚTestFilec                 C   s(   i | _ tt ¡ ƒ| _td| j d| _d S )Nó   foo.txt©Úconfig)Úcr   ÚtempfileÚmkdtempÚdÚFiler   r   r   r   r   r   V   s   zTestFile.setUpc                 C   s8   | j j}| d¡ |  | ¡ |¡ | d¡ | ¡  d S ©Nr   )r   Úfile_objectÚseekr   ÚreadÚtruncate)r   Údatar   r   r   r   Úassert_data[   s
   

zTestFile.assert_datac                 C   s*   t j | j| jj¡}|  t j |¡¡ d S r   )ÚosÚpathÚjoinrJ   r   Úactual_file_nameÚ
assertTrueÚexists)r   Ú	full_pathr   r   r   Úassert_existsb   s   zTestFile.assert_existsc                 C   ó   | j  d¡ |  d¡ d S ©Nó   foobar)r   r&   rR   r   r   r   r   Útest_simplef   ó   zTestFile.test_simplec                 C   s2   t ƒ }d|j_|| j_| j d¡}|  |d¡ d S )Né   r]   )r   r&   Úreturn_valuer   Ú_fileobjr   )r   ÚmÚvr   r   r   Útest_invalid_writej   s
   zTestFile.test_invalid_writec                 C   s†   d| j d< | j d¡ |  | jj¡ |  d¡ | j d¡ |  | jj¡ |  d¡ | jj}| j ¡  |  | jj¡ |  	| jj|¡ d S )Nr   ÚMAX_MEMORY_FILE_SIZEó   1r+   )
rG   r   r&   rW   Ú	in_memoryrR   r;   rM   Zflush_to_diskZassertIs)r   Zold_objr   r   r   Útest_file_fallbackq   s   



zTestFile.test_file_fallbackc                 C   sL   d| j d< | j d¡ |  | jj¡ | j d¡ |  | jj¡ |  d¡ d S )Né
   rf   s
   1111111111s
   2222222222s   11111111112222222222)rG   r   r&   rW   rh   r;   rR   r   r   r   r   Útest_file_fallback_with_data‚   s   
z%TestFile.test_file_fallback_with_datac                 C   sJ   | j | jd< d| jd< | j d¡ |  | jj¡ |  | jj¡ |  ¡  d S )NÚ
UPLOAD_DIRrj   rf   ó   12345678901)	rJ   rG   r   r&   r;   rh   ÚassertIsNotNonerV   rZ   r   r   r   r   Útest_file_name   s   
zTestFile.test_file_namec                 C   sV   | j | jd< d| jd< d| jd< | j d¡ |  | jj¡ |  | jjd¡ |  ¡  d S )Nrl   TÚUPLOAD_KEEP_FILENAMErj   rf   rm   r9   ©	rJ   rG   r   r&   r;   rh   r   rV   rZ   r   r   r   r   Útest_file_full_nameš   s   

zTestFile.test_file_full_namec                 C   ó`   | j | jd< d| jd< d| jd< d| jd< | j d¡ |  | jj¡ |  | jjd¡ |  ¡  d S ©	Nrl   Trp   ÚUPLOAD_KEEP_EXTENSIONSrj   rf   rm   rD   rq   r   r   r   r   Útest_file_full_name_with_ext¨   ó   


z%TestFile.test_file_full_name_with_extc                 C   rs   rt   rq   r   r   r   r   rv   ¶   rw   c                 C   sZ   d| j d< d| j d< | j d¡ |  | jj¡ tj | jj¡d }|  	|d¡ |  
¡  d S )NTru   rj   rf   rm   r   s   .txt)rG   r   r&   r;   rh   rS   rT   ÚsplitextrV   r   rZ   )r   Úextr   r   r   Útest_no_dir_with_extensionÄ   s   

z#TestFile.test_no_dir_with_extensionc                 C   ój   t tj ddd¡ƒ| jd< d| jd< d| jd< |  t¡ | j d	¡ W d   ƒ d S 1 s.w   Y  d S )
Nú/ÚtmpÚnotexistingrl   Trp   r`   rf   ó
   1234567890©	r   rS   rT   rU   rG   ÚassertRaisesZ	FileErrorr   r&   r   r   r   r   Útest_invalid_dir_with_nameÑ   ó   

"ÿz#TestFile.test_invalid_dir_with_namec                 C   r{   )
Nr|   r}   r~   rl   Frp   r`   rf   r   r€   r   r   r   r   Útest_invalid_dir_no_nameÛ   rƒ   z!TestFile.test_invalid_dir_no_nameN)r@   rA   rB   r   rR   rZ   r^   re   ri   rk   ro   rr   rv   rz   r‚   r„   r   r   r   r   rC   U   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 )ÚTestParseOptionsHeaderc                 C   ó(   t dƒ\}}|  |d¡ |  |i ¡ d S )Nzapplication/jsonó   application/json©Zparse_options_headerr   ©r   ÚtÚpr   r   r   r^   é   ó   z"TestParseOptionsHeader.test_simplec                 C   r†   )NÚ r>   rˆ   r‰   r   r   r   Ú
test_blankî   rŒ   z!TestParseOptionsHeader.test_blankc                 C   ó,   t dƒ\}}|  |d¡ |  |ddi¡ d S )Nzapplication/json;par=valr‡   ó   paró   valrˆ   r‰   r   r   r   Útest_single_paramó   ó   z(TestParseOptionsHeader.test_single_paramc                 C   r   )Ns   application/json;     par=valr‡   r   r‘   rˆ   r‰   r   r   r   Útest_single_param_with_spacesø   r“   z4TestParseOptionsHeader.test_single_param_with_spacesc                 C   s.   t dƒ\}}|  |d¡ |  |dddœ¡ d S )Ns!   application/json;par=val;asdf=foor‡   r‘   r9   )r   ó   asdfrˆ   r‰   r   r   r   Útest_multiple_paramsý   s   z+TestParseOptionsHeader.test_multiple_paramsc                 C   r   )Ns   application/json;param="quoted"r‡   ó   params   quotedrˆ   r‰   r   r   r   Útest_quoted_param  r“   z(TestParseOptionsHeader.test_quoted_paramc                 C   ó    t dƒ\}}|  |d d¡ d S )Ns/   application/json;param="quoted;with;semicolons"r—   s   quoted;with;semicolonsrˆ   r‰   r   r   r   Ú test_quoted_param_with_semicolon  r)   z7TestParseOptionsHeader.test_quoted_param_with_semicolonc                 C   r™   )Ns1   application/json;param="This \" is \" a \" quote"r—   s   This " is " a " quoterˆ   r‰   r   r   r   Útest_quoted_param_with_escapes  r)   z5TestParseOptionsHeader.test_quoted_param_with_escapesc                 C   r™   )Ns1   text/plain; filename="C:\this\is\a\path\file.txt"s   filenameó   file.txtrˆ   r‰   r   r   r   Útest_handles_ie6_bug  s   z+TestParseOptionsHeader.test_handles_ie6_bugN)r@   rA   rB   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d„ ZdS )ÚTestBaseParserc                 C   s   t ƒ | _i | j_d S r   )Z
BaseParserÚbÚ	callbacksr   r   r   r   r     s   zTestBaseParser.setUpc                    sj   dg‰ ‡ fdd„}| j  d|¡ | j  d¡ |  ˆ d d¡ | j  dd ¡ | j  d¡ |  ˆ d d¡ d S )Nr   c                      s   ˆ d  d7  < d S )Nr   r   r   r   ©Úlr   r   Úon_foo  r"   z-TestBaseParser.test_callbacks.<locals>.on_foor   r   )rŸ   Zset_callbackÚcallbackr   )r   r£   r   r¡   r   Útest_callbacks  s   zTestBaseParser.test_callbacksN)r@   rA   rB   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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 )&ÚTestQuerystringParserc                 O   sB   |  dd¡r| j ¡  |  | jt|ƒ¡ | dd¡rg | _d S d S )Nr.   TÚreset)Úpopr‹   r.   r   r   ÚlistÚget)r   ÚargsÚkwargsr   r   r   Úassert_fields*  s   

ÿz#TestQuerystringParser.assert_fieldsc                 C   s   |   ¡  d S r   )r§   r   r   r   r   r   2  s   zTestQuerystringParser.setUpc                    sP   g ˆ_ g ‰g ‰ ‡fdd„}‡ fdd„}‡ ‡‡fdd„}|||dœ}t|ƒˆ_d S )Nc                    ó   ˆ   | ||… ¡ d S r   ©Úappend©rQ   ÚstartÚend)Úname_bufferr   r   Úon_field_name;  ó   z2TestQuerystringParser.reset.<locals>.on_field_namec                    r®   r   r¯   r±   )Údata_bufferr   r   Úon_field_data>  r¶   z2TestQuerystringParser.reset.<locals>.on_field_datac                      s4   ˆj  d ˆ¡d ˆ ¡f¡ ˆd d …= ˆ d d …= d S ©Nr>   )r   r°   rU   r   ©r·   r´   r   r   r   Úon_field_endA  s   þ
z1TestQuerystringParser.reset.<locals>.on_field_end)rµ   r¸   r»   )r   ÚQuerystringParserr‹   )r   rµ   r¸   r»   r    r   rº   r   r§   5  s   
ýzTestQuerystringParser.resetc                 C   ó   | j  d¡ |  d¡ d S )Nó   foo=bar©r9   r:   ©r‹   r&   r­   r   r   r   r   Útest_simple_querystringR  ó   z-TestQuerystringParser.test_simple_querystringc                 C   r½   )Ns   &foo=barr¿   rÀ   r   r   r   r   Ú test_querystring_blank_beginningW  rÂ   z6TestQuerystringParser.test_querystring_blank_beginningc                 C   r½   )Nó   foo=bar&r¿   rÀ   r   r   r   r   Útest_querystring_blank_end\  rÂ   z0TestQuerystringParser.test_querystring_blank_endc                 C   ó   | j  d¡ |  dd¡ d S )Ns   foo=bar&asdf=bazr¿   ©r•   ó   bazrÀ   r   r   r   r   Útest_multiple_querystringa  ó
   þz/TestQuerystringParser.test_multiple_querystringc                 C   s4   | j  d¡ | jddd | j  d¡ |  d¡ d S )NrÄ   r¿   F©r.   s   asdf=bazrÇ   rÀ   r   r   r   r   Útest_streaming_simplei  s   þÿz+TestQuerystringParser.test_streaming_simplec                 C   s|   | j  d¡ | jdd | j  d¡ | jdd | j  d¡ | jdd | j  d¡ | jddd | j  d¡ |  d	¡ d S )
Ns   foo=oneFrË   s   twos   threes   &asd)r9   s   onetwothrees   f=bazrÇ   rÀ   r   r   r   r   Útest_streaming_breaku  s   þÿz*TestQuerystringParser.test_streaming_breakc                 C   rÆ   )Ns   foo=bar;asdf=bazr¿   rÇ   rÀ   r   r   r   r   Útest_semicolon_separatorŠ  rÊ   z.TestQuerystringParser.test_semicolon_separatorc                 C   s<   d| j _| j  d¡ | jddd | j  d¡ |  d¡ d S )Né   rÄ   r¿   FrË   s   a=123456)ó   as   12345)r‹   Úmax_sizer&   r­   r   r   r   r   Útest_too_large_field’  s
   z*TestQuerystringParser.test_too_large_fieldc                 C   ó:   |   t¡ tdd}W d   ƒ d S 1 sw   Y  d S )Niœÿÿÿ©rÑ   )r   Ú
ValueErrorr¼   )r   r‹   r   r   r   Útest_invalid_max_size  ó   "ÿz+TestQuerystringParser.test_invalid_max_sizec                 C   s`   d}t |ƒD ]'\}}|  ¡  d| j_t|›d|›ƒ | j |¡ | j |¡ |  dd¡ qd S )Ns   foo=bar&another=asdfTú / r¿   ©ó   anotherr•   )Ú	split_allr§   r‹   Ústrict_parsingÚprintr&   r­   )r   rQ   ÚfirstÚlastr   r   r   Útest_strict_parsing_pass¡  s   øz.TestQuerystringParser.test_strict_parsing_passc              	   C   sž   d}t |ƒD ]F\}}|  ¡  d| j_d}|  t¡}|| j |¡7 }|| j |¡7 }| j ¡  W d   ƒ n1 s9w   Y  |d urL|  |j	j
d| ¡ qd S )Nó   foo=bar&&another=asdfTr   é   )rÛ   r§   r‹   rÜ   r   ÚQuerystringParseErrorr&   r.   r   Ú	exceptionÚoffset)r   rQ   rÞ   rß   ÚcntÚcmr   r   r   Ú#test_strict_parsing_fail_double_sep­  s   ý€óz9TestQuerystringParser.test_strict_parsing_fail_double_sepc                 C   sh   d}t |ƒD ]+\}}td|›d|›dƒ |  ¡  d}|| j |¡7 }|| j |¡7 }|  dd¡ qd S )Nrá   ú rØ   r   r¿   rÙ   )rÛ   rÝ   r§   r‹   r&   r­   )r   rQ   rÞ   rß   ræ   r   r   r   Útest_double_sep¾  s   øz%TestQuerystringParser.test_double_sepc                 C   s^   d| j _|  t¡}| j  d¡ W d   ƒ n1 sw   Y  |d ur-|  |jjd¡ d S d S )NTó   foo=bar&blank&another=asdfrâ   )r‹   rÜ   r   rã   r&   r   rä   rå   )r   rç   r   r   r   Ú!test_strict_parsing_fail_no_valueÊ  s   ÿÿz7TestQuerystringParser.test_strict_parsing_fail_no_valuec                 C   s   | j  d¡ |  ddd¡ d S )Nrë   r¿   )s   blankr>   rÙ   rÀ   r   r   r   r   Útest_success_no_valueÒ  s   ýz+TestQuerystringParser.test_success_no_valuec                 C   s   t | jƒ}d S r   )Úreprr‹   )r   Z_ignoredr   r   r   Ú	test_reprÚ  s   zTestQuerystringParser.test_reprN)r@   rA   rB   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                   @   sR   e Zd Zdd„ Zddd„Zddd„Zddd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestOctetStreamParserc                    sP   g ˆ _ dˆ _dˆ _‡ fdd„}‡ fdd„}‡ fdd„}|||dœ}t|ƒˆ _d S )	Nr   c                      ó   ˆ  j d7  _ d S ©Nr   )Ústartedr   r   r   r   Úon_startå  ó   z-TestOctetStreamParser.setUp.<locals>.on_startc                    s   ˆ j  | ||… ¡ d S r   )rJ   r°   r±   r   r   r   Úon_dataè  s   z,TestOctetStreamParser.setUp.<locals>.on_datac                      rñ   rò   )Úfinishedr   r   r   r   Úon_endë  rõ   z+TestOctetStreamParser.setUp.<locals>.on_end)rô   rö   rø   )rJ   ró   r÷   ÚOctetStreamParserr‹   )r   rô   rö   rø   r    r   r   r   r   à  s   ýzTestOctetStreamParser.setUpTc                 C   s   |   d | j¡|¡ g | _d S r¹   )r   rU   rJ   ©r   rQ   r.   r   r   r   rR   ö  s   
z!TestOctetStreamParser.assert_datac                 C   ó(   |r|   | jd¡ d S |   | jd¡ d S ©Nr   r   )r   ró   ©r   r   r   r   r   Úassert_startedú  ó   z$TestOctetStreamParser.assert_startedc                 C   rû   rü   )r   r÷   rý   r   r   r   Úassert_finished   rÿ   z%TestOctetStreamParser.assert_finishedc                 C   sH   |   d¡ | j d¡ |   ¡  |  d¡ |  d¡ | j ¡  |  ¡  d S )NFr]   )rþ   r‹   r&   rR   r   r.   r   r   r   r   r^     s   



z!TestOctetStreamParser.test_simplec                 C   sD   | j  d¡ | j  d¡ | j  d¡ | j  ¡  |  d¡ |  ¡  d S )Nr9   r:   rÈ   s	   foobarbaz)r‹   r&   r.   rR   r   r   r   r   r   Útest_multiple_chunks  s   

z*TestOctetStreamParser.test_multiple_chunksc                 C   s4   d| j _| j  d¡ | j  ¡  |  d¡ |  ¡  d S )Nr`   ó
   0123456789s   01234)r‹   rÑ   r&   r.   rR   r   r   r   r   r   Útest_max_size  s
   

z#TestOctetStreamParser.test_max_sizec                 C   rÓ   )Nr   rÔ   )r   rÕ   rù   ©r   Úqr   r   r   rÖ   &  r×   z+TestOctetStreamParser.test_invalid_max_sizeN©T)r@   rA   rB   r   rR   rþ   r   r^   r  r  rÖ   r   r   r   r   rð   ß  s    


		rð   c                   @   sV   e Zd Zdd„ Z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S )ÚTestBase64Decoderc                 C   ó   t ƒ | _t| jƒ| _d S r   )r   r   ÚBase64DecoderrJ   r   r   r   r   r   -  ó   zTestBase64Decoder.setUpTc                 C   óF   |r| j  ¡  | j d¡ |  | j ¡ |¡ | j d¡ | j ¡  d S rL   ©rJ   r.   r   rN   r   rO   rP   rú   r   r   r   rR   1  ó   
zTestBase64Decoder.assert_datac                 C   r½   )Nó   Zm9vYmFyr]   ©rJ   r&   rR   r   r   r   r   r^   :  r_   zTestBase64Decoder.test_simplec                 C   s<   |   t¡ | j d¡ W d   ƒ d S 1 sw   Y  d S )Ns   Zm9v!mFy)r   ÚDecodeErrorrJ   r&   r   r   r   r   Útest_bad>  ó   "ÿzTestBase64Decoder.test_badc                 C   ó&   | j  d¡ | j  d¡ |  d¡ d S )Nó   Zm9vs   YmFyr]   r  r   r   r   r   Útest_split_properlyB  ó   z%TestBase64Decoder.test_split_properlyc                 C   ó\   d}t ddƒD ]$}|d |… ||d … }}|  ¡  | j |¡ | j |¡ |  d¡ qd S )Nr  r   é   r9   ©Úranger   rJ   r&   rR   ©r   ZbuffÚirÞ   Úsecondr   r   r   Útest_bad_splitG  ó   úz TestBase64Decoder.test_bad_splitc                 C   r  )Nr  r`   râ   r]   r  r  r   r   r   Útest_long_bad_splitQ  r  z%TestBase64Decoder.test_long_bad_splitc                 C   ó6   t ƒ }t|ƒ}| ¡  |j ¡  | ¡  |j ¡  d S r   )r   r	  r.   Úassert_called_once_withr1   ©r   Úparserr   r   r   r   Útest_close_and_finalize[  ó   
z)TestBase64Decoder.test_close_and_finalizec                 C   sF   | j  d¡ |  t¡ | j  ¡  W d   ƒ d S 1 sw   Y  d S )Ns   Zm9vYmF)rJ   r&   r   r  r.   r   r   r   r   Útest_bad_lengthe  s   "ÿz!TestBase64Decoder.test_bad_lengthNr  )r@   rA   rB   r   rR   r^   r  r  r  r   r%  r'  r   r   r   r   r  +  s    
	


r  c                   @   sf   e Zd Zdd„ Z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dd„ ZdS )ÚTestQuotedPrintableDecoderc                 C   r  r   )r   r   ÚQuotedPrintableDecoderrJ   r   r   r   r   r   m  r
  z TestQuotedPrintableDecoder.setUpTc                 C   r  rL   r  rú   r   r   r   rR   q  r  z&TestQuotedPrintableDecoder.assert_datac                 C   r[   r\   r  r   r   r   r   r^   z  r_   z&TestQuotedPrintableDecoder.test_simplec                 C   r½   )Ns	   foo=3Dbarr¾   r  r   r   r   r   Útest_with_escape~  r_   z+TestQuotedPrintableDecoder.test_with_escapec                 C   r½   )Ns	   foo=
barr]   r  r   r   r   r   Útest_with_newline_escape‚  r_   z3TestQuotedPrintableDecoder.test_with_newline_escapec                 C   r½   )Ns   foo=
barr]   r  r   r   r   r   Útest_with_only_newline_escape†  r_   z8TestQuotedPrintableDecoder.test_with_only_newline_escapec                 C   r  )Ns   foo=3s   Dbarr¾   r  r   r   r   r   Útest_with_split_escapeŠ  r  z1TestQuotedPrintableDecoder.test_with_split_escapec                 C   r  )Ns   foo=s   
barr]   r  r   r   r   r   Ú test_with_split_newline_escape_1  r  z;TestQuotedPrintableDecoder.test_with_split_newline_escape_1c                 C   r  )Ns   foo=s   
barr]   r  r   r   r   r   Ú test_with_split_newline_escape_2”  r  z;TestQuotedPrintableDecoder.test_with_split_newline_escape_2c                 C   r!  r   )r   r)  r.   r"  r1   r#  r   r   r   r%  ™  r&  z2TestQuotedPrintableDecoder.test_close_and_finalizec                 C   sR   | j  d¡ |  d¡ | j  d¡ | j  d¡ |  d¡ | j  d¡ |  d¡ dS )zG
        https://github.com/andrew-d/python-multipart/issues/6
        s   =3AXs   :Xs   =3s   AXs   q=3AXs   q:XNr  r   r   r   r   Útest_not_aligned£  s   

z+TestQuotedPrintableDecoder.test_not_alignedNr  )r@   rA   rB   r   rR   r^   r*  r+  r,  r-  r.  r/  r%  r0  r   r   r   r   r(  l  s    
	
r(  r(   ÚhttpZsingle_field_blocksz.httpz.yamlÚrb)ÚnameÚtestÚresultc                 c   s8    t dt| ƒd ƒD ]}| d|… | |d… fV  q
dS )z¯
    This function will split an array all possible ways.  For example:
        split_all([1,2,3,4])
    will give:
        ([1], [2,3,4]), ([1,2], [3,4]), ([1,2,3], [4])
    r   N)r  Úlen)r   r  r   r   r   rÛ   Ñ  s   €ÿrÛ   c                   @   sÒ   e Zd Zi fdd„Zdd„ Zdd„ Zdd„ Zed	eƒd
d„ ƒZ	dd„ Z
dd„ Zdd„ Zedd„ ƒZe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 )/ÚTestFormParserc                    sP   dˆ _ g ˆ _g ˆ _‡ fdd„}‡ fdd„}‡ fdd„}td|||||d	ˆ _d S )
NFc                    ó   ˆ j  | ¡ d S r   )Úfieldsr°   ©r   r   r   r   Úon_fieldã  ó   z%TestFormParser.make.<locals>.on_fieldc                    r8  r   )Úfilesr°   r:  r   r   r   Úon_fileæ  r<  z$TestFormParser.make.<locals>.on_filec                      s
   dˆ _ d S )NT)Úendedr   r   r   r   rø   é  s   
z#TestFormParser.make.<locals>.on_endúmultipart/form-data)ÚboundaryrF   )r?  r=  r9  Ú
FormParserr   )r   rA  rF   r;  r>  rø   r   r   r   ÚmakeÞ  s   
ÿzTestFormParser.makec                 C   s(   |j }| d¡ | ¡ }|  ||¡ d S rL   )rM   rN   rO   r   )r   r   rQ   ÚoZ	file_datar   r   r   Úassert_file_datað  s   
zTestFormParser.assert_file_datac                 C   sl   d }| j D ]}|j|kr|} nq|  |¡ z|  ||¡ |  |j|¡ | j  |¡ W | ¡  d S | ¡  w r   )r=  r    rn   rE  r   Ú	file_nameÚremover1   )r   r    rF  rQ   Úfoundr   r   r   r   Úassert_fileö  s   

þ
zTestFormParser.assert_filec                 C   sJ   d }| j D ]}|j|kr|} nq|  |¡ |  ||j¡ | j  |¡ d S r   )r9  r    rn   r   r'   rG  )r   r3  r'   rH  r   r   r   r   Úassert_field  s   

þ
zTestFormParser.assert_fieldÚparamc              
   C   s4  |d d }t |tƒr| d¡}|  |¡ d }z| j |d ¡}| j ¡  W n ty< } z
d}|}W Y d }~nd }~ww d|d d v rY|  |¡ |  	|d d d |j
¡ d S |  	|t|d ƒ¡ |d d D ].}|d }|d	  d¡}|d
krƒ|  ||d ¡ qi|dkr–|  ||d  d¡|d ¡ qiJ ‚d S )Nr5  rA  zlatin-1r4  r   ÚerrorÚexpectedÚtyper3  ÚfieldrQ   ÚfilerF  )r   r   r   rC  r   r&   r.   ÚMultipartParseErrorrn   r   rå   r6  rJ  rI  )r   rK  rA  ÚexcÚ	processedÚerN  r3  r   r   r   Ú	test_http  s>   


€þ

ýðzTestFormParser.test_httpc                 C   s¸   d}t tj t|¡dƒ}| ¡ }W d  ƒ n1 sw   Y  t|ƒD ]5\}}|  d¡ d}|| j 	|¡7 }|| j 	|¡7 }| j 
¡  |  |t|ƒ¡ |  dd¡ |  dd	d
¡ q$dS )zz
        This test runs a simple multipart body with one field and one file
        through every possible split.
        úsingle_field_single_file.httpr2  NrA  r   ó   fieldó   test1ó   filerœ   ó   test2)ÚopenrS   rT   rU   Úhttp_tests_dirrO   rÛ   rC  r   r&   r.   r   r6  rJ  rI  )r   Ú	test_filer   r(   rÞ   rß   r  r   r   r   Útest_random_splittingM  s   
ÿ

ñz$TestFormParser.test_random_splittingc                 C   s¸   d}t tj t|¡dƒ}| ¡ }W d  ƒ n1 sw   Y  |  d¡ d}tt|ƒƒD ]}|||d … }|| j	 
|¡7 }q-| j	 ¡  |  |t|ƒ¡ |  dd¡ |  d	d
d¡ dS )úL
        This test parses a simple multipart body 1 byte at a time.
        rV  r2  NrA  r   r   rW  rX  rY  rœ   rZ  )r[  rS   rT   rU   r\  rO   rC  r  r6  r   r&   r.   r   rJ  rI  )r   r]  r   r(   r  ÚxrŸ   r   r   r   Útest_feed_single_bytesi  s   
ÿ

z%TestFormParser.test_feed_single_bytesc           	      C   sð   d}t tj t|¡dƒ}| ¡ }W d  ƒ n1 sw   Y  tdt|ƒd ƒD ]L}t|ƒD ]E}|  d¡ d}| j	 
|d|… ¡ ||7 }t|t|ƒ|ƒD ]}|||| … }|| j	 
|¡7 }qN| j	 ¡  |  |t|ƒ¡ |  dd¡ q/q)dS )	r_  zsingle_field_blocks.httpr2  Nr   rA  r   rW  s(   0123456789ABCDEFGHIJ0123456789ABCDEFGHIJ)r[  rS   rT   rU   r\  rO   r  r6  rC  r   r&   r.   r   rJ  )	r   r]  r   r(   rG   rJ   r  r`  rŸ   r   r   r   Útest_feed_blocks†  s(   
ÿ

ÿëþzTestFormParser.test_feed_blocksc              	   C   sØ  d}t tj t|¡dƒ}| ¡ }W d  ƒ n1 sw   Y  d}d}d}d}td|f ƒ t|ƒD ]}t|ƒ}	t	 
g d¢¡}
|
dkr]t	 t|ƒ¡}t	 d	¡}|	 ||¡ d
||f }n:|
dkrqt	 t|ƒ¡}|	|= d|f }n&|
dkr—t	 t|ƒd ¡}|	|d  |	| |	|< |	|d < d||d f }td| ƒ |  d¡ d}z| j t|	ƒ¡}| j ¡  W n tyÀ   |d7 }Y q3w |t|	ƒkrÌ|d7 }q3|d7 }q3tdƒ td|f ƒ td|f ƒ td|f ƒ dS )ap  
        This test randomly fuzzes the request body to ensure that no strange
        exceptions are raised and we don't end up in a strange state.  The
        fuzzing consists of randomly doing one of the following:
            - Adding a random byte at a random offset
            - Randomly deleting a single byte
            - Randomly swapping two bytes
        rV  r2  Néè  r   ú&Running %d iterations of fuzz testing:)r   r
   é   r   é   zInserting byte %r at offset %dr
   zDeleting byte at offset %dre  zSwapping bytes %d and %dz  rA  ú2--------------------------------------------------úSuccesses:  %dúFailures:   %dúExceptions: %d)r[  rS   rT   rU   r\  rO   rÝ   r  Ú	bytearrayÚrandomÚchoiceÚ	randranger6  ÚinsertrC  r   r&   Úbytesr.   ÚFormParserError)r   r]  r   r(   Ú
iterationsÚ	successesÚfailuresÚ
exceptionsr  Z	fuzz_datarm  rŸ   Úmsgr   r   r   Útest_request_body_fuzz©  sR   
ÿ
"
ÿ

z%TestFormParser.test_request_body_fuzzc              	   C   sì   d}d}d}d}t d|f ƒ t|ƒD ]G}t dd¡}t |¡}t d|f ƒ |  d¡ d}z| j t	|ƒ¡}| j 
¡  W n tyJ   |d7 }Y qw |t|ƒkrV|d7 }q|d7 }qt d	ƒ t d
|f ƒ t d|f ƒ t d|f ƒ dS )z}
        This test will fuzz the multipart parser with some number of iterations
        of randomly-generated data.
        rc  r   rd  éd   i   z!  Testing with %d random bytes...rA  r   rg  rh  ri  rj  N)rÝ   r  rl  rn  rS   ÚurandomrC  r   r&   rp  r.   rq  r6  )r   rr  rs  rt  ru  r  Ú	data_sizerQ   r   r   r   Ú"test_request_body_fuzz_random_dataò  s0   

ÿ

z1TestFormParser.test_request_body_fuzz_random_datac                 C   sŽ   |   d¡ d}|  t¡ | j |¡ W d   ƒ n1 sw   Y  |   d¡ d}|  t¡ | j |¡}W d   ƒ d S 1 s@w   Y  d S )NrA  s   --boundaryfoobars   --boundaryfoobar)rC  r   rQ  r   r&   )r   rQ   r  r   r   r   Útest_bad_start_boundary  s   
ÿ
"ÿz&TestFormParser.test_bad_start_boundaryc                    s˜   g ‰ ‡ fdd„}t ƒ }t ƒ }td|||dd}|  t|jtƒ¡ | d¡ | d¡ | ¡  |  |j	¡ |  
tˆ ƒd¡ |  ˆ d	 d
¡ |  |j	¡ d S )Nc                    ó   ˆ   | ¡ d S r   r¯   r:  ©r=  r   r   r>  %  r   z1TestFormParser.test_octet_stream.<locals>.on_fileúapplication/octet-streamrD   )rø   rF  r*   s   1234r   r   s   test1234)r   rB  rW   r   r$  rù   r&   r.   r;   Úcalledr   r6  rE  ©r   r>  r;  rø   r   r   r~  r   Útest_octet_stream#  s   

z TestFormParser.test_octet_streamc                    s†   g ‰ ‡ fdd„}t ƒ ‰t ƒ ‰‡ ‡‡‡fdd„}td|ˆˆd}ˆ t|jtƒ¡ ||ƒ td|ˆˆd}ˆ t|jtƒ¡ ||ƒ d S )Nc                    r}  r   r¯   r:  ©r9  r   r   r;  9  r   z1TestFormParser.test_querystring.<locals>.on_fieldc                    sª   ˆ d d …= ˆ  ¡  ˆ  ¡  |  d¡ |  d¡ |  ¡  ˆ ˆj¡ ˆ tˆ ƒd¡ ˆ ˆ d jd¡ ˆ ˆ d jd¡ ˆ ˆ d jd¡ ˆ ˆ d jd	¡ ˆ 	ˆj¡ d S )
Nr¾   s
   &test=asdfr
   r   r9   r:   r   r*   r•   )
Z
reset_mockr&   r.   r;   r€  r   r6  r    r'   rW   r:  ©r9  rø   r>  r   r   r   Úsimple_test>  s   


z4TestFormParser.test_querystring.<locals>.simple_testú!application/x-www-form-urlencoded©rø   úapplication/x-url-encoded)r   rB  rW   r   r$  r¼   )r   r;  r…  r   r   r„  r   Útest_querystring7  s   zTestFormParser.test_querystringc                 C   s@   t ƒ }tdd d ƒ}||_| ¡  |j ¡  | ¡  |j ¡  d S )Nrˆ  )r   rB  r$  r.   r"  r1   r#  r   r   r   Útest_close_methods_  s   
z!TestFormParser.test_close_methodsc                 C   ó<   |   t¡ tdd d ƒ}W d   ƒ d S 1 sw   Y  d S )Nzapplication/bad)r   rÕ   rB  r<   r   r   r   Útest_bad_content_typej  s   "ÿz$TestFormParser.test_bad_content_typec                 C   r‹  )Nr@  )r   rq  rB  r<   r   r   r   Útest_no_boundary_giveno  s   "ÿz%TestFormParser.test_no_boundary_givenc                    sº   d}g ‰ ‡ fdd„}t ƒ }t ƒ }ddi}td|||d|d}|  t¡ | |¡ | ¡  W d   ƒ n1 s7w   Y  dd	i}td|||d|d}| |¡ | ¡  |  ˆ d
 d¡ d S )Ns§   ----boundary
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Content-Transfer-Encoding: badstuff

Test
----boundary--
c                    r}  r   r¯   r:  r~  r   r   r>  y  r   zBTestFormParser.test_bad_content_transfer_encoding.<locals>.on_fileZUPLOAD_ERROR_ON_BAD_CTETr@  z
--boundary)rø   rA  rF   Fr   s   Test)r   rB  r   rq  r&   r.   rE  )r   rQ   r>  r;  rø   rF   r   r   r~  r   Ú"test_bad_content_transfer_encodingu  s(   ÿ

þÿ
z1TestFormParser.test_bad_content_transfer_encodingc                    s®   g ‰ ‡ fdd„}t ƒ }t ƒ }td|||d}| d¡ | ¡  |  ˆ d jd¡ |  ˆ d jd¡ |  ˆ d	 jd
¡ |  ˆ d	 jd ¡ |  ˆ d jd¡ |  ˆ d jd¡ d S )Nc                    r}  r   r¯   r:  rƒ  r   r   r;  ’  r   z9TestFormParser.test_handles_None_fields.<locals>.on_fieldr†  r‡  s   foo=bar&another&baz=asdfr   r9   r:   r   rÚ   r
   rÈ   r•   )r   rB  r&   r.   r   r    r'   )r   r;  r>  rø   r   r   rƒ  r   Útest_handles_None_fields  s   
z'TestFormParser.test_handles_None_fieldsc                 C   sŠ   d}t tj t|¡dƒ}| ¡ }W d   ƒ n1 sw   Y  |  d¡ t|ƒd | jj	_
| j |¡}| j ¡  |  |t|ƒd ¡ d S )NrV  r2  rA  r
   )r[  rS   rT   rU   r\  rO   rC  r6  r   r$  rÑ   r&   r.   r   )r   r]  r   r(   r  r   r   r   Útest_max_size_multipart¤  s   
ÿ

z&TestFormParser.test_max_size_multipartc                 C   sŒ   d}t tj t|¡dƒ}| ¡ }W d   ƒ n1 sw   Y  t|ƒd }| jdd|id | j 	|¡}| j 
¡  |  |t|ƒd ¡ d S )NrV  r2  r
   rA  ÚMAX_BODY_SIZErE   )r[  rS   rT   rU   r\  rO   r6  rC  r   r&   r.   r   )r   r]  r   r(   Úsizer  r   r   r   Útest_max_size_form_parser·  s   
ÿ
z(TestFormParser.test_max_size_form_parserc                    sZ   g ‰ ‡ fdd„}t ƒ }t ƒ }td|||dddid}| d¡ | ¡  |  ˆ d	 d
¡ d S )Nc                    r}  r   r¯   r:  r~  r   r   r>  Ê  r   z:TestFormParser.test_octet_stream_max_size.<locals>.on_filer  rD   r‘  rj   )rø   rF  rF   s   0123456789012345689r   r  )r   rB  r&   r.   rE  r  r   r~  r   Útest_octet_stream_max_sizeÈ  s   þ
z)TestFormParser.test_octet_stream_max_sizec                 C   s<   |   t¡ tddd}W d   ƒ d S 1 sw   Y  d S )Ns   boundr   rÔ   )r   rÕ   ZMultipartParserr  r   r   r   Útest_invalid_max_size_multipartØ  r  z.TestFormParser.test_invalid_max_size_multipartN)r@   rA   rB   rC  rE  rI  rJ  r   Ú
http_testsrU  r^  ra  rb  r   rw  r{  r|  r‚  r‰  rŠ  rŒ  r  rŽ  r  r  r“  r”  r•  r   r   r   r   r7  Ü  s4    
1#
H
%(r7  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestHelperFunctionsc                 C   s$   t ddid d ƒ}|  t|tƒ¡ d S )NúContent-Typer  )Úcreate_form_parserrW   r   rB  )r   Úrr   r   r   Útest_create_form_parserÞ  s   ÿz+TestHelperFunctions.test_create_form_parserc                 C   s@   i }|   t¡ t|d d ƒ W d   ƒ d S 1 sw   Y  d S r   )r   rÕ   r™  )r   Úheadersr   r   r   Útest_create_form_parser_errorã  s   "ÿz1TestHelperFunctions.test_create_form_parser_errorc                 C   sL   t ƒ }t ƒ }tdditdƒ||ƒ |jdksJ ‚|  |jd d jd¡ d S )Nr˜  r  ó   123456789012345r   r   rÏ   )r   Ú
parse_formr   Z
call_countr   Z	call_argsr’  )r   r;  r>  r   r   r   Útest_parse_formè  s   ûz#TestHelperFunctions.test_parse_formc                    sN   g ‰ ‡ fdd„}t dddœtdƒd |ƒ |  tˆ ƒd¡ |  ˆ d jd	¡ d S )
Nc                    r}  r   r¯   )rP  r~  r   r   r>  ü  r   zCTestHelperFunctions.test_parse_form_content_length.<locals>.on_filer  Ú10)r˜  zContent-Lengthrž  r   r   rj   )rŸ  r   r   r6  r’  )r   r>  r   r~  r   Útest_parse_form_content_lengthú  s   ÿú	z2TestHelperFunctions.test_parse_form_content_lengthN)r@   rA   rB   r›  r  r   r¢  r   r   r   r   r—  Ý  s
    r—  c                  C   s®   t  ¡ } |  t j t¡¡ |  t j t¡¡ |  t j t¡¡ |  t j t¡¡ |  t j t	¡¡ |  t j t
¡¡ |  t j t¡¡ |  t j t¡¡ |  t j t¡¡ | S r   )ÚunittestZ	TestSuiteZaddTestZdefaultTestLoaderZloadTestsFromTestCaserC   r…   rž   r¦   rð   r  r(  r7  r—  )Úsuiter   r   r   r¤    s   r¤  )6rS   r   ÚglobÚyamlÚbase64rl  rH   r£  Úcompatr   r   r   Úior   Zunittest.mockr   r   r	   Ú	multipartrT   ÚabspathÚdirnameÚ__file__Zcurr_dirr   ZTestCaser   rC   r…   rž   r¦   rð   r  r(  rU   r\  ZNON_PARAMETRIZED_TESTSr–  Úlistdirr   rx   Úfnamery   Z	yaml_filer[  rO   r(   Z	safe_loadZ	yaml_datar°   rÛ   r7  r—  r¤  r   r   r   r   Ú<module>   sl    6 - 7LAH

ÿÿý€    0