@@ -863,6 +863,74 @@ def test_massive_upgrade_operation_page(self, *args):
863863 self .assertContains (response , "Failure rate" )
864864 self .assertContains (response , "Abortion rate" )
865865
866+ def test_upgrade_operation_change_breadcrumb_with_batch (self , * args ):
867+ self .test_upgrade_all ()
868+ uo = UpgradeOperation .objects .first ()
869+ url = reverse (f"admin:{ self .app_label } _upgradeoperation_change" , args = [uo .pk ])
870+ response = self .client .get (url )
871+ self .assertEqual (response .status_code , 200 )
872+ batch_changelist_url = reverse (
873+ f"admin:{ self .app_label } _batchupgradeoperation_changelist"
874+ )
875+ batch_change_url = reverse (
876+ f"admin:{ self .app_label } _batchupgradeoperation_change" , args = [uo .batch .pk ]
877+ )
878+ self .assertTrue (response .context ["batch_has_view_permission" ])
879+ self .assertEqual (response .context ["batch" ], uo .batch )
880+ self .assertContains (response , batch_changelist_url )
881+ self .assertContains (response , batch_change_url )
882+ self .assertContains (response , str (uo .batch ))
883+ generic_upgrade_changelist_url = reverse (
884+ f"admin:{ self .app_label } _upgradeoperation_changelist"
885+ )
886+ self .assertNotContains (response , f'href="{ generic_upgrade_changelist_url } "' )
887+
888+ def test_upgrade_operation_change_breadcrumb_without_batch (self , * args ):
889+ self ._login ()
890+ device_fw = self ._create_device_firmware ()
891+ device_fw .save (upgrade = True )
892+ uo = device_fw .device .upgradeoperation_set .first ()
893+ self .assertIsNone (uo .batch_id )
894+ url = reverse (f"admin:{ self .app_label } _upgradeoperation_change" , args = [uo .pk ])
895+ response = self .client .get (url )
896+ self .assertEqual (response .status_code , 200 )
897+ self .assertIsNone (response .context .get ("batch" ))
898+ generic_upgrade_changelist_url = reverse (
899+ f"admin:{ self .app_label } _upgradeoperation_changelist"
900+ )
901+ self .assertContains (response , f'href="{ generic_upgrade_changelist_url } "' )
902+
903+ def test_upgrade_operation_change_breadcrumb_with_batch_no_permission (self , * args ):
904+ self .test_upgrade_all ()
905+ uo = UpgradeOperation .objects .first ()
906+ url = reverse (f"admin:{ self .app_label } _upgradeoperation_change" , args = [uo .pk ])
907+ with mock .patch (
908+ "openwisp_firmware_upgrader.admin.BatchUpgradeOperationAdmin.has_view_permission" ,
909+ return_value = False ,
910+ ):
911+ response = self .client .get (url )
912+ self .assertEqual (response .status_code , 200 )
913+ batch_changelist_url = reverse (
914+ f"admin:{ self .app_label } _batchupgradeoperation_changelist"
915+ )
916+ batch_change_url = reverse (
917+ f"admin:{ self .app_label } _batchupgradeoperation_change" , args = [uo .batch .pk ]
918+ )
919+ self .assertFalse (response .context ["batch_has_view_permission" ])
920+ self .assertEqual (response .context ["batch" ], uo .batch )
921+ breadcrumbs = (
922+ response .content .decode ()
923+ .split ('<div class="breadcrumbs">' , 1 )[1 ]
924+ .split ("</div>" , 1 )[0 ]
925+ )
926+ self .assertNotIn (f'href="{ batch_changelist_url } "' , breadcrumbs )
927+ self .assertNotIn (f'href="{ batch_change_url } "' , breadcrumbs )
928+ generic_upgrade_changelist_url = reverse (
929+ f"admin:{ self .app_label } _upgradeoperation_changelist"
930+ )
931+ self .assertNotIn (f'href="{ generic_upgrade_changelist_url } "' , breadcrumbs )
932+ self .assertIn (str (uo .batch ), breadcrumbs )
933+
866934 def test_recent_upgrades (self , * args ):
867935 self ._login ()
868936 env = self ._create_upgrade_env ()
0 commit comments