test(dcim): Add test coverage for Connection list views

Add test cases for Console, Power, and Interface Connection list views.
Include query count baselines and shared mixin for read-only connection
views that filter by complete cable paths.

Fixes #22577
This commit is contained in:
Martin Hauser 2026-07-07 14:18:17 +02:00 committed by Jeremy Stretch
parent 52a8e6a48d
commit 0663ea1a47
2 changed files with 107 additions and 0 deletions

View File

@ -4,6 +4,7 @@
"cablebundle:api_list_objects": 13,
"cablebundle:list_objects_with_permission": 20,
"cabletermination:api_list_objects": 16,
"consoleconnection:list_objects_with_permission": 29,
"consoleport:api_list_objects": 14,
"consoleport:list_objects_with_permission": 21,
"consoleporttemplate:api_list_objects": 11,
@ -24,6 +25,7 @@
"frontporttemplate:api_list_objects": 12,
"interface:api_list_objects": 23,
"interface:list_objects_with_permission": 21,
"interfaceconnection:list_objects_with_permission": 41,
"interfacetemplate:api_list_objects": 11,
"inventoryitem:api_list_objects": 20,
"inventoryitem:list_objects_with_permission": 23,
@ -47,6 +49,7 @@
"moduletypeprofile:list_objects_with_permission": 20,
"platform:api_list_objects": 13,
"platform:list_objects_with_permission": 21,
"powerconnection:list_objects_with_permission": 29,
"powerfeed:api_list_objects": 15,
"powerfeed:list_objects_with_permission": 22,
"poweroutlet:api_list_objects": 14,

View File

@ -4052,6 +4052,110 @@ class CableTestCase(
return data
#
# Connections
#
class ConnectionsListViewTestCaseMixin:
"""
Shared behavior for the read-only connection list views.
These views list components whose cable paths are complete, but their URL names
do not follow the <model>_list pattern assumed by ModelViewTestCase.
"""
url_base = None
def _get_base_url(self):
return self.url_base
def _get_queryset(self):
return self.model.objects.filter(_path__is_complete=True)
class ConsoleConnectionsListViewTestCase(
ConnectionsListViewTestCaseMixin,
ViewTestCases.ListObjectsViewTestCase
):
model = ConsolePort
url_base = 'dcim:console_connections_{}'
query_count_model_label = 'consoleconnection'
@classmethod
def setUpTestData(cls):
device = create_test_device('Device 1')
peer_device = create_test_device('Device 2')
console_ports = ConsolePort.objects.bulk_create((
ConsolePort(device=device, name='Console Port 1'),
ConsolePort(device=device, name='Console Port 2'),
ConsolePort(device=device, name='Console Port 3'),
))
console_server_ports = ConsoleServerPort.objects.bulk_create((
ConsoleServerPort(device=peer_device, name='Console Server Port 1'),
ConsoleServerPort(device=peer_device, name='Console Server Port 2'),
ConsoleServerPort(device=peer_device, name='Console Server Port 3'),
))
for console_port, console_server_port in zip(console_ports, console_server_ports):
Cable(a_terminations=[console_port], b_terminations=[console_server_port]).save()
class PowerConnectionsListViewTestCase(
ConnectionsListViewTestCaseMixin,
ViewTestCases.ListObjectsViewTestCase
):
model = PowerPort
url_base = 'dcim:power_connections_{}'
query_count_model_label = 'powerconnection'
@classmethod
def setUpTestData(cls):
device = create_test_device('Device 1')
peer_device = create_test_device('Device 2')
power_ports = PowerPort.objects.bulk_create((
PowerPort(device=device, name='Power Port 1'),
PowerPort(device=device, name='Power Port 2'),
PowerPort(device=device, name='Power Port 3'),
))
power_outlets = PowerOutlet.objects.bulk_create((
PowerOutlet(device=peer_device, name='Power Outlet 1'),
PowerOutlet(device=peer_device, name='Power Outlet 2'),
PowerOutlet(device=peer_device, name='Power Outlet 3'),
))
for power_port, power_outlet in zip(power_ports, power_outlets):
Cable(a_terminations=[power_port], b_terminations=[power_outlet]).save()
class InterfaceConnectionsListViewTestCase(
ConnectionsListViewTestCaseMixin,
ViewTestCases.ListObjectsViewTestCase
):
model = Interface
url_base = 'dcim:interface_connections_{}'
query_count_model_label = 'interfaceconnection'
@classmethod
def setUpTestData(cls):
device = create_test_device('Device 1')
peer_device = create_test_device('Device 2')
interfaces = Interface.objects.bulk_create((
Interface(device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
Interface(device=device, name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
Interface(device=device, name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
))
peer_interfaces = Interface.objects.bulk_create((
Interface(device=peer_device, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
Interface(device=peer_device, name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
Interface(device=peer_device, name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_FIXED),
))
for interface, peer_interface in zip(interfaces, peer_interfaces):
Cable(a_terminations=[interface], b_terminations=[peer_interface]).save()
class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase):
model = VirtualChassis