o
    ˷e`                     @   s`  d dl Z d dlZd dlZd dl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 d d	lmZ d d
lmZ d dl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# ddl$m%Z% ddl&mZm'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/ dd Z0G dd de1Z2dd Z3G dd de1Z4dd Z5G d d! d!e"Z6dS )"    N)parse_qsurlparse)settings)AnonymousUser)MessageMiddleware)SessionMiddleware)RequestFactory)override_settings)reverse)	urlencode   )app_settings)EmailAddress)
user_emailuser_username)MockedResponseTestCasemocked_response)get_user_model   )r   	providers)complete_social_login)SocialAccount	SocialAppSocialLogin)signupc                 C   s`   d }t j| ji ds.tjj| j| jd| jdd}tj jr.ddl	m
} |j|j  |S )NAPPapp123iddummyprovidername	client_idkeysecretr   Site)r   	PROVIDERSgetidr   objectscreateallauthSITES_ENABLEDdjango.contrib.sites.modelsr&   sitesaddget_current)r    appr&    r3   R/var/www/ideatree/venv/lib/python3.10/site-packages/allauth/socialaccount/tests.py	setup_app   s   r5   c                       sj   e Zd ZdZdd Z fddZedddd	 Zed
ddddd ZdddZ	dd Z
dd Z  ZS )OAuthTestsMixinNc                 C      d S Nr3   selfr3   r3   r4   get_mocked_response0      z#OAuthTestsMixin.get_mocked_responsec                    .   t t|   tj| j| _t| j| _	d S r8   )
superr6   setUpr   registryby_idprovider_idr    r5   r2   r9   	__class__r3   r4   r?   3      zOAuthTestsMixin.setUpFSOCIALACCOUNT_AUTO_SIGNUPc                 C   s   |   }|d u rtd| jj  d S | |}| |td | j	td}|j
d j}tt|jttddd}| jjtd|d}| j|dd	d
 |j
d }| |  tjj	|| jjd}| }|  |  |  |  |S )N&Cannot test provider %s, no oauth mocksocialaccount_signupformi  i )emailusernamedata/accounts/profile/Ffetch_redirect_responseuserrR   r    )r;   warningswarnr    r)   loginassertRedirectsr
   clientr(   contextsociallogindictr   rR   strrandom	randrangepostassertFalsehas_usable_passwordr   r*   get_provider_accountget_avatar_urlget_profile_url	get_brandto_str)r:   
resp_mocksresprZ   rN   rR   accountprovider_accountr3   r3   r4   
test_login8   s.   

zOAuthTestsMixin.test_loginT)rG   SOCIALACCOUNT_EMAIL_REQUIREDACCOUNT_EMAIL_REQUIREDc                 C   sT   |   }|std| jj  d S | |}| j|ddd | |jd 	  d S )NrH   rO   FrP   rR   )
r;   rT   rU   r    r)   rV   rW   r`   rY   ra   )r:   rg   rh   r3   r3   r4   test_auto_signupT   s   
z OAuthTestsMixin.test_auto_signuprV   c                 C   s   t tddddi | jt| jjd d tt|d }W d    n1 s*w   Y  t	|d }t
|j}t| jjd	 }| |d
 d |d t |  g|R   | j|}W d    |S 1 skw   Y  |S )N   )oauth_token=token&oauth_token_secret=psstcontent-type	text/html_login?processlocation	_callbackoauth_callbackr   )r   r   rX   r_   r
   r    r)   r   r[   r   r   queryassertGreaterfindget_access_token_responser(   )r:   rg   rv   rh   pqcomplete_urlr3   r3   r4   rV   b   s2   

zOAuthTestsMixin.loginc                 C   s   t ddddiS )Nro   rp   rq   rr   )r   r9   r3   r3   r4   r}   w   s
   z)OAuthTestsMixin.get_access_token_responsec                 C   4   | j t| jjd }| |dttdd  d S Nrx   z%socialaccount/authentication_error.%sACCOUNT_TEMPLATE_EXTENSIONhtmlrX   r(   r
   r    r)   assertTemplateUsedgetattrr   r:   rh   r3   r3   r4   test_authentication_error~      
z)OAuthTestsMixin.test_authentication_error)rV   )__name__
__module____qualname__rB   r;   r?   r	   rk   rn   rV   r}   r   __classcell__r3   r3   rC   r4   r6   -   s    


	r6   c                    &   G  fdddt t}d j |_|S )Nc                          e Zd Z jZdS )z!create_oauth_tests.<locals>.ClassNr   r   r   r)   rB   r3   r    r3   r4   Class       
