o
    Qœ_�[  ã                   @   sR  d dl Z d dlmZmZmZmZmZ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mZ d d	lmZmZmZ zd d
l mZ W n eyW   dZY nw G dd„ deeƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deeƒZ"G dd„ deeƒZ#G dd„ deƒZ$G dd „ d eƒZ%G d!d"„ d"eeƒZ&G d#d$„ d$e&ƒZ'G d%d&„ d&e&ƒZ(G d'd(„ d(e&ƒZ)G d)d*„ d*e&ƒZ*G d+d,„ d,eƒZ+G d-d.„ d.eƒZ,G d/d0„ d0eƒZ-G d1d2„ d2eƒZ.G d3d4„ d4eeƒZ/G d5d6„ d6eƒZ0G d7d8„ d8eƒZ1G d9d:„ d:eƒZ2G d;d<„ d<eƒZ3dS )=é    N)ÚOpenIdMixinÚ
OAuthMixinÚOAuth2MixinÚGoogleOAuth2MixinÚFacebookGraphMixinÚTwitterMixin)Újson_decode)Úgen)ÚHTTPClientError)Ú
url_concat)Úapp_log)ÚAsyncHTTPTestCaseÚ	ExpectLog)ÚRequestHandlerÚApplicationÚ	HTTPError)Úmockc                   @   ó"   e Zd Zdd„ Zejdd„ ƒZdS )ÚOpenIdClientLoginHandlerc                 C   ó   |  d¡| _d S )Nú/openid/server/authenticate)Úget_urlÚ_OPENID_ENDPOINT©ÚselfÚtest© r   ú8/usr/lib/python3/dist-packages/tornado/test/auth_test.pyÚ
initialize   ó   z#OpenIdClientLoginHandler.initializec                 c   sX   � |   dd ¡r | j| jd d�V }|d u rtdƒ‚|  |¡ d S |  ¡ }|d u s*J ‚d S )Núopenid.modeÚhttp_client©r!   úuser is None)Úget_argumentÚget_authenticated_userÚsettingsÚ	ExceptionÚfinishÚauthenticate_redirect)r   ÚuserÚresr   r   r   Úget"   s   €ÿ
zOpenIdClientLoginHandler.getN©Ú__name__Ú
__module__Ú__qualname__r   r	   Ú	coroutiner,   r   r   r   r   r      s    r   c                   @   ó   e Zd Zdd„ ZdS )ÚOpenIdServerAuthenticateHandlerc                 C   s$   |   d¡dkrtdƒ‚|  d¡ d S )Nr    Úcheck_authenticationzincorrect openid.mode %rzis_valid:true)r$   r'   Úwrite©r   r   r   r   Úpost1   s   z$OpenIdServerAuthenticateHandler.postN©r.   r/   r0   r7   r   r   r   r   r3   0   ó    r3   c                   @   s8   e Zd Zdd„ Zdd„ Zejdd„ ƒZejdd„ ƒZd	S )
ÚOAuth1ClientLoginHandlerc                 C   s.   || _ | d¡| _| d¡| _| d¡| _d S )Nú/oauth1/server/request_tokenú/oauth1/server/authorizeú/oauth1/server/access_token)Ú_OAUTH_VERSIONr   Ú_OAUTH_REQUEST_TOKEN_URLÚ_OAUTH_AUTHORIZE_URLÚ_OAUTH_ACCESS_TOKEN_URL)r   r   Úversionr   r   r   r   8   ó   z#OAuth1ClientLoginHandler.initializec                 C   ó   t ddd�S ©NÚasdfÚqwer©ÚkeyÚsecret©Údictr6   r   r   r   Ú_oauth_consumer_token>   ó   z.OAuth1ClientLoginHandler._oauth_consumer_tokenc                 c   sX   � |   dd ¡r | j| jd d�V }|d u rtdƒ‚|  |¡ d S | j| jd d�V  d S )NÚoauth_tokenr!   r"   r#   )r$   r%   r&   r'   r(   Úauthorize_redirect©r   r*   r   r   r   r,   A   s   €ÿ
zOAuth1ClientLoginHandler.getc                 C   s:   |   dd ¡r
tdƒ‚|tddd�krtd| ƒ‚tdd�S )	NÚfail_in_get_userzfailing in get_userÚuiopÚ5678rH   zincorrect access token %rúfoo@example.com)Úemail)r$   r'   rL   )r   Úaccess_tokenr   r   r   Ú_oauth_get_user_futureM   s
   
