Newer
Older
pydwiki / accounts / tests / tests_models_custom_group.py
from django.contrib.auth.models import Group
from django.core.exceptions import ValidationError
from django.db.utils import IntegrityError
from django.test import TestCase

from accounts.models import CustomGroup


class CustomGroupTestCase(TestCase):

    def test_str(self):
        group = Group.objects.create(name="Test Group")
        custom_group = CustomGroup.objects.create(group=group)
        self.assertEqual(str(custom_group), "Test Group")

    def test_parent(self):
        parent_group = CustomGroup.objects.create(name="Parent Group")
        child_group = CustomGroup.objects.create(name="Child Group", parent=parent_group)
        self.assertEqual(str(child_group), "Parent Group/Child Group")

    def test_parent_loop_error(self):
        parent1_group = CustomGroup.objects.create(name="Parent1 Group")
        parent2_group = CustomGroup.objects.create(name="Parent2 Group", parent=parent1_group)
        child_group = CustomGroup.objects.create(name="Child Group", parent=parent2_group)
        parent1_group.parent = child_group  # type: ignore
        with self.assertRaises(ValidationError):
            parent1_group.save()

        # self.assertEqual(str(child_group), "Parent Group/Child Group")

    def test_create_custom_group(self):
        cg = CustomGroup.objects.create(name="Test Group")
        self.assertIsNotNone(cg)
        self.assertEqual(cg.group.name, "Test Group")

    def test_create_custom_group_noname(self):
        with self.assertRaises(ValueError):
            CustomGroup.objects.create()

    def test_update_custom_group(self):
        cg1 = CustomGroup.objects.create(name="Test1 Group")
        cg2 = CustomGroup.objects.create(name="Test2 Group")
        cg3 = CustomGroup.objects.create(name="Test3 Group")
        CustomGroup.objects.filter(name="Test1 Group").update(name="Test Group")
        self.assertEqual(CustomGroup.objects.get(group__pk=cg1.group.pk).group.name, "Test Group")
        self.assertEqual(CustomGroup.objects.get(group__pk=cg2.group.pk).group.name, "Test2 Group")
        self.assertEqual(CustomGroup.objects.get(group__pk=cg3.group.pk).group.name, "Test3 Group")

    def test_update_custom_group_duplicate_names(self):
        CustomGroup.objects.create(name="Test1 Group")
        CustomGroup.objects.create(name="Test2 Group")
        CustomGroup.objects.create(name="Test3 Group")
        with self.assertRaises(IntegrityError):
            CustomGroup.objects.all().update(name="Test Group")

    def test_update_custom_group_noname(self):
        cg1 = CustomGroup.objects.create(
            name="Test1 Group", group_type=CustomGroup.GroupType.ORGANIZATION
        )
        self.assertEqual(cg1.group_type, CustomGroup.GroupType.ORGANIZATION)

        cg2 = CustomGroup.objects.create(
            name="Test2 Group", group_type=CustomGroup.GroupType.DEPARTMENT
        )
        self.assertEqual(cg2.group_type, CustomGroup.GroupType.DEPARTMENT)

        CustomGroup.objects.all().update(group_type=CustomGroup.GroupType.TEAM)
        groups = CustomGroup.objects.all()
        for group in groups:
            self.assertEqual(group.group_type, CustomGroup.GroupType.TEAM)

    def test_get(self):
        cg1 = CustomGroup.objects.create(
            name="Test1 Group", group_type=CustomGroup.GroupType.ORGANIZATION
        )
        cg2 = CustomGroup.objects.create(
            name="Test2 Group", group_type=CustomGroup.GroupType.DEPARTMENT
        )

        searched_cg1 = CustomGroup.objects.get(name="Test1 Group")
        self.assertEqual(searched_cg1, cg1)

        searched_cg2 = CustomGroup.objects.get(group__name="Test2 Group")
        self.assertEqual(searched_cg2, cg2)

    def test_get_or_create(self):
        cg1, created1 = CustomGroup.objects.get_or_create(
            name="Test1 Group", group_type=CustomGroup.GroupType.ORGANIZATION
        )
        self.assertTrue(created1)

        cg2, created2 = CustomGroup.objects.get_or_create(name="Test1 Group")
        self.assertFalse(created2)
        self.assertEqual(cg2, cg1)

        cg3, created3 = CustomGroup.objects.get_or_create(group__name="Test1 Group")
        self.assertFalse(created3)
        self.assertEqual(cg3, cg1)

        cg4, created4 = CustomGroup.objects.get_or_create(group__name="Test2 Group")
        self.assertTrue(created4)
        self.assertEqual(cg4.group.name, "Test2 Group")
        self.assertEqual(cg4.group_type, CustomGroup.GroupType.OTHER)

    def test_update_or_create(self):
        cg1, created1 = CustomGroup.objects.update_or_create(
            name="Test1 Group", group_type=CustomGroup.GroupType.ORGANIZATION
        )
        self.assertTrue(created1)

        cg2, created2 = CustomGroup.objects.update_or_create(
            name="Test1 Group",
            defaults={
                "group_type": CustomGroup.GroupType.DEPARTMENT,
            },
        )
        self.assertFalse(created2)
        self.assertEqual(cg2.group_type, CustomGroup.GroupType.DEPARTMENT)
        self.assertEqual(cg2.pk, cg1.pk)

        cg3, created3 = CustomGroup.objects.update_or_create(
            group__name="Test1 Group",
            defaults={
                "group_type": CustomGroup.GroupType.TEAM,
            },
        )
        self.assertFalse(created3)
        self.assertEqual(cg3.group_type, CustomGroup.GroupType.TEAM)
        self.assertEqual(cg3.pk, cg1.pk)

        cg4, created4 = CustomGroup.objects.update_or_create(
            group__name="Test2 Group",
            defaults={
                "group_type": CustomGroup.GroupType.DEPARTMENT,
            },
        )
        self.assertTrue(created4)
        self.assertEqual(cg4.group.name, "Test2 Group")
        self.assertEqual(cg4.group_type, CustomGroup.GroupType.DEPARTMENT)
        self.assertNotEqual(cg4.pk, cg1.pk)

        cg5, created5 = CustomGroup.objects.update_or_create(
            group__name="Test2 Group",
            defaults={
                "name": "Test5 Group",
                "group_type": CustomGroup.GroupType.DEPARTMENT,
            },
        )
        self.assertFalse(created5)
        self.assertEqual(cg5.group.name, "Test5 Group")
        self.assertEqual(cg5.group_type, CustomGroup.GroupType.DEPARTMENT)
        self.assertEqual(cg5.pk, cg4.pk)

    def test_update(self):
        cg1 = CustomGroup.objects.create(
            name="Test1 Group", group_type=CustomGroup.GroupType.ORGANIZATION
        )
        self.assertEqual(cg1.group_type, CustomGroup.GroupType.ORGANIZATION)

        cg2 = CustomGroup.objects.create(
            name="Test2 Group", group_type=CustomGroup.GroupType.DEPARTMENT
        )
        self.assertEqual(cg2.group_type, CustomGroup.GroupType.DEPARTMENT)

        CustomGroup.objects.update(group_type=CustomGroup.GroupType.TEAM)
        cgs = CustomGroup.objects.all()
        for cg in cgs:
            self.assertEqual(cg.group_type, CustomGroup.GroupType.TEAM)

    def test_delete(self):
        cg1 = CustomGroup.objects.create(
            name="Test1 Group", group_type=CustomGroup.GroupType.ORGANIZATION
        )
        self.assertEqual(cg1.group_type, CustomGroup.GroupType.ORGANIZATION)

        cg2 = CustomGroup.objects.create(
            name="Test2 Group", group_type=CustomGroup.GroupType.DEPARTMENT
        )
        self.assertEqual(cg2.group_type, CustomGroup.GroupType.DEPARTMENT)

        CustomGroup.objects.delete()
        self.assertEqual(CustomGroup.objects.count(), 0)