Explorar el Código

Clean up tests

jeremystretch hace 3 años
padre
commit
d4a231585a

+ 15 - 15
netbox/dcim/tests/test_api.py

@@ -1954,37 +1954,37 @@ class CableTest(APIViewTestCases.APIViewTestCase):
 
 class ConnectedDeviceTest(APITestCase):
 
-    def setUp(self):
-
-        super().setUp()
-
+    @classmethod
+    def setUpTestData(cls):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1', color='ff0000')
-        self.device1 = Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site
+        devices = (
+            Device(device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site),
+            Device(device_type=devicetype, device_role=devicerole, name='TestDevice2', site=site),
         )
-        self.device2 = Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestDevice2', site=site
+        Device.objects.bulk_create(devices)
+        interfaces = (
+            Interface(device=devices[0], name='eth0'),
+            Interface(device=devices[1], name='eth0'),
+            Interface(device=devices[0], name='eth1'),  # Not connected
         )
-        self.interface1 = Interface.objects.create(device=self.device1, name='eth0')
-        self.interface2 = Interface.objects.create(device=self.device2, name='eth0')
-        self.interface3 = Interface.objects.create(device=self.device1, name='eth1')  # Not connected
+        Interface.objects.bulk_create(interfaces)
 
-        cable = Cable(a_terminations=[self.interface1], b_terminations=[self.interface2])
+        cable = Cable(a_terminations=[interfaces[0]], b_terminations=[interfaces[1]])
         cable.save()
 
     @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
     def test_get_connected_device(self):
         url = reverse('dcim-api:connected-device-list')
 
-        url_params = f'?peer_device={self.device1.name}&peer_interface={self.interface1.name}'
+        url_params = f'?peer_device=TestDevice1&peer_interface=eth0'
         response = self.client.get(url + url_params, **self.header)
         self.assertHttpStatus(response, status.HTTP_200_OK)
-        self.assertEqual(response.data['name'], self.device2.name)
+        self.assertEqual(response.data['name'], 'TestDevice2')
 
-        url_params = f'?peer_device={self.device1.name}&peer_interface={self.interface3.name}'
+        url_params = f'?peer_device=TestDevice1&peer_interface=eth1'
         response = self.client.get(url + url_params, **self.header)
         self.assertHttpStatus(response, status.HTTP_404_NOT_FOUND)
 

+ 124 - 92
netbox/dcim/tests/test_models.py

@@ -73,7 +73,8 @@ class LocationTestCase(TestCase):
 
 class RackTestCase(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
         sites = (
             Site(name='Site 1', slug='site-1'),
@@ -240,30 +241,31 @@ class RackTestCase(TestCase):
 
 class DeviceTestCase(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
-        self.site = Site.objects.create(name='Test Site 1', slug='test-site-1')
+        site = Site.objects.create(name='Test Site 1', slug='test-site-1')
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
-        self.device_type = DeviceType.objects.create(
+        device_type = DeviceType.objects.create(
             manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
         )
-        self.device_role = DeviceRole.objects.create(
+        device_role = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
 
         # Create DeviceType components
         ConsolePortTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Console Port 1'
         ).save()
 
         ConsoleServerPortTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Console Server Port 1'
         ).save()
 
         ppt = PowerPortTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Power Port 1',
             maximum_draw=1000,
             allocated_draw=500
@@ -271,21 +273,21 @@ class DeviceTestCase(TestCase):
         ppt.save()
 
         PowerOutletTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Power Outlet 1',
             power_port=ppt,
             feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A
         ).save()
 
         InterfaceTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Interface 1',
             type=InterfaceTypeChoices.TYPE_1GE_FIXED,
             mgmt_only=True
         ).save()
 
         rpt = RearPortTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Rear Port 1',
             type=PortTypeChoices.TYPE_8P8C,
             positions=8
@@ -293,7 +295,7 @@ class DeviceTestCase(TestCase):
         rpt.save()
 
         FrontPortTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Front Port 1',
             type=PortTypeChoices.TYPE_8P8C,
             rear_port=rpt,
@@ -301,12 +303,12 @@ class DeviceTestCase(TestCase):
         ).save()
 
         ModuleBayTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Module Bay 1'
         ).save()
 
         DeviceBayTemplate(
-            device_type=self.device_type,
+            device_type=device_type,
             name='Device Bay 1'
         ).save()
 