z/OAuth1ClientLoginHandler._oauth_get_user_futureN)	r.   r/   r0   r   rM   r	   r1   r,   rX   r   r   r   r   r:   7   s    
r:   c                   @   s   e Zd ZdZejdd„ ƒZdS )Ú!OAuth1ClientLoginCoroutineHandlerzDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              
   c   sl   � |   dd ¡r/z|  ¡ V  W d S  ty. } z|  d¡ |  d| ¡ W Y d }~d S d }~ww |  ¡ V  d S )NrO   é÷  zgot exception: %s)r$   r%   r'   Ú
set_statusr5   rP   )r   Úer   r   r   r,   Y   s   €
€þz%OAuth1ClientLoginCoroutineHandler.getN)r.   r/   r0   Ú__doc__r	   r1   r,   r   r   r   r   rY   V   s    rY   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú$OAuth1ClientRequestParametersHandlerc                 C   s
   || _ d S ©N)r>   )r   rB   r   r   r   r   h   ó   
z/OAuth1ClientRequestParametersHandler.initializec                 C   rD   rE   rK   r6   r   r   r   rM   k   rN   z:OAuth1ClientRequestParametersHandler._oauth_consumer_tokenc                 C   s,   | j dtddd�tdd�d�}|  |¡ d S )Nzhttp://www.example.com/api/asdfrS   rT   rH   Úbar)Úfoo)Ú
parameters)Ú_oauth_request_parametersrL   r5   )r   Úparamsr   r   r   r,   n   s   
ýz(OAuth1ClientRequestParametersHandler.getN)r.   r/   r0   r   rM   r,   r   r   r   r   r^   g   s    r^   c                   @   r2   )ÚOAuth1ServerRequestTokenHandlerc                 C   ó   |   d¡ d S )Nz(oauth_token=zxcv&oauth_token_secret=1234©r5   r6   r   r   r   r,   x   ó   z#OAuth1ServerRequestTokenHandler.getN©r.   r/   r0   r,   r   r   r   r   rf   w   r9   rf   c                   @   r2   )ÚOAuth1ServerAccessTokenHandlerc                 C   rg   )Nz(oauth_token=uiop&oauth_token_secret=5678rh   r6   r   r   r   r,   }   ri   z"OAuth1ServerAccessTokenHandler.getNrj   r   r   r   r   rk   |   r9   rk   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚOAuth2ClientLoginHandlerc                 C   r   )Nz/oauth2/server/authorize)r   r@   r   r   r   r   r   ‚   r   z#OAuth2ClientLoginHandler.initializec                 C   s   |   ¡ }|d u s
J ‚d S r_   )rP   )r   r+   r   r   r   r,   …   s   zOAuth2ClientLoginHandler.getN)r.   r/   r0   r   r,   r   r   r   r   rm   �   s    rm   c                   @   r   )ÚFacebookClientLoginHandlerc                 C   s(   |  d¡| _|  d¡| _|  d¡| _d S )Nz/facebook/server/authorizeú/facebook/server/access_tokenz/facebook/server)r   r@   rA   Ú_FACEBOOK_BASE_URLr   r   r   r   r   ‹   s   z%FacebookClientLoginHandler.initializec                 c   sl   � |   dd ¡r$| j| j ¡ | jd | jd |   d¡d�V }|  |¡ d S | j| j ¡ | jd ddid� d S )NÚcodeÚfacebook_api_keyÚfacebook_secret)Úredirect_uriÚ	client_idÚclient_secretrq   Úscopezread_stream,offline_access)rt   ru   Úextra_params)r$   r%   ÚrequestÚfull_urlr&   r5   rP   rQ   r   r   r   r,   �   s   €ü
ýzFacebookClientLoginHandler.getNr-   r   r   r   r   rn   Š   s    rn   c                   @   r2   )Ú FacebookServerAccessTokenHandlerc                 C   s   |   tddd�¡ d S )NrF   i  ©rW   Ú
expires_in)r5   rL   r6   r   r   r   r,   £   s   z$FacebookServerAccessTokenHandler.getNrj   r   r   r   r   r{   ¢   r9   r{   c                   @   r2   )ÚFacebookServerMeHandlerc                 C   rg   )Nz{}rh   r6   r   r   r   r,   ¨   ri   zFacebookServerMeHandler.getNrj   r   r   r   r   r~   §   r9   r~   c                   @   rl   )ÚTwitterClientHandlerc                 C   s@   |  d¡| _|  d¡| _|  d¡| _|  d¡| _|  d¡| _d S )Nr;   ú/twitter/server/access_tokenr<   z/twitter/server/authenticatez/twitter/api)r   r?   rA   r@   Ú_OAUTH_AUTHENTICATE_URLÚ_TWITTER_BASE_URLr   r   r   r   r   ­   s
   zTwitterClientHandler.initializec                 C   s
   | j d S )Nr!   )r&   r6   r   r   r   Úget_auth_http_client´   r`   z)TwitterClientHandler.get_auth_http_clientN)r.   r/   r0   r   rƒ   r   r   r   r   r   ¬   s    r   c                   @   ó   e Zd Zejdd„ ƒZdS )ÚTwitterClientLoginHandlerc                 c   óD   � |   dd ¡r|  ¡ V }|d u rtdƒ‚|  |¡ d S |  ¡ V  d S ©NrO   r#   )r$   r%   r'   r(   rP   rQ   r   r   r   r,   ¹   ó   €

zTwitterClientLoginHandler.getN©r.   r/   r0   r	   r1   r,   r   r   r   r   r…   ¸   ó    r…   c                   @   r„   )Ú TwitterClientAuthenticateHandlerc                 c   r†   r‡   )r$   r%   r'   r(   r)   rQ   r   r   r   r,   Ç   rˆ   z$TwitterClientAuthenticateHandler.getNr‰   r   r   r   r   r‹   Ä   s    r‹   c                   @   r„   )Ú%TwitterClientLoginGenCoroutineHandlerc                 c   s4   � |   dd ¡r|  ¡ V }|  |¡ d S |  ¡ V  d S )NrO   )r$   r%   r(   rP   rQ   r   r   r   r,   Ó   s
   €
z)TwitterClientLoginGenCoroutineHandler.getNr‰   r   r   r   r   rŒ   Ò   rŠ   rŒ   c                   @   r„   )ÚTwitterClientShowUserHandlerc                 c   s`   � z| j d|  d¡ tddd�d�V }W n ty(   |  d¡ |  d¡ Y d S w |  |¡ d S )	Nz/users/show/%sÚnameÚhjklÚvbnmrH   ©rW   éô  zerror from twitter request)Útwitter_requestr$   rL   r
   r[   r(   ©r   Úresponser   r   r   r,   ß   s   €
þ
üz TwitterClientShowUserHandler.getNr‰   r   r   r   r   r�   Þ   rŠ   r�   c                   @   r2   )ÚTwitterServerAccessTokenHandlerc                 C   rg   )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foorh   r6   r   r   r   r,   ò   ri   z#TwitterServerAccessTokenHandler.getNrj   r   r   r   r   r–   ñ   r9   r–   c                   @   r2   )ÚTwitterServerShowUserHandlerc                 C   s¢   |dkrt dƒ‚d| jjv sJ ‚d| jjv sJ ‚d| jjv s J ‚|  d¡dks)J ‚|  d¡d	ks2J ‚|  d
¡dks;J ‚|  d¡dksDJ ‚|  t|| ¡ d�¡ d S )NÚerrorr’   Úoauth_nonceÚoauth_timestampÚoauth_signatureÚoauth_consumer_keyÚtest_twitter_consumer_keyÚoauth_signature_methodú	HMAC-SHA1Úoauth_versionú1.0rO   r�   ©Úscreen_namerŽ   )r   ry   Ú	argumentsr$   r5   rL   Ú
capitalize)r   r£   r   r   r   r,   ÷   s   z TwitterServerShowUserHandler.getNrj   r   r   r   r   r—   ö   r9   r—   c                   @   r2   )Ú%TwitterServerVerifyCredentialsHandlerc                 C   sŽ   d| j jv sJ ‚d| j jv sJ ‚d| j jv sJ ‚|  d¡dks!J ‚|  d¡dks*J ‚|  d¡d	ks3J ‚|  d
¡dks<J ‚|  tddd�¡ d S )Nr™   rš   r›   rœ   r�   rž   rŸ   r    r¡   rO   r�   rb   ÚFoor¢   )ry   r¤   r$   r5   rL   r6   r   r   r   r,     s   z)TwitterServerVerifyCredentialsHandler.getNrj   r   r   r   r   r¦     r9   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	e
 edu 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%d&„ Zd'd(„ Zd)d*„ ZdS )+ÚAuthTestc                 C   sô   t dtt| d�fdtt| dd�fdttdd�fdtt| d	d�fd
