Clean up tests

This commit is contained in:
jeremystretch 2022-11-17 10:24:03 -05:00
parent 977b79ecee
commit d4a231585a
9 changed files with 353 additions and 288 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,12 +9,17 @@ import netaddr
class OrderingTestBase(TestCase): class OrderingTestBase(TestCase):
vrfs = None vrfs = None
def setUp(self): @classmethod
def setUpTestData(cls):
""" """
Setup the VRFs for the class as a whole Setup the VRFs for the class as a whole
""" """
self.vrfs = (VRF(name="VRF A"), VRF(name="VRF B"), VRF(name="VRF C")) vrfs = (
VRF.objects.bulk_create(self.vrfs) VRF(name='VRF 1'),
VRF(name='VRF 2'),
VRF(name='VRF 3'),
)
VRF.objects.bulk_create(vrfs)
def _compare(self, queryset, objectset): 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 This is a very basic test, which tests both prefixes without VRFs and prefixes with VRFs
""" """
# Setup VRFs vrf1, vrf2, vrf3 = list(VRF.objects.all())
vrfa, vrfb, vrfc = self.vrfs
# Setup Prefixes
prefixes = ( prefixes = (
Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('192.168.0.0/16')), 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')), 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.4.0/24')),
Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('192.168.5.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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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_ACTIVE, vrf=vrf1, 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=vrf2, 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_CONTAINER, vrf=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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_ACTIVE, vrf=vrf2, 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_CONTAINER, vrf=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, prefix=netaddr.IPNetwork('172.17.4.0/24')),
) )
Prefix.objects.bulk_create(prefixes) Prefix.objects.bulk_create(prefixes)
@ -104,20 +106,17 @@ class PrefixOrderingTestCase(OrderingTestBase):
VRF A:10.1.1.0/24 VRF A:10.1.1.0/24
None: 192.168.0.0/16 None: 192.168.0.0/16
""" """
# Setup VRFs vrf1, vrf2, vrf3 = list(VRF.objects.all())
vrfa, vrfb, vrfc = self.vrfs
# Setup Prefixes
prefixes = [ 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/8')),
Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('10.0.0.0/16')), 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('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=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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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.1.1.0/24')),
] ]
Prefix.objects.bulk_create(prefixes) Prefix.objects.bulk_create(prefixes)
@ -131,37 +130,34 @@ class IPAddressOrderingTestCase(OrderingTestBase):
""" """
This function tests ordering with the inclusion of vrfs This function tests ordering with the inclusion of vrfs
""" """
# Setup VRFs vrf1, vrf2, vrf3 = list(VRF.objects.all())
vrfa, vrfb, vrfc = self.vrfs
# Setup Addresses
addresses = ( addresses = (
IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrfa, address=netaddr.IPNetwork('10.0.0.1/24')), IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf1, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=vrf2, 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=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.0.1/24')),
IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=None, address=netaddr.IPNetwork('192.168.1.1/24')), IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=None, address=netaddr.IPNetwork('192.168.1.1/24')),

View File

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