121 lines
4.7 KiB
Python
121 lines
4.7 KiB
Python
from django.test import TestCase
|
|
from django.contrib.auth import get_user_model
|
|
from django.db import IntegrityError
|
|
from django.conf import settings
|
|
import uuid
|
|
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class UserModelTests(TestCase):
|
|
|
|
def setUp(self):
|
|
self.user_data = {
|
|
'email_address': 'Test@Example.com',
|
|
'first_name': 'Test',
|
|
'last_name': 'User',
|
|
'date_of_birth': '1990-01-01',
|
|
}
|
|
|
|
def test_create_user_and_properties(self):
|
|
user = User.objects.create_user(password='pass1234', **self.user_data)
|
|
self.assertIsNotNone(user.pk)
|
|
self.assertEqual(user.email_address, 'Test@example.com')
|
|
self.assertEqual(user.full_name, 'Test User')
|
|
|
|
def test_create_superuser(self):
|
|
su = User.objects.create_superuser(password='adminpass', **self.user_data)
|
|
self.assertTrue(su.is_staff)
|
|
self.assertIsNotNone(su.pk)
|
|
self.assertTrue(su.is_active)
|
|
|
|
def test_password_hashed_and_check(self):
|
|
user = User.objects.create_user(email_address='hashme@example.com', password='secret123')
|
|
self.assertNotEqual(user.password, 'secret123')
|
|
self.assertTrue(user.check_password('secret123'))
|
|
|
|
def test_uuid_and_id_auto_populated(self):
|
|
u1 = User.objects.create_user(email_address='one@example.com', password='p')
|
|
u2 = User.objects.create_user(email_address='two@example.com', password='p')
|
|
self.assertIsNotNone(u1.uuid)
|
|
self.assertIsInstance(u1.uuid, uuid.UUID)
|
|
self.assertNotEqual(u1.uuid, u2.uuid)
|
|
self.assertIsNotNone(u1.id)
|
|
self.assertIsNotNone(u2.id)
|
|
|
|
def test_default_fields(self):
|
|
u = User.objects.create_user(email_address='defaults@example.com', password='p')
|
|
self.assertEqual(u.bio, "")
|
|
self.assertEqual(u.timezone, settings.TIME_ZONE)
|
|
self.assertEqual(u.avatar_url, "")
|
|
self.assertTrue(u.is_active)
|
|
self.assertFalse(u.is_staff)
|
|
|
|
def test_unique_email_constraint(self):
|
|
User.objects.create_user(email_address='dup@example.com', password='p')
|
|
with self.assertRaises(IntegrityError):
|
|
User.objects.create_user(email_address='dup@example.com', password='p')
|
|
|
|
def test_create_user_without_email_raises(self):
|
|
with self.assertRaises(ValueError):
|
|
User.objects.create_user(email_address='', password='p')
|
|
|
|
def test_date_of_birth_optional(self):
|
|
u = User.objects.create_user(email_address='nodob@example.com', password='p')
|
|
self.assertIsNone(u.date_of_birth)
|
|
|
|
def test_str_and_full_name(self):
|
|
u = User.objects.create_user(
|
|
email_address='name@example.com',
|
|
password='p',
|
|
first_name='A',
|
|
last_name='B'
|
|
)
|
|
self.assertEqual(u.full_name, 'A B')
|
|
self.assertEqual(str(u), 'A B')
|
|
|
|
def test_email_normalization_domain_lowercase(self):
|
|
user1 = User.objects.create_user(email_address='Test@EXAMPLE.COM', password='p')
|
|
self.assertEqual(user1.email_address, 'Test@example.com')
|
|
user2 = User.objects.create_user(email_address='test@EXAMPLE.COM', password='p2')
|
|
self.assertEqual(user2.email_address, 'test@example.com')
|
|
self.assertNotEqual(user1.email_address, user2.email_address)
|
|
|
|
def test_superuser_must_have_is_staff(self):
|
|
with self.assertRaises(ValueError):
|
|
User.objects.create_superuser(
|
|
email_address='fail@example.com',
|
|
password='p',
|
|
is_staff=False
|
|
)
|
|
|
|
def test_role_default_is_employee(self):
|
|
u = User.objects.create_user(email_address='role@example.com', password='p')
|
|
self.assertFalse(getattr(u, 'is_manager', False))
|
|
|
|
def test_role_choices(self):
|
|
u = User.objects.create_user(
|
|
email_address='manager@example.com',
|
|
password='p',
|
|
is_manager=True
|
|
)
|
|
self.assertTrue(u.is_manager)
|
|
|
|
def test_timestamps_auto_set(self):
|
|
from datetime import timedelta
|
|
u = User.objects.create_user(email_address='timestamps@example.com', password='p')
|
|
self.assertIsNotNone(u.created_at)
|
|
self.assertIsNotNone(u.updated_at)
|
|
time_diff = abs((u.updated_at - u.created_at).total_seconds())
|
|
self.assertLess(time_diff, 1.0)
|
|
|
|
def test_has_perm_returns_true(self):
|
|
u = User.objects.create_user(email_address='perm@example.com', password='p')
|
|
self.assertTrue(u.has_perm('any.permission'))
|
|
self.assertTrue(u.has_perm('another.permission', obj=None))
|
|
|
|
def test_has_module_perms_returns_true(self):
|
|
u = User.objects.create_user(email_address='modperm@example.com', password='p')
|
|
self.assertTrue(u.has_module_perms('auth'))
|
|
self.assertTrue(u.has_module_perms('users'))
|