o
    gëfü  ã                   @   sè  d 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lm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlZedƒZedƒZdZeeƒZdZeedƒZdZeedƒZdZeedƒZejdk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ƒZ#G dd„ dejƒZ$G d d!„ d!eje#ƒZ%G d"d#„ d#ej&ƒZ'G d$d%„ d%ejƒZ(G d&d'„ d'ejƒZ)e*d(kròddl+Z+ddlZe+j, -e+j, .e/¡d)¡gej,dd…< e 0¡  dS dS )*a0  
The MIT License

Copyright (c) 2009 Vic Fryzel

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
é    N)Úb)Úunquote)Ú	urlencode)Úurlparse)Ú
urlunparse)Úparse_qs)Ú	parse_qsl)ÚuÚ ú s   :-)ó   ®Úlatin1s   â€™Úutf8s   â¦)é   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	TestErrorc              
   C   s‚   zt j‚ t jy } z|  |jd¡ W Y d }~nd }~ww d}zt  |¡‚ t jy@ } z|  |j|¡ W Y d }~d S d }~ww )NúOAuth error occurred.zOMG THINGS BROKE!!!!)ÚoauthÚErrorÚassertEqualÚmessage)ÚselfÚeÚmsg© r   úQ/var/www/html/humari/django-venv/lib/python3.10/site-packages/tests/test_oauth.pyÚtest_message;   s   €ÿ
€ÿzTestError.test_messagec              
   C   s@   zt j‚ t jy } z|  t|ƒd¡ W Y d }~d S d }~ww )Nr   )r   r   r   Ústr)r   r   r   r   r   Útest_strG   s   €ÿzTestError.test_strN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   :   s    r   c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestGenerateFunctionsc                 C   s^   t  ¡ }|  |d d¡ |  t|ƒd¡ d}t  |¡}|  |d d| ¡ |  t|ƒd¡ d S )NúWWW-AuthenticatezOAuth realm=""é   zhttp://example.myrealm.com/zOAuth realm="%s")r   Úbuild_authenticate_headerr   Úlen)r   ÚheaderÚrealmr   r   r   Útest_build_auth_headerN   s   
ÿz,TestGenerateFunctions.test_build_auth_headerc                 C   sÊ   t  dd¡}t  dd¡}d}t  |||¡}| d¡\}}}|  d|¡ |  ||¡ i }| d¡}	|	D ]}
|
 d	¡\}}| d
¡||< q2|  d|d ¡ |  d|d ¡ |  d|d ¡ |  d|v d¡ d S )NÚconsumer_tokenÚconsumer_secretÚ
user_tokenÚuser_secretz4https://mail.google.com/mail/b/joe@example.com/imap/r   ÚGETú,ú=ú"ú	HMAC-SHA1Úoauth_signature_methodÚoauth_tokenÚoauth_consumer_keyÚoauth_signature)r   ÚConsumerÚTokenÚbuild_xoauth_stringÚsplitr   ÚstripÚ
assertTrue)r   ÚconsumerÚtokenÚurlÚxoauth_stringÚmethodÚ	oauth_urlÚoauth_stringÚreturnedÚpartsÚpartÚvarÚvalr   r   r   Útest_build_xoauth_stringX   s    
z.TestGenerateFunctions.test_build_xoauth_stringc                 C   s4   d}|   dt |¡v ¡ d}|   dt |¡v¡ d S )Nz4http://whatever.com/~someuser/?test=test&other=otherú~z../../../../../../../etc/passwdz../)r<   r   Úescape©r   Ústringr   r   r   Útest_escapen   s   z!TestGenerateFunctions.test_escapec                 C   ó6   t  ¡ }|  t|ƒd¡ t  d¡}|  t|ƒd¡ d S )Né   é   )r   Úgenerate_noncer   r&   )r   Únoncer   r   r   Útest_gen_noncet   ó   
z$TestGenerateFunctions.test_gen_noncec                 C   rO   )NrP   é   )r   Úgenerate_verifierr   r&   )r   Úverifierr   r   r   Útest_gen_verifierz   rU   z'TestGenerateFunctions.test_gen_verifierc                 C   s$   t t ¡ ƒ}t ¡ }|  ||¡ d S ©N)ÚintÚtimer   Úgenerate_timestampr   )r   ÚexpÚnowr   r   r   Útest_gen_timestamp€   s   z(TestGenerateFunctions.test_gen_timestampN)	r   r   r    r)   rI   rN   rT   rY   r`   r   r   r   r   r"   M   s    
r"   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestConsumerc                 C   s$   d| _ d| _tj| j | jd| _d S )Númy-keyú	my-secret©ÚkeyÚsecret)re   rf   r   r7   r=   ©r   r   r   r   ÚsetUp†   s   zTestConsumer.setUpc                 C   s(   |   | jj| j¡ |   | jj| j¡ d S rZ   )r   r=   re   rf   rg   r   r   r   Ú	test_init‹   s   zTestConsumer.test_initc                 C   ó4   |   tdd„ ¡ |   tdd„ ¡ |   tdd„ ¡ d S )Nc                   S   ó   t  d d ¡S rZ   ©r   r7   r   r   r   r   Ú<lambda>   ó    z)TestConsumer.test_basic.<locals>.<lambda>c                   S   ó   t  dd ¡S ©NÚasfrl   r   r   r   r   rm   ‘   rn   c                   S   ó   t  d d¡S ©NÚdasfrl   r   r   r   r   rm   ’   rn   ©ÚassertRaisesÚ
ValueErrorrg   r   r   r   Ú
test_basic   ó   zTestConsumer.test_basicc                 C   sZ   t tt| jƒƒƒ}|  d|v ¡ |  d|v ¡ |  |d | jj¡ |  |d | jj¡ d S )Nr5   Úoauth_consumer_secret)Údictr   r   r=   r<   r   re   rf   )r   Úresr   r   r   r   ”   s
   zTestConsumer.test_strN)r   r   r    rh   ri   rx   r   r   r   r   r   ra   …   s
    ra   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú	TestTokenc                 C   s"   d| _ d| _t | j | j¡| _d S )Nrb   rc   )re   rf   r   r8   r>   rg   r   r   r   rh   œ   s   zTestToken.setUpc                 C   rj   )Nc                   S   rk   rZ   ©r   r8   r   r   r   r   rm   ¢   rn   z&TestToken.test_basic.<locals>.<lambda>c                   S   ro   rp   r~   r   r   r   r   rm   £   rn   c                   S   rr   rs   r~   r   r   r   r   rm   ¤   rn   ru   rg   r   r   r   rx   ¡   ry   zTestToken.test_basicc                 C   sX   |   | jj| j¡ |   | jj| j¡ |   | jjd ¡ |   | jjd ¡ |   | jjd ¡ d S rZ   )r   r>   re   rf   ÚcallbackÚcallback_confirmedrX   rg   r   r   r   ri   ¦   s
   zTestToken.test_initc                 C   s€   |   | jjd ¡ |   | jjd ¡ d}| j |¡ |   | jj|¡ |   | jjd¡ | j d ¡ |   | jjd ¡ |   | jjd¡ d S )Nú"http://www.example.com/my-callbackÚtrue)r   r>   r   r€   Úset_callback)r   Úcbr   r   r   Útest_set_callback­   s   zTestToken.test_set_callbackc                 C   sn   |   | jjd ¡ t ¡ }| j |¡ |   | jj|¡ | j ¡  |  | jj|¡ | j d¡ |   | jjd¡ d S ©Nr
   )r   r>   rX   r   rW   Úset_verifierÚassertNotEqual)r   Úvr   r   r   Útest_set_verifier»   s   
