From 616f37fca29fc7cb59a281591dbc04c6eb7e6323 Mon Sep 17 00:00:00 2001 From: Jon Date: Sun, 1 Jun 2025 04:33:47 +0930 Subject: [PATCH] test(core): Add fixtures for api permission tests ref: #780 #730 --- app/conftest.py | 6 +- app/tests/fixtures/__init__.py | 17 ++++ app/tests/fixtures/api_request_permissions.py | 47 +++++----- app/tests/fixtures/kwargs_api_create.py | 26 ++++++ app/tests/fixtures/model_gitgroup.py | 17 +++- app/tests/fixtures/model_instance.py | 87 +++++++++++++++++++ app/tests/fixtures/model_team.py | 9 ++ app/tests/fixtures/model_teamuser.py | 9 ++ app/tests/fixtures/model_tenancyabstract.py | 6 +- pyproject.toml | 4 +- 10 files changed, 197 insertions(+), 31 deletions(-) create mode 100644 app/tests/fixtures/kwargs_api_create.py create mode 100644 app/tests/fixtures/model_instance.py create mode 100644 app/tests/fixtures/model_team.py create mode 100644 app/tests/fixtures/model_teamuser.py diff --git a/app/conftest.py b/app/conftest.py index 603314a6..6973ff5d 100644 --- a/app/conftest.py +++ b/app/conftest.py @@ -1,4 +1,5 @@ import datetime +from typing import Any import django import pytest import os @@ -7,6 +8,7 @@ import sys from django.core.management import call_command from django.conf import settings +from django.db import models from django.test import ( TestCase ) @@ -769,7 +771,3 @@ def user(django_db_blocker, model_user, kwargs_user): with django_db_blocker.unblock(): user.delete() - - - - diff --git a/app/tests/fixtures/__init__.py b/app/tests/fixtures/__init__.py index 478bd2f0..a0b47741 100644 --- a/app/tests/fixtures/__init__.py +++ b/app/tests/fixtures/__init__.py @@ -5,6 +5,10 @@ from .api_request_permissions import ( api_request_permissions, ) +from .kwargs_api_create import ( + kwargs_api_create +) + from .model_centurionaudit import ( kwargs_centurionaudit, model_centurionaudit, @@ -47,12 +51,25 @@ from .model_featureflag import ( from .model_gitgroup import ( kwargs_gitgroup, model_gitgroup, + serializer_gitgroup, +) + +from .model_instance import ( + model_instance ) from .model_permission import ( model_permission, ) +from .model_team import ( + model_team, +) + +from .model_teamuser import ( + model_teamuser, +) + from .model_tenancyabstract import ( kwargs_tenancyabstract, model_tenancyabstract, diff --git a/app/tests/fixtures/api_request_permissions.py b/app/tests/fixtures/api_request_permissions.py index 3e4c1ddf..f55278dc 100644 --- a/app/tests/fixtures/api_request_permissions.py +++ b/app/tests/fixtures/api_request_permissions.py @@ -1,17 +1,17 @@ -import django +import datetime import pytest from settings.models.app_settings import AppSettings -User = django.contrib.auth.get_user_model() - - @pytest.fixture( scope = 'class') def api_request_permissions( django_db_blocker, model_contenttype, model_permission, + model_team, + model_teamuser, + model_user, model, organization_one, organization_two, @@ -41,18 +41,18 @@ def api_request_permissions( django_db_blocker, ) ) - add_team = Team.objects.create( + add_team = model_team.objects.create( team_name = 'add_team' + str(random_str), organization = organization_one, ) add_team.permissions.set([add_permissions]) - add_user = User.objects.create_user( + add_user = model_user.objects.create_user( username="test_user_add" + str(random_str), password="password" ) - TeamUsers.objects.create( + model_teamuser.objects.create( team = add_team, user = add_user ) @@ -67,18 +67,18 @@ def api_request_permissions( django_db_blocker, ) ) - change_team = Team.objects.create( + change_team = model_team.objects.create( team_name = 'change_team' + str(random_str), organization = organization_one, ) change_team.permissions.set([change_permissions]) - change_user = User.objects.create_user( + change_user = model_user.objects.create_user( username="test_user_change" + str(random_str), password="password" ) - TeamUsers.objects.create( + model_teamuser.objects.create( team = change_team, user = change_user ) @@ -93,17 +93,17 @@ def api_request_permissions( django_db_blocker, ) ) - delete_team = Team.objects.create( + delete_team = model_team.objects.create( team_name = 'delete_team' + str(random_str), organization = organization_one, ) delete_team.permissions.set([delete_permissions]) - delete_user = User.objects.create_user( + delete_user = model_user.objects.create_user( username="test_user_delete" + str(random_str), password="password" ) - TeamUsers.objects.create( + model_teamuser.objects.create( team = delete_team, user = delete_user ) @@ -118,30 +118,30 @@ def api_request_permissions( django_db_blocker, ) ) - view_team = Team.objects.create( + view_team = model_team.objects.create( team_name = 'view_team' + str(random_str), organization = organization_one, ) view_team.permissions.set([view_permissions]) - view_user = User.objects.create_user( + view_user = model_user.objects.create_user( username="test_user_view" + str(random_str), password="password" ) - TeamUsers.objects.create( + model_teamuser.objects.create( team = view_team, user = view_user ) - different_organization_user = User.objects.create_user( + different_organization_user = model_user.objects.create_user( username="test_diff_org_user" + str(random_str), password="password" ) - different_organization_team = Team.objects.create( + different_organization_team = model_team.objects.create( team_name = 'diff_org_team' + str(random_str), organization = organization_two, ) @@ -153,11 +153,17 @@ def api_request_permissions( django_db_blocker, delete_permissions, ]) - TeamUsers.objects.create( + model_teamuser.objects.create( team = different_organization_team, user = different_organization_user ) + + no_permission_user = model_user.objects.create_user( + username="nil_permissions" + str(random_str), password="password" + ) + + yield { 'app_settings': app_settings, 'tenancy': { @@ -167,10 +173,11 @@ def api_request_permissions( django_db_blocker, }, 'user': { 'add': add_user, + 'anon': None, 'change': change_user, 'delete': delete_user, 'different_tenancy': different_organization_user, - 'no_permissions': '', + 'no_permissions': no_permission_user, 'view': view_user, } diff --git a/app/tests/fixtures/kwargs_api_create.py b/app/tests/fixtures/kwargs_api_create.py new file mode 100644 index 00000000..1b462210 --- /dev/null +++ b/app/tests/fixtures/kwargs_api_create.py @@ -0,0 +1,26 @@ +import pytest + + +@pytest.fixture(scope = 'class') +def kwargs_api_create(django_db_blocker, model_kwargs): + + + kwargs: dict = {} + + with django_db_blocker.unblock(): + + for field, value in model_kwargs.items(): + + if value is None: + continue + + if isinstance(value, models.Model): + value = value.id + + kwargs.update({ + field: value + }) + + yield kwargs + + del kwargs diff --git a/app/tests/fixtures/model_gitgroup.py b/app/tests/fixtures/model_gitgroup.py index 0879b832..03c52ed6 100644 --- a/app/tests/fixtures/model_gitgroup.py +++ b/app/tests/fixtures/model_gitgroup.py @@ -1,7 +1,10 @@ import pytest from devops.models.git_group import GitGroup - +from devops.serializers.git_group import ( + ModelSerializer, + ViewSerializer +) @pytest.fixture( scope = 'class') @@ -11,10 +14,16 @@ def model_gitgroup(request): @pytest.fixture( scope = 'class') -def kwargs_gitgroup(kwargs_centurionmodel): +def serializer_gitgroup(): - # kwargs = kwargs_centurionmodel.copy() - # del kwargs['model_notes'] + yield { + 'model': ModelSerializer, + 'view': ViewSerializer, + } + + +@pytest.fixture( scope = 'class') +def kwargs_gitgroup(kwargs_centurionmodel): kwargs = { **kwargs_centurionmodel.copy(), diff --git a/app/tests/fixtures/model_instance.py b/app/tests/fixtures/model_instance.py new file mode 100644 index 00000000..b0948a3e --- /dev/null +++ b/app/tests/fixtures/model_instance.py @@ -0,0 +1,87 @@ +import datetime +import pytest + +from django.apps import apps + + + +model_objs: list = [] + + +@pytest.fixture( scope = 'class') +def model_instance(django_db_blocker, model_user, model, model_kwargs): + + with django_db_blocker.unblock(): + + + def instance( user = None, random_field:str = '', kwargs_create: dict = {} ): + """Create a model instance + + Args: + user (User, optional): The User to create and add to model.context['user']. + Defaults to None. + random_field (str, optional): The unique field that needs to be randomized. + Defaults to ''. + kwargs_create (dict, optional): object create kwargs. overwrites default. + Defaults to {}. + + Returns: + Model Object (Model): Model that was created. + """ + + global model_objs + + obj = None + + if user: + model.context['user'] = user + + + if model._meta.abstract: + + class MockModel(model): + class Meta: + app_label = 'core' + verbose_name = 'mock instance' + managed = False + + obj = MockModel() + + else: + + kwargs = model_kwargs.copy() + + kwargs.update( kwargs_create ) + + if random_field: + + random_str = str(datetime.datetime.now(tz=datetime.timezone.utc)) + + kwargs.update({ + random_field: str( random_field ) + '_' + random_str + }) + + obj = model.objects.create( + **kwargs + ) + + model_objs += [ obj ] + + return obj + + yield instance + + for model_obj in model_objs: + + if model_obj._meta.abstract: + + del model_obj + + else: + + model_obj.delete() + + + if 'mockmodel' in apps.all_models['core']: + + del apps.all_models['core']['mockmodel'] diff --git a/app/tests/fixtures/model_team.py b/app/tests/fixtures/model_team.py new file mode 100644 index 00000000..04ada937 --- /dev/null +++ b/app/tests/fixtures/model_team.py @@ -0,0 +1,9 @@ +import pytest + +from access.models.team import Team + + +@pytest.fixture( scope = 'class') +def model_team(request): + + yield Team diff --git a/app/tests/fixtures/model_teamuser.py b/app/tests/fixtures/model_teamuser.py new file mode 100644 index 00000000..8ba8e8cd --- /dev/null +++ b/app/tests/fixtures/model_teamuser.py @@ -0,0 +1,9 @@ +import pytest + +from access.models.team_user import TeamUsers + + +@pytest.fixture( scope = 'class') +def model_teamuser(request): + + yield TeamUsers diff --git a/app/tests/fixtures/model_tenancyabstract.py b/app/tests/fixtures/model_tenancyabstract.py index 31654cbe..7c076e3f 100644 --- a/app/tests/fixtures/model_tenancyabstract.py +++ b/app/tests/fixtures/model_tenancyabstract.py @@ -11,8 +11,10 @@ def model_tenancyabstract(request): @pytest.fixture( scope = 'class') -def kwargs_tenancyabstract(): +def kwargs_tenancyabstract(organization_one): - kwargs = {} + kwargs = { + 'organization': organization_one + } yield kwargs.copy() diff --git a/pyproject.toml b/pyproject.toml index 3fa280a0..6b4ec291 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1066,13 +1066,15 @@ log_cli_format = '%(asctime)s %(levelname)s %(message)s' log_cli_date_format = '%Y-%m-%d %H:%M:%S' markers = [ - "audit_models: Selects Audit models...", + "api: Selects all API related tests.", + "audit_models: Selects Audit models.", "centurion_models: Selects Centurion models", "functional: Selects all Functional tests.", "meta_models: Selects Meta models", "model_gitgroup: Selects tests for model `git group`", "models: Selects all models tests.", "note_models: Selects all centurion model note models", + "permissions: selects all permission related tests.", "tenancy_models: Selects Tenancy models.", "unit: Selects all Unit Tests.", ]