
    .~h                     d   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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  e	j<                  dd      Z edddd       G d de             Z  ed       G d de              Z!y)    N)copy)	timedelta)apps)settings)mail)
management)ImproperlyConfigured)TransactionTestCase)override_settings)get_random_string)now)RegistrationProfile)SupervisedRegistrationProfile)	UserModelsitesSite   registration@email.comTdjango@email.com)ACCOUNT_ACTIVATION_DAYSREGISTRATION_DEFAULT_FROM_EMAILREGISTRATION_EMAIL_HTMLDEFAULT_FROM_EMAILc                   ~   e Zd ZdZddddZeZd Zd Zd Z	 e
d	
      d        Zd Z e
d      d        Z e
dd      d        Z e
d      d        Zd Z e
d      d        Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd' Zd( Z d) Z!d* Z"d+ Z#d, Z$d- Z%d. Z&d/ Z'd0 Z(d1 Z)d2 Z*d3 Z+d4 Z,d5 Z-y)6RegistrationModelTestszB
    Test the model and manager used in the default backend.

    alice	swordfishalice@example.comusernamepasswordemailc                 8    t        j                  dt               y )Nalways)warningssimplefilterUserWarningselfs    b/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/registration/tests/models.pysetUpzRegistrationModelTests.setUp*   s    h4    c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }| j                  | j                  j                  j                         d       | j                  |j                  j                  |j                         | j                  t        j                  d|j                               | j                  t        |      d       y)z
        Creating a registration profile for a user populates the
        profile with the correct user and a SHA256 hash to use as
        activation key.

           z^[a-f0-9]{40,64}$z"Registration information for aliceN )r   objectscreate_user	user_inforegistration_profilecreate_profileassertEqualcountuserid
assertTruerematchactivation_keystrr)   new_userprofiles      r*   test_profile_creationz,RegistrationModelTests.test_profile_creation-   s     39;&&22DT^^D++33BB8L22::@@BAF(++6!4g6L6LMNW=	?r,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        j                  d   j                  | j                  d   g       yX
        ``RegistrationProfile.send_activation_email`` sends an
        email.

        r.   r   r"   Nr/   r   r0   r1   r2   r3   r4   send_activation_emailr   get_currentr5   lenr   outboxtor>   s      r*   test_activation_emailz,RegistrationModelTests.test_activation_email=   s     39;&&22DT^^D++33BB8L%%dll&>&>&@AT[[)1-Q**T^^G-D,EFr,   zdoes-not-exist)ACTIVATION_EMAIL_HTMLc                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        j                  d   j                  | j                  d   g       yrC   rE   r>   s      r*   &test_activation_email_missing_templatez=RegistrationModelTests.test_activation_email_missing_templateI   s     39;&&22DT^^D++33BB8L%%dll&>&>&@AT[[)1-Q**T^^G-D,EFr,   c                 ^    t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        j                  d   j                  d       y)rD   r   r   Nr/   r   r0   r1   r2   r3   r4   rF   r   rG   r5   r   rI   
from_emailr>   s      r*   :test_activation_email_uses_registration_default_from_emailzQRegistrationModelTests.test_activation_email_uses_registration_default_from_emailV   s{     39;&&22DT^^D++33BB8L%%dll&>&>&@AQ224LMr,   Nr   c                 ^    t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        j                  d   j                  d       y)rD   r   r   Nr/   rP   r>   s      r*   =test_activation_email_falls_back_to_django_default_from_emailzTRegistrationModelTests.test_activation_email_falls_back_to_django_default_from_emaila   s{     39;&&22DT^^D++33BB8L%%dll&>&>&@AQ224FGr,   Tadmin)REGISTRATION_USE_SITE_EMAILREGISTRATION_SITE_USER_EMAILc                     t               j                  j                  di | j                  }| j                  j                  j                  |      }t        j                  j                         }|j                  |       dj                  |j                        }| j                  t        j                  d   j                  |       y)z
        ``RegistrationProfile.send_activation_email`` sends an
        email with the ``from`` address configured by the site.

        zadmin@{}r   Nr/   )r   r0   r1   r2   r3   r4   r   rG   rF   formatdomainr5   r   rI   rQ   )r)   r?   r@   siterQ   s        r*   'test_activation_email_uses_site_addressz>RegistrationModelTests.test_activation_email_uses_site_addressm   s     39;&&22DT^^D++33BB8L||'')%%d+&&t{{3