r   OAuthTests_)r6   r   r)   r   r    r   r3   r   r4   create_oauth_tests      r   c                       sp   e Zd ZdZdd ZdddZ fddZed	d
dd ZdddZ	dd Z
dddZdd Zdd Z  ZS )OAuth2TestsMixinNc                 C   r7   r8   r3   r9   r3   r3   r4   r;      r<   z$OAuth2TestsMixin.get_mocked_responseTc                 C   s   d}|rd}d| S )N z,"refresh_token": "testrf"zQ{
            "uid":"weibo",
            "access_token":"testac"
            %s }r3   )r:   with_refresh_tokenrtr3   r3   r4   get_login_response_json   s   z(OAuth2TestsMixin.get_login_response_jsonc                    r=   r8   )
r>   r   r?   r   r@   rA   rB   r    r5   r2   r9   rC   r3   r4   r?      rE   zOAuth2TestsMixin.setUpFrF   c                 C   s@   |   }|std| jj  d S | |}| |td d S )NrH   rI   )r;   rT   rU   r    r)   rV   rW   r
   )r:   	resp_mockrh   r3   r3   r4   rk      s   zOAuth2TestsMixin.test_loginc                 C   s  t jsd S d}t dd}t|| t|d |d |  tjj	||ddd | j
j|jdd | j|  dd	 |rH| j|  d
dd tjj|| jjd }| }|  |  |  |  | jr|j }| d|j | |jt| jdddd d S d S )Nzuser@example.comT)	is_activerR   test)rR   rK   primaryverifiedrL   passwordconnectru   F)r   rv   rS   testacr   refresh_tokenr   ) r   STORE_TOKENSr   r   r   set_passwordsaver   r*   r+   rX   rV   rL   r;   r   filterr    r)   r(   rb   rc   rd   re   rf   r2   socialtoken_setassertEqualtokentoken_secretjsonloadsr   )r:   multiple_loginrK   rR   sarj   tr3   r3   r4   test_account_tokens   sB   



z$OAuth2TestsMixin.test_account_tokensc                 C   s   | j dd dS )z
        fails if a login missing a refresh token, deletes the previously
        saved refresh token. Systems such as google's oauth only send
        a refresh token on first login.
        T)r   N)r   r9   r3   r3   r4   +test_account_refresh_token_saved_next_login   s   z<OAuth2TestsMixin.test_account_refresh_token_saved_next_loginrV   c           
      C   s   | j t| jjd d tt|d }t|d }t|j	}t| jjd }| 
|d d |d | j|d}t|trC|}	n|g}	ttd	|d
dig|	R   | j || |}W d    |S 1 sjw   Y  |S )Nrs   rt   ru   rw   rx   redirect_urir   r   ro   rq   zapplication/json)rX   r_   r
   r    r)   r   r[   r   r   rz   r{   r|   r   
isinstancelistr   r   r(   get_complete_parameters)
r:   r   rv   r   rh   r~   r   r   response_jsonrg   r3   r3   r4   rV      s6   



zOAuth2TestsMixin.loginc                 C   s   d|d d dS )Nr   stater   )coder   r3   )r:   r   r3   r3   r4   r      s   z(OAuth2TestsMixin.get_complete_parametersc                 C   r   r   r   r   r3   r3   r4   r      r   z*OAuth2TestsMixin.test_authentication_error)T)F)rV   T)r   r   r   rB   r;   r   r?   r	   rk   r   r   rV   r   r   r   r3   r3   rC   r4   r      s    



'
r   c                    r   )Nc                       r   )z"create_oauth2_tests.<locals>.ClassNr   r3   r   r3   r4   r   
  r   r   OAuth2Tests_)r   r   r)   r   r   r3   r   r4   create_oauth2_tests	  r   r   c                       sF  e Zd Z fddZeddejjddd Zedddddd	d