zTestToken.test_set_verifierc                 C   sÆ   |   | j ¡ d ¡ | j ¡  |   | j ¡ d ¡ d}t ¡ }| j |¡ | j |¡ | j ¡ }d| }|   |d||f ¡ d}t ¡ }| j |¡ | j |¡ | j ¡ }d| }|   |d||f ¡ d S )Nz5http://www.example.com/my-callback?save=1&return=truez&oauth_verifier=%sú%s%sz+http://www.example.com/my-callback-no-queryz?oauth_verifier=%s)r   r>   Úget_callback_urlr‡   r   rW   rƒ   )r   r„   r‰   r?   Úverifier_strr   r   r   Útest_get_callback_urlÅ   s"   


zTestToken.test_get_callback_urlc                 C   sL   d| j | jf }|  | j ¡ |¡ | j d¡ |d7 }|  | j ¡ |¡ d S )Nz$oauth_token=%s&oauth_token_secret=%sr   z&oauth_callback_confirmed=true)re   rf   r   r>   Ú	to_stringrƒ   rL   r   r   r   Útest_to_stringÛ   s
   zTestToken.test_to_stringc                 C   s:   |   | jj|j¡ |   | jj|j¡ |   | jj|j¡ d S rZ   )r   r>   re   rf   r€   )r   Únewr   r   r   Ú_compare_tokensã   s
   
ÿzTestToken._compare_tokensc                 C   s    t  dd¡}|  t|ƒd¡ d S )NÚtookenÚseecretz-oauth_token=tooken&oauth_token_secret=seecret)r   r8   r   r   )r   Útokr   r   r   Útest___str__í   s   zTestToken.test___str__c                 C   sà   |   tdd„ ¡ |   tdd„ ¡ |   tdd„ ¡ |   tdd„ ¡ |   tdd„ ¡ |   tdd„ ¡ |   tdd„ ¡ |   td	d„ ¡ |   td
d„ ¡ | j ¡ }tj |¡}|  |¡ | j d¡ | j ¡ }tj |¡}|  |¡ d S )Nc                   S   ó   t j d¡S r†   ©r   r8   Úfrom_stringr   r   r   r   rm   ò   rn   z,TestToken.test_from_string.<locals>.<lambda>c                   S   r—   )NÚblahblahblahr˜   r   r   r   r   rm   ó   rn   c                   S   r—   )Nz	blah=blahr˜   r   r   r   r   rm   ô   rn   c                   S   r—   )Nzoauth_token_secret=asfdasfr˜   r   r   r   r   rm   ö   rn   c                   S   r—   )Nzoauth_token_secret=r˜   r   r   r   r   rm   ÷   rn   c                   S   r—   )Nzoauth_token=asfdasfr˜   r   r   r   r   rm   ø   rn   c                   S   r—   )Nzoauth_token=r˜   r   r   r   r   rm   ù   rn   c                   S   r—   )Nz oauth_token=&oauth_token_secret=r˜   r   r   r   r   rm   ú   rn   c                   S   r—   )Nz/oauth_token=tooken%26oauth_token_secret=seecretr˜   r   r   r   r   rm   û   rn   r   )	rv   rw   r>   r   r   r8   r™   r’   rƒ   )r   rM   r‘   r   r   r   Útest_from_stringñ   s    


zTestToken.test_from_stringN)r   r   r    rh   rx   ri   r…   rŠ   rŽ   r   r’   r–   r›   r   r   r   r   r}   ›   s    

r}   c                   @   s   e Zd Zddd„ZdS )ÚReallyEqualMixinNc                 C   s6   | j |||d | j t|ƒt|ƒd|||f d d S )N)r   za :: %r, b :: %r, %r)r   Útype)r   Úar   r   r   r   r   ÚassertReallyEqual  s   &z"ReallyEqualMixin.assertReallyEqualrZ   )r   r   r    rŸ   r   r   r   r   rœ     s    rœ   c                   @   r!   )Ú	TestFuncsc                 C   s|   |   ttjd¡ |   ttjd¡ |   ttjd¡ |   ttjdg¡ |  t t¡t¡ |  t t¡t¡ |  t d¡t¡ d S )Nr   r   ó   Â®)	rv   Ú	TypeErrorr   Ú
to_unicodeÚto_unicode_optional_iteratorr   Ú_BSMILEYÚ_USMILEYÚ_UGLYPHrg   r   r   r   Útest_to_unicode  s   zTestFuncs.test_to_unicodec                 C   sN   |   ttjd¡ |   ttjd¡ |  t t¡t¡ |  t t¡t d¡¡ d S )Nr   ó   r   )rv   r¢   r   Úto_utf8r   r¥   r§   Úencoderg   r   r   r   Útest_to_utf8  s   ÿzTestFuncs.test_to_utf8c                 C   s*   |   t | ¡| u ¡ |  t t¡t¡ d S rZ   )r<   r   Úto_unicode_if_stringr   r¥   r¦   rg   r   r   r   Útest_to_unicode_if_string  s   z#TestFuncs.test_to_unicode_if_stringc                 C   sB   |   t | ¡| u ¡ |  t t¡t¡ |  t t¡t d¡¡ d S ©Nr   )r<   r   Úto_utf8_if_stringr   r¦   r¥   r§   r«   rg   r   r   r   Útest_to_utf8_if_string!  s
   ÿz TestFuncs.test_to_utf8_if_stringc                 C   s~   |   t t¡t¡ |   t t¡t¡ |   t tg¡tg¡ |   t tg¡tg¡ |   t tf¡tg¡ |  t | ¡| u ¡ d S rZ   )r   r   r¤   r¥   r¦   r§   r<   rg   r   r   r   Ú!test_to_unicode_optional_iterator'  s    ÿÿÿÿÿz+TestFuncs.test_to_unicode_optional_iteratorc                 C   s¦   |   t t¡t¡ |   t t¡t d¡¡ |   t tg¡tg¡ |   t tg¡tg¡ |   t tg¡t d¡g¡ |   t tf¡t d¡g¡ |  t | ¡| u ¡ d S r¯   )r   r   Úto_utf8_optional_iteratorr¥   r§   r«   r¦   r<   rg   r   r   r   Útest_to_utf8_optional_iterator4  s&   ÿÿÿÿ