Q22J?r,   )rW   c                 X    t               j                  j                  di | j                  }| j                  j                  j                  |      }| j                  t              5  |j                  t        j                  j                                ddd       y# 1 sw Y   yxY w)zv
        ``RegistrationProfile.send_activation_email`` won't send an email if
        improperly configured.

        Nr/   )r   r0   r1   r2   r3   r4   assertRaisesr	   rF   r   rG   r>   s      r*   =test_activation_email_uses_site_address_improperly_configuredzTRegistrationModelTests.test_activation_email_uses_site_address_improperly_configured|   s     39;&&22DT^^D++33BB8L34 	F))$,,*B*B*DE	F 	F 	Fs   ).B  B)c                 p    t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                  d   j                        d       y)zh
        ``RegistrationProfile.send_activation_email`` sends an html
        email by default.

        r   r.   Nr/   r   r0   r1   r2   r3   r4   rF   r   rG   r5   rH   r   rI   alternativesr>   s      r*   (test_activation_email_is_html_by_defaultz?RegistrationModelTests.test_activation_email_is_html_by_default   s     39;&&22DT^^D++33BB8L%%dll&>&>&@AT[[^8891=r,   Fr   c                 p    t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                  d   j                        d       y)z
        ``RegistrationProfile.send_activation_email`` sends a plain
        text email if settings.REGISTRATION_EMAIL_HTML is False.

        r   Nr/   rb   r>   s      r*   4test_activation_email_is_plain_text_if_html_disabledzKRegistrationModelTests.test_activation_email_is_plain_text_if_html_disabled   s     39;&&22DT^^D++33BB8L%%dll&>&>&@AT[[^8891=r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                  |j                         d       | j                  |j                  d       | j                  |j                  d             | j                  |j                         t               t        t        j                         z
  }| j#                  |j$                  |       y)zp
        Creating a new user populates the correct data, and sets the
        user's account inactive.

        r\   r   r   r   Nr/   r3   r0   create_inactive_userr   rG   r2   r5   get_usernamer"   r9   check_passwordassertFalse	is_activedatetime_nowr   r   r   assertGreaterdate_joined)r)   r?   expiration_dates      r*   test_user_creationz)RegistrationModelTests.test_user_creation   s     J4,,44II ?))+?/3~~?..0':)<=//<=++,&.9,,,
 
 	8//Ar,   c                      | j                   j                  j                  ddt        j                  j	                         i| j
                   | j                  t        t        j                        d       y)zM
        By default, creating a new user sends an activation email.

        r\   r.   Nr/   
r3   r0   rj   r   rG   r2   r5   rH   r   rI   r(   s    r*   test_user_creation_emailz/RegistrationModelTests.test_user_creation_email   sZ    
 	?!!))>> 	?))+	?/3~~	?T[[)1-r,   c                      | j                   j                  j                  dt        j                  j	                         dd| j
                   | j                  t        t        j                        d       y)zs
        Passing ``send_email=False`` when creating a new user will not
        send an activation email.

        Fr\   
send_emailr   Nr/   ru   r(   s    r*   test_user_creation_no_emailz2RegistrationModelTests.test_user_creation_no_email   s_     	?!!))>> 	0))+	0 $	0 	T[[)1-r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                  |j                         d       | j                  |j                  d       | j                  |j                  d             | j                  |j                         t               t        t        j                         z
  }| j#                  |j$                  |       y)zW
        If ``user.date_joined`` is well in the past, ensure that we reset it.
        r\   r   r   r   Nr/   ri   )r)   r?   expiry_dates      r*   "test_user_creation_old_date_joinedz9RegistrationModelTests.test_user_creation_old_date_joined   s     J4,,44II ?))+?/3~~?..0':)<=//<=++,"ny1Q1Q'RR8//=r,   c                    t               t        t        j                  dz         z
  | j                  d<    | j
                  j                  j                  ddt        j                  j                         i| j                  }| j
                  j                  j                  |      }| j                  |j                                y)z
        ``RegistrationProfile.activation_key_expired()`` is ``False`` within
        the activation window. Even if the user was created in the past.

        r.   rq   r\   r7   Nr/   )ro   r   r   r   r2   r3   r0   rj   r   rG   getrm   activation_key_expiredr>   s      r*   &test_unexpired_account_old_date_joinedz=RegistrationModelTests.test_unexpired_account_old_date_joined   s     )5 )
h66:;)<}%I4,,44II ?))+?/3~~?++3377X7F779:r,   c                 *    | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                  |j                                y)zv
        ``RegistrationProfile.activation_key_expired()`` is ``False``
        within the activation window.

        r\   r   Nr/   )	r3   r0   rj   r   rG   r2   r   rm   r   r>   s      r*   test_unexpired_accountz-RegistrationModelTests.test_unexpired_account   sz     J4,,44II ?))+?/3~~?++3377X7F779:r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                |j                          | j                  |j                                y)z{
        ``RegistrationProfile.activation_key_expired()`` is ``True``
        when the account is already active.

        r\   r   Nr/   )r3   r0   rj   r   rG   r2   r   activate_userr<   refresh_from_dbr9   r   r>   s      r*   *test_active_account_activation_key_expiredzARegistrationModelTests.test_active_account_activation_key_expired   s     J4,,44II ?))+?/3~~?++3377X7F!!))77""DLL$<$<$>	@!6689r,   c                 v    | j                   j                  j                  ddt        j                  j	                         i| j
                  }|xj                  t        j                  t        j                  dz         z  c_        |j                          | j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                |j                          | j!                  |j#                                y)z
        ``RegistrationProfile.activation_key_expired()`` is ``True``
        when the account is already active and the activation window has passed.

        r\   r.   daysr   Nr/   )r3   r0   rj   r   rG   r2   rq   datetimer   r   r   saver   r   r<   r   r9   r   r>   s      r*   =test_active_account_and_expired_accountactivation_key_expiredzTRegistrationModelTests.test_active_account_and_expired_accountactivation_key_expired   s     J4,,44II ?))+?/3~~? 2 211A5!7 	7++3377X7F!!))77""DLL$<$<$>	@!6689r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }|xj                  t        j                  t        j                  dz         z  c_        |j                          | j                   j                  j                  |      }| j                  |j                                y)zv
        ``RegistrationProfile.activation_key_expired()`` is ``True``
        outside the activation window.

        r\   r.   r   r   Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   r   r9   r   r>   s      r*   test_expired_accountz+RegistrationModelTests.test_expired_account  s     J4,,44II ?))+?/3~~? 2 211A5!7 	7++3377X7F6689r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |t                      | j                  |j                  |j                         | j                  |j                         | j                  |       | j                   j                  j                  |      }| j                  |j                         y
        Activating a user within the permitted window makes the
        account active, and resets the activation key.

        r\   r   Nr/   )r3   r0   rj   r   rG   r2   r   r   r<   assertIsInstancer   r5   r8   r9   rn   	activatedr)   r?   r@   r7   r   s        r*   test_valid_activationz,RegistrationModelTests.test_valid_activation  s    J4,,44II ?))+?/3~~?++3377X7F33;;II""DLL$<$<$>@i 	dIK0(++.'	"++3377X7F))*r,   c                      | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                         d      \  }}| j                  || j                          | j                  |j                  |j                         | j                  |j                         | j                  |       |j                          | j                  |j                  j                  |j                         | j                  |j                          yr   r\   r   T)get_profileNr/   )r3   r0   rj   r   rG   r2   r   r   r<   r   r5   r8   r9   r   r   r7   rn   r)   r?   r@   r   s       r*   "test_valid_activation_with_profilez9RegistrationModelTests.test_valid_activation_with_profile.  s+    J4,,44II ?))+?/3~~?++3377X7F!66>>LL""DLL$<$<$>D M R 	gt'@'@AWZZ0))*	"  "5**+r,   c                 d    | j                   j                  j                  d	dt        j                  j	                         i| j
                  }|xj                  t        j                  t        j                  dz         z  c_        |j                          | j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |d       | j!                  |       t#               j                  j                  d      }| j!                  |j$                         | j                   j                  j                  |      }| j!                  |j&                         y)
