Commits

James Bennett committed 8ca23d5

Add tests for the functionality in RegistrationProfile.

Comments (0)

Files changed (2)

registration/tests/__init__.py

 from registration.tests.backends import *
 from registration.tests.forms import *
+from registration.tests.models import *
 from registration.tests.views import *

registration/tests/models.py

+import datetime
+import re
+
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core import mail
+from django.core import management
+from django.test import TestCase
+
+from registration.models import RegistrationProfile
+
+
+class RegistrationModelTests(TestCase):
+    """
+    Test the model and manager used in the default backend.
+    
+    """
+    user_info = {'username': 'alice',
+                 'password': 'swordfish',
+                 'email': 'alice@example.com'}
+    
+    def setUp(self):
+        self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None)
+        settings.ACCOUNT_ACTIVATION_DAYS = 7
+
+    def tearDown(self):
+        settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation
+
+    def test_profile_creation(self):
+        """
+        Creating a registration profile for a user populates the
+        profile with the correct user and a SHA1 hash to use as
+        activation key.
+        
+        """
+        new_user = User.objects.create_user(**self.user_info)
+        profile = RegistrationProfile.objects.create_profile(new_user)
+
+        self.assertEqual(RegistrationProfile.objects.count(), 1)
+        self.assertEqual(profile.user.id, new_user.id)
+        self.failUnless(re.match('^[a-f0-9]{40}$', profile.activation_key))
+
+    def test_activation_email(self):
+        """
+        ``RegistrationProfile.objects.send_activation_email`` sends an
+        email.
+        
+        """
+        new_user = User.objects.create_user(**self.user_info)
+        profile = RegistrationProfile.objects.create_profile(new_user)
+        RegistrationProfile.objects.send_activation_email(profile,
+                                                          Site.objects.get_current())
+        self.assertEqual(len(mail.outbox), 1)
+
+    def test_user_creation(self):
+        """
+        Creating a new user populates the correct data, and sets the
+        user's account inactive.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        self.assertEqual(new_user.username, 'alice')
+        self.assertEqual(new_user.email, 'alice@example.com')
+        self.failUnless(new_user.check_password('swordfish'))
+        self.failIf(new_user.is_active)
+
+    def test_user_creation_email(self):
+        """
+        By default, creating a new user sends an activation email.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        self.assertEqual(len(mail.outbox), 1)
+
+    def test_unexpired_account(self):
+        """
+        ``RegistrationProfile.activation_key_expired()`` is ``False``
+        within the activation window.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        profile = RegistrationProfile.objects.get(user=new_user)
+        self.failIf(profile.activation_key_expired())
+
+    def test_expired_account(self):
+        """
+        ``RegistrationProfile.activation_key_expired()`` is ``True``
+        outside the activation window.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
+        new_user.save()
+        profile = RegistrationProfile.objects.get(user=new_user)
+        self.failUnless(profile.activation_key_expired())
+
+    def test_valid_activation(self):
+        """
+        Activating a user within the permitted window makes the
+        account active, and resets the activation key.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        profile = RegistrationProfile.objects.get(user=new_user)
+        activated = RegistrationProfile.objects.activate_user(profile.activation_key)
+
+        self.failUnless(isinstance(activated, User))
+        self.assertEqual(activated.id, new_user.id)
+        self.failUnless(activated.is_active)
+
+        profile = RegistrationProfile.objects.get(user=new_user)
+        self.assertEqual(profile.activation_key, RegistrationProfile.ACTIVATED)
+
+    def test_invalid_activation(self):
+        """
+        Attempting to activate outside the permitted window does not
+        activate the account.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
+        new_user.save()
+
+        profile = RegistrationProfile.objects.get(user=new_user)
+        activated = RegistrationProfile.objects.activate_user(profile.activation_key)
+
+        self.failIf(isinstance(activated, User))
+        self.failIf(activated)
+
+        new_user = User.objects.get(username='alice')
+        self.failIf(new_user.is_active)
+
+        profile = RegistrationProfile.objects.get(user=new_user)
+        self.assertNotEqual(profile.activation_key, RegistrationProfile.ACTIVATED)
+
+    def test_expired_user_deletion(self):
+        """
+        ``RegistrationProfile.objects.delete_expired_users()`` only
+        deletes inactive users whose activation window has expired.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        expired_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                        username='bob',
+                                                                        password='secret',
+                                                                        email='bob@example.com')
+        expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
+        expired_user.save()
+
+        RegistrationProfile.objects.delete_expired_users()
+        self.assertEqual(RegistrationProfile.objects.count(), 1)
+        self.assertRaises(User.DoesNotExist, User.objects.get, username='bob')
+
+    def test_management_command(self):
+        """
+        The ``cleanupregistration`` management command properly
+        deletes expired accounts.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                    **self.user_info)
+        expired_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
+                                                                        username='bob',
+                                                                        password='secret',
+                                                                        email='bob@example.com')
+        expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
+        expired_user.save()
+
+        management.call_command('cleanupregistration')
+        self.assertEqual(RegistrationProfile.objects.count(), 1)
+        self.assertRaises(User.DoesNotExist, User.objects.get, username='bob')