from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.test import TestCase from members.models import Member User = get_user_model() class MembersTestCase(TestCase): def setUp(self): self.user_a = User.objects.create(username="user_a", first_name="User", last_name="A", email="user_a@test.com") def testMemberName(self): self.assertEqual(str(self.user_a.member), "User A") def testMemberCreation(self): self.assertTrue(hasattr(self.user_a, "member")) def testMemberManager(self): self.assertFalse(self.user_a.has_perm("members.member_manager")) self.assertFalse(self.user_a.has_perm("members.add_member")) self.assertFalse(self.user_a.is_superuser) member_manager_permission = Permission.objects.get(codename="member_manager") self.user_a.user_permissions.add(member_manager_permission) self.user_a = User.objects.get(pk=self.user_a.pk) self.assertTrue(self.user_a.has_perm("members.member_manager")) self.assertTrue(self.user_a.has_perm("members.add_member")) self.assertFalse(self.user_a.is_superuser) class MemberCreateTest(TestCase): def test_create_new_member(self): member = Member.create(first_name="Alice", last_name="Smith", email="alice@test.com") self.assertIsNotNone(member.pk) self.assertEqual(member.user.first_name, "Alice") self.assertEqual(member.user.last_name, "Smith") self.assertEqual(member.user.email, "alice@test.com") def test_create_sets_initial_password_note(self): member = Member.create(first_name="Alice", last_name="Smith", email="alice@test.com") self.assertIn("Initial password:", member.notes) def test_create_with_explicit_password(self): member = Member.create(first_name="Alice", last_name="Smith", email="alice@test.com", password="secret123") self.assertTrue(member.user.check_password("secret123")) self.assertIsNone(member.notes) def test_create_existing_user_reuses_member(self): existing_user = User.objects.create(username="bob@test.com", email="bob@test.com", first_name="Bob", last_name="Old") original_member_pk = existing_user.member.pk member = Member.create(first_name="Bob", last_name="New", email="bob@test.com") self.assertEqual(member.pk, original_member_pk) self.assertEqual(member.user.last_name, "New") def test_create_update_existing_member(self): existing_member = Member.create(first_name="Carol", last_name="Old", email="carol@test.com") updated_member = Member.create(first_name="Carol", last_name="Updated", email="carol@test.com", member=existing_member) self.assertEqual(updated_member.pk, existing_member.pk) self.assertEqual(updated_member.user.last_name, "Updated") def test_create_update_existing_member_with_password(self): existing_member = Member.create(first_name="Dave", last_name="D", email="dave@test.com") Member.create(first_name="Dave", last_name="D", email="dave@test.com", password="newpass", member=existing_member) existing_member.user.refresh_from_db() self.assertTrue(existing_member.user.check_password("newpass")) def test_create_reactivates_inactive_user(self): member = Member.create(first_name="Eve", last_name="E", email="eve@test.com") member.user.is_active = False member.user.save() reactivated = Member.create(first_name="Eve", last_name="E", email="eve@test.com", member=member) self.assertTrue(reactivated.user.is_active) def test_create_member_is_active_by_default(self): member = Member.create(first_name="Frank", last_name="F", email="frank@test.com") self.assertTrue(member.user.is_active) class MemberManagerTest(TestCase): def test_queryset_select_related(self): User.objects.create(username="user_mgr", first_name="Mgr", last_name="Test", email="mgr@test.com") # select_related means no extra query is needed to access member.user with self.assertNumQueries(1): members = list(Member.objects.all()) _ = [m.user.get_full_name() for m in members]