
    R?g3[                        S SK r S SKJrJrJrJrJrJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  S SKJrJr  S S	KJrJrJr   S S
K Jr   " S S\\5      r " S S\5      r " S S\\5      r " S S\5      r " S S\\5      r " S S\5      r  " S S\5      r! " S S\\5      r" " S S\\5      r# " S S\5      r$ " S S \5      r% " S! S"\\5      r& " S# S$\&5      r' " S% S&\&5      r( " S' S(\&5      r) " S) S*\&5      r* " S+ S,\5      r+ " S- S.\5      r, " S/ S0\5      r- " S1 S2\5      r. " S3 S4\\5      r/ " S5 S6\5      r0 " S7 S8\5      r1 " S9 S:\5      r2 " S; S<\5      r3g! \ a    Sr GN&f = f)=    N)OpenIdMixin
OAuthMixinOAuth2MixinGoogleOAuth2MixinFacebookGraphMixinTwitterMixin)json_decode)gen)HTTPClientError)
url_concat)app_log)AsyncHTTPTestCase	ExpectLog)RequestHandlerApplication	HTTPError)mockc                   >    \ rS rSrS r\R                  S 5       rSrg)OpenIdClientLoginHandler   c                 0    UR                  S5      U l        g )N/openid/server/authenticate)get_url_OPENID_ENDPOINTselftests     8/usr/lib/python3/dist-packages/tornado/test/auth_test.py
initialize#OpenIdClientLoginHandler.initialize   s     $-J K    c              #      #    U R                  SS 5      (       a>  U R                  U R                  S   S9v nUc  [        S5      eU R	                  U5        g U R                  5       nUb   eg 7f)Nopenid.modehttp_clientr$   user is None)get_argumentget_authenticated_usersettings	Exceptionfinishauthenticate_redirect)r   userress      r   getOpenIdClientLoginHandler.get"   sw     ]D1144 MM-8 5  D |//KK((*{{s   A,A.)r   N	__name__
__module____qualname____firstlineno__r   r
   	coroutiner/   __static_attributes__ r!   r   r   r      s     L 	]]
 
r!   r   c                       \ rS rSrS rSrg)OpenIdServerAuthenticateHandler0   c                 f    U R                  S5      S:w  a  [        S5      eU R                  S5        g )Nr#   check_authenticationzincorrect openid.mode %rzis_valid:true)r'   r*   writer   s    r   post$OpenIdServerAuthenticateHandler.post1   s.    ]+/EE677

?#r!   r8   Nr2   r3   r4   r5   r@   r7   r8   r!   r   r:   r:   0   s    $r!   r:   c                   h    \ rS rSrS rS r\R                  S 5       r\R                  S 5       r	Sr
g)OAuth1ClientLoginHandler7   c                     X l         UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        g )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   versions      r   r   #OAuth1ClientLoginHandler.initialize8   s>    %(,5S(T%$(LL1K$L!'+||4Q'R$r!   c                     [        SSS9$ Nasdfqwerkeysecretdictr?   s    r   _oauth_consumer_token.OAuth1ClientLoginHandler._oauth_consumer_token>       v..r!   c              #      #    U R                  SS 5      (       a>  U R                  U R                  S   S9v nUc  [        S5      eU R	                  U5        g U R                  U R                  S   S9v   g 7f)Noauth_tokenr$   r%   r&   )r'   r(   r)   r*   r+   authorize_redirectr   r-   s     r   r/   OAuth1ClientLoginHandler.getA   s|     ]D1144 MM-8 5  D |//KK%%$--2N%OOs   A5A7c                     U R                  SS 5      (       a  [        S5      eU[        SSS9:w  a  [        SU-  5      e[        SS9$ )	Nfail_in_get_userzfailing in get_useruiop5678rT   zincorrect access token %rfoo@example.com)email)r'   r*   rX   )r   access_tokens     r   _oauth_get_user_future/OAuth1ClientLoginHandler._oauth_get_user_futureM   sN    /661224F6::7,FGG+,,r!   )rM   rL   rK   rJ   N)r2   r3   r4   r5   r   rY   r
   r6   r/   rh   r7   r8   r!   r   rD   rD   7   s?    S/ 	]]	P 	P 	]]- -r!   rD   c                   <    \ rS rSrSr\R                  S 5       rSrg)!OAuth1ClientLoginCoroutineHandlerV   zDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              #      #    U R                  SS 5      (       a   U R                  5       v   g U R                  5       v   g ! [         a/  nU R                  S5        U R	                  SU-  5         S nAg S nAff = f7f)Nr]     zgot exception: %s)r'   r(   r*   