tt| d	d�fdttd	d�fdtt| d�fdtt| d�fdtt| d�fdt	t| d�fdt
t| d�fdtt| d�fdtfdtfdtfdtfdtfdtfdtfdtfg| jddddd�S )Nú/openid/client/login©r   ú/oauth10/client/loginr¡   )r   rB   ú/oauth10/client/request_params)rB   ú/oauth10a/client/loginz1.0az /oauth10a/client/login_coroutineú/oauth10a/client/request_paramsú/oauth2/client/loginú/facebook/client/loginú/twitter/client/loginú/twitter/client/authenticateú#/twitter/client/login_gen_coroutinez/twitter/client/show_userr   r;   r=   ro   z/facebook/server/mer€   z"/twitter/api/users/show/(.*)\.jsonz-/twitter/api/account/verify_credentials\.jsonr�   Útest_twitter_consumer_secretÚtest_facebook_api_keyÚtest_facebook_secret)r!   Útwitter_consumer_keyÚtwitter_consumer_secretrr   rs   )r   r   rL   r:   r^   rY   rm   rn   r…   r‹   rŒ   r�   r3   rf   rk   r{   r~   r–   r—   r¦   r!   r6   r   r   r   Úget_app  sl   
ýý
ý
ýýýýýþÊ;ÀzAuthTest.get_appc                 C   ó4   | j ddd�}|  |jd¡ |  d|jd v ¡ d S )Nr©   F©Úfollow_redirectsé.  z/openid/server/authenticate?ÚLocation©ÚfetchÚassertEqualrq   Ú
assertTrueÚheadersr”   r   r   r   Útest_openid_redirectU  ó   zAuthTest.test_openid_redirectc                 C   s0   |   d¡}| ¡  t|jƒ}|  |d d¡ d S )Nz¬/openid/client/login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo@example.comrV   rU   ©rÀ   Úrethrowr   ÚbodyrÁ   ©r   r•   Úparsedr   r   r   Útest_openid_get_userZ  s   ÿ
zAuthTest.test_openid_get_userc                 C   óR   | j ddd�}|  |jd¡ |  |jd  d¡¡ |  d|jd v |jd ¡ d S )	Nr«   Fr»   r½   r¾   ú)/oauth1/server/authorize?oauth_token=zxcvú(_oauth_request_token="enhjdg==|MTIzNA=="ú
Set-Cookie©rÀ   rÁ   rq   rÂ   rÃ   Úendswithr”   r   r   r   Útest_oauth10_redirecte  ó   
ÿÿÿýzAuthTest.test_oauth10_redirectc                 C   óP   | j dddid�}| ¡  t|jƒ}|  |d d¡ |  |d tdd	d
�¡ d S )Nz&/oauth10/client/login?oauth_token=zxcvÚCookieú&_oauth_request_token=enhjdg==|MTIzNA==©rÃ   rV   rU   rW   rS   rT   rH   ©rÀ   rÇ   r   rÈ   rÁ   rL   rÉ   r   r   r   Útest_oauth10_get_usert  ó   þ
zAuthTest.test_oauth10_get_userc                 C   ó\   |   d¡}| ¡  t|jƒ}|  |d d¡ |  |d d¡ |  d|v ¡ |  d|v ¡ d S )Nr¬   rœ   rF   rO   rS   r™   r›   ©rÀ   rÇ   r   rÈ   rÁ   rÂ   rÉ   r   r   r   Útest_oauth10_request_parameters~  ó   

