@@ -262,7 +262,7 @@ def test_104_cable_profile_b_to_many(self):
262262 # Check that all CablePaths have been deleted
263263 self .assertEqual (CablePath .objects .count (), 0 )
264264
265- def test_105_cable_profile_2x2_mpo (self ):
265+ def test_105_cable_profile_2x2_mpo8 (self ):
266266 """
267267 [IF1:1] --C1-- [IF3:1]
268268 [IF1:2] [IF3:2]
@@ -273,9 +273,10 @@ def test_105_cable_profile_2x2_mpo(self):
273273 [IF2:3] [IF4:3]
274274 [IF2:4] [IF4:4]
275275
276- Cable profile: Shuffle (2x2 MPO )
276+ Cable profile: Shuffle (2x2 MPO8 )
277277 """
278278 interfaces = [
279+ # A side
279280 Interface .objects .create (device = self .device , name = 'Interface 1:1' ),
280281 Interface .objects .create (device = self .device , name = 'Interface 1:2' ),
281282 Interface .objects .create (device = self .device , name = 'Interface 1:3' ),
@@ -284,6 +285,7 @@ def test_105_cable_profile_2x2_mpo(self):
284285 Interface .objects .create (device = self .device , name = 'Interface 2:2' ),
285286 Interface .objects .create (device = self .device , name = 'Interface 2:3' ),
286287 Interface .objects .create (device = self .device , name = 'Interface 2:4' ),
288+ # B side
287289 Interface .objects .create (device = self .device , name = 'Interface 3:1' ),
288290 Interface .objects .create (device = self .device , name = 'Interface 3:2' ),
289291 Interface .objects .create (device = self .device , name = 'Interface 3:3' ),
@@ -296,7 +298,7 @@ def test_105_cable_profile_2x2_mpo(self):
296298
297299 # Create cable 1
298300 cable1 = Cable (
299- profile = CableProfileChoices .SHUFFLE_2X2_MPO ,
301+ profile = CableProfileChoices .SHUFFLE_2X2_MPO8 ,
300302 a_terminations = interfaces [0 :8 ],
301303 b_terminations = interfaces [8 :16 ],
302304 )
@@ -372,6 +374,118 @@ def test_105_cable_profile_2x2_mpo(self):
372374 # Check that all CablePaths have been deleted
373375 self .assertEqual (CablePath .objects .count (), 0 )
374376
377+ def test_106_cable_profile_4x4_mpo8 (self ):
378+ """
379+ [IF1:1] --C1-- [IF3:1]
380+ [IF1:2] [IF3:2]
381+ [IF1:3] [IF3:3]
382+ [IF1:4] [IF3:4]
383+ [IF2:1] [IF4:1]
384+ [IF2:2] [IF4:2]
385+ [IF2:3] [IF4:3]
386+ [IF2:4] [IF4:4]
387+
388+ Cable profile: Shuffle (4x4 MPO8)
389+ """
390+ interfaces = [
391+ # A side
392+ Interface .objects .create (device = self .device , name = 'Interface 1:1' ),
393+ Interface .objects .create (device = self .device , name = 'Interface 1:2' ),
394+ Interface .objects .create (device = self .device , name = 'Interface 2:1' ),
395+ Interface .objects .create (device = self .device , name = 'Interface 2:2' ),
396+ Interface .objects .create (device = self .device , name = 'Interface 3:1' ),
397+ Interface .objects .create (device = self .device , name = 'Interface 3:2' ),
398+ Interface .objects .create (device = self .device , name = 'Interface 4:1' ),
399+ Interface .objects .create (device = self .device , name = 'Interface 4:2' ),
400+ # B side
401+ Interface .objects .create (device = self .device , name = 'Interface 5:1' ),
402+ Interface .objects .create (device = self .device , name = 'Interface 5:2' ),
403+ Interface .objects .create (device = self .device , name = 'Interface 6:1' ),
404+ Interface .objects .create (device = self .device , name = 'Interface 6:2' ),
405+ Interface .objects .create (device = self .device , name = 'Interface 7:1' ),
406+ Interface .objects .create (device = self .device , name = 'Interface 7:2' ),
407+ Interface .objects .create (device = self .device , name = 'Interface 8:1' ),
408+ Interface .objects .create (device = self .device , name = 'Interface 8:2' ),
409+ ]
410+
411+ # Create cable 1
412+ cable1 = Cable (
413+ profile = CableProfileChoices .SHUFFLE_4X4_MPO8 ,
414+ a_terminations = interfaces [0 :8 ],
415+ b_terminations = interfaces [8 :16 ],
416+ )
417+ cable1 .clean ()
418+ cable1 .save ()
419+
420+ paths = [
421+ # A-to-B paths
422+ self .assertPathExists (
423+ (interfaces [0 ], cable1 , interfaces [8 ]), is_complete = True , is_active = True
424+ ),
425+ self .assertPathExists (
426+ (interfaces [1 ], cable1 , interfaces [10 ]), is_complete = True , is_active = True
427+ ),
428+ self .assertPathExists (
429+ (interfaces [2 ], cable1 , interfaces [12 ]), is_complete = True , is_active = True
430+ ),
431+ self .assertPathExists (
432+ (interfaces [3 ], cable1 , interfaces [14 ]), is_complete = True , is_active = True
433+ ),
434+ self .assertPathExists (
435+ (interfaces [4 ], cable1 , interfaces [9 ]), is_complete = True , is_active = True
436+ ),
437+ self .assertPathExists (
438+ (interfaces [5 ], cable1 , interfaces [11 ]), is_complete = True , is_active = True
439+ ),
440+ self .assertPathExists (
441+ (interfaces [6 ], cable1 , interfaces [13 ]), is_complete = True , is_active = True
442+ ),
443+ self .assertPathExists (
444+ (interfaces [7 ], cable1 , interfaces [15 ]), is_complete = True , is_active = True
445+ ),
446+ # B-to-A paths
447+ self .assertPathExists (
448+ (interfaces [8 ], cable1 , interfaces [0 ]), is_complete = True , is_active = True
449+ ),
450+ self .assertPathExists (
451+ (interfaces [9 ], cable1 , interfaces [4 ]), is_complete = True , is_active = True
452+ ),
453+ self .assertPathExists (
454+ (interfaces [10 ], cable1 , interfaces [1 ]), is_complete = True , is_active = True
455+ ),
456+ self .assertPathExists (
457+ (interfaces [11 ], cable1 , interfaces [5 ]), is_complete = True , is_active = True
458+ ),
459+ self .assertPathExists (
460+ (interfaces [12 ], cable1 , interfaces [2 ]), is_complete = True , is_active = True
461+ ),
462+ self .assertPathExists (
463+ (interfaces [13 ], cable1 , interfaces [6 ]), is_complete = True , is_active = True
464+ ),
465+ self .assertPathExists (
466+ (interfaces [14 ], cable1 , interfaces [3 ]), is_complete = True , is_active = True
467+ ),
468+ self .assertPathExists (
469+ (interfaces [15 ], cable1 , interfaces [7 ]), is_complete = True , is_active = True
470+ ),
471+ ]
472+ self .assertEqual (CablePath .objects .count (), len (paths ))
473+
474+ for i , (interface , path ) in enumerate (zip (interfaces , paths )):
475+ interface .refresh_from_db ()
476+ self .assertPathIsSet (interface , path )
477+ self .assertEqual (interface .cable_end , 'A' if i < 8 else 'B' )
478+ self .assertEqual (interface .cable_position , (i % 8 ) + 1 )
479+
480+ # Test SVG generation
481+ CableTraceSVG (interfaces [0 ]).render ()
482+
483+ # Delete cable 1
484+ cable1 .delete ()
485+
486+ # Check that all CablePaths have been deleted
487+ self .assertEqual (CablePath .objects .count (), 0 )
488+
375489 def test_202_single_path_via_pass_through_with_breakouts (self ):
376490 """
377491 [IF1] --C1-- [FP1] [RP1] --C2-- [IF3]
0 commit comments