zm
        Attempting to activate outside the permitted window does not
        activate the account.

        r\   r.   r   r   Fr   r    Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   r   r   r<   assertIsrm   r   rn   r   r   s        r*   test_expired_activationz.RegistrationModelTests.test_expired_activationC  sQ    J4,,44II ?))+?/3~~? 2 211A5!7 	7++3377X7F33;;II""DLL$<$<$>@i 	dE"#;&&**G*<++,++3377X7F**+r,   c                     | j                   j                  j                  dt        j                  j	                               \  }}| j                  |d       | j                  |       y)z^
        Attempting to activate with a key which is not a SHA256 hash
        fails.

        fooFN)r3   r0   r   r   rG   r   rm   )r)   r7   r   s      r*   test_activation_invalid_keyz2RegistrationModelTests.test_activation_invalid_key\  sR     33;;II4<<++-/idE"#r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                | j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  ||       | j                  |       yzP
        Attempting to re-activate an already-activated account fails.

        r\   r   Nr/   )r3   r0   rj   r   rG   r2   r   r   r<   r5   rm   r   s        r*   !test_activation_already_activatedz8RegistrationModelTests.test_activation_already_activatedg  s   
 J4,,44II ?))+?/3~~?++3377X7F!!))77""DLL$<$<$>	@ ++3377X7F33;;II""DLL$<$<$>@ix(#r,   c                 r    | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                d|_	        |j                          | j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |       y)zH
        Attempting to re-activate a deactivated account fails.
        r\   r   FNr/   )r3   r0   rj   r   rG   r2   r   r   r<   rn   r   rm   r   s        r*   test_activation_deactivatedz2RegistrationModelTests.test_activation_deactivatedx  s     J4,,44II ?))+?/3~~?++3377X7F!!))77""DLL$<$<$>	@ # 33;;II""DLL$<$<$>@i#r,   c                    t        j                  dj                  d            j                         }| j                  j
                  j                  |t        j
                  j                               \  }}| j                  |       y)z|
        Attempting to activate with a non-existent key (i.e., one not
        associated with any account) fails.

        r   zlatin-1N)
