From d7e70c1e62470d2725962d2ae4813e34d9b12562 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 11 Jun 2025 19:13:54 +0930 Subject: [PATCH] refactor(itam): Update Test Suite for DeviceSoftware model ref:#817 closes #802 --- app/fixtures/fresh_db.sql | 12 +- ...test_unit_device_operating_system_model.py | 4 +- .../tests/unit/device_software/conftest.py | 19 +++ ...i_v2.py => test_device_software_api_v2.py} | 3 +- .../test_unit_device_software_model.py | 161 +++++++++++++----- ...y => test_unit_device_software_viewset.py} | 4 + app/tests/fixtures/__init__.py | 10 ++ app/tests/fixtures/model_devicesoftware.py | 51 ++++++ app/tests/fixtures/model_softwareversion.py | 36 ++++ pyproject.toml | 3 + 10 files changed, 250 insertions(+), 53 deletions(-) create mode 100644 app/itam/tests/unit/device_software/conftest.py rename app/itam/tests/unit/device_software/{device_software_api_v2.py => test_device_software_api_v2.py} (99%) rename app/itam/tests/unit/device_software/{unit_device_software_viewset.py => test_unit_device_software_viewset.py} (92%) create mode 100644 app/tests/fixtures/model_devicesoftware.py create mode 100644 app/tests/fixtures/model_softwareversion.py diff --git a/app/fixtures/fresh_db.sql b/app/fixtures/fresh_db.sql index 8da5cd2f..85695ca0 100644 --- a/app/fixtures/fresh_db.sql +++ b/app/fixtures/fresh_db.sql @@ -32,7 +32,6 @@ CREATE TABLE IF NOT EXISTS "core_relatedtickets" ("id" integer NOT NULL PRIMARY CREATE TABLE IF NOT EXISTS "core_ticket" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "status" integer NOT NULL, "title" varchar(100) NOT NULL UNIQUE, "description" text NOT NULL, "urgency" integer NULL, "impact" integer NULL, "priority" integer NULL, "external_ref" integer NULL, "external_system" integer NULL, "ticket_type" integer NOT NULL, "is_deleted" bool NOT NULL, "date_closed" datetime NULL, "planned_start_date" datetime NULL, "planned_finish_date" datetime NULL, "estimate" integer NOT NULL, "real_start_date" datetime NULL, "real_finish_date" datetime NULL, "milestone_id" integer NULL REFERENCES "project_management_projectmilestone" ("id") DEFERRABLE INITIALLY DEFERRED, "opened_by_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "project_id" integer NULL REFERENCES "project_management_project" ("id") DEFERRABLE INITIALLY DEFERRED, "category_id" integer NULL REFERENCES "core_ticketcategory" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "parent_ticket_id" integer NULL REFERENCES "core_ticket" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "core_ticketcomment" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "external_ref" integer NULL, "external_system" integer NULL, "comment_type" integer NOT NULL, "body" text NOT NULL, "created" datetime NOT NULL, "modified" datetime NOT NULL, "private" bool NOT NULL, "duration" integer NOT NULL, "is_template" bool NOT NULL, "source" integer NOT NULL, "status" integer NOT NULL, "date_closed" datetime NULL, "planned_start_date" datetime NULL, "planned_finish_date" datetime NULL, "real_start_date" datetime NULL, "real_finish_date" datetime NULL, "responsible_team_id" integer NULL REFERENCES "access_team" ("group_ptr_id") DEFERRABLE INITIALLY DEFERRED, "responsible_user_id" integer NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "ticket_id" integer NULL REFERENCES "core_ticket" ("id") DEFERRABLE INITIALLY DEFERRED, "user_id" integer NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "category_id" integer NULL REFERENCES "core_ticketcommentcategory" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "parent_id" integer NULL REFERENCES "core_ticketcomment" ("id") DEFERRABLE INITIALLY DEFERRED, "template_id" integer NULL REFERENCES "core_ticketcomment" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "core_ticketlinkeditem" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "item_type" integer NOT NULL, "item" integer NOT NULL, "ticket_id" integer NOT NULL REFERENCES "core_ticket" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); -CREATE TABLE IF NOT EXISTS "itam_devicesoftware" ("is_global" bool NOT NULL, "model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "action" integer NULL, "installed" datetime NULL, "device_id" integer NOT NULL REFERENCES "itam_device" ("id") DEFERRABLE INITIALLY DEFERRED, "software_id" integer NOT NULL REFERENCES "itam_software" ("id") DEFERRABLE INITIALLY DEFERRED, "installedversion_id" integer NULL REFERENCES "itam_softwareversion" ("id") DEFERRABLE INITIALLY DEFERRED, "version_id" integer NULL REFERENCES "itam_softwareversion" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "itam_operatingsystem" ("is_global" bool NOT NULL, "model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(50) NOT NULL UNIQUE, "slug" varchar(50) NOT NULL, "publisher_id" integer NULL REFERENCES "core_manufacturer" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "itam_operatingsystemversion" ("is_global" bool NOT NULL, "model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(50) NOT NULL, "operating_system_id" integer NOT NULL REFERENCES "itam_operatingsystem" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "itam_softwarecategory" ("is_global" bool NOT NULL, "model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(50) NOT NULL UNIQUE, "slug" varchar(50) NOT NULL, "created" datetime NOT NULL, "modified" datetime NOT NULL, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); @@ -117,11 +116,11 @@ CREATE TABLE IF NOT EXISTS "devops_git_group_history" ("modelhistory_ptr_id" int CREATE TABLE IF NOT EXISTS "devops_github_repository_notes" ("modelnotes_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "core_model_notes" ("id") DEFERRABLE INITIALLY DEFERRED, "model_id" integer NOT NULL REFERENCES "devops_githubrepository" ("gitrepository_ptr_id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "devops_gitlab_repository_notes" ("modelnotes_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "core_model_notes" ("id") DEFERRABLE INITIALLY DEFERRED, "model_id" integer NOT NULL REFERENCES "devops_gitlabrepository" ("gitrepository_ptr_id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "devops_git_group_notes" ("modelnotes_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "core_model_notes" ("id") DEFERRABLE INITIALLY DEFERRED, "model_id" integer NOT NULL REFERENCES "devops_gitgroup" ("id") DEFERRABLE INITIALLY DEFERRED); -CREATE TABLE IF NOT EXISTS "access_organization_history" ("modelhistory_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "core_model_history" ("id") DEFERRABLE INITIALLY DEFERRED, "model_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "access_organization_notes" ("modelnotes_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "core_model_notes" ("id") DEFERRABLE INITIALLY DEFERRED, "model_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); +CREATE TABLE IF NOT EXISTS "access_organization_history" ("modelhistory_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "core_model_history" ("id") DEFERRABLE INITIALLY DEFERRED, "model_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "itam_software" ("is_global" bool NOT NULL, "model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(50) NOT NULL UNIQUE, "slug" varchar(50) NOT NULL, "created" datetime NOT NULL, "modified" datetime NOT NULL, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "publisher_id" integer NULL REFERENCES "core_manufacturer" ("id") DEFERRABLE INITIALLY DEFERRED, "category_id" integer NULL REFERENCES "itam_softwarecategory" ("id") DEFERRABLE INITIALLY DEFERRED); -CREATE TABLE IF NOT EXISTS "settings_usersettings" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "default_organization_id" integer NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "timezone" varchar(32) NOT NULL, "browser_mode" integer NOT NULL); CREATE TABLE IF NOT EXISTS "settings_appsettings" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "device_model_is_global" bool NOT NULL, "device_type_is_global" bool NOT NULL, "manufacturer_is_global" bool NOT NULL, "software_is_global" bool NOT NULL, "software_categories_is_global" bool NOT NULL, "global_organization_id" integer NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "owner_organization_id" integer NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED); +CREATE TABLE IF NOT EXISTS "settings_usersettings" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "default_organization_id" integer NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "timezone" varchar(32) NOT NULL, "browser_mode" integer NOT NULL); CREATE TABLE IF NOT EXISTS "access_company" ("entity_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "access_entity" ("id") DEFERRABLE INITIALLY DEFERRED, "name" varchar(80) NOT NULL); CREATE TABLE IF NOT EXISTS "access_entity" ("is_global" bool NOT NULL, "model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "entity_type" varchar(30) NOT NULL); CREATE TABLE IF NOT EXISTS "access_person" ("entity_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "access_entity" ("id") DEFERRABLE INITIALLY DEFERRED, "f_name" varchar(64) NOT NULL, "l_name" varchar(64) NOT NULL, "dob" date NULL, "m_name" varchar(100) NULL); @@ -193,6 +192,7 @@ CREATE TABLE IF NOT EXISTS "human_resources_employee" ("contact_ptr_id" integer CREATE TABLE IF NOT EXISTS "itam_device" ("model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(50) NOT NULL UNIQUE, "serial_number" varchar(50) NULL UNIQUE, "inventorydate" datetime NULL, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "device_model_id" integer NULL REFERENCES "itam_devicemodel" ("id") DEFERRABLE INITIALLY DEFERRED, "device_type_id" integer NULL REFERENCES "itam_devicetype" ("id") DEFERRABLE INITIALLY DEFERRED, "config" text NULL CHECK ((JSON_VALID("config") OR "config" IS NULL)), "is_virtual" bool NOT NULL, "uuid" char(32) NULL UNIQUE); CREATE TABLE IF NOT EXISTS "itam_devicemodel" ("model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "name" varchar(50) NOT NULL UNIQUE, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "manufacturer_id" integer NULL REFERENCES "core_manufacturer" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "itam_deviceoperatingsystem" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "version" varchar(15) NOT NULL, "device_id" integer NOT NULL UNIQUE REFERENCES "itam_device" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "operating_system_version_id" integer NOT NULL REFERENCES "itam_operatingsystemversion" ("id") DEFERRABLE INITIALLY DEFERRED, "installdate" datetime NULL); +CREATE TABLE IF NOT EXISTS "itam_devicesoftware" ("model_notes" text NULL, "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "created" datetime NOT NULL, "modified" datetime NOT NULL, "action" integer NULL, "installed" datetime NULL, "device_id" integer NOT NULL REFERENCES "itam_device" ("id") DEFERRABLE INITIALLY DEFERRED, "organization_id" integer NOT NULL REFERENCES "access_tenant" ("id") DEFERRABLE INITIALLY DEFERRED, "software_id" integer NOT NULL REFERENCES "itam_software" ("id") DEFERRABLE INITIALLY DEFERRED, "installedversion_id" integer NULL REFERENCES "itam_softwareversion" ("id") DEFERRABLE INITIALLY DEFERRED, "version_id" integer NULL REFERENCES "itam_softwareversion" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE TABLE IF NOT EXISTS "django_session" ("session_key" varchar(40) NOT NULL PRIMARY KEY, "session_data" text NOT NULL, "expire_date" datetime NOT NULL); CREATE TABLE IF NOT EXISTS "social_auth_association" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "server_url" varchar(255) NOT NULL, "handle" varchar(255) NOT NULL, "secret" varchar(255) NOT NULL, "issued" integer NOT NULL, "lifetime" integer NOT NULL, "assoc_type" varchar(64) NOT NULL); CREATE TABLE IF NOT EXISTS "social_auth_code" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "email" varchar(254) NOT NULL, "code" varchar(32) NOT NULL, "verified" bool NOT NULL, "timestamp" datetime NOT NULL); @@ -200,7 +200,7 @@ CREATE TABLE IF NOT EXISTS "social_auth_nonce" ("id" integer NOT NULL PRIMARY KE CREATE TABLE IF NOT EXISTS "social_auth_usersocialauth" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "provider" varchar(32) NOT NULL, "uid" varchar(255) NOT NULL, "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "created" datetime NOT NULL, "modified" datetime NOT NULL, "extra_data" text NOT NULL CHECK ((JSON_VALID("extra_data") OR "extra_data" IS NULL))); CREATE TABLE IF NOT EXISTS "social_auth_partial" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "token" varchar(32) NOT NULL, "next_step" smallint unsigned NOT NULL CHECK ("next_step" >= 0), "backend" varchar(32) NOT NULL, "timestamp" datetime NOT NULL, "data" text NOT NULL CHECK ((JSON_VALID("data") OR "data" IS NULL))); DELETE FROM sqlite_sequence; -INSERT INTO sqlite_sequence VALUES('django_migrations',200); +INSERT INTO sqlite_sequence VALUES('django_migrations',201); INSERT INTO sqlite_sequence VALUES('django_content_type',179); INSERT INTO sqlite_sequence VALUES('auth_permission',761); INSERT INTO sqlite_sequence VALUES('auth_group',0); @@ -218,15 +218,14 @@ INSERT INTO sqlite_sequence VALUES('core_relatedtickets',0); INSERT INTO sqlite_sequence VALUES('core_ticket',0); INSERT INTO sqlite_sequence VALUES('core_ticketcomment',0); INSERT INTO sqlite_sequence VALUES('core_ticketlinkeditem',0); -INSERT INTO sqlite_sequence VALUES('itam_devicesoftware',0); INSERT INTO sqlite_sequence VALUES('itam_operatingsystem',0); INSERT INTO sqlite_sequence VALUES('itam_operatingsystemversion',0); INSERT INTO sqlite_sequence VALUES('itam_softwarecategory',0); INSERT INTO sqlite_sequence VALUES('itam_softwareversion',0); INSERT INTO sqlite_sequence VALUES('settings_externallink',0); INSERT INTO sqlite_sequence VALUES('itam_software',0); -INSERT INTO sqlite_sequence VALUES('settings_usersettings',0); INSERT INTO sqlite_sequence VALUES('settings_appsettings',1); +INSERT INTO sqlite_sequence VALUES('settings_usersettings',0); INSERT INTO sqlite_sequence VALUES('access_entity',0); INSERT INTO sqlite_sequence VALUES('core_ticketbase',0); INSERT INTO sqlite_sequence VALUES('core_ticketcommentbase',0); @@ -254,6 +253,7 @@ INSERT INTO sqlite_sequence VALUES('django_celery_results_taskresult',0); INSERT INTO sqlite_sequence VALUES('itam_device',0); INSERT INTO sqlite_sequence VALUES('itam_devicemodel',0); INSERT INTO sqlite_sequence VALUES('itam_deviceoperatingsystem',0); +INSERT INTO sqlite_sequence VALUES('itam_devicesoftware',0); INSERT INTO sqlite_sequence VALUES('social_auth_association',0); INSERT INTO sqlite_sequence VALUES('social_auth_code',0); INSERT INTO sqlite_sequence VALUES('social_auth_nonce',0); diff --git a/app/itam/tests/unit/device_operating_system/test_unit_device_operating_system_model.py b/app/itam/tests/unit/device_operating_system/test_unit_device_operating_system_model.py index a3c65b20..3bf9d57a 100644 --- a/app/itam/tests/unit/device_operating_system/test_unit_device_operating_system_model.py +++ b/app/itam/tests/unit/device_operating_system/test_unit_device_operating_system_model.py @@ -20,10 +20,10 @@ class DeviceOperatingSystemModelTestCases( return { '_audit_enabled': { - 'value': models.fields.NOT_PROVIDED + 'value': False }, '_notes_enabled': { - 'value': models.fields.NOT_PROVIDED + 'value': False }, 'model_tag': { 'type': models.fields.NOT_PROVIDED, diff --git a/app/itam/tests/unit/device_software/conftest.py b/app/itam/tests/unit/device_software/conftest.py new file mode 100644 index 00000000..fdfc98e5 --- /dev/null +++ b/app/itam/tests/unit/device_software/conftest.py @@ -0,0 +1,19 @@ +import pytest + + + +@pytest.fixture( scope = 'class') +def model(model_devicesoftware): + + yield model_devicesoftware + + +@pytest.fixture( scope = 'class', autouse = True) +def model_kwargs(request, kwargs_devicesoftware): + + request.cls.kwargs_create_item = kwargs_devicesoftware.copy() + + yield kwargs_devicesoftware.copy() + + if hasattr(request.cls, 'kwargs_create_item'): + del request.cls.kwargs_create_item diff --git a/app/itam/tests/unit/device_software/device_software_api_v2.py b/app/itam/tests/unit/device_software/test_device_software_api_v2.py similarity index 99% rename from app/itam/tests/unit/device_software/device_software_api_v2.py rename to app/itam/tests/unit/device_software/test_device_software_api_v2.py index 86af2319..00451213 100644 --- a/app/itam/tests/unit/device_software/device_software_api_v2.py +++ b/app/itam/tests/unit/device_software/test_device_software_api_v2.py @@ -1,6 +1,5 @@ import django import pytest -import unittest from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType @@ -24,6 +23,8 @@ User = django.contrib.auth.get_user_model() +@pytest.mark.model_devicesoftware +@pytest.mark.module_itam class DeviceSoftwareAPI( TestCase, APITenancyObject diff --git a/app/itam/tests/unit/device_software/test_unit_device_software_model.py b/app/itam/tests/unit/device_software/test_unit_device_software_model.py index d9964c56..4f9d775d 100644 --- a/app/itam/tests/unit/device_software/test_unit_device_software_model.py +++ b/app/itam/tests/unit/device_software/test_unit_device_software_model.py @@ -1,68 +1,141 @@ import pytest -from django.test import TestCase +from django.db import models -from access.models.tenant import Tenant as Organization -from centurion.tests.unit.test_unit_models import ( - TenancyObjectInheritedCases +from core.tests.unit.centurion_abstract.test_unit_centurion_abstract_model import ( + CenturionAbstractModelInheritedCases ) -from itam.models.device import Device, DeviceSoftware -from itam.models.software import Software - -@pytest.mark.skip( reason = 'to be refactored' ) -class DeviceSoftwareModel( - TenancyObjectInheritedCases, - TestCase, +@pytest.mark.model_devicesoftware +class DeviceSoftwareModelTestCases( + CenturionAbstractModelInheritedCases ): - model = DeviceSoftware + @property + def parameterized_class_attributes(self): - @classmethod - def setUpTestData(self): - """ Setup Test - - """ - - self.organization = Organization.objects.create(name='test_org') - - - self.parent_item = Device.objects.create( - organization = self.organization, - name = 'device_name' - ) - - self.software_item = Software.objects.create( - organization = self.organization, - name = 'software_name', - ) - - self.kwargs_item_create = { - 'software': self.software_item, - 'device': self.parent_item, + return { + '_audit_enabled': { + 'value': False + }, + '_notes_enabled': { + 'value': False + }, + 'model_tag': { + 'type': models.fields.NOT_PROVIDED, + 'value': models.fields.NOT_PROVIDED + }, } - super().setUpTestData() + + @property + def parameterized_model_fields(self): + + return { + 'model_notes': { + 'blank': models.fields.NOT_PROVIDED, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.fields.NOT_PROVIDED, + 'null': models.fields.NOT_PROVIDED, + 'unique': models.fields.NOT_PROVIDED, + }, + 'device': { + 'blank': False, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.ForeignKey, + 'null': False, + 'unique': False, + }, + 'software': { + 'blank': False, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.ForeignKey, + 'null': False, + 'unique': False, + }, + 'action': { + 'blank': True, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.CharField, + 'null': True, + 'unique': False, + }, + 'version': { + 'blank': True, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.ForeignKey, + 'null': True, + 'unique': False, + }, + 'installedversion': { + 'blank': True, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.ForeignKey, + 'null': True, + 'unique': False, + }, + 'installed': { + 'blank': True, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.DateTimeField, + 'null': True, + 'unique': False, + }, + 'modified': { + 'blank': False, + 'default': models.fields.NOT_PROVIDED, + 'field_type': models.DateTimeField, + 'null': False, + 'unique': False, + }, + } - def test_model_has_property_parent_object(self): - """ Check if model contains 'parent_object' +class DeviceSoftwareModelInheritedCases( + DeviceSoftwareModelTestCases, +): + pass + + + +@pytest.mark.module_itam +class DeviceSoftwareModelPyTest( + DeviceSoftwareModelTestCases, +): + + def test_method_get_url_kwargs(self, mocker, model_instance, model_kwargs): + """Test Class Method - This is a required property for all models that have a parent + Ensure method `get_url_kwargs` returns the correct value. """ - assert hasattr(self.model, 'parent_object') + + url = model_instance.get_url_kwargs() + + assert model_instance.get_url_kwargs() == { + 'device_id': model_kwargs['device'].id, + 'pk': model_instance.id + } - def test_model_property_parent_object_returns_object(self): - """ Check if model contains 'parent_object' - - This is a required property for all models that have a parent + def test_model_tag_defined(self, model): + """ Model Tag + + Ensure that the model has a tag defined. """ - assert self.item.parent_object == self.parent_item + pytest.xfail( reason = 'model does not require' ) + + + def test_method_value_not_default___str__(self, model, model_instance ): + """Test Method + + Ensure method `__str__` does not return the default value. + """ + + pytest.xfail( reason = 'model does not require' ) diff --git a/app/itam/tests/unit/device_software/unit_device_software_viewset.py b/app/itam/tests/unit/device_software/test_unit_device_software_viewset.py similarity index 92% rename from app/itam/tests/unit/device_software/unit_device_software_viewset.py rename to app/itam/tests/unit/device_software/test_unit_device_software_viewset.py index 58fc3a0a..326852ef 100644 --- a/app/itam/tests/unit/device_software/unit_device_software_viewset.py +++ b/app/itam/tests/unit/device_software/test_unit_device_software_viewset.py @@ -1,3 +1,5 @@ +import pytest + from django.test import Client, TestCase from rest_framework.reverse import reverse @@ -9,6 +11,8 @@ from itam.viewsets.device_software import ViewSet +@pytest.mark.model_devicesoftware +@pytest.mark.module_itam class DeviceSoftwareViewsetList( ModelViewSetInheritedCases, TestCase, diff --git a/app/tests/fixtures/__init__.py b/app/tests/fixtures/__init__.py index 0c1c62c7..2e41867e 100644 --- a/app/tests/fixtures/__init__.py +++ b/app/tests/fixtures/__init__.py @@ -77,6 +77,11 @@ from .model_deviceoperatingsystem import ( model_deviceoperatingsystem, ) +from .model_devicesoftware import ( + kwargs_devicesoftware, + model_devicesoftware, +) + from .model_devicetype import ( kwargs_devicetype, model_devicetype, @@ -158,6 +163,11 @@ from .model_softwareenablefeatureflag import ( kwargs_softwareenablefeatureflag, ) +from .model_softwareversion import ( + kwargs_softwareversion, + model_softwareversion, +) + from .model_team import ( kwargs_team, model_team, diff --git a/app/tests/fixtures/model_devicesoftware.py b/app/tests/fixtures/model_devicesoftware.py new file mode 100644 index 00000000..75a24d16 --- /dev/null +++ b/app/tests/fixtures/model_devicesoftware.py @@ -0,0 +1,51 @@ +import datetime +import pytest + +from itam.models.device import DeviceSoftware + + + +@pytest.fixture( scope = 'class') +def model_devicesoftware(): + + yield DeviceSoftware + + +@pytest.fixture( scope = 'class') +def kwargs_devicesoftware(django_db_blocker, + kwargs_centurionmodel, + kwargs_device, model_device, + kwargs_softwareversion, model_softwareversion +): + + random_str = str(datetime.datetime.now(tz=datetime.timezone.utc)) + random_str = str(random_str).replace( + ' ', '').replace(':', '').replace('+', '').replace('.', '') + + with django_db_blocker.unblock(): + + device = model_device.objects.create( + **kwargs_device.copy() + ) + + softwareversion = model_softwareversion.objects.create( + **kwargs_softwareversion + ) + + kwargs = { + **kwargs_centurionmodel.copy(), + 'device': device, + 'software': kwargs_softwareversion['software'], + 'action': DeviceSoftware.Actions.INSTALL, + 'version': softwareversion, + 'installedversion': softwareversion, + 'installed': '2025-06-11T17:38:00Z', + } + + yield kwargs.copy() + + with django_db_blocker.unblock(): + + device.delete() + + softwareversion.delete() diff --git a/app/tests/fixtures/model_softwareversion.py b/app/tests/fixtures/model_softwareversion.py new file mode 100644 index 00000000..8b72e951 --- /dev/null +++ b/app/tests/fixtures/model_softwareversion.py @@ -0,0 +1,36 @@ +import datetime +import pytest + +from itam.models.software import SoftwareVersion + + + +@pytest.fixture( scope = 'class') +def model_softwareversion(request): + + yield SoftwareVersion + + +@pytest.fixture( scope = 'class') +def kwargs_softwareversion(django_db_blocker, + kwargs_centurionmodel, + kwargs_software, model_software +): + + random_str = str(datetime.datetime.now(tz=datetime.timezone.utc)) + + with django_db_blocker.unblock(): + + software = model_software.objects.create( **kwargs_software ) + + kwargs = { + **kwargs_centurionmodel.copy(), + 'software': software, + 'name': 'softwareversion_' + random_str, + } + + yield kwargs.copy() + + with django_db_blocker.unblock(): + + software.delete() diff --git a/pyproject.toml b/pyproject.toml index a15d352c..6abec857 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1079,6 +1079,7 @@ markers = [ "model_device: Select all Device tests", "model_devicemodel: Select all device model tests.", "model_deviceoperatingsystem: Select tests for model Device Operating System", + "model_devicesoftware: Select tests for model Device Software.", "model_devicetype: Select all device type tests.", "model_featureflag: Feature Flag Model", "model_gitgroup: Selects tests for model `git group`", @@ -1090,7 +1091,9 @@ markers = [ "model_manufacturer: Select all manufacturer tests.", "model_operatingsystem: Select tests for model Operating System", "model_operatingsystemversion: Select tests for model Operating System Version", + "model_software: Selects tests for model Software.", "model_softwareenablefeatureflag: Selects tests for model Software Enabled Feature Flag.", + "model_softwareversion: Selects tests for model Software Version.", "model_ticketcategory: Select all ticket category tests.", "model_ticketcommentcategory: Select all ticket comment category tests.", "models: Selects all models tests.",