o
    LfjO                     @   s  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Zd d	lmZ d d
lm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 m!Z!m"Z" d dl#m$Z$ d dl%m&Z& G dd de&Z'dd Z(dd Z)dd Z*dd Z+dS )    N)get_user_model)AnonymousUser)MessageMiddleware)SessionMiddleware)RequestFactory)override_settings)reverse)app_settings)EmailAddress)
user_emailuser_username)context)	providers)complete_social_login)SocialAccount	SocialAppSocialLogin)signup)TestCasec                	       s  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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d Zedddddddd d! Z  ZS )"SignupTestsc                    sn   t    tj D ]*}|jdkrq
tjj|j|jdddd}t	j
jr4ddlm} |j }|j| q
d S )Nopenid_connectapp123id123dummy)providername	client_idkeysecretr   )Site)supersetUpr   registryget_class_listidr   objectscreateallauthr	   SITES_ENABLEDdjango.contrib.sites.modelsr   get_currentsitesadd)selfr   appr   site	__class__ h/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/socialaccount/tests/test_signup.pyr!      s"   


zSignupTests.setUpTN)SOCIALACCOUNT_AUTO_SIGNUP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| t|| W d    n1 sSw   Y  |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      d S Nr2   requestr2   r2   r3   <lambda>2       z8SignupTests.test_email_address_created.<locals>.<lambda>c                 S   r7   r8   r2   r9   r2   r2   r3   r;   3   r<   testtest@example.comopenidr   r   uiduseraccount)rC   rA   )rC   emailr2   )r   getr   rC   r   process_requestr   r   setattraccount_settingsUSER_MODEL_USERNAME_FIELDUSER_MODEL_EMAIL_FIELDr   r   r   request_contextr   r%   
assertTruefilterrA   existsr
   r   r-   factoryr:   UserrC   rD   socialloginr2   r2   r3   test_email_address_created)   s*   
z&SignupTests.test_email_address_createdrE   )ACCOUNT_EMAIL_REQUIREDACCOUNT_UNIQUE_EMAILACCOUNT_USERNAME_REQUIREDACCOUNT_AUTHENTICATION_METHODr4   c                 C   s   |  dd\}}| |d td d|_ddd|_t| t|}W d	   n1 s/w   Y  | |d d
 t j	j
di tjdi}| t|d d	S )z%Test clash on both username and emailr=   r>   locationsocialaccount_signupPOSTotherother@example.comusernamerE   N/accounts/profile/r2   )_email_address_clashassertEqualr   methodr[   r   rL   r   r   r%   rF   rI   rK   r   r-   r:   resprC   r2   r2   r3   *test_email_address_clash_username_requiredG   s   	
z6SignupTests.test_email_address_clash_username_requiredFc                 C   s   |  dd\}}| |d td d|_ddi|_t| t|}W d   n1 s.w   Y  | |d d	 t j	j
d
i tjdi}| t|d dS )z)Test clash while username is not requiredr=   r>   rY   rZ   r[   rE   r]   Nr`   r2   )ra   rb   r   rc   r[   r   rL   r   r   r%   rF   rI   rK   assertNotEqualr   rd   r2   r2   r3   .test_email_address_clash_username_not_required^   s   	

z:SignupTests.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]   rY   r`   r2   )	ra   rb   r   r%   rF   rI   rK   rg   r   rd   r2   r2   r3   -test_email_address_clash_username_auto_signupu   s   	z9SignupTests.test_email_address_clash_username_auto_signup)r_   	username1	username2)rU   ACCOUNT_USERNAME_BLACKLISTrV   rW   rX   r4   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| t|| W d    n1 sSw   Y  | |jjt	j d S )N!/accounts/twitter/login/callback/c                 S   r7   r8   r2   r9   r2   r2   r3   r;      r<   zASignupTests.test_populate_username_in_blacklist.<locals>.<lambda>c                 S   r7   r8   r2   r9   r2   r2   r3   r;      r<   r_   zusername@example.comtwitterr   r@   rB   )r   rF   r   rC   r   rG   r   r   rH   rI   rJ   rK   r   r   r   rL   r   assertNotInr_   USERNAME_BLACKLISTrP   r2   r2   r3   #test_populate_username_in_blacklist   s&   	
z/SignupTests.test_populate_username_in_blacklistc                 C   s   t  }| }t|d d}t|| |  tjj||ddd tddd}| }t|| t|| t||d}t	 }	|	
d	}
t |
_td
d |
 tdd |
 t|
 t|
|}W d    |
|fS 1 sow   Y  |
|fS )Nr=   r>   TrC   rE   verifiedprimaryrn   r   r@   rB   rm   c                 S   r7   r8   r2   r9   r2   r2   r3   r;      r<   z2SignupTests._email_address_clash.<locals>.<lambda>c                 S   r7   r8   r2   r9   r2   r2   r3   r;      r<   )r   r   r   saver
   r%   r&   r   r   r   rF   r   rC   r   rG   r   r   rL   r   )r-   r_   rE   rR   exi_userexi_user_emailrD   rC   rS   rQ   r:   re   r2   r2   r3   ra      s2   