@@ -315,9 +317,9 @@ class DeviceTestCase(TestCase):
         Ensure that all Device components are copied automatically from the DeviceType.
         """
         d = Device(
-            site=self.site,
-            device_type=self.device_type,
-            device_role=self.device_role,
+            site=Site.objects.first(),
+            device_type=DeviceType.objects.first(),
+            device_role=DeviceRole.objects.first(),
             name='Test Device 1'
         )
         d.save()
@@ -381,9 +383,9 @@ class DeviceTestCase(TestCase):
     def test_multiple_unnamed_devices(self):
 
         device1 = Device(
-            site=self.site,
-            device_type=self.device_type,
-            device_role=self.device_role,
+            site=Site.objects.first(),
+            device_type=DeviceType.objects.first(),
+            device_role=DeviceRole.objects.first(),
             name=None
         )
         device1.save()
@@ -402,9 +404,9 @@ class DeviceTestCase(TestCase):
     def test_device_name_case_sensitivity(self):
 
         device1 = Device(
-            site=self.site,
-            device_type=self.device_type,
-            device_role=self.device_role,
+            site=Site.objects.first(),
+            device_type=DeviceType.objects.first(),
+            device_role=DeviceRole.objects.first(),
             name='device 1'
         )
         device1.save()
@@ -423,9 +425,9 @@ class DeviceTestCase(TestCase):
     def test_device_duplicate_names(self):
 
         device1 = Device(
-            site=self.site,
-            device_type=self.device_type,
-            device_role=self.device_role,
+            site=Site.objects.first(),
+            device_type=DeviceType.objects.first(),
+            device_role=DeviceRole.objects.first(),
             name='Test Device 1'
         )
         device1.save()
@@ -459,7 +461,8 @@ class DeviceTestCase(TestCase):
 
 class CableTestCase(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
         site = Site.objects.create(name='Test Site 1', slug='test-site-1')
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
@@ -469,72 +472,76 @@ class CableTestCase(TestCase):
         devicerole = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
-        self.device1 = Device.objects.create(
+        device1 = Device.objects.create(
             device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site
         )
-        self.device2 = Device.objects.create(
+        device2 = Device.objects.create(
             device_type=devicetype, device_role=devicerole, name='TestDevice2', site=site
         )
-        self.interface1 = Interface.objects.create(device=self.device1, name='eth0')
-        self.interface2 = Interface.objects.create(device=self.device2, name='eth0')
-        self.interface3 = Interface.objects.create(device=self.device2, name='eth1')
-        self.cable = Cable(a_terminations=[self.interface1], b_terminations=[self.interface2])
-        self.cable.save()
-
-        self.power_port1 = PowerPort.objects.create(device=self.device2, name='psu1')
-        self.patch_pannel = Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestPatchPannel', site=site
-        )
-        self.rear_port1 = RearPort.objects.create(device=self.patch_pannel, name='RP1', type='8p8c')
-        self.front_port1 = FrontPort.objects.create(
-            device=self.patch_pannel, name='FP1', type='8p8c', rear_port=self.rear_port1, rear_port_position=1
-        )
-        self.rear_port2 = RearPort.objects.create(device=self.patch_pannel, name='RP2', type='8p8c', positions=2)
-        self.front_port2 = FrontPort.objects.create(
-            device=self.patch_pannel, name='FP2', type='8p8c', rear_port=self.rear_port2, rear_port_position=1
-        )
-        self.rear_port3 = RearPort.objects.create(device=self.patch_pannel, name='RP3', type='8p8c', positions=3)
-        self.front_port3 = FrontPort.objects.create(
-            device=self.patch_pannel, name='FP3', type='8p8c', rear_port=self.rear_port3, rear_port_position=1
-        )
-        self.rear_port4 = RearPort.objects.create(device=self.patch_pannel, name='RP4', type='8p8c', positions=3)
-        self.front_port4 = FrontPort.objects.create(
-            device=self.patch_pannel, name='FP4', type='8p8c', rear_port=self.rear_port4, rear_port_position=1
-        )
-        self.provider = Provider.objects.create(name='Provider 1', slug='provider-1')
-        provider_network = ProviderNetwork.objects.create(name='Provider Network 1', provider=self.provider)
-        self.circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1')
-        self.circuit1 = Circuit.objects.create(provider=self.provider, type=self.circuittype, cid='1')
-        self.circuit2 = Circuit.objects.create(provider=self.provider, type=self.circuittype, cid='2')
-        self.circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit1, site=site, term_side='A')
-        self.circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit1, site=site, term_side='Z')
-        self.circuittermination3 = CircuitTermination.objects.create(circuit=self.circuit2, provider_network=provider_network, term_side='A')
+        interface1 = Interface.objects.create(device=device1, name='eth0')
+        interface2 = Interface.objects.create(device=device2, name='eth0')
+        interface3 = Interface.objects.create(device=device2, name='eth1')
+        Cable(a_terminations=[interface1], b_terminations=[interface2]).save()
+
+        power_port1 = PowerPort.objects.create(device=device2, name='psu1')
+        patch_pannel = Device.objects.create(
+            device_type=devicetype, device_role=devicerole, name='TestPatchPanel', site=site
+        )
+        rear_port1 = RearPort.objects.create(device=patch_pannel, name='RP1', type='8p8c')
+        front_port1 = FrontPort.objects.create(
+            device=patch_pannel, name='FP1', type='8p8c', rear_port=rear_port1, rear_port_position=1
+        )
+        rear_port2 = RearPort.objects.create(device=patch_pannel, name='RP2', type='8p8c', positions=2)
+        front_port2 = FrontPort.objects.create(
+            device=patch_pannel, name='FP2', type='8p8c', rear_port=rear_port2, rear_port_position=1
+        )
+        rear_port3 = RearPort.objects.create(device=patch_pannel, name='RP3', type='8p8c', positions=3)
+        front_port3 = FrontPort.objects.create(
+            device=patch_pannel, name='FP3', type='8p8c', rear_port=rear_port3, rear_port_position=1
+        )
+        rear_port4 = RearPort.objects.create(device=patch_pannel, name='RP4', type='8p8c', positions=3)
+        front_port4 = FrontPort.objects.create(
+            device=patch_pannel, name='FP4', type='8p8c', rear_port=rear_port4, rear_port_position=1
+        )
+        provider = Provider.objects.create(name='Provider 1', slug='provider-1')
+        provider_network = ProviderNetwork.objects.create(name='Provider Network 1', provider=provider)
+        circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1')
+        circuit1 = Circuit.objects.create(provider=provider, type=circuittype, cid='1')
+        circuit2 = Circuit.objects.create(provider=provider, type=circuittype, cid='2')
+        circuittermination1 = CircuitTermination.objects.create(circuit=circuit1, site=site, term_side='A')
+        circuittermination2 = CircuitTermination.objects.create(circuit=circuit1, site=site, term_side='Z')
+        circuittermination3 = CircuitTermination.objects.create(circuit=circuit2, provider_network=provider_network, term_side='A')
 
     def test_cable_creation(self):
         """
         When a new Cable is created, it must be cached on either termination point.
         """
-        self.interface1.refresh_from_db()
-        self.interface2.refresh_from_db()
-        self.assertEqual(self.interface1.cable, self.cable)
-        self.assertEqual(self.interface2.cable, self.cable)
-        self.assertEqual(self.interface1.cable_end, 'A')
-        self.assertEqual(self.interface2.cable_end, 'B')
-        self.assertEqual(self.interface1.link_peers, [self.interface2])
-        self.assertEqual(self.interface2.link_peers, [self.interface1])
+        interface1 = Interface.objects.get(device__name='TestDevice1', name='eth0')
+        interface2 = Interface.objects.get(device__name='TestDevice2', name='eth0')
+        cable = Cable.objects.first()
+        self.assertEqual(interface1.cable, cable)
+        self.assertEqual(interface2.cable, cable)
+        self.assertEqual(interface1.cable_end, 'A')
+        self.assertEqual(interface2.cable_end, 'B')
+        self.assertEqual(interface1.link_peers, [interface2])
+        self.assertEqual(interface2.link_peers, [interface1])
 
     def test_cable_deletion(self):
         """
         When a Cable is deleted, the `cable` field on its termination points must be nullified. The str() method
         should still return the PK of the string even after being nullified.
         """
-        self.cable.delete()
-        self.assertIsNone(self.cable.pk)
-        self.assertNotEqual(str(self.cable), '#None')
-        interface1 = Interface.objects.get(pk=self.interface1.pk)
+        interface1 = Interface.objects.get(device__name='TestDevice1', name='eth0')
+        interface2 = Interface.objects.get(device__name='TestDevice2', name='eth0')
+        cable = Cable.objects.first()
+
+        cable.delete()
+        self.assertIsNone(cable.pk)
+        self.assertNotEqual(str(cable), '#None')
+        interface1 = Interface.objects.get(pk=interface1.pk)
         self.assertIsNone(interface1.cable)
         self.assertListEqual(interface1.link_peers, [])
-        interface2 = Interface.objects.get(pk=self.interface2.pk)
+        interface2 = Interface.objects.get(pk=interface2.pk)
         self.assertIsNone(interface2.cable)
         self.assertListEqual(interface2.link_peers, [])
 
@@ -542,7 +549,10 @@ class CableTestCase(TestCase):
         """
         The clean method should ensure that all terminations at either end of a Cable belong to the same parent object.
         """
-        cable = Cable(a_terminations=[self.interface1], b_terminations=[self.power_port1])
+        interface1 = Interface.objects.get(device__name='TestDevice1', name='eth0')
+        powerport1 = PowerPort.objects.get(device__name='TestDevice2', name='psu1')
+
+        cable = Cable(a_terminations=[interface1], b_terminations=[powerport1])
         with self.assertRaises(ValidationError):
             cable.clean()
 
@@ -550,7 +560,11 @@ class CableTestCase(TestCase):
         """
         The clean method should ensure that all terminations at either end of a Cable are of the same type.
         """
-        cable = Cable(a_terminations=[self.front_port1, self.rear_port1], b_terminations=[self.interface1])
+        interface1 = Interface.objects.get(device__name='TestDevice1', name='eth0')
+        frontport1 = FrontPort.objects.get(device__name='TestPatchPanel', name='FP1')
+        rearport1 = RearPort.objects.get(device__name='TestPatchPanel', name='RP1')
+
+        cable = Cable(a_terminations=[frontport1, rearport1], b_terminations=[interface1])
         with self.assertRaises(ValidationError):
             cable.clean()
 
@@ -558,8 +572,11 @@ class CableTestCase(TestCase):
         """
         The clean method should have a check to ensure only compatible port types can be connected by a cable
         """
+        interface1 = Interface.objects.get(device__name='TestDevice1', name='eth0')
+        powerport1 = PowerPort.objects.get(device__name='TestDevice2', name='psu1')
+
         # An interface cannot be connected to a power port, for example
-        cable = Cable(a_terminations=[self.interface1], b_terminations=[self.power_port1])
+        cable = Cable(a_terminations=[interface1], b_terminations=[powerport1])
         with self.assertRaises(ValidationError):
             cable.clean()
 
@@ -567,7 +584,10 @@ class CableTestCase(TestCase):
         """
         Neither side of a cable can be terminated to a CircuitTermination which is attached to a ProviderNetwork
         """
-        cable = Cable(a_terminations=[self.interface3], b_terminations=[self.circuittermination3])
+        interface3 = Interface.objects.get(device__name='TestDevice2', name='eth1')
+        circuittermination3 = CircuitTermination.objects.get(circuit__cid='2', term_side='A')
+
+        cable = Cable(a_terminations=[interface3], b_terminations=[circuittermination3])
         with self.assertRaises(ValidationError):
             cable.clean()
 
@@ -575,8 +595,11 @@ class CableTestCase(TestCase):
         """
         A cable cannot terminate to a virtual interface
         """
-        virtual_interface = Interface(device=self.device1, name="V1", type=InterfaceTypeChoices.TYPE_VIRTUAL)
-        cable = Cable(a_terminations=[self.interface2], b_terminations=[virtual_interface])
+        device1 = Device.objects.get(name='TestDevice1')
+        interface2 = Interface.objects.get(device__name='TestDevice2', name='eth0')
+
+        virtual_interface = Interface(device=device1, name="V1", type=InterfaceTypeChoices.TYPE_VIRTUAL)
+        cable = Cable(a_terminations=[interface2], b_terminations=[virtual_interface])
         with self.assertRaises(ValidationError):
             cable.clean()
 
@@ -584,15 +607,19 @@ class CableTestCase(TestCase):
         """
         A cable cannot terminate to a wireless interface
         """
-        wireless_interface = Interface(device=self.device1, name="W1", type=InterfaceTypeChoices.TYPE_80211A)
-        cable = Cable(a_terminations=[self.interface2], b_terminations=[wireless_interface])
+        device1 = Device.objects.get(name='TestDevice1')
+        interface2 = Interface.objects.get(device__name='TestDevice2', name='eth0')
+
+        wireless_interface = Interface(device=device1, name="W1", type=InterfaceTypeChoices.TYPE_80211A)
+        cable = Cable(a_terminations=[interface2], b_terminations=[wireless_interface])
         with self.assertRaises(ValidationError):
             cable.clean()
 
 
 class VirtualDeviceContextTestCase(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
         site = Site.objects.create(name='Test Site 1', slug='test-site-1')
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
@@ -602,36 +629,41 @@ class VirtualDeviceContextTestCase(TestCase):
         devicerole = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
-        self.device = Device.objects.create(
+        Device.objects.create(
             device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site
         )
 
     def test_vdc_and_interface_creation(self):
+        device = Device.objects.first()
 
-        vdc = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=1, status='active')
+        vdc = VirtualDeviceContext(device=device, name="VDC 1", identifier=1, status='active')
         vdc.full_clean()
         vdc.save()
 
-        interface = Interface(device=self.device, name='Eth1/1', type='10gbase-t')
+        interface = Interface(device=device, name='Eth1/1', type='10gbase-t')
         interface.full_clean()
         interface.save()
 
         interface.vdcs.set([vdc])
 
     def test_vdc_duplicate_name(self):
-        vdc1 = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=1, status='active')
+        device = Device.objects.first()
+
+        vdc1 = VirtualDeviceContext(device=device, name="VDC 1", identifier=1, status='active')
         vdc1.full_clean()
         vdc1.save()
 
-        vdc2 = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=2, status='active')
+        vdc2 = VirtualDeviceContext(device=device, name="VDC 1", identifier=2, status='active')
         with self.assertRaises(ValidationError):
             vdc2.full_clean()
 
     def test_vdc_duplicate_identifier(self):
-        vdc1 = VirtualDeviceContext(device=self.device, name="VDC 1", identifier=1, status='active')
+        device = Device.objects.first()
+
+        vdc1 = VirtualDeviceContext(device=device, name="VDC 1", identifier=1, status='active')
         vdc1.full_clean()
         vdc1.save()
 
-        vdc2 = VirtualDeviceContext(device=self.device, name="VDC 2", identifier=1, status='active')
+        vdc2 = VirtualDeviceContext(device=device, name="VDC 2", identifier=1, status='active')
         with self.assertRaises(ValidationError):
             vdc2.full_clean()

+ 15 - 14
netbox/dcim/tests/test_natural_ordering.py

@@ -5,7 +5,8 @@ from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer,
 
 class NaturalOrderingTestCase(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
         site = Site.objects.create(name='Test Site 1', slug='test-site-1')
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
@@ -15,12 +16,12 @@ class NaturalOrderingTestCase(TestCase):
         devicerole = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
-        self.device = Device.objects.create(
+        Device.objects.create(
             device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
         )
 
     def test_interface_ordering_numeric(self):
-
+        device = Device.objects.first()
         INTERFACES = [
             '0',
             '0.0',
@@ -57,16 +58,16 @@ class NaturalOrderingTestCase(TestCase):
         ]
 
         for name in INTERFACES:
-            iface = Interface(device=self.device, name=name)
+            iface = Interface(device=device, name=name)
             iface.save()
 
         self.assertListEqual(
-            list(Interface.objects.filter(device=self.device).values_list('name', flat=True)),
+            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
             INTERFACES
         )
 
     def test_interface_ordering_linux(self):
-
+        device = Device.objects.first()
         INTERFACES = [
             'eth0',
             'eth0.1',
@@ -81,16 +82,16 @@ class NaturalOrderingTestCase(TestCase):
         ]
 
         for name in INTERFACES:
-            iface = Interface(device=self.device, name=name)
+            iface = Interface(device=device, name=name)
             iface.save()
 
         self.assertListEqual(
-            list(Interface.objects.filter(device=self.device).values_list('name', flat=True)),
+            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
             INTERFACES
         )
 
     def test_interface_ordering_junos(self):
-
+        device = Device.objects.first()
         INTERFACES = [
             'xe-0/0/0',
             'xe-0/0/1',
@@ -134,16 +135,16 @@ class NaturalOrderingTestCase(TestCase):
         ]
 
         for name in INTERFACES:
-            iface = Interface(device=self.device, name=name)
+            iface = Interface(device=device, name=name)
             iface.save()
 
         self.assertListEqual(
-            list(Interface.objects.filter(device=self.device).values_list('name', flat=True)),
+            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
             INTERFACES
         )
 
     def test_interface_ordering_ios(self):
-
+        device = Device.objects.first()
         INTERFACES = [
             'GigabitEthernet0/1',
             'GigabitEthernet0/2',
@@ -161,10 +162,10 @@ class NaturalOrderingTestCase(TestCase):
         ]
 
         for name in INTERFACES:
-            iface = Interface(device=self.device, name=name)
+            iface = Interface(device=device, name=name)
             iface.save()
 
         self.assertListEqual(
-            list(Interface.objects.filter(device=self.device).values_list('name', flat=True)),
+            list(Interface.objects.filter(device=device).values_list('name', flat=True)),
             INTERFACES
         )

+ 23 - 20
netbox/extras/tests/test_api.py

@@ -611,73 +611,76 @@ class ScriptTest(APITestCase):
 
 class CreatedUpdatedFilterTest(APITestCase):
 
-    def setUp(self):
-
-        super().setUp()
-
-        self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
-        self.location1 = Location.objects.create(site=self.site1, name='Test Location 1', slug='test-location-1')
-        self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
-        self.rack1 = Rack.objects.create(
-            site=self.site1, location=self.location1, role=self.rackrole1, name='Test Rack 1', u_height=42,
-        )
-        self.rack2 = Rack.objects.create(
-            site=self.site1, location=self.location1, role=self.rackrole1, name='Test Rack 2', u_height=42,
+    @classmethod
+    def setUpTestData(cls):
+        site1 = Site.objects.create(name='Site 1', slug='site-1')
+        location1 = Location.objects.create(site=site1, name='Location 1', slug='location-1')
+        rackrole1 = RackRole.objects.create(name='Rack Role 1', slug='rack-role-1', color='ff0000')
+        racks = (
+            Rack(site=site1, location=location1, role=rackrole1, name='Rack 1', u_height=42),
+            Rack(site=site1, location=location1, role=rackrole1, name='Rack 2', u_height=42)
         )
+        Rack.objects.bulk_create(racks)
 
-        # change the created and last_updated of one
-        Rack.objects.filter(pk=self.rack2.pk).update(
+        # Change the created and last_updated of the second rack
+        Rack.objects.filter(pk=racks[1].pk).update(
             last_updated=make_aware(datetime.datetime(2001, 2, 3, 1, 2, 3, 4)),
             created=make_aware(datetime.datetime(2001, 2, 3))
         )
 
     def test_get_rack_created(self):
+        rack2 = Rack.objects.get(name='Rack 2')
         self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?created=2001-02-03'.format(url), **self.header)
 
         self.assertEqual(response.data['count'], 1)
-        self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
+        self.assertEqual(response.data['results'][0]['id'], rack2.pk)
 
     def test_get_rack_created_gte(self):
+        rack1 = Rack.objects.get(name='Rack 1')
         self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?created__gte=2001-02-04'.format(url), **self.header)
 
         self.assertEqual(response.data['count'], 1)
-        self.assertEqual(response.data['results'][0]['id'], self.rack1.pk)
+        self.assertEqual(response.data['results'][0]['id'], rack1.pk)
 
     def test_get_rack_created_lte(self):
+        rack2 = Rack.objects.get(name='Rack 2')
         self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?created__lte=2001-02-04'.format(url), **self.header)
 
         self.assertEqual(response.data['count'], 1)
-        self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
+        self.assertEqual(response.data['results'][0]['id'], rack2.pk)
 
     def test_get_rack_last_updated(self):
+        rack2 = Rack.objects.get(name='Rack 2')
         self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?last_updated=2001-02-03%2001:02:03.000004'.format(url), **self.header)
 
         self.assertEqual(response.data['count'], 1)
-        self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
+        self.assertEqual(response.data['results'][0]['id'], rack2.pk)
 
     def test_get_rack_last_updated_gte(self):
+        rack1 = Rack.objects.get(name='Rack 1')
         self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?last_updated__gte=2001-02-04%2001:02:03.000004'.format(url), **self.header)
 
         self.assertEqual(response.data['count'], 1)
-        self.assertEqual(response.data['results'][0]['id'], self.rack1.pk)
+        self.assertEqual(response.data['results'][0]['id'], rack1.pk)
 
     def test_get_rack_last_updated_lte(self):
+        rack2 = Rack.objects.get(name='Rack 2')
         self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?last_updated__lte=2001-02-04%2001:02:03.000004'.format(url), **self.header)
 
         self.assertEqual(response.data['count'], 1)
-        self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
+        self.assertEqual(response.data['results'][0]['id'], rack2.pk)
 
 
 class ContentTypeTest(APITestCase):

+ 2 - 1
netbox/extras/tests/test_customfields.py

@@ -373,7 +373,8 @@ class CustomFieldTest(TestCase):
 
 class CustomFieldManagerTest(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
         content_type = ContentType.objects.get_for_model(Site)
         custom_field = CustomField(type=CustomFieldTypeChoices.TYPE_TEXT, name='text_field', default='foo')
         custom_field.save()

+ 104 - 72
netbox/extras/tests/test_models.py

@@ -21,32 +21,32 @@ class ConfigContextTest(TestCase):
 
     It also ensures the various config context querysets are consistent.
     """