ÿ
ÿz(TestFuncs.test_to_utf8_optional_iteratorN)	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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"e# $dA¡e# $dB¡dCdD„ ƒƒZ%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSS )TÚTestRequestc                 C   sR   d}t  |¡}|  d|jv ¡ |  d|jv ¡ |  tt|d¡ |  tt|d¡ d S )Nr.   r?   Únormalized_url)r   ÚRequestÚassertFalseÚ__dict__rv   ÚAttributeErrorÚgetattr)r   rA   Úreqr   r   r   Útest__init__D  s   
zTestRequest.test__init__c                 C   s„   d}d}t  ||¡}|  |j|¡ |  |j|¡ |d |_|  |j|d ¡ |  |j|d ¡ d |_|  |jd ¡ |  |jd ¡ d S )Núhttp://example.comr.   z	/?foo=barú/)r   r·   r   r?   r¶   ©r   r?   rA   r¼   r   r   r   Útest_setterL  s   
zTestRequest.test_setterc                 C   s,   d}d}t  ||¡}|`|  tt|d¡ d S )Nr¾   r.   r?   )r   r·   r?   rv   rº   r»   rÀ   r   r   r   Útest_deleterY  s
   zTestRequest.test_deleterc                 C   sh   d}d}d}d}d}t  ||¡}|  |j|¡ |  |j|¡ t  ||¡}|  |j|¡ |  |j|¡ d S )Nzhttp://example.com:80/foo.phpzhttps://example.com:443/foo.phpzhttp://example.com/foo.phpzhttps://example.com/foo.phpr.   ©r   r·   r   r¶   r?   )r   Úurl1Úurl2Úexp1Úexp2rA   r¼   r   r   r   Útest_url`  s   zTestRequest.test_urlc                 C   s4   t  ¡ }zd|_|  d¡ W d S  ty   Y d S w )Nzftp://example.comz Invalid URL scheme was accepted.)r   r·   r?   Úfailrw   )r   Úrequestr   r   r   Útest_bad_urlo  s   ÿzTestRequest.test_bad_urlc                 C   s^   t  dd¡}t  dd¡}t  dd¡}| t  ¡ ||¡ |  |j|d ¡ |  |j|d ¡ d S )	NÚmy_consumer_keyÚmy_consumer_secretÚmy_keyÚ	my_secretr.   úhttp://example.com/fetch.phpr5   r4   )r   r7   r8   r·   Úsign_requestÚSignatureMethod_HMAC_SHA1r   re   ©r   r=   r>   rÊ   r   r   r   Útest_unset_consumer_and_tokenw  s   ÿz)TestRequest.test_unset_consumer_and_tokenc                 C   s<   t  dd¡}t  dd¡}t  ¡ }|  t|jt  ¡ ||¡ d S )NrÌ   rÍ   rÎ   rÏ   )r   r7   r8   r·   rv   rw   rÑ   rÒ   rÓ   r   r   r   Útest_no_url_set  s   
þzTestRequest.test_no_url_setc                 C   sL   d}t t|ƒd d… d ƒ}d}t ||¡}|  |j|¡ |  |j|¡ d S )NúOhttps://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10r   )NNNr.   )r   r   r   r·   r   r?   r¶   )r   r?   r¶   rA   r¼   r   r   r   Útest_url_query‰  s   zTestRequest.test_url_queryc                 C   sH   d}d}ddi}t j|||d}|  | d¡d¡ |  t j|jd¡ d S )Nr¾   r.   Úoauth_consumerÚasdf©Ú
parametersÚblah)r   r·   r   Úget_parameterrv   r   )r   r?   rA   Úparamsr¼   r   r   r   Útest_get_parameter‘  s   zTestRequest.test_get_parameterc                 C   sŒ   ddi}t dƒt dƒt dƒt dƒt dƒt dƒt dƒgt d	ƒt d
dƒt dƒtt dƒt ddƒi}|}| |¡ t dd|¡}|  || ¡ ¡ d S )NrØ   ÚasdfasdfasdfÚfooÚbazÚbarÚmultiÚFOOÚBARÚuni_utf8r   r   Úuni_unicodeÚuni_unicode_2s   Ã¥Ã…Ã¸Ã˜r.   r¾   )r	   r§   Úupdater   r·   r   Úget_nonoauth_parameters)r   Úoauth_paramsÚother_paramsrÞ   r¼   r   r   r   Útest_get_nonoauth_parametersš  s   ÿù

z(TestRequest.test_get_nonoauth_parametersc              	   C   sž   d}dddddddd	d
œ}t  d||¡}t| ¡ ƒ}|d  d¡|d< td|t|ƒf ƒ}|  |j|j¡ |  |j|j¡ t	|j
ƒ}t	|j
ƒ}|  ||¡ d S )Núhttp://sp.example.com/õ   qÂ¿uÃ© ,aasp u?..a.sú1.0Ú4572616e48616d6d65724c61686176Ú	137131200Ú0685bd9184jfhq22r2   Úad180jjd733klru7ú wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D©ÚnonasciithingÚoauth_versionÚoauth_nonceÚoauth_timestampr5   r3   r4   r6   r.   rø   zutf-8ú%s?%s)r   r·   r   Úto_urlr«   r   ÚassertEqualsÚnetlocÚpathr   Úquery)r   r?   rÞ   r¼   r|   r^   rž   r   r   r   r   Útest_to_url_nonascii°  s&   ø