hashlibsha256encode	hexdigestr3   r0   r   r   rG   rm   )r)   invalid_key_r   s       r*   test_activation_nonexistent_keyz6RegistrationModelTests.test_activation_nonexistent_key  sd     nnU\\)%<=GGI0088FF11359#r,   c                     | j                   j                  j                  d
dt        j                  j	                         i| j
                   | j                   j                  j                  t        j                  j	                         ddd      }|xj                  t        j                  t        j                  dz         z  c_        |j                          | j                   j                  j                         }| j                  |d       | j                  | j                   j                  j                         d       | j                  t!               j"                  t!               j                  j$                  d       y	)z
        ``RegistrationProfile.objects.delete_expired_users()`` only
        deletes inactive users whose activation window has expired.

        r\   bobsecretbob@example.comr\   r    r!   r"   r.   r   r   Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   delete_expired_usersr5   r6   r_   r   DoesNotExistr   r)   expired_userdeleted_counts      r*   ,test_expired_user_deletion_activation_windowzCRegistrationModelTests.test_expired_user_deletion_activation_window  s8    	?!!))>> 	?))+	?/3~~	?1199--!%!9!9!;%*%-"3	 . 5 	 	  H$6$611A5%7 	7 1199NNP*22::@@BAF)+22#+--11E 	 	Cr,   c                 j   | j                   j                  j                  t        j                  j	                         ddd      }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |       |xj                  t        j                  t        j                  dz         z  c_	        |j                          | j                   j                  j                         }| j!                  |d       | j!                  | j                   j                  j#                         d       | j!                  t%               j                  j                  d	      |       y
)z
        ``RegistrationProfile.objects.delete_expired_users()`` only
        deletes inactive users whose activation window has expired and if
        their profile is not activated.

        r   r   r   r   r   r.   r   r   r   N)r3   r0   rj   r   rG   r   r   r<   r9   rq   r   r   r   r   r   r   r5   r6   r   )r)   r7   r@   r   r   r   s         r*   +test_expired_user_deletion_ignore_activatedzBRegistrationModelTests.test_expired_user_deletion_ignore_activated  sQ    ))11%%113"%+	 & - 	 ++3377T7B0088FF""DLL$<$<$>@9	"H..11A57 	7		1199NNP*22::@@BAF,,00%0@$Gr,   c                 \    | j                   j                  j                  ddt        j                  j	                         i| j
                   | j                   j                  j                  t        j                  j	                         ddd      }|xj                  t        j                  t        j                  dz         z  c_        |j                          t               j                  j                  d       | j                   j                  j                         }| j                  |d       | j                  | j                   j                  j!                         d       | j#                  t               j$                  t               j                  j&                  d	       y
)z
        ``RegistrationProfile.objects.delete_expired_users()`` only deletes
        inactive users whose activation window has expired. If a ``UserModel``
        is not present, the delete continues gracefully.

        r\   r   r   r   r   r.   r   z&DELETE FROM users WHERE username="bob"r   Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   r   rawr   r5   r6   r_   r   r   r   s      r*   'test_expired_user_deletion_missing_userz>RegistrationModelTests.test_expired_user_deletion_missing_user  sQ    	?!!))>> 	?))+	?/3~~	?1199--!%!9!9!;%*%-"3	 . 5 	 	  H$6$611A5%7 	7  	 HI1199NNP*22::@@BAF)+22#+--11E 	 	Cr,   c                 l   | j                   j                  j                  t        j                  j	                         ddd      }|xj
                  t        j                  t        j                  dz         z  c_        d|_
        |j                          | j                   j                  j                         }| j                  |d       | j                  | j                   j                  j                         d       | j                  t               j                  j!                  d	      |       y
)z
        Test if a user failed to go through the registration flow but was
        manually marked ``is_active`` in the DB.  Although the profile is
        expired and not active, we should never delete active users.
        r   r   r   r   r.   r   Tr   r   N)r3   r0   rj   r   rG   rq   r   r   r   r   rn   r   r   r5   r6   r   r   )r)   active_userr   s      r*    test_manually_registered_accountz7RegistrationModelTests.test_manually_registered_account  s     0088,, $ 8 8 :$)$,!2	 - 4 	 	8#5#511A5$7 	7 $1199NNP*22::@@BAF,,00%0@+Nr,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                   | j                   j                  j                  t        j                  j	                         ddd      }|xj                  t        j                  t        j                  dz         z  c_        |j                          t        j                  d       | j                  | j                   j                  j                         d       | j!                  t#               j$                  t#               j                  j&                  d	       y
)zl
        The ``cleanupregistration`` management command properly
        deletes expired accounts.

        r\   r   r   r   r   r.   r   cleanupregistrationr   Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   r   call_commandr5   r6   r_   r   r   r   )r)   r   s     r*   test_management_commandz.RegistrationModelTests.test_management_command  s    	?!!))>> 	?))+	?/3~~	?1199--4<<3K3K3M7<7?4E . G 	
 	  H$6$611A5%7 	7  5622::@@BAF)+22#+--11E 	 	Cr,   c                     | j                   j                  j                  d
t        j                  j	                         dd| j
                  }| j                  t        t        j                        d       | j                   j                  j                  |      }|j                  }| j                  | j                   j                  j                  | j
                  d   t        j                  j	                                      | j                   j                  j                  |j                        }|j                  }| j                  ||       | j                  t        t        j                        d       y	)zE
        Test resending activation email to an existing user
        Frx   r   r   r"   r"   r\   )pkr.   Nr/   )r3   r0   rj   r   rG   r2   r5   rH   r   rI   r   r<   r9   resend_activation_mailr   assertNotEqual)r)   r7   r@   orig_activation_keynew_activation_keys        r*   test_resend_activation_emailz3RegistrationModelTests.test_resend_activation_email  s0    Ft((00EE Q))+QAEQT[[)1-++3377T7B%441199PP..)))+ Q 
 	
 ++33777::7F$33/1CDT[[)1-r,   c                    | j                  | j                  j                  j                  | j                  d   t
        j                  j                                      | j                  t        t        j                        d       y)zG
        Test resending activation email to a nonexisting user
        r"   r   r   N)rm   r3   r0   r   r2   r   rG   r5   rH   r   rI   r(   s    r*   -test_resend_activation_email_nonexistent_userzDRegistrationModelTests.test_resend_activation_email_nonexistent_user*  sh     	22::QQ..)))+ R 
 	 	T[[)1-r,   c                     | j                   j                  j                  dt        j                  j	                         dd| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |j                         | j                  |       | j                  | j                   j                  j                  | j
                  d   t        j                  j	                                      | j                  t        t        j                         d       y)	|
        Test the scenario where user tries to resend activation code
        to the already activated user's email
        Frx   r   r"   r   r   Nr/   )r3   r0   rj   r   rG   r2   r   r   r<   r9   rn   rm   r   r5   rH   r   rI   )r)   r7   r@   r   s       r*   +test_resend_activation_email_activated_userzBRegistrationModelTests.test_resend_activation_email_activated_user4  s#   
 Ft((00EE Q))+QAEQ ++3377T7B33;;II""DLL$<$<$>@i'	"22::QQ..)))+ R 
 	 	T[[)1-r,   c                     | j                   j                  j                  d
t        j                  j	                         dd| j
                  }|xj                  t        j                  t        j                  dz         z  c_        |j                          | j                   j                  j                  |      }| j                  |j                                | j                  | j                   j                  j!                  | j
                  d   t        j                  j	                                      | j#                  t%        t&        j(                        d       y	)r
        Test the scenario where user tries to resend activation code
        to the expired user's email
        Frx   r.   r   r   r"   r   r   Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   r   r9   r   rm   r   r5   rH   r   rI   r>   s      r*   )test_resend_activation_email_expired_userz@RegistrationModelTests.test_resend_activation_email_expired_userH  s   
 J4,,44II Q))+QAEQ 2 211A5!7 	7++3377X7F668922::QQ..)))+ R 
 	 	T[[)1-r,   c                     | j                   j                  j                  d	t        j                  j	                         dd| j
                  }t        | j
                        }d|d<    | j                   j                  j                  d	t        j                  j	                         dd|}| j                  |j                  |j                         | j                  | j                   j                  j                  | j
                  d   t        j                  j	                                      | j                  t        t        j                        d       y)
