108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
from django.test import TestCase
|
|
from django.contrib.auth import get_user_model
|
|
from rest_framework.test import APIClient
|
|
from rest_framework import status
|
|
from django.conf import settings
|
|
from django.db import IntegrityError
|
|
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)
|
|
# email should be normalized by the manager (domain lowercased)
|
|
self.assertEqual(user.email_address.lower(), 'test@example.com')
|
|
# full_name property
|
|
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.assertTrue(su.pk)
|
|
|
|
|
|
class UserAPITests(TestCase):
|
|
def setUp(self):
|
|
self.client = APIClient()
|
|
self.user = User.objects.create_user(
|
|
password='pass1234',
|
|
email_address='apiuser@example.com',
|
|
first_name='API',
|
|
last_name='User',
|
|
date_of_birth='1995-05-05',
|
|
)
|
|
|
|
def test_list_users(self):
|
|
url = '/api/users/'
|
|
resp = self.client.get(url)
|
|
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
|
emails = [u.get('email_address') for u in resp.json()]
|
|
self.assertIn(self.user.email_address, emails)
|
|
|
|
def test_api_response_contains_expected_fields(self):
|
|
url = '/api/users/'
|
|
resp = self.client.get(url)
|
|
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
|
data = resp.json()
|
|
self.assertTrue(len(data) >= 1)
|
|
sample = data[0]
|
|
expected_keys = {'id', 'uuid', 'email_address', 'first_name', 'last_name', 'bio', 'timezone', 'avatar_url'}
|
|
self.assertTrue(expected_keys.issubset(set(sample.keys())))
|
|
|
|
|
|
class UserModelExtraTests(TestCase):
|
|
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, "")
|
|
|
|
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_create_superuser_defaults(self):
|
|
su = User.objects.create_superuser(email_address='admin@example.com', password='admin')
|
|
self.assertTrue(su.is_staff)
|
|
self.assertTrue(su.is_active)
|
|
|