z TestRequest.test_to_url_nonasciic                 C   s”   ddi}ddddddœ}|}|  |¡ t dd	|¡}| ¡  d
¡}|d }tdd„ |d  d¡D ƒƒ}dddddddœ}|  d	|¡ |  ||¡ d S )NrØ   rà   râ   rá   õ   Â®u   Ã¥Ã…Ã¸Ã˜)rá   rã   rç   rè   ré   r.   r¾   ú?r   c                 s   s    | ]
}|  ¡  d ¡V  qdS )r0   N)r;   r:   )Ú.0Úitemr   r   r   Ú	<genexpr>á  s   € zJTestRequest.test_to_url_works_with_non_ascii_parameters.<locals>.<genexpr>r$   ú&z%C2%AEz%C3%A5%C3%85%C3%B8%C3%98)rç   rá   rã   ré   rè   rØ   )rê   r   r·   rý   r:   r{   rþ   )r   rì   rí   rÞ   r¼   Ú	url_partsÚhostÚexpected_paramsr   r   r   Ú+test_to_url_works_with_non_ascii_parametersË  s.   ÿû
ú	z7TestRequest.test_to_url_works_with_non_ascii_parametersc                 C   sð   d}dddddddd	œ}t  d
||¡}t| |¡ ¡ ƒd \}}| d¡}|d  d¡}|  t|ƒt|ƒd ¡ i }|D ]}	|	 d¡\}
}t| 	d¡ƒ||
< q<|  
||d ¡ |d= |  t|ƒt|ƒ¡ | ¡ D ]\}}|  
|| |¡¡ qhd S )Nrï   rñ   rò   ró   rô   r2   rõ   rö   ©rù   rú   rû   r5   r3   r4   r6   r.   r   zOAuth r$   z, r0   r1   r(   )r   r·   ÚlistÚ	to_headerÚitemsr:   r<   r&   r   r;   r   Úget)r   r(   rÞ   r¼   r'   ÚvaluerE   Úvarsr|   r‰   rG   rH   re   r   r   r   Útest_to_headerï  s0   ù

ÿzTestRequest.test_to_headerc              	   C   sB   d}t ddƒdddddd	d
dœ}t d||¡}|  | ¡ d¡ d S )Nrï   rð   r   rñ   rò   ró   rô   r2   rõ   rö   r÷   r.   a   nonasciithing=q%C2%BFu%C3%A9%20%2Caasp%20u%3F..a.s&oauth_consumer_key=0685bd9184jfhq22&oauth_nonce=4572616e48616d6d65724c61686176&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%252FPY%253D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131200&oauth_token=ad180jjd733klru7&oauth_version=1.0)r	   r   r·   rŸ   Úto_postdata)r   r(   rÞ   r¼   r   r   r   Útest_to_postdata_nonascii  s   øþz%TestRequest.test_to_postdata_nonasciic              	   C   sx   d}ddgdddddd	d
dœ}t  d||¡}ddg}|d= | | ¡ ¡ dd„ }|  t||dtt| ¡ ƒ|d¡ d S )Nrï   rå   ræ   rñ   rò   ró   rô   r2   rõ   rö   )rä   rù   rú   rû   r5   r3   r4   r6   r.   )rä   rå   )rä   ræ   rä   c                 S   s   | d S )Nr   r   )Úxr   r   r   rm   ?  s    z.TestRequest.test_to_postdata.<locals>.<lambda>)re   )r   r·   Úextendr  r   Úsortedr   r  )r   r(   rÞ   r¼   ÚflatÚkfr   r   r   Útest_to_postdata,  s&   ø
þzTestRequest.test_to_postdatac                 C   sš   d}dddddddd	œ}t  d
||¡}td|t|ƒf ƒ}t| ¡ ƒ}|  |j|j¡ |  |j|j¡ |  |j|j¡ t	|j
ƒ}t	|j
ƒ}|  ||¡ d S )Nrï   rñ   rò   ró   rô   r2   rõ   rö   r  r.   rü   )r   r·   r   r   rý   r   Úschemerÿ   r   r   r  )r   r?   rÞ   r¼   r^   r|   Ú
exp_parsedÚ
res_parsedr   r   r   Útest_to_urlD  s$   ù


zTestRequest.test_to_urlc                 C   sÚ   d}dddddddd	œ}t  d
||¡}td|t|ƒf ƒ}t| ¡ ƒ}|  |j|j¡ |  |j|j¡ |  |j|j¡ t	|j
ƒ}t	|j
ƒ}|  d|v ¡ |  d|v ¡ |  |d dg¡ |  |d dg¡ |  ||¡ d S )NrÖ   rñ   rò   ró   rô   r2   rõ   rö   r  r.   z%s&%sÚaltúmax-contactsÚjsonÚ10)r   r·   r   r   rý   r   r  rÿ   r   r   r  r<   )r   r?   rÞ   r¼   r^   r|   Úexp_qÚres_qr   r   r   Útest_to_url_with_query\  s,   ù


z"TestRequest.test_to_url_with_queryc                 C   sd   t  dd¡}tdƒt tdƒ }t  d|¡}|  |jtdƒ¡ | t  ¡ |d ¡ |  |d d¡ d S )	Nr*   r+   zqhttp://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Franciscz,+CAr.   ú0http://api.simplegeo.com/1.0/places/address.jsonr6   ó   WhufgeZKyYpKsI70GZaiDaYwl6g=)	r   r7   r	   Ú_U2766r·   rŸ   r¶   rÑ   rÒ   ©r   r=   r?   r¼   r   r   r   Ú$test_signature_base_unicode_nonascii{  s   þþþÿz0TestRequest.test_signature_base_unicode_nonasciic                 C   s\   t  dd¡}dt d }t  d|¡}|  |jtdƒ¡ | t  ¡ |d ¡ |  |d d¡ d S )	Nr*   r+   sq   http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Franciscs   ,+CAr.   r(  r6   r)  )	r   r7   Ú_B2766r·   rŸ   r¶   r	   rÑ   rÒ   r+  r   r   r   Ú1test_signature_base_string_bytes_nonascii_nonutf8‰  s   þþþÿz=TestRequest.test_signature_base_string_bytes_nonascii_nonutf8c                 C   sT   t  dd¡}d}t  d|¡}|  |jtdƒ¡ | t  ¡ |d ¡ |  |d d¡ d S )Nr*   r+   s~   http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc%E2%9D%A6,+CAr.   r(  r6   r)  )r   r7   r·   rŸ   r¶   r	   rÑ   rÒ   r+  r   r   r   Ú5test_signature_base_bytes_nonascii_nonutf8_urlencoded—  s   þÿzATestRequest.test_signature_base_bytes_nonascii_nonutf8_urlencodedc                 C   sX   t  dd¡}tdƒ}t  d|¡}|  |jtdƒ¡ | t  ¡ |d ¡ |  |d d¡ d S )Nr*   r+   z~http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc%E2%9D%A6,+CAr.   r(  r6   r)  )r   r7   r	   r·   rŸ   r¶   rÑ   rÒ   r+  r   r   r   Ú8test_signature_base_unicode_nonascii_nonutf8_url_encoded¥  s   þÿzDTestRequest.test_signature_base_unicode_nonascii_nonutf8_url_encodedc                 C   s¾   d}dddddddd	œ}t  d
||¡}|  |jd¡ |  |j|¡ t| ¡ ƒ}|  t|ƒt|ƒd ¡ t	|ƒ}| 
¡ D ]\}}|dkrDq;|  ||| ¡ q;|  |d d¡ |  |d d¡ d S )NrÖ   rñ   rò   ró   rô   r2   rõ   rö   r  r.   z6https://www.google.com/m8/feeds/contacts/default/full/é   r6   r!  r#  r"  r$  )r   r·   r   r¶   r?   r   Úget_normalized_parametersr<   r&   r{   r  )r   r?   rÞ   r¼   Únormalized_paramsre   r  r   r   r   Ú%test_signature_base_string_with_query³  s0   ù	þz1TestRequest.test_signature_base_string_with_queryc                 C   ó,   d}t  d|¡}| ¡ }d}|  ||¡ d S )Nzhttp://sp.example.com/?empty=r.   zempty=©r   r·   r2  r   ©r   r?   r¼   r|   Úexpectedr   r   r   Ú$test_get_normalized_parameters_emptyÎ  ó
   z0TestRequest.test_get_normalized_parameters_emptyc                 C   r5  )Nzâhttp://example.com/v2/search/videos?oauth_nonce=79815175&oauth_timestamp=1295397962&oauth_consumer_key=mykey&oauth_signature_method=HMAC-SHA1&q=car&oauth_version=1.0&offset=10&oauth_signature=spWLI%2FGQjid7sQVd5%2FarahRxzJg%3Dr.   z‹oauth_consumer_key=mykey&oauth_nonce=79815175&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1295397962&oauth_version=1.0&offset=10&q=carr6  r7  r   r   r   Ú(test_get_normalized_parameters_duplicateÙ  s
   z4TestRequest.test_get_normalized_parameters_duplicatec                 C   r5  )Nzìhttp://example.com/v2/search/videos?oauth_nonce=79815175&oauth_timestamp=1295397962&oauth_consumer_key=mykey&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&offset=10&oauth_signature=spWLI%2FGQjid7sQVd5%2FarahRxzJg%3D&tag=one&tag=twor.   z•oauth_consumer_key=mykey&oauth_nonce=79815175&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1295397962&oauth_version=1.0&offset=10&tag=one&tag=twor6  r7  r   r   r   Ú'test_get_normalized_parameters_multipleë  r:  z3TestRequest.test_get_normalized_parameters_multiplec                 C   r5  )Núìhttp://photos.example.net/photos?file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=originalr.   zËfile=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=originalr6  r7  r   r   r   Ú'test_get_normalized_parameters_from_url÷  s
   z3TestRequest.test_get_normalized_parameters_from_urlc                 C   sN   d}t  d|¡}t  ¡ }t  dd¡}| ||d ¡\}}tdƒ}|  ||¡ d S )Nr=  r.   Údpf43f3p2l4k3l03rá   a  GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal)r   r·   rÒ   r7   Úsigning_baser   r   )r   r?   r¼   Úsmr=   re   Úrawr8  r   r   r   Útest_signing_base  s   zTestRequest.test_signing_basec                 C   sT   d}dddddddd	t d
