Dynavera/apps/users/tests.py

109 lines
4.1 KiB
Python
Raw Normal View History

from django.test import TestCase
2025-11-19 12:55:15 +00:00
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
2025-11-19 12:55:15 +00:00
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)
2025-11-19 12:55:15 +00:00
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)