2626
2727from PyQt6 import QtCore , QtWidgets
2828import qubesmanager .settings as vm_settings
29+ import qubesmanager .utils as utils
30+ import qubesadmin .utils as admin_utils
2931from qubesadmin .tests .mock_app import MockQube , MockDevice
3032
3133PAGES = ["basic" , "advanced" , "firewall" , "devices" , "applications" , "services" ]
3840 "test-standalone" ,
3941 "test-old" ,
4042 "test-vm-set" ,
43+ "default-dvm" ,
44+ "test-disp" ,
4145]
4246
4347# with a template
@@ -609,7 +613,9 @@ def test_108_disk_space(settings_fixture):
609613@mock .patch ("qubesmanager.settings.RenameVMThread" )
610614@mock .patch ("PyQt6.QtWidgets.QMessageBox.warning" )
611615@pytest .mark .parametrize (
612- "settings_fixture" , ["fedora-36" , "test-vm-set" , "test-blue" ], indirect = True
616+ "settings_fixture" ,
617+ ["fedora-36" , "test-vm-set" , "test-blue" , "default-dvm" , "test-disp" ],
618+ indirect = True ,
613619)
614620def test_109_renamevm (mock_warning , mock_thread , mock_input , settings_fixture ):
615621 settings_window , page , vm_name = settings_fixture
@@ -619,29 +625,68 @@ def test_109_renamevm(mock_warning, mock_thread, mock_input, settings_fixture):
619625 assert not settings_window .rename_vm_button .isEnabled ()
620626 assert mock_warning .call_count == 0
621627 return
622- else :
623- assert settings_window .rename_vm_button .isEnabled ()
628+ assert settings_window .rename_vm_button .isEnabled ()
624629
625630 mock_input .return_value = ("renamed-vm" , True )
626- settings_window .rename_vm_button .click ()
631+ # Qubes with same names from mock_app may be on the system, such as
632+ # sys-net, which affects test.
633+ dependencies = admin_utils .vm_dependencies (settings_window .qubesapp , vm )
634+ running_dependencies = []
635+ running_dependencies .extend (
636+ [
637+ vm
638+ for (vm , prop ) in dependencies
639+ if vm and prop == "template" and utils .is_running (vm , False )
640+ ]
641+ )
642+ for qube in running_dependencies :
643+ expected_call = (
644+ qube .name ,
645+ "admin.vm.property.Get" ,
646+ "is_preload" ,
647+ None ,
648+ )
649+ assert expected_call not in settings_window .qubesapp .actual_calls
650+ settings_window .qubesapp .expected_calls [expected_call ] = (
651+ b"0\x00 default=False type=bool False"
652+ )
653+
654+ if vm .name == "default-dvm" :
655+ dispvm = settings_window .qubesapp .domains ["test-disp" ]
656+ expected_call = (
657+ dispvm .name ,
658+ "admin.vm.property.Get" ,
659+ "is_preload" ,
660+ None ,
661+ )
662+ settings_window .qubesapp .expected_calls [expected_call ] = (
663+ b"0\x00 default=False type=bool True"
664+ )
665+ assert expected_call not in settings_window .qubesapp .actual_calls
666+ with mock .patch .object (dispvm , "is_running" , return_value = True ):
667+ settings_window .rename_vm_button .click ()
668+ assert expected_call in settings_window .qubesapp .actual_calls
669+ else :
670+ settings_window .rename_vm_button .click ()
627671
628672 if vm .name == "fedora-36" :
629673 assert mock_warning .call_count == 1
630674 assert mock_thread .call_count == 0
631675 return
632- elif vm .name == "test-vm-set" :
633- mock_thread .assert_called_with (vm , "renamed-vm" , mock .ANY )
634- mock_thread ().start .assert_called_with ()
635- assert mock_warning .call_count == 0
636676
637677 assert mock_warning .call_count == 0
678+ if vm .name in ["test-vm-set" , "default-dvm" ]:
679+ mock_thread .assert_called_with (vm , "renamed-vm" , mock .ANY )
680+ mock_thread ().start .assert_called_with ()
638681
639682
640683@mock .patch ("PyQt6.QtWidgets.QInputDialog.getText" )
641684@mock .patch ("qubesmanager.common_threads.RemoveVMThread" )
642685@mock .patch ("PyQt6.QtWidgets.QMessageBox.warning" )
643686@pytest .mark .parametrize (
644- "settings_fixture" , ["fedora-36" , "test-vm-set" , "test-blue" ], indirect = True
687+ "settings_fixture" ,
688+ ["fedora-36" , "test-vm-set" , "test-blue" , "default-dvm" , "test-alt-dvm" ],
689+ indirect = True ,
645690)
646691def test_110_deletevm (mock_warning , mock_thread , mock_input , settings_fixture ):
647692 settings_window , page , vm_name = settings_fixture
@@ -651,22 +696,60 @@ def test_110_deletevm(mock_warning, mock_thread, mock_input, settings_fixture):
651696 assert not settings_window .delete_vm_button .isEnabled ()
652697 assert mock_warning .call_count == 0
653698 return
654- else :
655- assert settings_window .delete_vm_button .isEnabled ()
699+ assert settings_window .delete_vm_button .isEnabled ()
656700
657701 mock_input .return_value = (vm .name , True )
658- settings_window .delete_vm_button .click ()
659702
660- if vm .name == "fedora-36" :
703+ # Qubes with same names from mock_app may be on the system, such as
704+ # sys-net, which affects test.
705+ dependencies = [
706+ (vm , prop )
707+ for (vm , prop ) in admin_utils .vm_dependencies (settings_window .qubesapp , vm )
708+ if vm
709+ ]
710+ for (qube , prop ) in dependencies :
711+ expected_call = (
712+ qube .name ,
713+ "admin.vm.property.Get" ,
714+ "is_preload" ,
715+ None ,
716+ )
717+ assert expected_call not in settings_window .qubesapp .actual_calls
718+ settings_window .qubesapp .expected_calls [expected_call ] = (
719+ b"0\x00 default=False type=bool False"
720+ )
721+
722+ if vm .name in ["default-dvm" , "test-alt-dvm" ]:
723+ if vm .name == "default-dvm" :
724+ dispvm_name = "test-disp"
725+ else :
726+ dispvm_name = "test-alt-disp"
727+ dispvm = settings_window .qubesapp .domains [dispvm_name ]
728+ expected_call = (
729+ dispvm .name ,
730+ "admin.vm.property.Get" ,
731+ "is_preload" ,
732+ None ,
733+ )
734+ settings_window .qubesapp .expected_calls [expected_call ] = (
735+ b"0\x00 default=False type=bool True"
736+ )
737+ assert expected_call not in settings_window .qubesapp .actual_calls
738+ with mock .patch .object (dispvm , "is_running" , return_value = True ):
739+ settings_window .delete_vm_button .click ()
740+ assert expected_call in settings_window .qubesapp .actual_calls
741+ else :
742+ settings_window .delete_vm_button .click ()
743+
744+ if vm .name in ["fedora-36" , "default-dvm" ]:
661745 assert mock_warning .call_count == 1
662746 assert mock_thread .call_count == 0
663747 return
664- elif vm .name == "test-vm-set" :
665- mock_thread .assert_called_with (vm )
666- mock_thread ().start .assert_called_with ()
667- assert mock_warning .call_count == 0
668748
669749 assert mock_warning .call_count == 0
750+ if vm .name in ["test-vm-set" , "test-alt-dvm" ]:
751+ mock_thread .assert_called_with (vm )
752+ mock_thread ().start .assert_called_with ()
670753
671754
672755@mock .patch ("PyQt6.QtWidgets.QInputDialog.getText" )
0 commit comments