z(AuthTest.test_oauth10_request_parametersc                 C   rÌ   )	Nr­   Fr»   r½   r¾   rÍ   rÎ   rÏ   rÐ   r”   r   r   r   Útest_oauth10a_redirect‡  rÓ   zAuthTest.test_oauth10a_redirectNzmock package not presentc              	   C   s„   t j td¡�1}tdƒ|_ttdƒ� | jddd�}W d   ƒ n1 s$w   Y  |  	|j
d¡ W d   ƒ d S 1 s;w   Y  d S )Nr,   ÚboomzUncaught exceptionr­   Fr»   r’   )r   ÚpatchÚobjectrf   r'   Úside_effectr   r   rÀ   rÁ   rq   )r   r,   r•   r   r   r   Útest_oauth10a_redirect_error–  s   
ÿ"üz%AuthTest.test_oauth10a_redirect_errorc                 C   rÔ   )Nz'/oauth10a/client/login?oauth_token=zxcvrÕ   rÖ   r×   rV   rU   rW   rS   rT   rH   rØ   rÉ   r   r   r   Útest_oauth10a_get_userž  rÚ   zAuthTest.test_oauth10a_get_userc                 C   rÛ   )Nr®   rœ   rF   rO   rS   r™   r›   rÜ   rÉ   r   r   r   Ú test_oauth10a_request_parameters¨  rÞ   z)AuthTest.test_oauth10a_request_parametersc                 C   s$   | j dddid�}|  |jd¡ d S )NzG/oauth10a/client/login_coroutine?oauth_token=zxcv&fail_in_get_user=truerÕ   rÖ   r×   rZ   )rÀ   rÁ   rq   r”   r   r   r   Ú*test_oauth10a_get_user_coroutine_exception±  s
   þz3AuthTest.test_oauth10a_get_user_coroutine_exceptionc                 C   rº   )Nr¯   Fr»   r½   z/oauth2/server/authorize?r¾   r¿   r”   r   r   r   Útest_oauth2_redirect¸  rÅ   zAuthTest.test_oauth2_redirectc                 C   sz   | j ddd�}|  |jd¡ |  d|jd v ¡ | j ddd�}|  |jd¡ t|jƒ}|  |d	 d