r   Frx   r   r    r"   r   r   Nr/   )r3   r0   rj   r   rG   r2   r   r5   r"   rm   r   rH   r   rI   )r)   user1
user2_infouser2s       r*   ,test_resend_activation_email_nonunique_emailzCRegistrationModelTests.test_resend_activation_email_nonunique_email\  s   
 G))11FF Q))+QAEQ$..)
!&
:F))11FF M))+MAKMekk222::QQ..)))+ R 
 	 	T[[)1-r,   c                 \   | j                   j                  }dd}|| j                   _         | j                   j                  j                  ddt        j                  j                         i| j                  }| j                   j                  j                  |      }|| j                   _        | j                   j                  j                  |j                  t        j                  j                               \  }}| j                  |t                      | j                  |j                  |j                         | j                  |j                         | j                  |       | j                   j                  j                  |      }| j                  |j                          y)|
        Make sure that users created with the old create_new_activation_key
        method can still be activated.
        c                    t        j                  t        t        j                               j	                  d            j                         d d }|j	                  d      }t        | j                  j                        }t        |t              r|j	                         }t        j                  ||z         j                         | _	        |r| j                          | j                  S Nascii   r   sha1r=   randomr   r   r7   r   
isinstancer<   r   r)   r   saltuser_pks       r*   
old_methodzVRegistrationModelTests.test_activation_key_backwards_compatibility.<locals>.old_methodu      <<FMMO$++G4ik"1D ;;w'D$)),,'G'3'!..*"),,tg~">"H"H"JD		&&&r,   r\   r   NTr/   r3   create_new_activation_keyr0   rj   r   rG   r2   r   r   r<   r   r   r5   r8   r9   rn   r   r)   current_methodr   r?   r@   r7   r   s          r*   +test_activation_key_backwards_compatibilityzBRegistrationModelTests.test_activation_key_backwards_compatibilityn  sI   
 22LL	' ?I!!;I4,,44II ?))+?/3~~?++3377X7F>L!!;33;;II""DLL$<$<$>@i 	dIK0(++.'	"++3377X7F))*r,   c                 \   | j                   j                  }dd}|| j                   _         | j                   j                  j                  ddt        j                  j                         i| j                  }| j                   j                  j                  |      }|| j                   _        | j                   j                  j                  |j                  t        j                  j                               \  }}| j                  |t                      | j                  |j                  |j                         | j                  |j                         | j                  |       | j                   j                  j                  |      }| j                  |j                          y)r   c                     t        dt        j                        }t        j                  |j                               j                         | _        |r| j                          | j                  S N    )lengthallowed_chars	r   string	printabler   r   r   r   r<   r   r)   r   random_strings      r*   r   z[RegistrationModelTests.test_activation_key_backwards_compatibility_sha1.<locals>.old_method  O    -RvGWGWXM"),,}/C/C/E"F"P"P"RD		&&&r,   r\   r   Nr   r/   r   r   s          r*   0test_activation_key_backwards_compatibility_sha1zGRegistrationModelTests.test_activation_key_backwards_compatibility_sha1  sI   
 22LL	' ?I!!;I4,,44II ?))+?/3~~?++3377X7F>L!!;33;;II""DLL$<$<$>@i 	dIK0(++.'	"++3377X7F))*r,   ).__name__