d Z	edddddd	dd Z
edddddd	dd Zedg dddddddd Zdd Zdd Zeddddddddd Zeddddddddd Zeddddddddd  Zedddddddd!d" Zd#d$ Zd%d& Zeed'd(d) Z  ZS )*SocialAccountTestsc                    sf   t t|   tj D ]$}tjj|j	|j	dddd}t
jjr0ddlm} |j }|j| qd S )Nr   123r   r   r   r%   )r>   r   r?   r   r@   get_listr   r*   r+   r)   r,   r   r-   r.   r&   r1   r/   r0   )r:   r    r2   r&   siterC   r3   r4   r?     s   
zSocialAccountTests.setUpTN)rG   ACCOUNT_SIGNUP_FORM_CLASSACCOUNT_EMAIL_VERIFICATIONc                 C   s   t  }|d}t |_tdd | tdd | t }| }t|t	j
d t|t	jd tddd	}t||d
}t|| |jjdi t	j
di}| tjj||jd  | tjj|t|d  d S )Nz/accounts/login/callback/c                 S   r7   r8   r3   requestr3   r3   r4   <lambda>+      z?SocialAccountTests.test_email_address_created.<locals>.<lambda>c                 S   r7   r8   r3   r   r3   r3   r4   r   ,  r   r   test@example.comopenidr   r    uidrR   ri   )rR   r   )rR   rK   r3   )r   r(   r   rR   r   process_requestr   r   setattraccount_settingsUSER_MODEL_USERNAME_FIELDUSER_MODEL_EMAIL_FIELDr   r   r   r*   
assertTruer   r   existsr   r   r:   factoryr   UserrR   ri   rZ   r3   r3   r4   test_email_address_created"  s&   

z-SocialAccountTests.test_email_address_createdrK   )rm   ACCOUNT_UNIQUE_EMAILACCOUNT_USERNAME_REQUIREDACCOUNT_AUTHENTICATION_METHODrG   c                 C   s|   |  dd\}}| |d td d|_ddd|_t|}| |d d	 t jjdi t	j
di}| t|d d
S )z%Test clash on both username and emailr   r   rw   rI   POSTotherother@example.comrL   rK   rO   Nr3   )_email_address_clashr   r
   methodr   r   r   r*   r(   r   r   r   r:   r   rh   rR   r3   r3   r4   *test_email_address_clash_username_required?  s   	z=SocialAccountTests.test_email_address_clash_username_requiredFc                 C   sz   |  dd\}}| |d td d|_ddi|_t|}| |d d t jjd
i t	j
di}| t|d d	S )z)Test clash while username is not requiredr   r   rw   rI   r   rK   r   rO   Nr3   )r   r   r
   r   r   r   r   r*   r(   r   r   assertNotEqualr   r   r3   r3   r4   .test_email_address_clash_username_not_requiredU  s   	
zASocialAccountTests.test_email_address_clash_username_not_requiredc                 C   sN   |  dd\}}| |d d t jjdi tjdi}| t|d d S )Nr   r   rw   rO   r3   )	r   r   r   r*   r(   r   r   r   r   r   r3   r3   r4   -test_email_address_clash_username_auto_signupk  s   	z@SocialAccountTests.test_email_address_clash_username_auto_signup)rL   	username1	username2)rm   ACCOUNT_USERNAME_BLACKLISTr   r   r   rG   c                 C   s   t  }|d}t |_tdd | tdd | t }| }t|t	j
d t|t	jd tddd	}t||d
}t|| | |jjt	j d S )N!/accounts/twitter/login/callback/c                 S   r7   r8   r3   r   r3   r3   r4   r     r   zHSocialAccountTests.test_populate_username_in_blacklist.<locals>.<lambda>c                 S   r7   r8   r3   r   r3   r3   r4   r     r   rL   zusername@example.comtwitterr   r   r   )r   r(   r   rR   r   r   r   r   r   r   r   r   r   r   r   assertNotInrL   USERNAME_BLACKLISTr   r3   r3   r4   #test_populate_username_in_blacklist{  s"   	

z6SocialAccountTests.test_populate_username_in_blacklistc                 C   s   t  }| }t|d t|d |  tddd}| }t|| t|| t||d}t }|d}	t |	_	t
dd	 |	 td
d	 |	 t|	|}
|	|
fS )Nr   r   r   r   r   r   r   c                 S   r7   r8   r3   r   r3   r3   r4   r     r   z9SocialAccountTests._email_address_clash.<locals>.<lambda>c                 S   r7   r8   r3   r   r3   r3   r4   r     r   )r   r   r   r   r   r   r   r(   r   rR   r   r   r   r   )r:   rL   rK   r   exi_userri   rR   rZ   r   r   rh   r3   r3   r4   r     s"   