-
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
-        self.devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
-        self.devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
-        self.region = Region.objects.create(name="Region")
-        self.sitegroup = SiteGroup.objects.create(name="Site Group")
-        self.site = Site.objects.create(name='Site 1', slug='site-1', region=self.region, group=self.sitegroup)
-        self.location = Location.objects.create(name='Location 1', slug='location-1', site=self.site)
-        self.platform = Platform.objects.create(name="Platform")
-        self.tenantgroup = TenantGroup.objects.create(name="Tenant Group")
-        self.tenant = Tenant.objects.create(name="Tenant", group=self.tenantgroup)
-        self.tag = Tag.objects.create(name="Tag", slug="tag")
-        self.tag2 = Tag.objects.create(name="Tag2", slug="tag2")
-
-        self.device = Device.objects.create(
+        devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
+        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        region = Region.objects.create(name='Region')
+        sitegroup = SiteGroup.objects.create(name='Site Group')
+        site = Site.objects.create(name='Site 1', slug='site-1', region=region, group=sitegroup)
+        location = Location.objects.create(name='Location 1', slug='location-1', site=site)
+        platform = Platform.objects.create(name='Platform')
+        tenantgroup = TenantGroup.objects.create(name='Tenant Group')
+        tenant = Tenant.objects.create(name='Tenant', group=tenantgroup)
+        tag1 = Tag.objects.create(name='Tag', slug='tag')
+        tag2 = Tag.objects.create(name='Tag2', slug='tag2')
+
+        Device.objects.create(
             name='Device 1',
-            device_type=self.devicetype,
-            device_role=self.devicerole,
-            site=self.site,
-            location=self.location
+            device_type=devicetype,
+            device_role=devicerole,
+            site=site,
+            location=location
         )
 
     def test_higher_weight_wins(self):
-
+        device = Device.objects.first()
         context1 = ConfigContext(
             name="context 1",
             weight=101,
@@ -72,10 +72,10 @@ class ConfigContextTest(TestCase):
             "b": 456,
             "c": 777
         }
-        self.assertEqual(self.device.get_config_context(), expected_data)
+        self.assertEqual(device.get_config_context(), expected_data)
 
     def test_name_ordering_after_weight(self):
-
+        device = Device.objects.first()
         context1 = ConfigContext(
             name="context 1",
             weight=100,
@@ -101,13 +101,14 @@ class ConfigContextTest(TestCase):
             "b": 456,
             "c": 789
         }
-        self.assertEqual(self.device.get_config_context(), expected_data)
+        self.assertEqual(device.get_config_context(), expected_data)
 
     def test_annotation_same_as_get_for_object(self):
         """
-        This test incorperates features from all of the above tests cases to ensure
+        This test incorporates features from all of the above tests cases to ensure
         the annotate_config_context_data() and get_for_object() queryset methods are the same.
         """
+        device = Device.objects.first()
         context1 = ConfigContext(
             name="context 1",
             weight=101,
@@ -142,10 +143,19 @@ class ConfigContextTest(TestCase):
         )
         ConfigContext.objects.bulk_create([context1, context2, context3, context4])
 
-        annotated_queryset = Device.objects.filter(name=self.device.name).annotate_config_context_data()
-        self.assertEqual(self.device.get_config_context(), annotated_queryset[0].get_config_context())
+        annotated_queryset = Device.objects.filter(name=device.name).annotate_config_context_data()
+        self.assertEqual(device.get_config_context(), annotated_queryset[0].get_config_context())
 
     def test_annotation_same_as_get_for_object_device_relations(self):
+        region = Region.objects.first()
+        sitegroup = SiteGroup.objects.first()
+        site = Site.objects.first()
+        location = Location.objects.first()
+        platform = Platform.objects.first()
+        tenantgroup = TenantGroup.objects.first()
+        tenant = Tenant.objects.first()
+        tag = Tag.objects.first()
+
         region_context = ConfigContext.objects.create(
             name="region",
             weight=100,
@@ -153,7 +163,8 @@ class ConfigContextTest(TestCase):
                 "region": 1
             }
         )