z SignupTests._email_address_clash	mandatory)rU   r6   rV   rW   rX   r4   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rE   googler   TrE   rs   rt   rC   rD   email_addressessocialaccount_socialloginrZ   formrE   unverified@example.orgdatar`   F)fetch_redirect_responser   rr   Nclientsessionr   r   r   r
   	serializeru   rF   r   r   rb   valuepostassertRedirectsr%   allr   rM   rN   rO   r-   r   rR   rS   re   r   rC   r2   r2   r3   $test_verified_email_change_at_signup   sL   
z0SignupTests.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.comry   rz   r{   FTr|   r}   r   rZ   r   rE   r   r   account_email_verification_sentr   rr   Nr   r   r2   r2   r3   &test_unverified_email_change_at_signup   sT   
z2SignupTests.test_unverified_email_change_at_signup)ACCOUNT_PREVENT_ENUMERATIONrU   r6   rV   rW   rX   r4   c                 C   s   | j j}t }d}|jj|d}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  | | j jtd
d|id}tjdkrj| |jd dd d S | |ddd d S )Nzme@example.comry   T)rE   rC   rs   rz   r{   r|   r}   r   rZ   r   rE   r   )      zzAn account already exists with this email address. Please sign in to that account first, then connect your Google account.)r   r   r   r%   r&   r
   r   r   r   ru   rF   r   r   rb   r   r   djangoVERSIONassertFormError)r-   r   rR   rE   rC   rS   re   r   r2   r2   r3   #test_unique_email_validation_signup/  s:   


z/SignupTests.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.comry   facebookr{   rB   r   rZ   r   rE   me1r^   r   i.  r   account_loginN)r   r   r   r   r   r   ru   rF   r   r   rb   r   r   status_coder%   countr   )r-   r   rR   rS   re   r   r2   r2   r3   #test_social_account_taken_at_signup]  s(   
z/SignupTests.test_social_account_taken_at_signup)__name__
__module____qualname__r!   r   rI   EmailVerificationMethodNONErT   rf   rh   ri   rq   ra   r   r   r   r   __classcell__r2   r2   r0   r3   r      s    



	

,
2
	%r   c           	      C   s   d|_ d|_d|_d|_d|_d|_|dd}|d}i |_t |_	t
||}|d tdks2J |j}| |d	< |  |tddd
i}|d tdksSJ dS )zgTests that when the email address is missing from the sociallogin email
    verification kicks in.
    TFrE   rx   
with_email/rY   rZ   r   zother@example.orgr   N)rU   rV   rW   rX   r6   r4   rF   r   r   rC   r   r   r   ru   r   )	dbsettingssociallogin_factoryr   rfrS   r:   re   r   r2   r2   r3   4test_email_address_required_missing_from_sociallogin  s"   


r   c                 C   s   d|_ d|_d|_d|_d|_d|_| }|dd}|d}	i |	_t |	_	t
|	|}
|
d tdks5J |j}| |d	< |  |tdd|ji}
|d
 jdksVJ |
d tdks`J dS )yTests that when an already existing email is given at the social signup
    form, enumeration preventation kicks in.
    TFrE   rx   r   r   rY   rZ   r   r   $[example.com] Account Already Existsr   N)rU   rV   rW   rX   r6   r4   rF   r   r   rC   r   r   r   ru   r   rE   subjectr   r   user_factoryr   r   r   
mailoutboxrC   rS   r:   re   r   r2   r2   r3   1test_email_address_conflict_at_social_signup_form  s&   


r   c                 C   s   d|_ d|_d|_d|_d|_d|_| }||jdd}|d}	i |	_t	 |	_
t|	|}
|
d tdks7J |d	 jd
ks@J dS )ztTests that when an already existing email is received from the provider,
    enumeration preventation kicks in.
    TFrE   rx   )rE   r   r   rY   r   r   r   N)rU   rV   rW   rX   r6   r4   rE   rF   r   r   rC   r   r   r   )r   r   r   r   r   r   r   rC   rS   r:   re   r2   r2   r3   .test_email_address_conflict_during_auto_signup  s   

r   c                 C   s   d|_ d|_d|_d|_d|_d|_d|_|dd}||jdd}|d}	i |	_	t
 |	_t|	|}
|
d td	ks<J |j	}| |d
< |  |td	ddi}
|d jdks\J |
d |jkseJ tjj|jd dkssJ dS )r   TFrE   optional)email_verified)rE   r   r   rY   rZ   r   zother@email.orgr   z/[example.com] Please Confirm Your Email Addressry   r   N)rU   rV   rW   rX   r6   r4   "SOCIALACCOUNT_EMAIL_AUTHENTICATIONrE   rF   r   r   rC   r   r   r   ru   r   r   LOGIN_REDIRECT_URLr
   r%   rN   r   r   r2   r2   r3   5test_email_address_conflict_removes_conflicting_email  s*   


 r   ),r   django.contrib.authr   django.contrib.auth.modelsr   "django.contrib.messages.middlewarer   "django.contrib.sessions.middlewarer   django.test.clientr   django.test.utilsr   django.urlsr   allauth.app_settingsr'   allauth.accountr	   rI   allauth.account.modelsr
   allauth.account.utilsr   r   allauth.corer   allauth.socialaccountr   allauth.socialaccount.helpersr   allauth.socialaccount.modelsr   r   r   allauth.socialaccount.viewsr   allauth.testsr   r   r   r   r   r   r2   r2   r2   r3   <module>   s2      q!