set_statusr>   r^   )r   es     r   r/   %OAuth1ClientLoginCoroutineHandler.getY   so     ]D1141133
 ))++	  4$

.2334s-   A=A A=
A:%A50A=5A::A=r8   N)	r2   r3   r4   r5   __doc__r
   r6   r/   r7   r8   r!   r   rk   rk   V   s    N]]
, 
,r!   rk   c                   &    \ rS rSrS rS rS rSrg)$OAuth1ClientRequestParametersHandlerg   c                     Xl         g NrJ   )r   rN   s     r   r   /OAuth1ClientRequestParametersHandler.initializeh   s    %r!   c                     [        SSS9$ rQ   rW   r?   s    r   rY   :OAuth1ClientRequestParametersHandler._oauth_consumer_tokenk   r[   r!   c                 f    U R                  S[        SSS9[        SS9S9nU R                  U5        g )Nzhttp://www.example.com/api/asdfrc   rd   rT   bar)foo)
parameters)_oauth_request_parametersrX   r>   )r   paramss     r   r/   (OAuth1ClientRequestParametersHandler.getn   s9    //-VF+ 0 

 	

6r!   rx   N)r2   r3   r4   r5   r   rY   r/   r7   r8   r!   r   rt   rt   g   s    &/r!   rt   c                       \ rS rSrS rSrg)OAuth1ServerRequestTokenHandlerw   c                 &    U R                  S5        g )Nz(oauth_token=zxcv&oauth_token_secret=1234r>   r?   s    r   r/   #OAuth1ServerRequestTokenHandler.getx       

=>r!   r8   Nr2   r3   r4   r5   r/   r7   r8   r!   r   r   r   w       ?r!   r   c                       \ rS rSrS rSrg)OAuth1ServerAccessTokenHandler|   c                 &    U R                  S5        g )Nz(oauth_token=uiop&oauth_token_secret=5678r   r?   s    r   r/   "OAuth1ServerAccessTokenHandler.get}   r   r!   r8   Nr   r8   r!   r   r   r   |   r   r!   r   c                        \ rS rSrS rS rSrg)OAuth2ClientLoginHandler   c                 0    UR                  S5      U l        g )Nz/oauth2/server/authorize)r   rL   r   s     r   r   #OAuth2ClientLoginHandler.initialize   s    $(LL1K$L!r!   c                 .    U R                  5       nUb   eg rw   )r^   )r   r.   s     r   r/   OAuth2ClientLoginHandler.get   s    %%'{{r!   )rL   N)r2   r3   r4   r5   r   r/   r7   r8   r!   r   r   r      s    Mr!   r   c                   >    \ rS rSrS r\R                  S 5       rSrg)FacebookClientLoginHandler   c                     UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        g )Nz/facebook/server/authorize/facebook/server/access_tokenz/facebook/server)r   rL   rM   _FACEBOOK_BASE_URLr   s     r   r   %FacebookClientLoginHandler.initialize   s8    $(LL1M$N!'+||4S'T$"&,,/A"Br!   c              #   x  #    U R                  SS 5      (       ag  U R                  U R                  R                  5       U R                  S   U R                  S   U R                  S5      S9v nU R                  U5        g U R                  U R                  R                  5       U R                  S   SS0S9  g 7f)Ncodefacebook_api_keyfacebook_secret)redirect_uri	client_idclient_secretr   scopezread_stream,offline_access)r   r   extra_params)r'   r(   requestfull_urlr)   r>   r^   r_   s     r   r/   FacebookClientLoginHandler.get   s     VT**44!\\224--(:;"mm,=>&&v.	 5  D JJt##!\\224--(:;%'CD $ s   B8B:)r   rM   rL   Nr1   r8   r!   r   r   r      s     C
 	]] r!   r   c                       \ rS rSrS rSrg) FacebookServerAccessTokenHandler   c                 6    U R                  [        SSS95        g )NrR   i  rg   
expires_in)r>   rX   r?   s    r   r/   $FacebookServerAccessTokenHandler.get   s    

4V=>r!   r8   Nr   r8   r!   r   r   r      r   r!   r   c                       \ rS rSrS rSrg)FacebookServerMeHandler   c                 &    U R                  S5        g )Nz{}r   r?   s    r   r/   FacebookServerMeHandler.get   s    

