from django.test import TestCase from django.utils import timezone from django.contrib.auth import get_user_model from datetime import timedelta from apps.orgs.models import Organization, OrganizationMembership, OrganizationInvitation, Role, RoleMembership User = get_user_model() class OrganizationModelTests(TestCase): def setUp(self): self.user = User.objects.create_user(email_address='u@example.com', password='pass') def test_create_organization_and_membership(self): org = Organization.objects.create(name='Acme', owner=self.user) self.assertEqual(org.owner, self.user) self.assertEqual(org.name, 'Acme') self.assertEqual(org.members.count(), 0) m = OrganizationMembership.objects.create(organization=org, user=self.user, is_manager=True) self.assertIn(self.user, org.members.all()) self.assertTrue(m.is_manager) def test_invitation_defaults_and_validation(self): org = Organization.objects.create(name='InvOrg', owner=self.user) invite = OrganizationInvitation.objects.create(organization=org, created_by=self.user) self.assertIsNotNone(invite.expires_at) self.assertTrue(invite.is_valid()) invite.used_by = self.user invite.save() self.assertFalse(invite.is_valid()) invite.used_by = None invite.expires_at = timezone.now() - timedelta(days=1) invite.save() self.assertFalse(invite.is_valid()) def test_role_and_role_membership(self): org = Organization.objects.create(name='RoleOrg', owner=self.user) role = Role.objects.create(name='Admin', organization=org) rm = RoleMembership.objects.create(role=role, user=self.user) self.assertIn(role, org.roles.all()) self.assertIn(self.user, role.members.all()) def test_unique_organization_name(self): Organization.objects.create(name='UniqueOrg', owner=self.user) with self.assertRaises(Exception): Organization.objects.create(name='UniqueOrg', owner=self.user) def test_membership_unique_together(self): org = Organization.objects.create(name='UTOrg', owner=self.user) OrganizationMembership.objects.create(organization=org, user=self.user) with self.assertRaises(Exception): OrganizationMembership.objects.create(organization=org, user=self.user) def test_invite_default_expiry_is_seven_days(self): org = Organization.objects.create(name='ExpiryOrg', owner=self.user) invite = OrganizationInvitation.objects.create(organization=org, created_by=self.user) delta = invite.expires_at - invite.created_at self.assertTrue(6 <= delta.days <= 8) def test_invite_str_contains_org_name(self): org = Organization.objects.create(name='StrOrg', owner=self.user) invite = OrganizationInvitation.objects.create(organization=org, created_by=self.user) self.assertIn('StrOrg', str(invite)) def test_role_uuid_and_unique(self): org = Organization.objects.create(name='RoleUuidOrg', owner=self.user) r1 = Role.objects.create(name='R1', organization=org) r2 = Role.objects.create(name='R2', organization=org) self.assertNotEqual(r1.uuid, r2.uuid) def test_str_methods(self): org = Organization.objects.create(name='StrTestOrg', owner=self.user) m = OrganizationMembership.objects.create(organization=org, user=self.user) self.assertIn(org.name, str(m))