#21361 Expand unit tests for ObjectChange and testing asserts (#21905)

* #21361 Expand unit tests for ObjectChange and testing asserts

* cleanup

* review feedback

* review feedback

* cleanup

* cleanup

* cleanup

* cleanup
This commit is contained in:
Arthur Hanson 2026-04-16 13:42:57 -07:00 committed by GitHub
parent 4fb9410aa9
commit a6cc0b671e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 21 deletions

View File

@ -253,7 +253,8 @@ class APIViewTestCases:
changed_object_id=instance.pk, changed_object_id=instance.pk,
action=ObjectChangeActionChoices.ACTION_CREATE, action=ObjectChangeActionChoices.ACTION_CREATE,
) )
self.assertEqual(objectchange.message, data['changelog_message']) self.assertObjectChange(objectchange, action=ObjectChangeActionChoices.ACTION_CREATE,
message=data['changelog_message'])
def test_bulk_create_objects(self): def test_bulk_create_objects(self):
""" """
@ -306,7 +307,8 @@ class APIViewTestCases:
) )
self.assertEqual(len(objectchanges), len(self.create_data)) self.assertEqual(len(objectchanges), len(self.create_data))
for oc in objectchanges: for oc in objectchanges:
self.assertEqual(oc.message, changelog_message) self.assertObjectChange(oc, action=ObjectChangeActionChoices.ACTION_CREATE,
message=changelog_message)
class UpdateObjectViewTestCase(APITestCase): class UpdateObjectViewTestCase(APITestCase):
update_data = {} update_data = {}
@ -364,8 +366,8 @@ class APIViewTestCases:
changed_object_type=ContentType.objects.get_for_model(instance), changed_object_type=ContentType.objects.get_for_model(instance),
changed_object_id=instance.pk changed_object_id=instance.pk
) )
self.assertEqual(objectchange.action, ObjectChangeActionChoices.ACTION_UPDATE) self.assertObjectChange(objectchange, action=ObjectChangeActionChoices.ACTION_UPDATE,
self.assertEqual(objectchange.message, data['changelog_message']) message=data['changelog_message'])
def test_bulk_update_objects(self): def test_bulk_update_objects(self):
""" """
@ -414,8 +416,8 @@ class APIViewTestCases:
) )
self.assertEqual(len(objectchanges), len(data)) self.assertEqual(len(objectchanges), len(data))
for oc in objectchanges: for oc in objectchanges:
self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_UPDATE) self.assertObjectChange(oc, action=ObjectChangeActionChoices.ACTION_UPDATE,
self.assertEqual(oc.message, changelog_message) message=changelog_message)
class DeleteObjectViewTestCase(APITestCase): class DeleteObjectViewTestCase(APITestCase):
@ -462,8 +464,8 @@ class APIViewTestCases:
changed_object_type=ContentType.objects.get_for_model(instance), changed_object_type=ContentType.objects.get_for_model(instance),
changed_object_id=instance.pk changed_object_id=instance.pk
) )
self.assertEqual(objectchange.action, ObjectChangeActionChoices.ACTION_DELETE) self.assertObjectChange(objectchange, action=ObjectChangeActionChoices.ACTION_DELETE,
self.assertEqual(objectchange.message, data['changelog_message']) message=data['changelog_message'])
def test_bulk_delete_objects(self): def test_bulk_delete_objects(self):
""" """
@ -503,8 +505,8 @@ class APIViewTestCases:
) )
self.assertEqual(len(objectchanges), len(data)) self.assertEqual(len(objectchanges), len(data))
for oc in objectchanges: for oc in objectchanges:
self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_DELETE) self.assertObjectChange(oc, action=ObjectChangeActionChoices.ACTION_DELETE,
self.assertEqual(oc.message, changelog_message) message=changelog_message)
class GraphQLTestCase(APITestCase): class GraphQLTestCase(APITestCase):

View File

