diff --git a/app/access/tests/functional/entity/conftest.py b/app/access/tests/functional/entity/conftest.py new file mode 100644 index 00000000..1c393761 --- /dev/null +++ b/app/access/tests/functional/entity/conftest.py @@ -0,0 +1,24 @@ +import pytest + +from access.models.entity import Entity + + + +@pytest.fixture( scope = 'class') +def model(request): + + request.cls.model = Entity + + yield request.cls.model + + del request.cls.model + + + +@pytest.fixture(scope='function') +def create_serializer(): + + from access.serializers.entity import ModelSerializer + + + yield ModelSerializer diff --git a/app/access/tests/functional/entity/test_functional_entity_metadata.py b/app/access/tests/functional/entity/test_functional_entity_metadata.py new file mode 100644 index 00000000..55f0d01d --- /dev/null +++ b/app/access/tests/functional/entity/test_functional_entity_metadata.py @@ -0,0 +1,260 @@ +import django +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType +from django.test import TestCase + +from access.models.entity import Entity +from access.models.tenant import Tenant as Organization +from access.models.team import Team +from access.models.team_user import TeamUsers + +from accounting.models.asset_base import AssetBase + +from api.tests.abstract.test_metadata_functional import MetadataAttributesFunctional + +User = django.contrib.auth.get_user_model() + + + +class EntityMetadataTestCases( + MetadataAttributesFunctional, +): + + add_data: dict = {} + + app_namespace = 'v2' + + base_model = Entity + """Base model for this sub model + don't change or override this value + """ + + change_data = None + + delete_data = {} + + kwargs_create_item: dict = {} + + kwargs_create_item_diff_org: dict = {} + + model = Entity + + url_kwargs: dict = {} + + url_view_kwargs: dict = {} + + url_name = None + + + @classmethod + def setUpTestData(self): + """Setup Test + + 1. Create an organization for user and item + . create an organization that is different to item + 2. Create a team + 3. create teams with each permission: view, add, change, delete + 4. create a user per team + """ + + organization = Organization.objects.create(name='test_org') + + self.organization = organization + + self.different_organization = Organization.objects.create(name='test_different_organization') + + self.view_user = User.objects.create_user(username="test_user_view", password="password") + + self.item = self.model.objects.create( + organization = organization, + **self.kwargs_create_item + ) + + self.other_org_item = self.model.objects.create( + organization = self.different_organization, + **self.kwargs_create_item_diff_org + ) + + + self.url_view_kwargs.update({ 'pk': self.item.id }) + + if self.add_data is not None: + + self.add_data.update({ + 'organization': self.organization.id, + }) + + + view_permissions = Permission.objects.get( + codename = 'view_' + self.model._meta.model_name, + content_type = ContentType.objects.get( + app_label = self.model._meta.app_label, + model = self.model._meta.model_name, + ) + ) + + view_team = Team.objects.create( + team_name = 'view_team', + organization = organization, + ) + + view_team.permissions.set([view_permissions]) + + + + add_permissions = Permission.objects.get( + codename = 'add_' + self.model._meta.model_name, + content_type = ContentType.objects.get( + app_label = self.model._meta.app_label, + model = self.model._meta.model_name, + ) + ) + + add_team = Team.objects.create( + team_name = 'add_team', + organization = organization, + ) + + add_team.permissions.set([add_permissions]) + + + + change_permissions = Permission.objects.get( + codename = 'change_' + self.model._meta.model_name, + content_type = ContentType.objects.get( + app_label = self.model._meta.app_label, + model = self.model._meta.model_name, + ) + ) + + change_team = Team.objects.create( + team_name = 'change_team', + organization = organization, + ) + + change_team.permissions.set([change_permissions]) + + + + delete_permissions = Permission.objects.get( + codename = 'delete_' + self.model._meta.model_name, + content_type = ContentType.objects.get( + app_label = self.model._meta.app_label, + model = self.model._meta.model_name, + ) + ) + + delete_team = Team.objects.create( + team_name = 'delete_team', + organization = organization, + ) + + delete_team.permissions.set([delete_permissions]) + + + self.no_permissions_user = User.objects.create_user(username="test_no_permissions", password="password") + + + TeamUsers.objects.create( + team = view_team, + user = self.view_user + ) + + self.add_user = User.objects.create_user(username="test_user_add", password="password") + TeamUsers.objects.create( + team = add_team, + user = self.add_user + ) + + self.change_user = User.objects.create_user(username="test_user_change", password="password") + TeamUsers.objects.create( + team = change_team, + user = self.change_user + ) + + self.delete_user = User.objects.create_user(username="test_user_delete", password="password") + TeamUsers.objects.create( + team = delete_team, + user = self.delete_user + ) + + + self.different_organization_user = User.objects.create_user(username="test_different_organization_user", password="password") + + + different_organization_team = Team.objects.create( + team_name = 'different_organization_team', + organization = self.different_organization, + ) + + different_organization_team.permissions.set([ + view_permissions, + add_permissions, + change_permissions, + delete_permissions, + ]) + + TeamUsers.objects.create( + team = different_organization_team, + user = self.different_organization_user + ) + + + def test_sanity_is_entity_sub_model(self): + """Sanity Test + + This test ensures that the model being tested `self.model` is a + sub-model of `self.base_model`. + This test is required as the same viewset is used for all sub-models + of `AssetBase` + """ + + assert issubclass(self.model, self.base_model) + + + +class EntityMetadataInheritedCases( + EntityMetadataTestCases, +): + + model = None + + kwargs_create_item: dict = {} + + kwargs_create_item_diff_org: dict = {} + + url_name = '_api_v2_entity_sub' + + + @classmethod + def setUpTestData(self): + + self.kwargs_create_item = { + **super().kwargs_create_item, + **self.kwargs_create_item + } + + self.kwargs_create_item_diff_org = { + **super().kwargs_create_item_diff_org, + **self.kwargs_create_item_diff_org + } + + self.url_kwargs = { + 'entity_model': self.model._meta.sub_model_type + } + + self.url_view_kwargs = { + 'entity_model': self.model._meta.sub_model_type + } + + super().setUpTestData() + + + +class EntityMetadataTest( + EntityMetadataTestCases, + TestCase, + +): + + url_name = '_api_v2_entity'