diff --git a/netbox/dcim/tests/test_cablepaths2.py b/netbox/dcim/tests/test_cablepaths2.py index 66ab58257..0f9a704c5 100644 --- a/netbox/dcim/tests/test_cablepaths2.py +++ b/netbox/dcim/tests/test_cablepaths2.py @@ -839,3 +839,205 @@ class CablePathTests(CablePathTestCase): is_active=True ) self.assertEqual(CablePath.objects.count(), 4) + + def test_304_add_port_mapping_between_connected_ports(self): + """ + [IF1] --C1-- [FP1] [RP1] --C2-- [IF2] + """ + interface1 = Interface.objects.create(device=self.device, name='Interface 1') + interface2 = Interface.objects.create(device=self.device, name='Interface 2') + frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1') + rearport1 = RearPort.objects.create(device=self.device, name='Rear Port 1') + cable1 = Cable( + a_terminations=[interface1], + b_terminations=[frontport1] + ) + cable1.save() + cable2 = Cable( + a_terminations=[interface2], + b_terminations=[rearport1] + ) + cable2.save() + + # Check for incomplete paths + self.assertPathExists( + (interface1, cable1, frontport1), + is_complete=False, + is_active=True + ) + self.assertPathExists( + (interface2, cable2, rearport1), + is_complete=False, + is_active=True + ) + + # Create a PortMapping between frontport1 and rearport1 + PortMapping.objects.create( + device=self.device, + front_port=frontport1, + front_port_position=1, + rear_port=rearport1, + rear_port_position=1, + ) + + # Check that paths are now complete + self.assertPathExists( + (interface1, cable1, frontport1, rearport1, cable2, interface2), + is_complete=True, + is_active=True + ) + self.assertPathExists( + (interface2, cable2, rearport1, frontport1, cable1, interface1), + is_complete=True, + is_active=True + ) + + def test_305_delete_port_mapping_between_connected_ports(self): + """ + [IF1] --C1-- [FP1] [RP1] --C2-- [IF2] + """ + interface1 = Interface.objects.create(device=self.device, name='Interface 1') + interface2 = Interface.objects.create(device=self.device, name='Interface 2') + frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1') + rearport1 = RearPort.objects.create(device=self.device, name='Rear Port 1') + cable1 = Cable( + a_terminations=[interface1], + b_terminations=[frontport1] + ) + cable1.save() + cable2 = Cable( + a_terminations=[interface2], + b_terminations=[rearport1] + ) + cable2.save() + portmapping1 = PortMapping.objects.create( + device=self.device, + front_port=frontport1, + front_port_position=1, + rear_port=rearport1, + rear_port_position=1, + ) + + # Check for complete paths + self.assertPathExists( + (interface1, cable1, frontport1, rearport1, cable2, interface2), + is_complete=True, + is_active=True + ) + self.assertPathExists( + (interface2, cable2, rearport1, frontport1, cable1, interface1), + is_complete=True, + is_active=True + ) + + # Delete the PortMapping between frontport1 and rearport1 + portmapping1.delete() + + # Check that paths are no longer complete + self.assertPathExists( + (interface1, cable1, frontport1), + is_complete=False, + is_active=True + ) + self.assertPathExists( + (interface2, cable2, rearport1), + is_complete=False, + is_active=True + ) + + def test_306_change_port_mapping_between_connected_ports(self): + """ + [IF1] --C1-- [FP1] [RP1] --C3-- [IF3] + [IF2] --C2-- [FP2] [RP3] --C4-- [IF4] + """ + interface1 = Interface.objects.create(device=self.device, name='Interface 1') + interface2 = Interface.objects.create(device=self.device, name='Interface 2') + interface3 = Interface.objects.create(device=self.device, name='Interface 3') + interface4 = Interface.objects.create(device=self.device, name='Interface 4') + frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1') + frontport2 = FrontPort.objects.create(device=self.device, name='Front Port 2') + rearport1 = RearPort.objects.create(device=self.device, name='Rear Port 1') + rearport2 = RearPort.objects.create(device=self.device, name='Rear Port 2') + cable1 = Cable( + a_terminations=[interface1], + b_terminations=[frontport1] + ) + cable1.save() + cable2 = Cable( + a_terminations=[interface2], + b_terminations=[frontport2] + ) + cable2.save() + cable3 = Cable( + a_terminations=[interface3], + b_terminations=[rearport1] + ) + cable3.save() + cable4 = Cable( + a_terminations=[interface4], + b_terminations=[rearport2] + ) + cable4.save() + portmapping1 = PortMapping.objects.create( + device=self.device, + front_port=frontport1, + front_port_position=1, + rear_port=rearport1, + rear_port_position=1, + ) + + # Verify expected initial paths + self.assertPathExists( + (interface1, cable1, frontport1, rearport1, cable3, interface3), + is_complete=True, + is_active=True + ) + self.assertPathExists( + (interface3, cable3, rearport1, frontport1, cable1, interface1), + is_complete=True, + is_active=True + ) + + # Delete and replace the PortMapping to connect interface1 to interface4 + portmapping1.delete() + portmapping2 = PortMapping.objects.create( + device=self.device, + front_port=frontport1, + front_port_position=1, + rear_port=rearport2, + rear_port_position=1, + ) + + # Verify expected new paths + self.assertPathExists( + (interface1, cable1, frontport1, rearport2, cable4, interface4), + is_complete=True, + is_active=True + ) + self.assertPathExists( + (interface4, cable4, rearport2, frontport1, cable1, interface1), + is_complete=True, + is_active=True + ) + + # Delete and replace the PortMapping to connect interface2 to interface4 + portmapping2.delete() + PortMapping.objects.create( + device=self.device, + front_port=frontport2, + front_port_position=1, + rear_port=rearport2, + rear_port_position=1, + ) + + # Verify expected new paths + self.assertPathExists( + (interface2, cable2, frontport2, rearport2, cable4, interface4), + is_complete=True, + is_active=True + ) + self.assertPathExists( + (interface4, cable4, rearport2, frontport2, cable2, interface2), + is_complete=True, + is_active=True + )