__module____qualname____doc__r2   r   r3   r+   rA   rK   r   rN   rR   rU   r]   r`   rd   rg   rs   rv   rz   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   r/   r,   r*   r   r      sZ   
 %(-/I /5? 
G -=>
G ?
G	N t<	H =	H 44;=@=@ 48	F 9	F
> u5
> 6
>B$.	.>;	;::":+(,*,2	$$"$&$C0H6C:O,C,.,..(.(.$$+L+r,   r   ))zT-Rexzadmin1@iamtrex.com)Fleazadmin2@iamaflea.com)ADMINSc                   B   e Zd ZdZddddZeZd Zd Zd Z	d	 Z
d
 Z ed      d        Zd Z ed      d        Zd Zd Zd Zd Z ed      d        Zd Z ed      d        Zd Zd Zd Zd Zd Zd Zd Z ed d !      d"        Z ed #      d$        Zy)% SupervisedRegistrationModelTestszI
    Test the model and manager used in the admin_approval backend.

    r   r   r   r   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |t                      | j                  |j                  |j                         | j                  |j                         | j                  |       | j                   j                  j                  |      }| j                  |j                          yr   )r3   r0   rj   r   rG   r2   r   r   r<   r   r   r5   r8   rm   rn   r9   r   r   s        r*   r   z6SupervisedRegistrationModelTests.test_valid_activation  s    J4,,44II ?))+?/3~~?++3377X7F33;;II""DLL$<$<$>@i 	dIK0(++.(	"++3377X7F))*r,   c                      | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                         d      \  }}| j                  || j                          | j                  |j                  |j                         | j                  |j                         | j                  |       |j                          | j                  |j                  j                  |j                         | j!                  |j"                         yr   )r3   r0   rj   r   rG   r2   r   r   r<   r   r5   r8   r9   r   r   r7   rm   rn   r   s       r*   r   zCSupervisedRegistrationModelTests.test_valid_activation_with_profile  s-    J4,,44II ?))+?/3~~?++3377X7F!66>>LL""DLL$<$<$>D M R 	gt'@'@AWZZ0))*	"  "5++,r,   c                     | j                   j                  j                  d	t        j                  j	                         dd| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |j                         | j                  |       | j                  | j                   j                  j                  | j
                  d   t        j                  j	                                      | j                  t        t        j                         d       t"        j$                  D cg c]  }|d   	 }}t        j                   d   j&                  D ]  }| j)                  ||        yc c}w )
r   Frx   r   r"   r   r.   r   Nr/   )r3   r0   rj   r   rG   r2   r   r   r<   rm   rn   r9   r   r5   rH   r   rI   r   REGISTRATION_ADMINSrJ   assertIn)r)   r7   r@   r   valueadmins_emailsr"   s          r*   r   zLSupervisedRegistrationModelTests.test_resend_activation_email_activated_user  ss   
 Ft((00EE Q))+QAEQ ++3377T7B33;;II""DLL$<$<$>@i(	"22::QQ..)))+ R 
 	 	T[[)1-/7/K/KLeqLL[[^&& 	0EMM%/	0 Ms   Gc                 @    t               j                  j                  di | j                  }| j                  j                  j                  |      }d|_        | j                  j                  j                  |t        j                  j                                | j                  t        t        j                        d       t        j                  D cg c]  }|d   	 }}t        j                  d   j                   D ]  }| j#                  ||        yc c}w )z
        ``SupervisedRegistrationManager.send_admin_approve_email`` sends an
        email to the site administrators

        Tr.   r   Nr/   )r   r0   r1   r2   r3   r4   r   send_admin_approve_emailr   rG   r5   rH   r   rI   r   r
  rJ   r  )r)   r?   r@   r  r  r"   s         r*   test_admin_approval_emailz:SupervisedRegistrationModelTests.test_admin_approval_email	  s     39;&&22DT^^D++33BB8L !!))BBdll..0	2T[[)1-/7/K/KLeqLL[[^&& 	0EMM%/	0 Ms   Dc                     t               j                  j                  di | j                  }| j                  j                  j                  |      }d|_        | j                  j                  j                  |t        j                  j                                | j                  t        j                  d   j                  d       y)zf
        ``SupervisedRegistrationManager.send_admin_approve_email``` sends an
        email.

        Tr   r   Nr/   r   r0   r1   r2   r3   r4   r   r  r   rG   r5   r   rI   rQ   r>   s      r*   >test_admin_approval_email_uses_registration_default_from_emailz_SupervisedRegistrationModelTests.test_admin_approval_email_uses_registration_default_from_email  s     39;&&22DT^^D++33BB8L !!))BBdll..0	2Q224LMr,   NrS   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }d|_        | j                  j                  j                  |t        j                  j                                | j                  t        j                  d   j                  d       y)ze
        ``SupervisedRegistrationManager.send_admin_approve_email`` sends an
        email.

        Tr   r   Nr/   r  r>   s      r*   Atest_admin_approval_email_falls_back_to_django_default_from_emailzbSupervisedRegistrationModelTests.test_admin_approval_email_falls_back_to_django_default_from_email&  s     39;&&22DT^^D++33BB8L !!))BBdll..0	2Q224FGr,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }d|_        | j                  j                  j                  |t        j                  j                                | j                  t        t        j                  d   j                        d       y)zr
        ``SupervisedRegistrationProfile.send_activation_email`` sends an html
        email by default.

        Tr   r.   Nr/   r   r0   r1   r2   r3   r4   r   r  r   rG   r5   rH   r   rI   rc   r>   s      r*   ,test_admin_approval_email_is_html_by_defaultzMSupervisedRegistrationModelTests.test_admin_approval_email_is_html_by_default4  s     39;&&22DT^^D++33BB8L !!))BBdll..0	2 	T[[^8891=r,   Fre   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }d|_        | j                  j                  j                  |t        j                  j                                | j                  t        t        j                  d   j                        d       y)z
        ``SupervisedRegistrationProfile.send_activation_email`` sends a plain
        text email if settings.REGISTRATION_EMAIL_HTML is False.

        Tr   Nr/   r  r>   s      r*   8test_admin_approval_email_is_plain_text_if_html_disabledzYSupervisedRegistrationModelTests.test_admin_approval_email_is_plain_text_if_html_disabledB  s     39;&&22DT^^D++33BB8L !!))BBdll..0	2 	T[[^8891=r,   c                 z    | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                | j                   j                  j                  |j                  t        j                  j	                                |j                          | j                  |j                                y)z
        ``SupervisedRegistrationProfile.activation_key_expired()`` is ``True``
        when the account is already active.

        r\   r   Nr/   )r3   r0   rj   r   rG   r2   r   r   r<   admin_approve_userr8   r   r9   r   r>   s      r*   r   zKSupervisedRegistrationModelTests.test_active_account_activation_key_expiredQ  s     J4,,44II ?))+?/3~~?++3377X7F!!))77""DLL$<$<$>	@!!))<<JJ002	4!6689r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }|xj                  t        j                  t        j                  dz         z  c_        |j                          | j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                | j                   j                  j                  |j                   t        j                  j	                                |j#                          | j%                  |j'                                y)z
        ``SupervisedRegistrationProfile.activation_key_expired()`` is ``True``
        when the account is already active and the activation window has passed.

        r\   r.   r   r   Nr/   )r3   r0   rj   r   rG   r2   rq   r   r   r   r   r   r   r   r<   r  r8   r   r9   r   r>   s      r*   r   z^SupervisedRegistrationModelTests.test_active_account_and_expired_accountactivation_key_expireda  s    J4,,44II ?))+?/3~~? 2 211A5!7 	7++3377X7F!!))77""DLL$<$<$>	@!!))<<JJ002	4!6689r,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        j                  d   j                  | j                  d   g       y)z
        ``SupervisedRegistrationManager.send_admin_approve_complete_email``
        sends an email to the approved user

        r.   r   r"   Nr/   )r   r0   r1   r2   r3   r4   !send_admin_approve_complete_emailr   rG   r5   rH   r   rI   rJ   r>   s      r*   "test_admin_approval_complete_emailzCSupervisedRegistrationModelTests.test_admin_approval_complete_emailt  s     39;&&22DT^^D++33BB8L11$,,2J2J2LMT[[)1-Q**T^^G-D,EFr,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        j                  d   j                  d       y)m
        ``SupervisedRegistrationManager.send_admin_approve_complete_email``
        sends an email

        r.   r   r   Nr/   r   r0   r1   r2   r3   r4   r  r   rG   r5   rH   r   rI   rQ   r>   s      r*   Gtest_admin_approval_complete_email_uses_registration_default_from_emailzhSupervisedRegistrationModelTests.test_admin_approval_complete_email_uses_registration_default_from_email  s     39;&&22DT^^D++33BB8L11$,,2J2J2LMT[[)1-Q224LMr,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        j                  d   j                  d       y)r"  r.   r   r   Nr/   r#  r>   s      r*   Jtest_admin_approval_complete_email_falls_back_to_django_default_from_emailzkSupervisedRegistrationModelTests.test_admin_approval_complete_email_falls_back_to_django_default_from_email  s     39;&&22DT^^D++33BB8L11$,,2J2J2LMT[[)1-Q224FGr,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        t        j                  d   j                        d       y)z~
        ``SupervisedRegistrationProfile.send_admin_approve_complete_email``
        sends an html email by default.

        r.   r   Nr/   r   r0   r1   r2   r3   r4   r  r   rG   r5   rH   r   rI   rc   r>   s      r*   5test_admin_approval_complete_email_is_html_by_defaultzVSupervisedRegistrationModelTests.test_admin_approval_complete_email_is_html_by_default  s     39;&&22DT^^D++33BB8L11$,,2J2J2LMT[[)1-T[[^8891=r,   c                     t               j                  j                  di | j                  }| j                  j                  j                  |      }|j                  t        j                  j                                | j                  t        t        j                        d       | j                  t        t        j                  d   j                        d       y)z
        ``SupervisedRegistrationProfile.send_admin_approve_complete_email``
        sends a plain text email if settings.REGISTRATION_EMAIL_HTML is False.

        r.   r   Nr/   r(  r>   s      r*   Atest_admin_approval_complete_email_is_plain_text_if_html_disabledzbSupervisedRegistrationModelTests.test_admin_approval_complete_email_is_plain_text_if_html_disabled  s     39;&&22DT^^D++33BB8L11$,,2J2J2LMT[[)1-T[[^8891=r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |t                      | j                   j                  j                  |j                  t        j                  j	                               }| j                  |t                      | j                  |j                  d       y)z]
        Approving an already activated user's account makes the user
        active
        r\   r   TNr/   )r3   r0   rj   r   rG   r2   r   r   r<   r   r   r  r8   r   rn   r   s        r*   test_valid_admin_approvalz:SupervisedRegistrationModelTests.test_valid_admin_approval  s    J4,,44II ?))+?/3~~?++3377X7F33;;II""DLL$<$<$>@i 	dIK0((00CCJJ0024dIK0dnnd+r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               }| j                  |d       | j                  |j                  j                  d       y)z@
        Approving a non activated user's account fails
        r\   r   FNr/   )r3   r0   rj   r   rG   r2   r   r  r8   r   r7   rn   r)   r?   r@   r7   s       r*   !test_admin_approval_not_activatedzBSupervisedRegistrationModelTests.test_admin_approval_not_activated  s     J4,,44II ?))+?/3~~?++3377X7F((00CCJJ0024dE"gll,,e4r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |t                      | j                  |       | j                   j                  j                  |j                  t        j                  j	                               }| j                  |t                      | j                  |j                  d       y)zU
        Approving an already approved user's account returns the User model
        r\   r   TNr/   )r3   r0   rj   r   rG   r2   r   r   r<   r   r   r9   r  r8   r   rn   r   s        r*   $test_admin_approval_already_approvedzESupervisedRegistrationModelTests.test_admin_approval_already_approved  s    J4,,44II ?))+?/3~~?++3377X7F33;;II""DLL$<$<$>@i 	dIK0	"((00CCJJ0024dIK0dnnd+r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               }| j                  |d       y)V
        Approving a non existent user profile does nothing and returns False
        r\   r   FNr/   )