-        region_context.regions.add(self.region)
+        region_context.regions.add(region)
+
         sitegroup_context = ConfigContext.objects.create(
             name="sitegroup",
             weight=100,
@@ -161,7 +172,8 @@ class ConfigContextTest(TestCase):
                 "sitegroup": 1
             }
         )
-        sitegroup_context.site_groups.add(self.sitegroup)
+        sitegroup_context.site_groups.add(sitegroup)
+
         site_context = ConfigContext.objects.create(
             name="site",
             weight=100,
@@ -169,7 +181,8 @@ class ConfigContextTest(TestCase):
                 "site": 1
             }
         )
-        site_context.sites.add(self.site)
+        site_context.sites.add(site)
+
         location_context = ConfigContext.objects.create(
             name="location",
             weight=100,
@@ -177,7 +190,8 @@ class ConfigContextTest(TestCase):
                 "location": 1
             }
         )
-        location_context.locations.add(self.location)
+        location_context.locations.add(location)
+
         platform_context = ConfigContext.objects.create(
             name="platform",
             weight=100,
@@ -185,7 +199,8 @@ class ConfigContextTest(TestCase):
                 "platform": 1
             }
         )
-        platform_context.platforms.add(self.platform)
+        platform_context.platforms.add(platform)
+
         tenant_group_context = ConfigContext.objects.create(
             name="tenant group",
             weight=100,
@@ -193,7 +208,8 @@ class ConfigContextTest(TestCase):
                 "tenant_group": 1
             }
         )