¡ |  |d d¡ d S )Nr°   Fr»   r½   z/facebook/server/authorize?r¾   z /facebook/client/login?code=1234éÈ   rW   rF   Úsession_expiresÚ3600)rÀ   rÁ   rq   rÂ   rÃ   r   rÈ   )r   r•   r*   r   r   r   Útest_facebook_login½  s   ÿ
zAuthTest.test_facebook_loginc                 C   sR   | j |dd�}|  |jd¡ |  |jd  d¡¡ |  d|jd v |jd ¡ d S )NFr»   r½   r¾   rÍ   rÎ   rÏ   rÐ   )r   Úurlr•   r   r   r   Úbase_twitter_redirectÉ  s   
ÿÿÿýzAuthTest.base_twitter_redirectc                 C   rg   )Nr±   ©rî   r6   r   r   r   Útest_twitter_redirectÙ  ri   zAuthTest.test_twitter_redirectc                 C   rg   )Nr³   rï   r6   r   r   r   Ú#test_twitter_redirect_gen_coroutineÜ  ri   z,AuthTest.test_twitter_redirect_gen_coroutinec                 C   sZ   | j ddd�}|  |jd¡ |  |jd  d¡|jd ¡ |  d|jd v |jd ¡ d S )	Nr²   Fr»   r½   r¾   z-/twitter/server/authenticate?oauth_token=zxcvrÎ   rÏ   rÐ   r”   r   r   r   Ú"test_twitter_authenticate_redirectß  s   
ÿüÿýz+AuthTest.test_twitter_authenticate_redirectc                 C   sF   | j dddid�}| ¡  t|jƒ}|  |ddddœd	ddd
œ¡ d S )Nz&/twitter/client/login?oauth_token=zxcvrÕ   rÖ   r×   r�   rb   r�   )rI   r£   rJ   r§   )rW   rŽ   r£   ÚusernamerÆ   rÉ   r   r   r   Útest_twitter_get_userï  s"   þ
ýøþzAuthTest.test_twitter_get_userc                 C   s.   |   d¡}| ¡  |  t|jƒdddœ¡ d S )Nz'/twitter/client/show_user?name=somebodyÚSomebodyÚsomebody)rŽ   r£   )rÀ   rÇ   rÁ   r   rÈ   r”   r   r   r   Útest_twitter_show_user  s
   
