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)