-        tenant_group_context.tenant_groups.add(self.tenantgroup)
+        tenant_group_context.tenant_groups.add(tenantgroup)
+
         tenant_context = ConfigContext.objects.create(
             name="tenant",
             weight=100,
@@ -201,7 +217,8 @@ class ConfigContextTest(TestCase):
                 "tenant": 1
             }
         )
-        tenant_context.tenants.add(self.tenant)
+        tenant_context.tenants.add(tenant)
+
         tag_context = ConfigContext.objects.create(
             name="tag",
             weight=100,
@@ -209,23 +226,30 @@ class ConfigContextTest(TestCase):
                 "tag": 1
             }
         )
-        tag_context.tags.add(self.tag)
+        tag_context.tags.add(tag)
 
         device = Device.objects.create(
             name="Device 2",
-            site=self.site,
-            location=self.location,
-            tenant=self.tenant,
-            platform=self.platform,
-            device_role=self.devicerole,
-            device_type=self.devicetype
+            site=site,
+            location=location,
+            tenant=tenant,
+            platform=platform,
+            device_role=DeviceRole.objects.first(),
+            device_type=DeviceType.objects.first()
         )
-        device.tags.add(self.tag)
+        device.tags.add(tag)
 
         annotated_queryset = Device.objects.filter(name=device.name).annotate_config_context_data()
         self.assertEqual(device.get_config_context(), annotated_queryset[0].get_config_context())
 
     def test_annotation_same_as_get_for_object_virtualmachine_relations(self):