4r!   r8   Nr   r8   r!   r   r   r      s    r!   r   c                        \ rS rSrS rS rSrg)TwitterClientHandler   c                     UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        g )NrG   /twitter/server/access_tokenrH   z/twitter/server/authenticatez/twitter/api)r   rK   rM   rL   _OAUTH_AUTHENTICATE_URL_TWITTER_BASE_URLr   s     r   r   TwitterClientHandler.initialize   s[    (,5S(T%'+||4R'S$$(LL1K$L!'+||4R'S$!%n!=r!   c                      U R                   S   $ )Nr$   )r)   r?   s    r   get_auth_http_client)TwitterClientHandler.get_auth_http_client   s    }}]++r!   )rM   r   rL   rK   r   N)r2   r3   r4   r5   r   r   r7   r8   r!   r   r   r      s    >,r!   r   c                   8    \ rS rSr\R
                  S 5       rSrg)TwitterClientLoginHandler   c              #      #    U R                  SS 5      (       a2  U R                  5       v nUc  [        S5      eU R                  U5        g U R	                  5       v   g 7fNr]   r&   )r'   r(   r*   r+   r^   r_   s     r   r/   TwitterClientLoginHandler.get   sW     ]D114466D|//KK%%''   AAr8   Nr2   r3   r4   r5   r
   r6   r/   r7   r8   r!   r   r   r      s    ]]( (r!   r   c                   8    \ rS rSr\R
                  S 5       rSrg) TwitterClientAuthenticateHandler   c              #      #    U R                  SS 5      (       a2  U R                  5       v nUc  [        S5      eU R                  U5        g U R	                  5       v   g 7fr   )r'   r(   r*   r+   r,   r_   s     r   r/   $TwitterClientAuthenticateHandler.get   sW     ]D114466D|//KK((**r   r8   Nr   r8   r!   r   r   r      s     	]]+ +r!   r   c                   8    \ rS rSr\R
                  S 5       rSrg)%TwitterClientLoginGenCoroutineHandler   c              #      #    U R                  SS 5      (       a$  U R                  5       v nU R                  U5        g U R                  5       v   g 7f)Nr]   )r'   r(   r+   r^   r_   s     r   r/   )TwitterClientLoginGenCoroutineHandler.get   sF     ]D114466DKK ))++s   AAr8   Nr   r8   r!   r   r   r      s    ]], ,r!   r   c                   8    \ rS rSr\R
                  S 5       rSrg)TwitterClientShowUserHandler   c              #      #     U R                  SU R                  S5      -  [        SSS9S9v nU R                  U5        g ! [         a%    U R                  S5        U R                  S5         g f = f7f)	Nz/users/show/%snamehjklvbnmrT   rg     zerror from twitter request)twitter_requestr'   rX   r+   r   ro   r   responses     r   r/    TwitterClientShowUserHandler.get   sz     	"!11 4#4#4V#<<!fV< 2  H KK!  	6 OOC KK45		6s'   A4,A A4,A1.A40A11A4r8   Nr   r8   r!   r   r   r      s    ]]" "r!   r   c                       \ rS rSrS rSrg)TwitterServerAccessTokenHandler   c                 &    U R                  S5        g )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foor   r?   s    r   r/   #TwitterServerAccessTokenHandler.get   s    

MNr!   r8   Nr   r8   r!   r   r   r      s    Or!   r   c                       \ rS rSrS rSrg)TwitterServerShowUserHandler   c                    US:X  a  [        S5      eSU R                  R                  ;   d   eSU R                  R                  ;   d   eSU R                  R                  ;   d   eU R                  S5      S:X  d   eU R                  S5      S	:X  d   eU R                  S
5      S:X  d   eU R                  S5      S:X  d   eU R	                  [        XR                  5       S95        g )Nerrorr   oauth_nonceoauth_timestampoauth_signatureoauth_consumer_keytest_twitter_consumer_keyoauth_signature_method	HMAC-SHA1oauth_version1.0r]   r   screen_namer   )r   r   	argumentsr'   r>   rX   
capitalize)r   r   s     r   r/    TwitterServerShowUserHandler.get   s    '!C.  6 6666 DLL$:$:::: DLL$:$::::  !56:UUUU  !9:kIII  1U:::  /6999