gddgd
t dœ
}t d||¡}| ¡ }d}|  ||¡ d S )Nrï   rñ   rò   ró   rô   r2   rõ   rå   ræ   r¡   )
rù   rú   rû   r5   r3   r4   rä   Ú
multi_sameÚuni_utf8_bytesÚuni_unicode_objectr.   a4  multi=BAR&multi=FOO&multi=%C2%AE&multi=%C2%AE&multi_same=FOO&multi_same=FOO&oauth_consumer_key=0685bd9184jfhq22&oauth_nonce=4572616e48616d6d65724c61686176&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131200&oauth_token=ad180jjd733klru7&oauth_version=1.0&uni_unicode_object=%C2%AE&uni_utf8_bytes=%C2%AE)r§   r   r·   r2  r   ©r   r?   rÞ   r¼   r|   r8  r   r   r   Útest_get_normalized_parameters*  s    
ö
z*TestRequest.test_get_normalized_parametersc              
   C   s|   d}ddddddt  dd	¡ d
dœ}t d||¡}| ¡ }|  tt| ¡ ƒƒ|¡ | 	¡ }|d= |  
tt| ¡ ƒƒ|¡ d S )Nrï   rñ   rò   ró   rô   r2   zsome-random-signature-%déè  éÐ  rõ   )rù   rú   rû   r5   r3   r6   r4   r.   r6   )ÚrandomÚrandintr   r·   r2  rˆ   r   r  r  Úcopyr   )r   r?   rÞ   r¼   r|   rá   r   r   r   Ú5test_get_normalized_parameters_ignores_auth_signatureJ  s   ù
zATestRequest.test_get_normalized_parameters_ignores_auth_signaturec                 C   s2   d}t  d|d ¡}|  |jd¡ |  |jd¡ d S )NzEhttp://social.yahooapis.com/v1/user/6677/connections;start=0;count=20r.   rÃ   )r   r?   r¼   r   r   r   Ú-test_signature_base_string_with_matrix_paramsa  s   z9TestRequest.test_signature_base_string_with_matrix_paramsc                 C   sv   t  dd¡}t  |¡}G dd„ dƒ}z| |ƒ ¡ |  d¡ W n	 ty(   Y nw t  ¡ }| |¡ |  ||j¡ d S )Nre   rf   c                   @   ó   e Zd ZdS )z3TestRequest.test_set_signature_method.<locals>.BlahN©r   r   r    r   r   r   r   ÚBlahk  ó    rR  z6Client.set_signature_method() accepted invalid method.)	r   r7   ÚClientÚset_signature_methodrÉ   rw   rÒ   r   rA   )r   r=   ÚclientrR  Úmr   r   r   Útest_set_signature_methodg  s   
ÿ
z%TestRequest.test_set_signature_methodc                 C   s`   d}t  dd¡dt  dd¡ dœ}t d||¡}| ¡ }tt| ¡ ƒƒ dd	¡}|  	||¡ d S )
Nrï   éd   rI  z/This data with a random number (%d) has spaces!rJ  )Úsome_random_dataÚdatar.   ú+z%20)
rK  rL  r   r·   r2  r   r  r  Úreplacer   rG  r   r   r   Ú2test_get_normalized_string_escapes_spaces_properlyx  s   

ÿþz>TestRequest.test_get_normalized_string_escapes_spaces_properlyzoauth2.Request.make_timestampzoauth2.Request.make_noncec                 C   s‚  d|_ d|_ tjddd}tjddd}dd	d
|j|jdœ}ts-d}| jttjd||d t	dƒt
 }tjd||d}| t ¡ |d ¡ |  |d d¡ d}tjd||d}| t ¡ |d ¡ |  |d d¡ d}d|d< | jttjd||d t
|d< tjd||d}| t ¡ |d ¡ |  |d d¡ d|d< tjd||d}| t ¡ |d ¡ |  |d d¡ d}| jttjd||d d S )Né   é   útok-test-keyútok-test-secretrd   úcon-test-keyúcon-test-secretrñ   rò   ró   )rù   rú   rû   r4   r5   u   http://sp.example.com/Â’r.   ©rA   r?   rÛ   rï   r6   s   cMzvCkhvLL57+sTIxLITTHfkqZk=zhttp://sp.example.com/%E2%80%99s   yMLKOyNKC/DkyhUOb8DLSvceEWE=)r   Únon_oauth_things   0GU50m0v60CVDB5JnoBXnvvvKx4=r¡   s   pqOCu4qvRTiGiXB8Z61Jsey0pMM=s   http://sp.example.com/?q=’)Úreturn_valuer   r8   r7   re   ÚPY3rv   r¢   r·   r	   Ú_U2019rÑ   rÒ   rŸ   )r   Úmock_make_nonceÚmock_make_timestampr•   ÚconrÞ   r?   r¼   r   r   r   Útest_request_nonutf8_bytes…  sD   ûz&TestRequest.test_request_nonutf8_bytesc                 C   s4  t jddd}t jddd}d|jdd|jd	œ}td
ƒ}t jd||ddd}| t  ¡ |d ¡ |  |d d¡ |  |d d¡ d|jdd|jd	œ}t jd||ddd}| t  ¡ |d ¡ |  |d d¡ |  |d d¡ d|jdd|jd	œ}t jd||dd}| t  ¡ |d ¡ |  |d d¡ |  |d d¡ d S )Nr>   rb  rd   r=   rd  rñ   l   ¶/ÿum%i«3¹I)rù   r4   rú   rû   r5   zhttp://www.example.com/resourceÚPUTs   Hello World!F)rA   r?   rÛ   ÚbodyÚis_form_encodedÚoauth_body_hashs   Lve95gjOVATpfV8EL5X4nxwjKHE=r6   s   t+MX8l/0S8hdbVQL99nD0X1fPnM=l   Í/)¹%iü3¹Is   CTFmrqJIGT7NsWJ42OrujahTtTc=l   §V<!diŽhÐIr.   )rA   r?   rÛ   rp  s   2jmj7l5rSw0yVb/vlWAYkK/YBwk=s   Zhl++aWSP0O3/hYQ0CuBc7jv38I=)	r   r8   r7   re   r	   r·   rÑ   rÒ   rŸ   )r   r•   rl  rÞ   r?   r¼   r   r   r   Útest_request_hash_of_bodyÂ  sB   ûûûz%TestRequest.test_request_hash_of_bodyc           	      C   s  d}ddddœ}t jddd}t jd	d
d}|j|d< |j|d< t jd||d}t  ¡ t  ¡ dœ}| ¡ D ]\}}| |||¡ |  	|d |j
¡ |  	|d |¡ q5d}t jd||d}| t  ¡ ||¡ |  	|d d¡ tdƒt }t jd||d}| t  ¡ ||¡ |  	|d d¡ d}t jd||d}| t  ¡ ||¡ |  	|d d¡ tdƒt }t jd||d}| t  ¡ ||¡ |  	|d d¡ d S )Nrï   rñ   rò   ró   )rù   rú   rû   ra  rb  rd   rc  rd  r4   r5   r.   re  )s   DX01TdHws7OninCLK9VztNTH1M4=s   con-test-secret&tok-test-secretr3   r6   s   http://sp.example.com/â€™s   loFvp5xC7YbOgd9exIO6TxB7H4s=s   http://sp.example.com/?q=â€™s   IBw5mfvoCsDjgpcsVKbyvsDqQaU=zhttp://sp.example.com/?q=)r   r8   r7   re   r·   rÒ   ÚSignatureMethod_PLAINTEXTr  rÑ   r   Únamer	   ri  )	r   r?   rÞ   r•   rl  r¼   Úmethodsr^   rA   r   r   r   Útest_sign_requestø  sB   ý

þzTestRequest.test_sign_requestc                 C   ó€   d}dddddddd	œ}t  d
||¡}| ¡ }|d |d< |d= t j d
||¡}|  |jd
¡ |  |j|¡ |  || ¡ ¡ dS )z?Make sure WSGI header HTTP_AUTHORIZATION is detected correctly.rï   rñ   rò   ró   rô   r2   rõ   rö   r  r.   ÚAuthorizationÚHTTP_AUTHORIZATIONN©r   r·   r  Úfrom_requestr   rA   r?   rM  ©r   r?   rÞ   r¼   Úheadersr   r   r   Ú!test_from_request_works_with_wsgi)  ó"   ù
z-TestRequest.test_from_request_works_with_wsgic                 C   rw  )z?Checks for the Authorization header should be case insensitive.rï   rñ   rò   ró   rô   r2   rõ   rö   r  r.   rx  ÚauthorizationNrz  r|  r   r   r   Ú7test_from_request_is_case_insensitive_checking_for_authE  r  zCTestRequest.test_from_request_is_case_insensitive_checking_for_authc           
      C   s   d}dddddddd	œ}t  d
||¡}| ¡ }t j d
||¡}|  |jd
¡ |  |j|¡ |  || ¡ ¡ ddi}|  t j	t jjd
||¡ t
|ƒ}t jjd
||d}t|dd}| ¡ D ]\}}	t|	d ƒ||< q\|  || ¡ ¡ t j d
|¡}|  d |¡ d S )Nrï   rñ   rò   ró   rô   r2   rõ   rö   r  r.   rx  zOAuth this is a bad header)Úquery_stringF)Úkeep_blank_valuesr   )r   r·   r  r{  r   rA   r?   rM  rv   r   r   r   r  r   )
r   r?   rÞ   r¼   r}  Úbad_headersÚqsr^   Úkr‰   r   r   r   Útest_from_requesta  s8   ù
ÿÿzTestRequest.test_from_requestc                 C   s„   d}dddddddd	œ}t jd
dd}t j |¡}|  d|v ¡ |  |d |j¡ t jj||d}|  d|v ¡ |  |d |¡ d S )Nrï   rñ   rò   ró   rô   r2   rõ   rö   r  ra  rb  rd   Úoauth_callbackr4   )r   )r   r8   r·   Úfrom_token_and_callbackr¸   r   re   r<   )r   r?   rÞ   r•   r¼   r   r   r   Útest_from_token_and_callbackŽ  s    ù
z(TestRequest.test_from_token_and_callbackc                 C   sx   d}t jddd}| d¡ t jddd}t jj||d|d	}|  |d
 |j¡ |  |d |j¡ |  |j|d ¡ d S )Nrï   ra  rb  rd   Úthis_is_a_test_verifierrc  rd  r.   )r>   Úhttp_methodÚhttp_urlr4   r5   Úoauth_verifier)	r   r8   r‡   r7   r·   Úfrom_consumer_and_tokenr   re   rX   )r   r?   r•   rl  r¼   r   r   r   Útest_from_consumer_and_token¤  s   

ÿz(TestRequest.test_from_consumer_and_tokenN)-r   r   r    r½   rÁ   rÂ   rÈ   rË   rÔ   rÕ   r×   rß   rî   r  r  r  r  r  r   r'  r,  r.  r/  r0  r4  r9  r;  r<  r>  rC  rH  rN  rO  rX  r^  ÚmockÚpatchrm  rr  rv  r~  r  r‡  rŠ  r  r   r   r   r   rµ   C  sV    
	$! ;61-rµ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚSignatureMethod_BadÚBADc                 C   ó   dS r†   r   ©r   rÊ   r=   r>   r   r   r   r@  ´  ó   z SignatureMethod_Bad.signing_basec                 C   r•  )Nzinvalid-signaturer   r–  r   r   r   Úsign·  r—  zSignatureMethod_Bad.signN)r   r   r    rt  r@  r˜  r   r   r   r   r“  ±  s    r“  c                   @   sl   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S )Ú
TestServerc                 C   sŒ   d}ddt t ¡ ƒdddgddœ}tjd	d
d| _tjddd| _| jj|d< | jj|d< tjd||d| _	t 
¡ }| j	 || j| j¡ d S ©Nrï   rñ   rò   Úblergrå   ræ   é;   ©rù   rú   rû   rã   rä   rá   úconsumer-keyúconsumer-secretrd   ú	token-keyútoken-secretr4   r5   r.   re  )r[   r\   r   r7   r=   r8   r>   re   r·   rÊ   rÒ   rÑ   )r   r?   rÞ   Úsignature_methodr   r   r   rh   ¼  s"   
ú	ÿzTestServer.setUpc                 C   sV   t jdt  ¡ id}|  d|jv ¡ |  t|jd t jƒ¡ t  ¡ }|  |ji ¡ d S )Nr2   )Úsignature_methods)r   ÚServerrÒ   r<   r£  Ú
isinstancer   ©r   Úserverr   r   r   ri   Ó  s   ÿzTestServer.test_initc                 C   s”   t  ¡ }| t  ¡ ¡}|  t|ƒdk¡ |  d|v ¡ |  t|d t jƒ¡ | t  ¡ ¡}|  t|ƒdk¡ |  d|v ¡ |  t|d t jƒ¡ d S )Nr$   r2   r1  Ú	PLAINTEXT)r   r¤  Úadd_signature_methodrÒ   r<   r&   r¥  rs  )r   r§  r|   r   r   r   Útest_add_signature_methodÜ  s   ÿ
ÿz$TestServer.test_add_signature_methodc                 C   sŒ   t  ¡ }| t  ¡ ¡ | | j| j| j¡}|  d|v ¡ |  d|v ¡ |  d|v ¡ |  	|d d¡ |  	|d d¡ |  	|d ddg¡ d S )Nrã   rá   rä   r›  rœ  rå   ræ   )
r   r¤  r©  rÒ   Úverify_requestrÊ   r=   r>   r<   r   )r   r§  rÛ   r   r   r   Útest_verify_requestê  s   ÿzTestServer.test_verify_requestc                 C   sP   ddl m} t ¡ }| t ¡ ¡ | jd= | jd= |  ||j| j| j	| j
¡ d S )Nr   )ÚMissingSignaturer3   r6   )Úoauth2r­  r   r¤  r©  rs  rÊ   rv   r«  r=   r>   )r   r­  r§  r   r   r   Ú%test_verify_request_missing_signatureø  s   ÿz0TestServer.test_verify_request_missing_signaturec                 C   s@   t  ¡ }| t  ¡ ¡ d| jd< |  t j|j| j| j| j	¡ d S )NÚBOGUSr6   ©
r   r¤  r©  rÒ   rÊ   rv   r   r«  r=   r>   r¦  r   r   r   Ú%test_verify_request_invalid_signature  s   
ÿz0TestServer.test_verify_request_invalid_signaturec                 C   sH   t  ¡ }| t  ¡ ¡ | jd  d8  < |  t j|j| j| j| j	¡ d S )Nrû   i€Q r±  r¦  r   r   r   Ú%test_verify_request_invalid_timestamp
  s   ÿz0TestServer.test_verify_request_invalid_timestampc                 C   s4   t  ¡ }| d¡}|  d|v ¡ |  d|d ¡ d S )Nzexample.comr#   zOAuth realm="example.com")r   r¤  r%   r<   r   )r   r§  r}  r   r   r   Útest_build_authenticate_header  s   
ÿz)TestServer.test_build_authenticate_headerc                 C   s´   d}dt t ¡ ƒdddgddœ}tjdd	d
| _tjddd
| _| jj|d< | jj|d< tjd||d| _	t 
¡ }| j	 || j| j¡ t ¡ }| t 
¡ ¡ | | j	| j| j¡}d S )Nrï   rò   r›  rå   ræ   rœ  )rú   rû   rã   rä   rá   rž  rŸ  rd   r   r¡  r4   r5   r.   re  )r[   r\   r   r7   r=   r8   r>   re   r·   rÊ   rÒ   rÑ   r¤  r©  r«  )r   r?   rÞ   r¢  r§  rÛ   r   r   r   Útest_no_version  s*   
ûÿÿzTestServer.test_no_versionc                 C   s¨   d}ddt t ¡ ƒdddgddœ}tjd	d
d}tjddd}|j|d< |j|d< tjd||d}t ¡ }| |||¡ t 	¡ }| 
t ¡ ¡ |  tj|j|||¡ d S )Nrï   z222.9922rò   r›  rá   rã   rœ  r  rž  rŸ  rd   r   r¡  r4   r5   r.   re  )r[   r\   r   r7   r8   re   r·   rÒ   rÑ   r¤  r©  rv   r   r«  ©r   r?   rÞ   r=   r>   rÊ   r¢  r§  r   r   r   Útest_invalid_version5  s(   
ú	ÿ

zTestServer.test_invalid_versionc                 C   s¦   d}ddt t ¡ ƒdddgddœ}tjd	d
d}tjddd}|j|d< |j|d< tjd||d}tƒ }| |||¡ t 	¡ }| 
t ¡ ¡ |  tj|j|||¡ d S rš  )r[   r\   r   r7   r8   re   r·   r“  rÑ   r¤  r©  rÒ   rv   r   r«  r¶  r   r   r   Útest_invalid_signature_methodQ  s,   
ú	ÿ

ÿz(TestServer.test_invalid_signature_methodc                 C   s®   d}ddt t ¡ ƒdddgddœ}tjd	d
d}tjddd}|j|d< |j|d< tjd||d}t ¡ }| |||¡ |d= t 	¡ }| 
t ¡ ¡ |  tj|j|||¡ d S )Nrï   rñ   rò   r›  rå   ræ   rœ  r  rž  rŸ  rd   r   r¡  r4   r5   r.   re  r6   )r[   r\   r   r7   r8   re   r·   rÒ   rÑ   r¤  r©  rv   r­  r«  r¶  r   r   r   Útest_missing_signaturen  s.   
ú	ÿ

ÿz!TestServer.test_missing_signatureN)r   r   r    rh   ri   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ddddœZdZd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e d¡dd „ ƒZe d¡d!d"„ ƒZe d¡e d#¡d$d%„ ƒƒZd&S )'Ú
TestClientz/request_tokenz
/authorizez/access_tokenz/two_leggedz/three_legged)Úrequest_tokenÚ	authorizeÚaccess_tokenÚ
two_leggedÚthree_leggedÚbd37aed57e15df53Ú0e9e6413a9ef49510a4f68ed02cdz&http://oauth-sandbox.sevengoslings.netc                 C   s,   t j| j| jd| _ddddgddœ| _d S )Nrd   rã   rá   rå   ræ   i¿'	 )rá   rã   rä   rÜ   )r   r7   Úconsumer_keyr+   r=   ro  rg   r   r   r   rh   ¦  s   ÿüzTestClient.setUpc                 C   s.   | j  |¡}|d u rtd| ƒ‚d| j|f S )Nz!%s is not a valid OAuth URI type.r‹   )Ú
oauth_urisr  ÚKeyErrorr
  )r   r   Úurir   r   r   Ú_uri±  s   zTestClient._uric                 C   s|   dt  dd¡ }d}g }| ¡ D ]\}}|d| dt|ƒ dt|ƒg7 }q|dd| d dg7 }d| }|| |¡ d	¡fS )
Nz---Boundary-%dr$   rI  z
z--z)Content-Disposition: form-data; name="%s"r
   z multipart/form-data; boundary=%sÚascii)rK  rL  r  r   Újoinr«   )r   r[  ÚboundaryÚcrlfr  re   r  Úcontent_typer   r   r   Úcreate_simple_multipart_data¸  s   
üz'TestClient.create_simple_multipart_datac                 C   s|   G dd„ dƒ}zt  |ƒ ¡}|  d¡ W n	 ty   Y nw t  dd¡}zt  ||ƒ ¡}|  d¡ W d S  ty=   Y d S w )Nc                   @   rP  )z"TestClient.test_init.<locals>.BlahNrQ  r   r   r   r   rR  È  rS  rR  z,Client.__init__() accepted invalid Consumer.r>   rf   z)Client.__init__() accepted invalid Token.)r   rT  rÉ   rw   r7   )r   rR  rV  r=   r   r   r   ri   Ç  s   ÿÿzTestClient.test_initc                 C   sN   G dd„ dƒ}t  dd¡}t j|d dddd}|  |jd ¡ |  |jd¡ d S )	Nc                   @   rP  )z<TestClient.test_init_passes_kwargs_to_httplib2.<locals>.BlahNrQ  r   r   r   r   rR  Ù  rS  rR  r>   rf   z.cacher   T)ÚcacheÚtimeoutÚ"disable_ssl_certificate_validation)r   r7   rT  rˆ   rÍ  r   rÎ  )r   rR  r=   rV  r   r   r   Ú#test_init_passes_kwargs_to_httplib2Ø  s
   z.TestClient.test_init_passes_kwargs_to_httplib2c                 C   s<   t  | jd¡}| |  d¡d¡\}}|  t|d ƒd¡ dS )z%Test getting an access token via GET.Nr»  r.   ÚstatuséÈ   )r   rT  r=   rÊ   rÆ  r   r[   )r   rV  ÚrespÚcontentr   r   r   Útest_access_token_getä  s   z TestClient.test_access_token_getc                 C   sd   t  | jd¡}| |  d¡d¡\}}|  t|d ƒd¡ tt|ƒƒ}|  	d|v ¡ |  	d|v ¡ dS )z&Test getting an access token via POST.Nr»  ÚPOSTrÑ  rÒ  s   oauth_tokens   oauth_token_secret)
r   rT  r=   rÊ   rÆ  r   r[   r{   r   r<   )r   rV  rÓ  rÔ  r|   r   r   r   Útest_access_token_postë  s   z!TestClient.test_access_token_postc                 C   s4   t  | jd ¡}t| jƒ d¡}|j|  d¡||dS )NrÇ  r¾  ©ro  )r   rT  r=   r   ro  r«   rÊ   rÆ  )r   rA   rV  ro  r   r   r   Ú_two_leggedö  s   zTestClient._two_leggedc                 C   ó&   |   d¡\}}|  t|d ƒd¡ dS )z*A test of a two-legged OAuth POST request.rÖ  rÑ  rÒ  N©rÙ  r   r[   ©r   rÓ  rÔ  r   r   r   Útest_two_legged_postü  s   zTestClient.test_two_legged_postc                 C   rÚ  )z)A test of a two-legged OAuth GET request.r.   rÑ  rÒ  NrÛ  rÜ  r   r   r   Útest_two_legged_get  s   zTestClient.test_two_legged_getzhttplib2.Http.requestc                    sŽ   t  dd¡‰dt  dd¡ t  dd¡i}ˆ |¡\}‰ t ˆjd ¡‰ˆ d¡‰‡ ‡‡‡‡fdd„}||_ˆjˆdd|iˆ d	}ˆ 	|ˆ¡ d S )
Nr$   rY  zrand-%dr¾  c                    s’   ˆ  | ˆu ¡ ˆ  |ˆu ¡ ˆ t| ¡ ƒtg d¢ƒ¡ ˆ |d ˆ ¡ ˆ |d d ¡ ˆ |d d¡ ˆ |d tj¡ ˆ  t|d tƒ¡ ˆS )N©rA   ro  ÚredirectionsÚconnection_typer}  ro  rá  rA   rÖ  rà  r}  )r<   r   Ú	frozensetÚkeysÚhttplib2ÚDEFAULT_MAX_REDIRECTSr¥  r{   )ÚclÚurÚkw©ro  rV  Úrandom_resultr   rÅ  r   r   Úmockrequest  s   
ÿzGTestClient.test_multipart_post_does_not_alter_body.<locals>.mockrequestrÖ  zContent-Type)r}  ro  )
rK  rL  rÌ  r   rT  r=   rÆ  Úside_effectrÊ   r   )r   ÚmockHttpRequestr[  rË  rë  Úresultr   ré  r   Ú'test_multipart_post_does_not_alter_body  s   ÿ
þz2TestClient.test_multipart_post_does_not_alter_bodyc                    sF   d‰t  ˆjd ¡‰ t dd¡‰‡ ‡‡‡fdd„}||_ˆ  ˆd¡ d S )Nz<http://example.com/foo/bar/?show=thundercats&character=snarfr$   rY  c                    s  ˆ  | ˆ u ¡ ˆ t| ¡ ƒtg d¢ƒ¡ ˆ |d d¡ ˆ |d d ¡ ˆ |d d¡ ˆ |d tj¡ ˆ  t|d tƒ¡ tj	j
ˆjd dˆi d	}| t ¡ ˆjd ¡ tt| ¡ ƒjƒ}tt|ƒjƒ}ˆ t|ƒt|ƒ¡ t|ƒ}|D ]\}}|d
vr†ˆ || |¡ qvˆS )Nrß  ro  ó    rá  rA   r.   rà  r}  )rŒ  r  rÛ   )r6   rú   rû   )r<   r   râ  rã  rä  rå  r¥  r{   r   r·   r  r=   rÑ   rÒ   r   r   rý   r  r&   )ræ  rç  rè  r¼   r8  Úactualre   r  ©rV  rê  r   rÅ  r   r   rë  -  s8   
ÿ
ÿÿ
ÿÿ€z:TestClient.test_url_with_query_string.<locals>.mockrequestr.   )r   rT  r=   rK  rL  rì  rÊ   )r   rí  rë  r   rò  r   Útest_url_with_query_string'  s   z%TestClient.test_url_with_query_stringz&oauth2.Request.from_consumer_and_tokenc                 C   sœ   t  | jd ¡}t jdddddgid}||_|jddd	d
 |  |jd¡ |  |jd d dddgi¡ |  	d|jd d v ¡ |  	d|jd d v ¡ d S )Nr.   rÐ   rä   Ú1Ú2rÚ   zhttp://whateverrÖ  zmulti=1&multi=2rØ  r$   rÛ   zmulti=1ro  zmulti=2)
r   rT  r=   r·   rg  rÊ   r   Ú
call_countÚ	call_argsr<   )r   ÚmockReqConstructorrí  rV  rÊ   r   r   r   Útest_multiple_values_for_a_keyM  s   z)TestClient.test_multiple_values_for_a_keyN)r   r   r    rÃ  rÂ  r+   r
  rh   rÆ  rÌ  ri   rÐ  rÕ  r×  rÙ  rÝ  rÞ  r‘  r’  rï  ró  rù  r   r   r   r   rº  ”  s6    û

%rº  Ú__main__z..)1Ú__doc__ÚsysrK  r\   Úunittesträ  r‘  Úoauth2._compatr   r   r   r   r   r   r   r	   r®  r   Ú_UEMPTYÚ_UBLANKr¥   r¦   Ú_BGLYPHr§   Ú_B2019ri  r-  r*  Úversion_inforh  ÚTestCaser   r"   ra   r}   rœ   r    rµ   ÚSignatureMethodr“  r™  rº  r   Úosr   rÈ  ÚdirnameÚ__file__Úmainr   r   r   r   Ú<module>   sf   



8k8      t
 Z J"ü