ÿzAuthTest.test_twitter_show_userc                 C   s*   |   d¡}|  |jd¡ |  |jd¡ d S )Nz$/twitter/client/show_user?name=errorr’   s   error from twitter request)rÀ   rÁ   rq   rÈ   r”   r   r   r   Útest_twitter_show_user_error  s   
z%AuthTest.test_twitter_show_user_error)r.   r/   r0   r¹   rÄ   rË   rÒ   rÙ   rÝ   rß   ÚunittestÚskipIfr   rä   rå   ræ   rç   rè   rì   rî   rð   rñ   rò   rô   r÷   rø   r   r   r   r   r¨     s,    D
	

	r¨   c                   @   r   )ÚGoogleLoginHandlerc                 C   s.   || _ | d¡| _| d¡| _| d¡| _d S )Nú/client/loginú/google/oauth2/authorizeú/google/oauth2/token)r   r   Ú_OAUTH_REDIRECT_URIr@   rA   r   r   r   r   r     rC   zGoogleLoginHandler.initializec                 c   s”   � |   dd ¡}|d ur.|  | j|¡V }| j| j d¡|d d�V }|d |d< |  |¡ d S | j| j| jd d | jd d dd	gdd
did� d S )Nrq   ú/google/oauth2/userinforW   r‘   Úgoogle_oauthrI   rJ   ÚprofilerV   ÚpromptÚselect_account)rt   ru   rv   rw   Úresponse_typerx   )	r$   r%   rÿ   Úoauth2_requestr   r   r5   rP   r&   )r   rq   Úaccessr*   r   r   r   r,     s$   €
þ
úzGoogleLoginHandler.getNr-   r   r   r   r   rû     s    rû   c                   @   r2   )ÚGoogleOAuth2AuthorizeHandlerc                 C   s$   d}|   t|  d¡t|d�ƒ¡ d S )Núfake-authorization-codert   )rq   )Úredirectr   r$   rL   )r   rq   r   r   r   r,   1  s    z GoogleOAuth2AuthorizeHandler.getNrj   r   r   r   r   r  0  r9   r  c                   @   r2   )ÚGoogleOAuth2TokenHandlerc                 C   ó&   |   d¡dks	J ‚|  dddœ¡ d S )Nrq   r	  úfake-access-tokenznever-expiresr|   ©r$   r(   r6   r   r   r   r7   8  s   ÿzGoogleOAuth2TokenHandler.postNr8   r   r   r   r   r  7  r9   r  c                   @   r2   )ÚGoogleOAuth2UserinfoHandlerc                 C   r  )NrW   r  r§   rU   )rŽ   rV   r  r6   r   r   r   r,   A  s   zGoogleOAuth2UserinfoHandler.getNrj   r   r   r   r   r  @  r9   r  c                   @   rl   )ÚGoogleOAuth2Testc                 C   s2   t dtt| d�fdtfdtfdtfgdddœd	�S )
Nrü   rª   rý   rþ   r   Úfake_google_client_idÚfake_google_client_secretrH   )r  )r   rû   rL   r  r  r  r6   r   r   r   r¹   H  s   ú	þ÷zGoogleOAuth2Test.get_appc                 C   s(   |   d¡}|  ddddœt|jƒ¡ d S )Nrü   r§   rU   r  )rŽ   rV   rW   )rÀ   ÚassertDictEqualr   rÈ   r”   r   r   r   Útest_google_loginX  s   
ýúz"GoogleOAuth2Test.test_google_loginN)r.   r/   r0   r¹   r  r   r   r   r   r  G  s    r  )4rù   Útornado.authr   r   r   r   r   r   Útornado.escaper   Útornador	   Útornado.httpclientr
   Útornado.httputilr   Útornado.logr   Útornado.testingr   r   Útornado.webr   r   r   r   ÚImportErrorr   r3   r:   rY   r^   rf   rk   rm   rn   r{   r~   r   r…   r‹   rŒ   r�   r–   r—   r¦   r¨   rû   r  r  r  r  r   r   r   r   Ú<module>   sR    ÿ	  	