mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
* 14042 fix cache count for mptt child delete * 14042 add test * Misc cleanup --------- Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
107 lines
4.1 KiB
Python
107 lines
4.1 KiB
Python
from django.contrib.contenttypes.models import ContentType
|
|
from django.test import override_settings
|
|
from django.urls import reverse
|
|
|
|
from dcim.models import *
|
|
from users.models import ObjectPermission
|
|
from utilities.testing.base import TestCase
|
|
from utilities.testing.utils import create_test_device, create_test_user
|
|
|
|
|
|
class CountersTest(TestCase):
|
|
"""
|
|
Validate the operation of dict_to_filter_params().
|
|
"""
|
|
@classmethod
|
|
def setUpTestData(cls):
|
|
# Create devices
|
|
device1 = create_test_device('Device 1')
|
|
device2 = create_test_device('Device 2')
|
|
|
|
# Create interfaces
|
|
Interface.objects.create(device=device1, name='Interface 1')
|
|
Interface.objects.create(device=device1, name='Interface 2')
|
|
Interface.objects.create(device=device2, name='Interface 3')
|
|
Interface.objects.create(device=device2, name='Interface 4')
|
|
|
|
def test_interface_count_creation(self):
|
|
"""
|
|
When a tracked object (Interface) is added the tracking counter should be updated.
|
|
"""
|
|
device1, device2 = Device.objects.all()
|
|
self.assertEqual(device1.interface_count, 2)
|
|
self.assertEqual(device2.interface_count, 2)
|
|
|
|
interface1 = Interface.objects.create(device=device1, name='Interface 5')
|
|
Interface.objects.create(device=device2, name='Interface 6')
|
|
device1.refresh_from_db()
|
|
device2.refresh_from_db()
|
|
self.assertEqual(device1.interface_count, 3)
|
|
self.assertEqual(device2.interface_count, 3)
|
|
|
|
# test saving an existing object - counter should not change
|
|
interface1.save()
|
|
device1.refresh_from_db()
|
|
self.assertEqual(device1.interface_count, 3)
|
|
|
|
# test save where tracked object FK back pointer is None
|
|
vc = VirtualChassis.objects.create(name='Virtual Chassis 1')
|
|
device1.virtual_chassis = vc
|
|
device1.save()
|
|
vc.refresh_from_db()
|
|
self.assertEqual(vc.member_count, 1)
|
|
|
|
def test_interface_count_deletion(self):
|
|
"""
|
|
When a tracked object (Interface) is deleted the tracking counter should be updated.
|
|
"""
|
|
device1, device2 = Device.objects.all()
|
|
self.assertEqual(device1.interface_count, 2)
|
|
self.assertEqual(device2.interface_count, 2)
|
|
|
|
Interface.objects.get(name='Interface 1').delete()
|
|
Interface.objects.get(name='Interface 3').delete()
|
|
device1.refresh_from_db()
|
|
device2.refresh_from_db()
|
|
self.assertEqual(device1.interface_count, 1)
|
|
self.assertEqual(device2.interface_count, 1)
|
|
|
|
def test_interface_count_move(self):
|
|
"""
|
|
When a tracked object (Interface) is moved the tracking counter should be updated.
|
|
"""
|
|
device1, device2 = Device.objects.all()
|
|
self.assertEqual(device1.interface_count, 2)
|
|
self.assertEqual(device2.interface_count, 2)
|
|
|
|
interface1 = Interface.objects.get(name='Interface 1')
|
|
interface1.device = device2
|
|
interface1.save()
|
|
|
|
device1.refresh_from_db()
|
|
device2.refresh_from_db()
|
|
self.assertEqual(device1.interface_count, 1)
|
|
self.assertEqual(device2.interface_count, 3)
|
|
|
|
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
|
|
def test_mptt_child_delete(self):
|
|
device1, device2 = Device.objects.all()
|
|
inventory_item1 = InventoryItem.objects.create(device=device1, name='Inventory Item 1')
|
|
inventory_item2 = InventoryItem.objects.create(device=device1, name='Inventory Item 2', parent=inventory_item1)
|
|
device1.refresh_from_db()
|
|
self.assertEqual(device1.inventory_item_count, 2)
|
|
|
|
# Setup bulk_delete for the inventory items
|
|
self.add_permissions('dcim.delete_inventoryitem')
|
|
pk_list = device1.inventoryitems.values_list('pk', flat=True)
|
|
data = {
|
|
'pk': pk_list,
|
|
'confirm': True,
|
|
'_confirm': True, # Form button
|
|
}
|
|
|
|
# Try POST with model-level permission
|
|
self.client.post(reverse("dcim:inventoryitem_bulk_delete"), data)
|
|
device1.refresh_from_db()
|
|
self.assertEqual(device1.inventory_item_count, 0)
|