4K6L6L6NOPr!   r8   Nr   r8   r!   r   r   r      s    
Qr!   r   c                       \ rS rSrS rSrg)%TwitterServerVerifyCredentialsHandleri  c                    SU R                   R                  ;   d   eSU R                   R                  ;   d   eSU R                   R                  ;   d   eU R                  S5      S:X  d   eU R                  S5      S:X  d   eU R                  S5      S	:X  d   eU R                  S
5      S:X  d   eU R                  [	        SSS95        g )Nr   r   r   r   r   r   r   r   r   r]   r   r~   Foor   )r   r   r'   r>   rX   r?   s    r   r/   )TwitterServerVerifyCredentialsHandler.get  s     6 6666 DLL$:$:::: DLL$:$::::  !56:UUUU  !9:kIII  1U:::  /6999

4E67r!   r8   Nr   r8   r!   r   r   r     s    8r!   r   c                       \ rS rSrS rS rS rS rS rS r	S r
\R                  " \S	L S
5      S 5       rS rS rS rS rS rS rS rS rS rS rS rS rSrg	)AuthTesti  c                    [        S[        [        U S94S[        [        U SS94S[        [        SS94S[        [        U S	S94S
[
        [        U S	S94S[        [        S	S94S[        [        U S94S[        [        U S94S[        [        U S94S[        [        U S94S[        [        U S94S[        [        U S94S[        4S[        4S[        4S[        4S[         4S["        4S[$        4S[&        4/U R(                  SSSSS9$ )N/openid/client/loginr   /oauth10/client/loginr   )r   rN   /oauth10/client/request_params)rN   /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   rG   rI   r   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_secretr   r   )r   r   rX   rD   rt   rk   r   r   r   r   r   r   r:   r   r   r   r   r   r   r   r$   r?   s    r   get_appAuthTest.get_app  sd    ()A4T?S+,dE2 58' -,dF3 75dF3 68(
 ()A4T?S)+EtQUW(*CTt_U24dO :9dO 00dO /0OP/1PQ.0NO02RS&(?@/1PQ68TUD9m:v ((!<$B42AA
 A	
r!   c                     U R                  SSS9nU R                  UR                  S5        U R                  SUR                  S   ;   5        g )Nr  Ffollow_redirects.  z/openid/server/authenticate?LocationfetchassertEqualr   
assertTrueheadersr   s     r   test_openid_redirectAuthTest.test_openid_redirectU  sF    ::4u:M,6(:J:J::VVWr!   c                     U R                  S5      nUR                  5         [        UR                  5      nU R	                  US   S5        g )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.comrf   re   r  rethrowr	   bodyr  r   r   parseds      r   test_openid_get_userAuthTest.test_openid_get_userZ  sF    ::5
 	X]]+*;<r!   c                    U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   R                  S5      5        U R                  SUR                  S   ;   UR                  S   5        g )	Nr  Fr  r  r  )/oauth1/server/authorize?oauth_token=zxcv(_oauth_request_token="enhjdg==|MTIzNA=="
Set-Cookier  r  r   r  r  endswithr   s     r   test_oauth10_redirectAuthTest.test_oauth10_redirecte  s    ::5:N,Z(11;	
 	6-.\*	
r!   c                     U R                  SSS0S9nUR                  5         [        UR                  5      nU R	                  US   S5        U R	                  US   [        SS	S
95        g )Nz&/oauth10/client/login?oauth_token=zxcvCookie&_oauth_request_token=enhjdg==|MTIzNA==r  rf   re   rg   rc   rd   rT   r  r!  r	   r"  r  rX   r#  s      r   test_oauth10_get_userAuthTest.test_oauth10_get_usert  sn    ::4GH  
 	X]]+*;</&1PQr!   c                    U R                  S5      nUR                  5         [        UR                  5      nU R	                  US   S5        U R	                  US   S5        U R                  SU;   5        U R                  SU;   5        g )Nr  r   rR   r]   rc   r   r   r  r!  r	   r"  r  r  r#  s      r   test_oauth10_request_parameters(AuthTest.test_oauth10_request_parameters~  sy    ::>?X]]+ 45v>.7/0)V34r!   c                    U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   R                  S5      5        U R                  SUR                  S   ;   UR                  S   5        g )	Nr  Fr  r  r  r(  r)  r*  r+  r   s     r   test_oauth10a_redirectAuthTest.test_oauth10a_redirect  s    ::6:O,Z(11;	
 	6-.\*	
r!   Nzmock package not presentc                 L   [         R                  R                  [        S5       n[	        S5      Ul        [        [        S5         U R                  SSS9nS S S 5        U R                  WR                  S5        S S S 5        g ! , (       d  f       N3= f! , (       d  f       g = f)Nr/   boomzUncaught exceptionr  Fr  r   )r   patchobjectr   r*   side_effectr   r   r  r  r   )r   r/   r   s      r   test_oauth10a_redirect_error%AuthTest.test_oauth10a_redirect_error  sw    ZZ>F#'/CO7$89::&>QV:W :X]]C0	 GF99 GFs#   !BB$B
B	B
B#c                     U R                  SSS0S9nUR                  5         [        UR                  5      nU R	                  US   S5        U R	                  US   [        SS	S
95        g )Nz'/oauth10a/client/login?oauth_token=zxcvr0  r1  r2  rf   re   rg   rc   rd   rT   r3  r#  s      r   test_oauth10a_get_userAuthTest.test_oauth10a_get_user  sn    ::5GH  
 	X]]+*;</&1PQr!   c                    U R                  S5      nUR                  5         [        UR                  5      nU R	                  US   S5        U R	                  US   S5        U R                  SU;   5        U R                  SU;   5        g )Nr  r   rR   r]   rc   r   r   r7  r#  s      r    test_oauth10a_request_parameters)AuthTest.test_oauth10a_request_parameters  sy    ::?@X]]+ 45v>.7/0)V34r!   c                 `    U R                  SSS0S9nU R                  UR                  S5        g )NzG/oauth10a/client/login_coroutine?oauth_token=zxcv&fail_in_get_user=truer0  r1  r2  rn   )r  r  r   r   s     r   *test_oauth10a_get_user_coroutine_exception3AuthTest.test_oauth10a_get_user_coroutine_exception  s7    ::UGH  
 	,r!   c                     U R                  SSS9nU R                  UR                  S5        U R                  SUR                  S   ;   5        g )Nr  Fr  r  z/oauth2/server/authorize?r  r  r   s     r   test_oauth2_redirectAuthTest.test_oauth2_redirect  sF    ::4u:M,3x7G7G
7SSTr!   c                 t   U R                  SSS9nU R                  UR                  S5        U R                  SUR                  S   ;   5        U R                  SSS9nU R                  UR                  S5        [        UR                  5      nU R                  US	   S
5        U R                  US   S5        g )Nr  Fr  r  z/facebook/server/authorize?r  z /facebook/client/login?code=1234   rg   rR   session_expires3600)r  r  r   r  r  r	   r"  )r   r   r-   s      r   test_facebook_loginAuthTest.test_facebook_login  s    ::6:O,59I9I*9UUV::.  
 	,8==)n-v6/0&9r!   c                    U R                  USS9nU R                  UR                  S5        U R                  UR                  S   R                  S5      5        U R                  SUR                  S   ;   UR                  S   5        g )NFr  r  r  r(  r)  r*  r+  )r   urlr   s      r   base_twitter_redirectAuthTest.base_twitter_redirect  s    ::cE::,Z(11;	
 	6-.\*	
r!   c                 &    U R                  S5        g )Nr	  rX  r?   s    r   test_twitter_redirectAuthTest.test_twitter_redirect  s    ""#:;r!   c                 &    U R                  S5        g )Nr  r[  r?   s    r   #test_twitter_redirect_gen_coroutine,AuthTest.test_twitter_redirect_gen_coroutine  s    ""#HIr!   c                 0   U R                  SSS9nU R                  UR                  S5        U R                  UR                  S   R                  S5      UR                  S   5        U R                  SUR                  S   ;   UR                  S   5        g )	Nr
  Fr  r  r  z-/twitter/server/authenticate?oauth_token=zxcvr)  r*  r+  r   s     r   "test_twitter_authenticate_redirect+AuthTest.test_twitter_authenticate_redirect  s    ::<u:U,Z(11? Z(		
 	6-.\*	
r!   c                     U R                  SSS0S9nUR                  5         [        UR                  5      nU R	                  USSSS.S	SSS
.5        g )Nz&/twitter/client/login?oauth_token=zxcvr0  r1  r2  r   r~   r   )rU   r   rV   r   )rg   r   r   usernamer   r#  s      r   test_twitter_get_userAuthTest.test_twitter_get_user  sn    ::4GH  
 	X]]+ "#($!
 $!		
r!   c                     U R                  S5      nUR                  5         U R                  [        UR                  5      SSS.5        g )Nz'/twitter/client/show_user?name=somebodySomebodysomebody)r   r   )r  r!  r  r	   r"  r   s     r   test_twitter_show_userAuthTest.test_twitter_show_user  s>    ::GH&J(W	
r!   c                     U R                  S5      nU R                  UR                  S5        U R                  UR                  S5        g )Nz$/twitter/client/show_user?name=errorr   s   error from twitter request)r  r  r   r"  r   s     r   test_twitter_show_user_error%AuthTest.test_twitter_show_user_error  s:    ::DE,(EFr!   r8   )r2   r3   r4   r5   r  r  r%  r-  r4  r8  r;  unittestskipIfr   rB  rE  rH  rK  rN  rT  rX  r\  r_  rb  rf  rk  rn  r7   r8   r!   r   r   r     s    B
HX
	=
R5
 __TT\#=>1 ?1R5-U

:
 <J
 
*
Gr!   r   c                   >    \ rS rSrS r\R                  S 5       rSrg)GoogleLoginHandleri  c                     Xl         UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        g )N/client/login/google/oauth2/authorize/google/oauth2/token)r   r   _OAUTH_REDIRECT_URIrL   rM   r   s     r   r   GoogleLoginHandler.initialize  s<    	#'<<#@ $(LL1K$L!'+||4J'K$r!   c              #   d  #    U R                  SS 5      nUbf  U R                  U R                  U5      v nU R                  U R                  R                  S5      US   S9v nUS   US'   U R                  U5        g U R                  U R                  U R                  S   S   SS/SS	S
0S9  g 7f)Nr   /google/oauth2/userinforg   r   google_oauthrU   profilerf   promptselect_account)r   r   r   response_typer   )	r'   r(   rx  oauth2_requestr   r   r>   r^   r)   )r   r   accessr-   s       r   r/   GoogleLoginHandler.get  s       .66t7O7OQUVVF,,		!!";<#N3 -  D
 $*.#9D JJt##!55--7> '*$&(89 $ s   B.B0)rM   rL   rx  r   Nr1   r8   r!   r   rs  rs    s     L 	]] r!   rs  c                       \ rS rSrS rSrg)GoogleOAuth2AuthorizeHandleri/  c           	      j    SnU R                  [        U R                  S5      [        US95      5        g )Nfake-authorization-coder   )r   )redirectr   r'   rX   )r   r   s     r   r/    GoogleOAuth2AuthorizeHandler.get0  s)    (j!2!2>!BDdOTUr!   r8   Nr   r8   r!   r   r  r  /  s    Vr!   r  c                       \ rS rSrS rSrg)GoogleOAuth2TokenHandleri6  c                 Z    U R                  S5      S:X  d   eU R                  SSS.5        g )Nr   r  fake-access-tokenznever-expiresr   r'   r+   r?   s    r   r@   GoogleOAuth2TokenHandler.post7  s0      (,EEEE0P	
r!   r8   NrB   r8   r!   r   r  r  6  s    
r!   r  c                       \ rS rSrS rSrg)GoogleOAuth2UserinfoHandleri?  c                 Z    U R                  S5      S:X  d   eU R                  SSS.5        g )Nrg   r  r   re   )r   rf   r  r?   s    r   r/   GoogleOAuth2UserinfoHandler.get@  s.      04GGGGU->?@r!   r8   Nr   r8   r!   r   r  r  ?  s    Ar!   r  c                        \ rS rSrS rS rSrg)GoogleOAuth2TestiF  c                 d    [        S[        [        U S94S[        4S[        4S[
        4/SSS.S	9$ )
Nru  r  rv  rw  r{  fake_google_client_idfake_google_client_secretrT   )r|  )r   rs  rX   r  r  r  r?   s    r   r  GoogleOAuth2Test.get_appG  sM     !"4doF+-IJ')AB*,GH /5
 	
r!   c                 x    U R                  S5      nU R                  SSSS.[        UR                  5      5        g )Nru  r   re   r  )r   rf   rg   )r  assertDictEqualr	   r"  r   s     r   test_google_login"GoogleOAuth2Test.test_google_loginW  s:    ::o.* 3
 &	
r!   r8   N)r2   r3   r4   r5   r  r  r7   r8   r!   r   r  r  F  s    
 	
r!   r  )4rp  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   r:   rD   rk   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs  r  r  r  r  r8   r!   r   <module>r     s     '  . '  8 > >
~{ $$n $-~z ->,(@ ,">:  ?n ?
?^ ?
~{ 1C 0?~ ?
n 
	,>< 	,	( 4 	(+'; +	,,@ 	,"#7 "&On O
Q> Q	8N 	8~G  ~GB): <V> V
~ 
A. A
( 
Y  Ds   E' 'E32E3