From 6f58f2985ce9d96204e19fc97feb39f5ddf11e35 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 30 Jul 2025 08:27:02 +0930 Subject: [PATCH] test(config_management): ViewSet Unit Test Suite re-written to pytest for model ConfigGroup ref: #908 #905 --- .../tests/unit/test_unit_common_viewset.py | 1 + .../test_unit_knowledge_base_serializer.py | 3 +- .../tests/unit/config_groups/conftest.py | 6 ++ .../test_unit_config_groups_viewset.py | 99 +++++++++++++++++++ .../unit_config_groups_viewset.py | 42 -------- .../viewsets/config_group.py | 11 ++- app/tests/fixtures/__init__.py | 1 + app/tests/fixtures/model_configgroup.py | 16 +++ 8 files changed, 131 insertions(+), 48 deletions(-) create mode 100644 app/config_management/tests/unit/config_groups/test_unit_config_groups_viewset.py delete mode 100644 app/config_management/tests/unit/config_groups/unit_config_groups_viewset.py diff --git a/app/api/tests/unit/test_unit_common_viewset.py b/app/api/tests/unit/test_unit_common_viewset.py index ccbfe9e8..770ca003 100644 --- a/app/api/tests/unit/test_unit_common_viewset.py +++ b/app/api/tests/unit/test_unit_common_viewset.py @@ -377,6 +377,7 @@ class CommonViewSetTestCases( ) view_set.request = request + view_set.kwargs = {} yield view_set diff --git a/app/assistance/tests/unit/knowledge_base/test_unit_knowledge_base_serializer.py b/app/assistance/tests/unit/knowledge_base/test_unit_knowledge_base_serializer.py index 1dab16cc..3e1fd692 100644 --- a/app/assistance/tests/unit/knowledge_base/test_unit_knowledge_base_serializer.py +++ b/app/assistance/tests/unit/knowledge_base/test_unit_knowledge_base_serializer.py @@ -61,7 +61,8 @@ class KnowledgeBaseSerializerTestCases( def test_serializer_validation_no_title(self, - kwargs_api_create, model, model_serializer, request_user): + kwargs_api_create, model, model_serializer, request_user + ): """Serializer Validation Check Ensure that if creating and no title is provided a validation error occurs diff --git a/app/config_management/tests/unit/config_groups/conftest.py b/app/config_management/tests/unit/config_groups/conftest.py index 063565f4..98e8d1a0 100644 --- a/app/config_management/tests/unit/config_groups/conftest.py +++ b/app/config_management/tests/unit/config_groups/conftest.py @@ -17,3 +17,9 @@ def model_kwargs(request, kwargs_configgroups): if hasattr(request.cls, 'kwargs_create_item'): del request.cls.kwargs_create_item + + +@pytest.fixture( scope = 'class') +def model_serializer(serializer_configgroups): + + yield serializer_configgroups diff --git a/app/config_management/tests/unit/config_groups/test_unit_config_groups_viewset.py b/app/config_management/tests/unit/config_groups/test_unit_config_groups_viewset.py new file mode 100644 index 00000000..e6f4f7b2 --- /dev/null +++ b/app/config_management/tests/unit/config_groups/test_unit_config_groups_viewset.py @@ -0,0 +1,99 @@ +import pytest + +from api.tests.unit.test_unit_common_viewset import ModelViewSetInheritedCases + +from config_management.viewsets.config_group import ( + ConfigGroups, + ViewSet, +) + + + +@pytest.mark.model_configgroups +class ViewsetTestCases( + ModelViewSetInheritedCases, +): + + + @pytest.fixture( scope = 'function' ) + def viewset(self): + return ViewSet + + + @property + def parameterized_class_attributes(self): + return { + '_model_documentation': { + 'type': type(None), + }, + 'back_url': { + 'type': type(None), + }, + 'documentation': { + 'type': type(None), + 'value': None + }, + 'filterset_fields': { + 'value': [ + 'organization', + 'parent' + ] + }, + 'model': { + 'value': ConfigGroups + }, + 'model_documentation': { + 'type': type(None), + }, + 'queryset': { + 'type': type(None), + }, + 'serializer_class': { + 'type': type(None), + }, + 'search_fields': { + 'value': [ + 'name', + 'config' + ] + }, + 'view_description': { + 'value': 'Configuration Groups' + }, + 'view_name': { + 'type': type(None), + }, + 'view_serializer_name': { + 'type': type(None), + } + } + + + def test_view_func_get_queryset_cache_result_used(self, mocker, viewset, viewset_mock_request): + + qs = mocker.spy(viewset_mock_request.model, 'objects') + + viewset_mock_request.get_queryset() # Initial QuerySet fetch/filter and cache + + assert len(qs.method_calls) == 1 # one call to .all() + assert len(qs.mock_calls) == 3 # calls = .all(), all().filter() + + viewset_mock_request.get_queryset() # Use Cached results, dont re-fetch QuerySet + + assert len(qs.method_calls) == 1 + assert len(qs.mock_calls) == 3 + + +class KnowledgeBaseViewsetInheritedCases( + ViewsetTestCases, +): + pass + + + +@pytest.mark.module_config_management +class KnowledgeBaseViewsetPyTest( + ViewsetTestCases, +): + + pass diff --git a/app/config_management/tests/unit/config_groups/unit_config_groups_viewset.py b/app/config_management/tests/unit/config_groups/unit_config_groups_viewset.py deleted file mode 100644 index 101d692d..00000000 --- a/app/config_management/tests/unit/config_groups/unit_config_groups_viewset.py +++ /dev/null @@ -1,42 +0,0 @@ -from django.test import Client, TestCase - -from rest_framework.reverse import reverse - -from api.tests.unit.test_unit_common_viewset import ModelViewSetInheritedCases - -from config_management.viewsets.config_group import ViewSet - - - -@pytest.mark.skip(reason = 'see #895, tests being refactored') -class ConfigGroupsViewsetList( - ModelViewSetInheritedCases, - TestCase, -): - - viewset = ViewSet - - route_name = 'v2:_api_configgroups' - - - @classmethod - def setUpTestData(self): - """Setup Test - - 1. make list request - """ - - - super().setUpTestData() - - - client = Client() - - url = reverse( - self.route_name + '-list', - kwargs = self.kwargs - ) - - client.force_login(self.view_user) - - self.http_options_response_list = client.options(url) diff --git a/app/config_management/viewsets/config_group.py b/app/config_management/viewsets/config_group.py index 48a101ce..3e48b521 100644 --- a/app/config_management/viewsets/config_group.py +++ b/app/config_management/viewsets/config_group.py @@ -74,7 +74,7 @@ class ViewSet( ModelViewSet ): model = ConfigGroups - view_description = 'Information Management Knowledge Base Article(s)' + view_description = 'Configuration Groups' def get_queryset(self): @@ -94,7 +94,7 @@ class ViewSet( ModelViewSet ): else: self.queryset = super().get_queryset().filter( parent = None ) - + return self.queryset @@ -105,12 +105,13 @@ class ViewSet( ModelViewSet ): or self.action == 'retrieve' ): - self.serializer_class = globals()[str( self.model._meta.verbose_name).replace(' ' , '') + 'ViewSerializer'] + self.serializer_class = globals()[str( + self.model._meta.verbose_name).replace(' ' , '') + 'ViewSerializer'] else: - self.serializer_class = globals()[str( self.model._meta.verbose_name).replace(' ' , '') + 'ModelSerializer'] + self.serializer_class = globals()[str( + self.model._meta.verbose_name).replace(' ' , '') + 'ModelSerializer'] return self.serializer_class - diff --git a/app/tests/fixtures/__init__.py b/app/tests/fixtures/__init__.py index 3402203f..9f93d2c1 100644 --- a/app/tests/fixtures/__init__.py +++ b/app/tests/fixtures/__init__.py @@ -77,6 +77,7 @@ from .model_company import ( from .model_configgroup import ( kwargs_configgroups, model_configgroups, + serializer_configgroups, ) from .model_configgrouphost import ( diff --git a/app/tests/fixtures/model_configgroup.py b/app/tests/fixtures/model_configgroup.py index 80a37b5c..c870a5ce 100644 --- a/app/tests/fixtures/model_configgroup.py +++ b/app/tests/fixtures/model_configgroup.py @@ -2,6 +2,12 @@ import datetime import pytest from config_management.models.groups import ConfigGroups +from config_management.serializers.config_group import ( + ConfigGroupBaseSerializer, + ConfigGroupModelSerializer, + ConfigGroupViewSerializer, +) + @pytest.fixture( scope = 'class') @@ -25,3 +31,13 @@ def kwargs_configgroups(django_db_blocker, } yield kwargs.copy() + + +@pytest.fixture( scope = 'class') +def serializer_configgroups(): + + yield { + 'base': ConfigGroupBaseSerializer, + 'model': ConfigGroupModelSerializer, + 'view': ConfigGroupViewSerializer + }