+        region = Region.objects.first()
+        sitegroup = SiteGroup.objects.first()
+        site = Site.objects.first()
+        platform = Platform.objects.first()
+        tenantgroup = TenantGroup.objects.first()
+        tenant = Tenant.objects.first()
+        tag = Tag.objects.first()
         cluster_type = ClusterType.objects.create(name="Cluster Type")
         cluster_group = ClusterGroup.objects.create(name="Cluster Group")
         cluster = Cluster.objects.create(name="Cluster", group=cluster_group, type=cluster_type)
@@ -235,49 +259,49 @@ class ConfigContextTest(TestCase):
             weight=100,
             data={"region": 1}
         )
-        region_context.regions.add(self.region)
+        region_context.regions.add(region)
 
         sitegroup_context = ConfigContext.objects.create(
             name="sitegroup",
             weight=100,
             data={"sitegroup": 1}
         )
-        sitegroup_context.site_groups.add(self.sitegroup)
+        sitegroup_context.site_groups.add(sitegroup)
 
         site_context = ConfigContext.objects.create(
             name="site",
             weight=100,
             data={"site": 1}
         )
-        site_context.sites.add(self.site)
+        site_context.sites.add(site)
 
         platform_context = ConfigContext.objects.create(
             name="platform",
             weight=100,
             data={"platform": 1}
         )