r3   r0   rj   r   rG   r2   r   r  r8   r   r/  s       r*   "test_admin_approval_nonexistent_idzCSupervisedRegistrationModelTests.test_admin_approval_nonexistent_id  s     J4,,44II ?))+?/3~~?++3377X7F((00CCJJ0024dE"r,   c                     | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                                | j                   j                  j                  |      }| j                   j                  j                  |j                  t        j                  j	                               \  }}| j                  |       yr   )
r3   r0   rj   r   rG   r2   r   r   r<   rm   )r)   r?   r@   r   r   s        r*   r   zBSupervisedRegistrationModelTests.test_activation_already_activated  s    
 J4,,44II ?))+?/3~~?++3377X7F!!))77""DLL$<$<$>	@ ++3377X7F0088FF""DLL$<$<$>@9#r,   c                 \   | j                   j                  }dd}|| j                   _         | j                   j                  j                  ddt        j                  j                         i| j                  }| j                   j                  j                  |      }|| j                   _        | j                   j                  j                  |j                  t        j                  j                               \  }}| j                  |t                      | j                  |j                  |j                         | j                  |j                         | j!                  |       | j                   j                  j                  |      }| j!                  |j"                         y)r   c                    t        j                  t        t        j                               j	                  d            j                         d d }|j	                  d      }t        | j                  j                        }t        |t              r|j	                         }t        j                  ||z         j                         | _	        |r| j                          | j                  S r   r   r   s       r*   r   z`SupervisedRegistrationModelTests.test_activation_key_backwards_compatibility.<locals>.old_method  r   r,   r\   r   Nr   r/   r3   r   r0   rj   r   rG   r2   r   r   r<   r   r   r5   r8   rm   rn   r9   r   r   s          r*   r   zLSupervisedRegistrationModelTests.test_activation_key_backwards_compatibility  sK   
 22LL	' ?I!!;I4,,44II ?))+?/3~~?++3377X7F>L!!;33;;II""DLL$<$<$>@i 	dIK0(++.(	"++3377X7F))*r,   c                 \   | j                   j                  }dd}|| j                   _         | j                   j                  j                  ddt        j                  j                         i| j                  }| j                   j                  j                  |      }|| j                   _        | j                   j                  j                  |j                  t        j                  j                               \  }}| j                  |t                      | j                  |j                  |j                         | j                  |j                         | j!                  |       | j                   j                  j                  |      }| j!                  |j"                         y)r   c                     t        dt        j                        }t        j                  |j                               j                         | _        |r| j                          | j                  S r   r   r   s      r*   r   zeSupervisedRegistrationModelTests.test_activation_key_backwards_compatibility_sha1.<locals>.old_method.  r   r,   r\   r   Nr   r/   r9  r   s          r*   r   zQSupervisedRegistrationModelTests.test_activation_key_backwards_compatibility_sha1'  sK   
 22LL	' ?I!!;I4,,44II ?))+?/3~~?++3377X7F>L!!;33;;II""DLL$<$<$>@i 	dIK0(++.(	"++3377X7F))*r,   r/   )r  r
  c                 x    | j                   j                  j                  ddt        j                  j	                         i| j
                  }| j                  t              5  | j                   j                  j                  |t        j                  j	                                ddd       y# 1 sw Y   yxY w)r4  r\   Nr/   )	r3   r0   rj   r   rG   r2   r_   r	   r  )r)   r?   s     r*   test_no_admins_registeredz:SupervisedRegistrationModelTests.test_no_admins_registeredG  s    
 J4,,44II ?))+?/3~~? 34 	6%%--FF$,,2246	6 	6 	6s   $AB00B9)r
  c                     | j                   j                  j                  d	dt        j                  j	                         i| j
                  }t        j                  d      5 }| j                   j                  j                  |t        j                  j	                                d}| j                  t        |      dkD  |       | j                  dt        |d   j                        v |       ddd       y# 1 sw Y   yxY w)
