|
@@ -61,6 +61,26 @@ class DeviceComponentFilterSetTestMixin:
|
|
|
params = {'tenant': [tenants[0].slug, tenants[1].slug]}
|
|
params = {'tenant': [tenants[0].slug, tenants[1].slug]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ def test_shared_names(self):
|
|
|
|
|
+ # A name or slug shared by several objects should resolve to a single filter value which still matches
|
|
|
|
|
+ # components on each of those objects
|
|
|
|
|
+ component = self.queryset.filter(_rack__isnull=False, _location__isnull=False).first()
|
|
|
|
|
+ device, rack, location = component.device, component._rack, component._location
|
|
|
|
|
+ params = (('device', device.name), ('rack', rack.name), ('location', location.slug))
|
|
|
|
|
+ counts = {param: self.filterset({param: [value]}, self.queryset).qs.count() for param, value in params}
|
|
|
|
|
+
|
|
|
|
|
+ # Move the component to a same-named device, rack, and location in another site
|
|
|
|
|
+ site = Site.objects.create(name='Site 99', slug='site-99')
|
|
|
|
|
+ self.queryset.filter(pk=component.pk).update(
|
|
|
|
|
+ device=Device.objects.create(site=site, name=device.name, device_type=device.device_type, role=device.role),
|
|
|
|
|
+ _rack=Rack.objects.create(site=site, name=rack.name),
|
|
|
|
|
+ _location=Location.objects.create(site=site, name=location.name, slug=location.slug),
|
|
|
|
|
+ )
|
|
|
|
|
+ for param, value in params:
|
|
|
|
|
+ filterset = self.filterset({param: [value]}, self.queryset)
|
|
|
|
|
+ self.assertEqual(filterset.qs.count(), counts[param])
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data[param]), 1)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class DeviceComponentTemplateFilterSetTestMixin:
|
|
class DeviceComponentTemplateFilterSetTestMixin:
|
|
|
|
|
|
|
@@ -572,6 +592,15 @@ class LocationTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'parent': [locations[0].slug, locations[1].slug]}
|
|
params = {'parent': [locations[0].slug, locations[1].slug]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ def test_parent_shared_slug(self):
|
|
|
|
|
+ # A location slug shared by several sites should resolve to a single filter value
|
|
|
|
|
+ location = Location.objects.first()
|
|
|
|
|
+ site = Site.objects.create(name='Site 99', slug='site-99')
|
|
|
|
|
+ Location.objects.create(site=site, name=location.name, slug=location.slug)
|
|
|
|
|
+ filterset = self.filterset({'parent': [location.slug]}, self.queryset)
|
|
|
|
|
+ self.assertTrue(filterset.is_valid())
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data['parent']), 1)
|
|
|
|
|
+
|
|
|
def test_ancestor(self):
|
|
def test_ancestor(self):
|
|
|
locations = Location.objects.filter(parent__isnull=True)[:2]
|
|
locations = Location.objects.filter(parent__isnull=True)[:2]
|
|
|
params = {'ancestor_id': [locations[0].pk, locations[1].pk]}
|
|
params = {'ancestor_id': [locations[0].pk, locations[1].pk]}
|
|
@@ -3886,6 +3915,18 @@ class ModuleTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'rack': [racks[0].name, racks[1].name]}
|
|
params = {'rack': [racks[0].name, racks[1].name]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
|
|
|
|
|
|
|
|
|
|
+ def test_shared_names(self):
|
|
|
|
|
+ # A name or slug shared by several objects should resolve to a single filter value
|
|
|
|
|
+ location, rack, device = Location.objects.first(), Rack.objects.first(), Device.objects.first()
|
|
|
|
|
+ site = Site.objects.create(name='Site 99', slug='site-99')
|
|
|
|
|
+ Location.objects.create(site=site, name=location.name, slug=location.slug)
|
|
|
|
|
+ Rack.objects.create(site=site, name=rack.name)
|
|
|
|
|
+ Device.objects.create(site=site, name=device.name, device_type=device.device_type, role=device.role)
|
|
|
|
|
+ for param, value in (('location', location.slug), ('rack', rack.name), ('device', device.name)):
|
|
|
|
|
+ filterset = self.filterset({param: [value]}, self.queryset)
|
|
|
|
|
+ self.assertTrue(filterset.is_valid())
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data[param]), 1)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class ConsolePortTestCase(TestCase, DeviceComponentFilterSetTestMixin, ChangeLoggedFilterSetTestMixin):
|
|
class ConsolePortTestCase(TestCase, DeviceComponentFilterSetTestMixin, ChangeLoggedFilterSetTestMixin):
|
|
|
queryset = ConsolePort.objects.all()
|
|
queryset = ConsolePort.objects.all()
|
|
@@ -6212,6 +6253,20 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTestMixin, ChangeLogge
|
|
|
params = {'vdc_identifier': vdc.values_list('identifier', flat=True)}
|
|
params = {'vdc_identifier': vdc.values_list('identifier', flat=True)}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
|
|
|
|
|
|
|
|
|
|
+ def test_vdc_shared_name(self):
|
|
|
|
|
+ # A VDC name or identifier shared by several devices should resolve to a single filter value
|
|
|
|
|
+ vdc = VirtualDeviceContext.objects.first()
|
|
|
|
|
+ VirtualDeviceContext.objects.create(
|
|
|
|
|
+ device=Device.objects.exclude(pk=vdc.device_id).first(),
|
|
|
|
|
+ name=vdc.name,
|
|
|
|
|
+ identifier=vdc.identifier,
|
|
|
|
|
+ status=vdc.status,
|
|
|
|
|
+ )
|
|
|
|
|
+ for param, value in (('vdc', vdc.name), ('vdc_identifier', vdc.identifier)):
|
|
|
|
|
+ filterset = self.filterset({param: [value]}, self.queryset)
|
|
|
|
|
+ self.assertTrue(filterset.is_valid())
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data[param]), 1)
|
|
|
|
|
+
|
|
|
def test_vlan(self):
|
|
def test_vlan(self):
|
|
|
vlan = VLAN.objects.filter(qinq_role=VLANQinQRoleChoices.ROLE_SERVICE).first()
|
|
vlan = VLAN.objects.filter(qinq_role=VLANQinQRoleChoices.ROLE_SERVICE).first()
|
|
|
params = {'vlan_id': vlan.pk}
|
|
params = {'vlan_id': vlan.pk}
|
|
@@ -7267,6 +7322,15 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTestMixin, ChangeLogge
|
|
|
params = {'device': [devices[0].name, devices[1].name]}
|
|
params = {'device': [devices[0].name, devices[1].name]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ def test_installed_device_shared_name(self):
|
|
|
|
|
+ # A device name shared by several sites should resolve to a single filter value
|
|
|
|
|
+ device = Device.objects.first()
|
|
|
|
|
+ site = Site.objects.create(name='Site 99', slug='site-99')
|
|
|
|
|
+ Device.objects.create(site=site, name=device.name, device_type=device.device_type, role=device.role)
|
|
|
|
|
+ filterset = self.filterset({'installed_device': [device.name]}, self.queryset)
|
|
|
|
|
+ self.assertTrue(filterset.is_valid())
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data['installed_device']), 1)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
queryset = InventoryItem.objects.all()
|
|
queryset = InventoryItem.objects.all()
|
|
@@ -7663,6 +7727,15 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'master': [masters[0].name, masters[2].name]}
|
|
params = {'master': [masters[0].name, masters[2].name]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ def test_master_shared_name(self):
|
|
|
|
|
+ # A device name shared by several sites should resolve to a single filter value
|
|
|
|
|
+ device = Device.objects.first()
|
|
|
|
|
+ site = Site.objects.create(name='Site 99', slug='site-99')
|
|
|
|
|
+ Device.objects.create(site=site, name=device.name, device_type=device.device_type, role=device.role)
|
|
|
|
|
+ filterset = self.filterset({'master': [device.name]}, self.queryset)
|
|
|
|
|
+ self.assertTrue(filterset.is_valid())
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data['master']), 1)
|
|
|
|
|
+
|
|
|
def test_name(self):
|
|
def test_name(self):
|
|
|
params = {'name': ['VC 1', 'VC 2']}
|
|
params = {'name': ['VC 1', 'VC 2']}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
@@ -9067,6 +9140,21 @@ class MACAddressTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'vminterface': [vm_interfaces[0].name, vm_interfaces[1].name]}
|
|
params = {'vminterface': [vm_interfaces[0].name, vm_interfaces[1].name]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ def test_interface_shared_name(self):
|
|
|
|
|
+ # A name shared by several interfaces should resolve to a single filter value
|
|
|
|
|
+ interface = Interface.objects.create(
|
|
|
|
|
+ device=Device.objects.get(name='Device 2'), name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED
|
|
|
|
|
+ )
|
|
|
|
|
+ vm_interface = VMInterface.objects.create(
|
|
|
|
|
+ virtual_machine=VirtualMachine.objects.get(name='Virtual Machine 2'), name='Interface 1'
|
|
|
|
|
+ )
|
|
|
|
|
+ MACAddress.objects.create(mac_address='00-00-00-01-01-99', assigned_object=interface)
|
|
|
|
|
+ MACAddress.objects.create(mac_address='00-00-00-04-01-99', assigned_object=vm_interface)
|
|
|
|
|
+ for param in ('interface', 'vminterface'):
|
|
|
|
|
+ filterset = self.filterset({param: ['Interface 1']}, self.queryset)
|
|
|
|
|
+ self.assertEqual(filterset.qs.count(), 2)
|
|
|
|
|
+ self.assertEqual(len(filterset.form.cleaned_data[param]), 1)
|
|
|
|
|
+
|
|
|
def test_assigned(self):
|
|
def test_assigned(self):
|
|
|
params = {'assigned': True}
|
|
params = {'assigned': True}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
|