-        platform_context.platforms.add(self.platform)
+        platform_context.platforms.add(platform)
 
         tenant_group_context = ConfigContext.objects.create(
             name="tenant group",
             weight=100,
             data={"tenant_group": 1}
         )
-        tenant_group_context.tenant_groups.add(self.tenantgroup)
+        tenant_group_context.tenant_groups.add(tenantgroup)
 
         tenant_context = ConfigContext.objects.create(
             name="tenant",
             weight=100,
             data={"tenant": 1}
         )
-        tenant_context.tenants.add(self.tenant)
+        tenant_context.tenants.add(tenant)
 
         tag_context = ConfigContext.objects.create(
             name="tag",
             weight=100,
             data={"tag": 1}
         )
-        tag_context.tags.add(self.tag)
+        tag_context.tags.add(tag)
 
         cluster_type_context = ConfigContext.objects.create(
             name="cluster type",
@@ -303,11 +327,11 @@ class ConfigContextTest(TestCase):
         virtual_machine = VirtualMachine.objects.create(
             name="VM 1",
             cluster=cluster,
-            tenant=self.tenant,
-            platform=self.platform,
-            role=self.devicerole
+            tenant=tenant,
+            platform=platform,
+            role=DeviceRole.objects.first()
         )
-        virtual_machine.tags.add(self.tag)
+        virtual_machine.tags.add(tag)
 
         annotated_queryset = VirtualMachine.objects.filter(name=virtual_machine.name).annotate_config_context_data()
         self.assertEqual(virtual_machine.get_config_context(), annotated_queryset[0].get_config_context())
@@ -315,12 +339,17 @@ class ConfigContextTest(TestCase):
     def test_multiple_tags_return_distinct_objects(self):
         """
         Tagged items use a generic relationship, which results in duplicate rows being returned when queried.
-        This is combatted by by appending distinct() to the config context querysets. This test creates a config
+        This is combated by appending distinct() to the config context querysets. This test creates a config
         context assigned to two tags and ensures objects related by those same two tags result in only a single
         config context record being returned.
 
         See https://github.com/netbox-community/netbox/issues/5314
         """
+        site = Site.objects.first()
+        platform = Platform.objects.first()
+        tenant = Tenant.objects.first()
+        tags = Tag.objects.all()
+
         tag_context = ConfigContext.objects.create(
             name="tag",
             weight=100,
@@ -328,19 +357,17 @@ class ConfigContextTest(TestCase):
                 "tag": 1
             }
         )
-        tag_context.tags.add(self.tag)
-        tag_context.tags.add(self.tag2)
+        tag_context.tags.set(tags)
 
         device = Device.objects.create(
             name="Device 3",
-            site=self.site,
-            tenant=self.tenant,
-            platform=self.platform,
-            device_role=self.devicerole,
-            device_type=self.devicetype
+            site=site,
+            tenant=tenant,
+            platform=platform,
+            device_role=DeviceRole.objects.first(),
+            device_type=DeviceType.objects.first()
         )
-        device.tags.add(self.tag)
-        device.tags.add(self.tag2)
+        device.tags.set(tags)
 
         annotated_queryset = Device.objects.filter(name=device.name).annotate_config_context_data()
         self.assertEqual(ConfigContext.objects.get_for_object(device).count(), 1)
@@ -357,6 +384,11 @@ class ConfigContextTest(TestCase):
 
         See https://github.com/netbox-community/netbox/issues/5387
         """
+        site = Site.objects.first()
+        platform = Platform.objects.first()
+        tenant = Tenant.objects.first()
+        tag1, tag2 = list(Tag.objects.all())
+
         tag_context_1 = ConfigContext.objects.create(
             name="tag-1",
             weight=100,
@@ -364,7 +396,8 @@ class ConfigContextTest(TestCase):
                 "tag": 1
             }
         )
-        tag_context_1.tags.add(self.tag)
+        tag_context_1.tags.add(tag1)
+
         tag_context_2 = ConfigContext.objects.create(
             name="tag-2",
             weight=100,
@@ -372,18 +405,17 @@ class ConfigContextTest(TestCase):
                 "tag": 1
             }
         )
-        tag_context_2.tags.add(self.tag2)
+        tag_context_2.tags.add(tag2)
 
         device = Device.objects.create(
             name="Device 3",
-            site=self.site,
-            tenant=self.tenant,
-            platform=self.platform,
-            device_role=self.devicerole,
-            device_type=self.devicetype
-        )
-        device.tags.add(self.tag)
-        device.tags.add(self.tag2)
+            site=site,
+            tenant=tenant,
+            platform=platform,
+            device_role=DeviceRole.objects.first(),
+            device_type=DeviceType.objects.first()
+        )
+        device.tags.set([tag1, tag2])
 
         annotated_queryset = Device.objects.filter(name=device.name).annotate_config_context_data()
         self.assertEqual(ConfigContext.objects.get_for_object(device).count(), 2)

+ 1 - 0
netbox/extras/tests/test_webhooks.py

@@ -23,6 +23,7 @@ class WebhookTest(APITestCase):
     def setUp(self):
         super().setUp()
 
+        # Ensure the queue has been cleared for each test
         self.queue = django_rq.get_queue('default')
         self.queue.empty()
 

+ 73 - 77
netbox/ipam/tests/test_ordering.py

@@ -9,12 +9,17 @@ import netaddr
 class OrderingTestBase(TestCase):
     vrfs = None
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
         """
         Setup the VRFs for the class as a whole
         """
-        self.vrfs = (VRF(name="VRF A"), VRF(name="VRF B"), VRF(name="VRF C"))
-        VRF.objects.bulk_create(self.vrfs)
+        vrfs = (
+            VRF(name='VRF 1'),
+            VRF(name='VRF 2'),
+            VRF(name='VRF 3'),
+        )
+        VRF.objects.bulk_create(vrfs)
 
     def _compare(self, queryset, objectset):
         """