r4  r\   T)recordzFNo warning triggered for unregistered
             REGISTRATION_ADMINSr   r
  Nr/   )r3   r0   rj   r   rG   r2   r%   catch_warningsr  r9   rH   r=   message)r)   r?   _warningassertion_errors       r*   &test_no_registration_admins_registeredzGSupervisedRegistrationModelTests.test_no_registration_admins_registeredS  s    
 J4,,44II ?))+?/3~~? $$D1 	-X%%--FF$,,2246$OOOCMA-?OO1S"9M9M5NN+-	- 	- 	-s   %BC;;D) r   r   r  r  r2   r   r3   r   r   r   r  r  r   r  r  r  r   r   r   r$  r&  r)  r+  r-  r0  r2  r5  r   r   r   r=  rE  r/   r,   r*   r  r    s   
 %(-/I 9+(-*020 N t<H =H> u5> 6>: :&
G
N t<
H =
H
> u5> 6>,&5,$
#$ $+L+@ bb9	6 :	6 2.- /-r,   r  )"r   r   r   r:   r   r%   r   r   django.appsr   django.confr   django.corer   r   django.core.exceptionsr	   django.testr
   r   django.utils.cryptor   django.utils.timezoner   ro   registration.modelsr   r   registration.usersr   	get_modelr   r   r  r/   r,   r*   <module>rP     s       	         " 7 + ) 1 5 3 = (t~~gv& 13K+/&8:S
+0 S
+	:S
+l h-'= h-h-r,   