@ -13,6 +13,7 @@ from django.test import TestCase as _TestCase
from netaddr import IPNetwork from netaddr import IPNetwork
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from core.choices import ObjectChangeActionChoices
from core.models import ObjectType from core.models import ObjectType
from users.models import ObjectPermission, User from users.models import ObjectPermission, User
from utilities.data import ranges_to_string from utilities.data import ranges_to_string
@ -83,6 +84,30 @@ class TestCase(_TestCase):
# Custom assertions # Custom assertions
# #
def assertObjectChange(self, objectchange, *, action, message=None):
"""
Assert that an ObjectChange record has the expected attributes. If message is provided, it will be
compared against objectchange.message.
"""
# Verify the change action (create, update, delete)
self.assertEqual(objectchange.action, action)
# Verify the changelog message if provided
if message is not None:
self.assertEqual(objectchange.message, message)
# Verify pre/postchange data presence and integrity based on action type
if action == ObjectChangeActionChoices.ACTION_CREATE:
self.assertIsNone(objectchange.prechange_data, "Expected prechange_data to be None for a create")
self.assertIsNotNone(objectchange.postchange_data, "Expected postchange_data to be populated for a create")
elif action == ObjectChangeActionChoices.ACTION_UPDATE:
self.assertIsNotNone(objectchange.prechange_data, "Expected prechange_data to be populated for an update")
self.assertIsNotNone(objectchange.postchange_data, "Expected postchange_data to be populated for an update")
self.assertNotEqual(objectchange.prechange_data, objectchange.postchange_data)
elif action == ObjectChangeActionChoices.ACTION_DELETE:
self.assertIsNotNone(objectchange.prechange_data, "Expected prechange_data to be populated for a delete")
self.assertIsNone(objectchange.postchange_data, "Expected postchange_data to be None for a delete")
def assertHttpStatus(self, response, expected_status): def assertHttpStatus(self, response, expected_status):
""" """
TestCase method. Provide more detail in the event of an unexpected HTTP response. TestCase method. Provide more detail in the event of an unexpected HTTP response.

View File

@ -192,8 +192,8 @@ class ViewTestCases:
changed_object_id=instance.pk changed_object_id=instance.pk
) )
self.assertEqual(len(objectchanges), 1) self.assertEqual(len(objectchanges), 1)
self.assertEqual(objectchanges[0].action, ObjectChangeActionChoices.ACTION_CREATE) self.assertObjectChange(objectchanges[0], action=ObjectChangeActionChoices.ACTION_CREATE,
self.assertEqual(objectchanges[0].message, self.form_data['changelog_message']) message=self.form_data['changelog_message'])
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[])
def test_create_object_with_constrained_permission(self): def test_create_object_with_constrained_permission(self):
@ -299,8 +299,8 @@ class ViewTestCases:
changed_object_id=instance.pk changed_object_id=instance.pk
) )
self.assertEqual(len(objectchanges), 1) self.assertEqual(len(objectchanges), 1)
self.assertEqual(objectchanges[0].action, ObjectChangeActionChoices.ACTION_UPDATE) self.assertObjectChange(objectchanges[0], action=ObjectChangeActionChoices.ACTION_UPDATE,
self.assertEqual(objectchanges[0].message, self.form_data['changelog_message']) message=self.form_data['changelog_message'])
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[])
def test_edit_object_with_constrained_permission(self): def test_edit_object_with_constrained_permission(self):
@ -394,8 +394,8 @@ class ViewTestCases:
changed_object_id=instance.pk changed_object_id=instance.pk
) )
self.assertEqual(len(objectchanges), 1) self.assertEqual(len(objectchanges), 1)
self.assertEqual(objectchanges[0].action, ObjectChangeActionChoices.ACTION_DELETE) self.assertObjectChange(objectchanges[0], action=ObjectChangeActionChoices.ACTION_DELETE,
self.assertEqual(objectchanges[0].message, form_data['changelog_message']) message=form_data['changelog_message'])
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
def test_delete_object_with_constrained_permission(self): def test_delete_object_with_constrained_permission(self):
@ -716,7 +716,8 @@ class ViewTestCases:
self.assertEqual(len(objectchanges), expected_new_objects) self.assertEqual(len(objectchanges), expected_new_objects)
for oc in objectchanges: for oc in objectchanges:
self.assertEqual(oc.message, data['changelog_message']) self.assertObjectChange(oc, action=ObjectChangeActionChoices.ACTION_CREATE,
message=data['changelog_message'])
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
def test_bulk_update_objects_with_permission(self): def test_bulk_update_objects_with_permission(self):
@ -868,8 +869,8 @@ class ViewTestCases:
) )
self.assertEqual(len(objectchanges), len(pk_list)) self.assertEqual(len(objectchanges), len(pk_list))
for oc in objectchanges: for oc in objectchanges:
self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_UPDATE) self.assertObjectChange(oc, action=ObjectChangeActionChoices.ACTION_UPDATE,
self.assertEqual(oc.message, data['changelog_message']) message=data['changelog_message'])
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[])
def test_bulk_edit_objects_with_constrained_permission(self): def test_bulk_edit_objects_with_constrained_permission(self):
@ -964,8 +965,8 @@ class ViewTestCases:
) )
self.assertEqual(len(objectchanges), len(pk_list)) self.assertEqual(len(objectchanges), len(pk_list))
for oc in objectchanges: for oc in objectchanges:
self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_DELETE) self.assertObjectChange(oc, action=ObjectChangeActionChoices.ACTION_DELETE,
self.assertEqual(oc.message, data['changelog_message']) message=data['changelog_message'])
def test_bulk_delete_objects_with_constrained_permission(self): def test_bulk_delete_objects_with_constrained_permission(self):
pk_list = self._get_queryset().values_list('pk', flat=True) pk_list = self._get_queryset().values_list('pk', flat=True)