z'SocialAccountTests._email_address_clashc                 C   s   t  }| }t|d t|d |d |  tjjdd|d}| jj	|j
|j
d | jtd}| |d | jtdd	|ji}| tjj|jd
  d S )Nr   r   r   r   )r   r    rR   r   socialaccount_connectionszsocialaccount/connections.htmlri   )pk)r   r   r   r   r   r   r*   r+   rX   rV   rL   r(   r
   r   r_   r   r`   r   r   )r:   r   rR   ri   rh   r3   r3   r4   test_disconnect  s   


z"SocialAccountTests.test_disconnect	mandatory)rm   r   r   r   r   rG   c                 C   s   | j j}t }t|ddtddtddddgd}| |d< |  | j t	d	}|j
d
 }| |d  d | j jt	d	ddid}| j|ddd |j d }| t|d | tjj|dddd  | tjj|dddd  dS )z
        Test scenario for when the user changes email at social signup. Current
        behavior is that both the unverified and verified email are added, and
        that the user is allowed to pass because he did provide a verified one.
        zverified@example.comrK   googler   TrK   r   r   rR   ri   email_addressessocialaccount_socialloginrI   rJ   rK   unverified@example.orgrM   rO   FrP   r   rR   rK   r   r   NrX   sessionr   r   r   r   	serializer   r(   r
   rY   r   valuer_   rW   r*   allr   r   r   r   r:   r   r   rZ   rh   rJ   rR   r3   r3   r4   $test_verified_email_change_at_signup  sL   
z7SocialAccountTests.test_verified_email_change_at_signupc                 C   s   | j j}t }t|ddtddtddddgd}| |d	< |  | j t	d
}|j
d }| |d  d | j jt	d
ddid}| |t	d |j d }| t|d | tjj|dddd  | tjj|dddd  dS )z
        Test scenario for when the user changes email at social signup, while
        his provider did not provide a verified email. In that case, email
        verification will kick in. Here, both email addresses are added as
        well.
        zunverified@example.comr   r   r   FTr   r   r   rI   rJ   rK   r   rM   account_email_verification_sentr   r   Nr   r  r3   r3   r4   &test_unverified_email_change_at_signup  sT   
z9SocialAccountTests.test_unverified_email_change_at_signupc                 C   s   | j j}t }|jjdd t|ddtddtddddgd}| |d< |	  | j 
td	}|jd
 }| |d  d | j jtd	ddid}| |d
dd d S )Nzme@example.comr   r   r   Tr   r   r   rI   rJ   rK   rM   z{An account already exists with this e-mail address. Please sign in to that account first, then connect your Google account.)rX   r   r   r*   r+   r   r   r   r   r   r(   r
   rY   r   r  r_   assertFormErrorr:   r   r   rZ   rh   rJ   r3   r3   r4   #test_unique_email_validation_signup2  s.   	
z6SocialAccountTests.test_unique_email_validation_signupc                 C   s   | j j}t }t|ddtddd}| |d< |  | j td}|j	d }| 
|d	  d | j jtdd
ddd}| 
|jd | 
|j d | 
tj d | j td}| |td dS )a  
        Test scenario for when the user signs up with a social account
        and uses email address in that social account. But upon seeing the
        verification screen, they realize that email address is somehow
        unusable for them, and so backs up and enters a different email
        address (and is forced to choose a new username) while providing
        the same social account token which is owned by their first attempt.
        zme1@example.comr   facebookr   r   r   rI   rJ   rK   me1r   rM   i.  r   account_loginN)rX   r   r   r   r   r   r   r(   r
   rY   r   r  r_   status_coder*   countrW   r  r3   r3   r4   #test_social_account_taken_at_signupV  s(   
z6SocialAccountTests.test_social_account_taken_at_signupc                 C   s.   t  }|dd}t|d}| dt| d S )Nr   rL   rR   r   r   r   r\   r:   r   rR   r   r3   r3   r4   test_social_account_str_default}  s   

z2SocialAccountTests.test_social_account_str_defaultc                 C   s   d | jS )NzA custom str builder for {})formatrR   )socialaccountr3   r3   r4   "socialaccount_str_custom_formatter  s   z5SocialAccountTests.socialaccount_str_custom_formatter)SOCIALACCOUNT_SOCIALACCOUNT_STRc                 C   s.   t  }|dd}t|d}| dt| d S )Nr   r  r  zA custom str builder for testr  r  r3   r3   r4   "test_social_account_str_customized  s   

z5SocialAccountTests.test_social_account_str_customized)r   r   r   r?   r	   r   EmailVerificationMethodNONEr   r   r   r   r   r   r   r  r  r	  r  r  r  r  r   r3   r3   rC   r4   r     s    



	

,
2

r   )7r   r]   rT   urllib.parser   r   django.confr   django.contrib.auth.modelsr   "django.contrib.messages.middlewarer   "django.contrib.sessions.middlewarer   django.test.clientr   django.test.utilsr	   django.urlsr
   django.utils.httpr   allauth.app_settingsr,   ri   r   r   account.modelsr   account.utilsr   r   testsr   r   r   utilsr   r   r   helpersr   modelsr   r   r   viewsr   r5   objectr6   r   r   r   r   r3   r3   r3   r4   <module>   s8    \x