@@ -37,10 +42,7 @@ class PrefixOrderingTestCase(OrderingTestBase):
         """
         This is a very basic test, which tests both prefixes without VRFs and prefixes with VRFs
         """
-        # Setup VRFs
-        vrfa, vrfb, vrfc = self.vrfs
-
-        # Setup Prefixes
+        vrf1, vrf2, vrf3 = list(VRF.objects.all())
         prefixes = (
             Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('192.168.0.0/16')),
             Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('192.168.0.0/24')),
@@ -50,37 +52,37 @@ class PrefixOrderingTestCase(OrderingTestBase):
             Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('192.168.4.0/24')),
             Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('192.168.5.0/24')),
 
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.0.0/8')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.0.0/16')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.0.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.1.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.2.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.3.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.4.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.0.0/16')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.1.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.2.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.3.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.4.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.2.0.0/16')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.2.1.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.2.2.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.2.3.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.2.4.0/24')),
-
-            Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.0.0/12')),
-            Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.0.0/16')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.0.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.1.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.2.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.3.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.16.4.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=vrfb, prefix=netaddr.IPNetwork('172.17.0.0/16')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.17.0.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.17.1.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.17.2.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.17.3.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfb, prefix=netaddr.IPNetwork('172.17.4.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.0.0/8')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.0.0/16')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.0.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.2.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.3.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.4.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.0.0/16')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.2.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.3.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.4.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.2.0.0/16')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.2.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.2.2.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.2.3.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.2.4.0/24')),
+
+            Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.0.0/12')),
+            Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.0.0/16')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.0.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.2.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.3.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.16.4.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=vrf2, prefix=netaddr.IPNetwork('172.17.0.0/16')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.17.0.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.17.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.17.2.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.17.3.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf2, prefix=netaddr.IPNetwork('172.17.4.0/24')),
         )
 
         Prefix.objects.bulk_create(prefixes)
@@ -104,20 +106,17 @@ class PrefixOrderingTestCase(OrderingTestBase):
             VRF A:10.1.1.0/24
             None: 192.168.0.0/16
         """
-        # Setup VRFs
-        vrfa, vrfb, vrfc = self.vrfs
-
-        # Setup Prefixes
+        vrf1, vrf2, vrf3 = list(VRF.objects.all())
         prefixes = [
             Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('10.0.0.0/8')),
             Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('10.0.0.0/16')),
             Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('10.1.0.0/16')),
             Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('192.168.0.0/16')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.0.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.1.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.0.1.0/25')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.0.0/24')),
-            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrfa, prefix=netaddr.IPNetwork('10.1.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.0.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.1.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.0.1.0/25')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.0.0/24')),
+            Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=vrf1, prefix=netaddr.IPNetwork('10.1.1.0/24')),
         ]
         Prefix.objects.bulk_create(prefixes)
 
@@ -131,37 +130,34 @@ class IPAddressOrderingTestCase(OrderingTestBase):
         """
         This function tests ordering with the inclusion of vrfs
         """
-        # Setup VRFs
-        vrfa, vrfb, vrfc = self.vrfs
-
-        # Setup Addresses
+        vrf1, vrf2, vrf3 = list(VRF.objects.all())
         addresses = (
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.0.0.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.0.1.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.0.2.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.0.3.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.0.4.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.1.0.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.1.1.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.1.2.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.1.3.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.1.4.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.2.0.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.2.1.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.2.2.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.2.3.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.2.4.1/24')),
-
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.16.0.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.16.1.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.16.2.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.16.3.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.16.4.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.17.0.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.17.1.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.17.2.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.17.3.1/24')),
-            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfb, address=netaddr.IPNetwork('172.17.4.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.0.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.1.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.2.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.3.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.4.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.1.0.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.1.1.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.1.2.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.1.3.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.1.4.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.2.0.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.2.1.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.2.2.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.2.3.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.2.4.1/24')),
+
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.16.0.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.16.1.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.16.2.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.16.3.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.16.4.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.17.0.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.17.1.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.17.2.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.17.3.1/24')),
+            IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf2, address=netaddr.IPNetwork('172.17.4.1/24')),
 
             IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=None, address=netaddr.IPNetwork('192.168.0.1/24')),
             IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=None, address=netaddr.IPNetwork('192.168.1.1/24')),

+ 6 - 7
netbox/users/tests/test_models.py

@@ -4,7 +4,8 @@ from django.test import TestCase
 
 class UserConfigTest(TestCase):
 
-    def setUp(self):
+    @classmethod
+    def setUpTestData(cls):
 
         user = User.objects.create_user(username='testuser')
         user.config.data = {
@@ -27,10 +28,8 @@ class UserConfigTest(TestCase):
         }
         user.config.save()
 
-        self.userconfig = user.config
-
     def test_get(self):
-        userconfig = self.userconfig
+        userconfig = User.objects.get(username='testuser').config
 
         # Retrieve root and nested values
         self.assertEqual(userconfig.get('a'), True)
@@ -50,7 +49,7 @@ class UserConfigTest(TestCase):
         self.assertEqual(userconfig.get('b.foo.x.invalid', 'DEFAULT'), 'DEFAULT')
 
     def test_all(self):
-        userconfig = self.userconfig
+        userconfig = User.objects.get(username='testuser').config
         flattened_data = {
             'a': True,
             'b.foo': 101,
@@ -64,7 +63,7 @@ class UserConfigTest(TestCase):
         self.assertEqual(userconfig.all(), flattened_data)
 
     def test_set(self):
-        userconfig = self.userconfig
+        userconfig = User.objects.get(username='testuser').config
 
         # Overwrite existing values
         userconfig.set('a', 'abc')
@@ -93,7 +92,7 @@ class UserConfigTest(TestCase):
             userconfig.set('a.x', 1)
 
     def test_clear(self):
-        userconfig = self.userconfig
+        userconfig = User.objects.get(username='testuser').config
 
         # Clear existing values
         userconfig.clear('a')