2026-01-17 15:51:11 +00:00
|
|
|
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):
|
2026-01-19 11:40:55 +00:00
|
|
|
self.user = User.objects.create_user(email_address='u@example.com', password='pass', is_manager=True)
|
2026-01-17 15:51:11 +00:00
|
|
|
|
|
|
|
|
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)
|
2026-01-19 11:40:55 +00:00
|
|
|
m = OrganizationMembership.objects.create(organization=org, user=self.user)
|
2026-01-17 15:51:11 +00:00
|
|
|
self.assertIn(self.user, org.members.all())
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
|
2026-01-19 11:40:55 +00:00
|
|
|
invite.used_by.add(self.user)
|
2026-01-17 15:51:11 +00:00
|
|
|
invite.save()
|
|
|
|
|
self.assertFalse(invite.is_valid())
|
|
|
|
|
|
2026-01-19 11:40:55 +00:00
|
|
|
invite.used_by.clear()
|
2026-01-17 15:51:11 +00:00
|
|
|
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))
|