3434import importlib .resources
3535import qubesappmenus
3636import qubesappmenus .receive
37+ import qubesappmenusext
3738
3839class Label (object ):
3940 def __init__ (self , index , color , name ):
@@ -48,6 +49,12 @@ class TestApp(object):
4849 def __init__ (self ):
4950 self .domains = {}
5051
52+ class TestVMM (object ):
53+ offline_mode = False
54+
55+ class TestAppmenusExtApp (object ):
56+ vmm = TestVMM ()
57+
5158class TestFeatures (dict ):
5259
5360 def __init__ (self , vm , ** kwargs ) -> None :
@@ -95,6 +102,18 @@ def icon(self):
95102 return 'servicevm-' + raw_icon_name
96103 return 'appvm-' + raw_icon_name
97104
105+ class TestAppmenusExtVM (object ):
106+ # pylint: disable=too-few-public-methods
107+ app = TestAppmenusExtApp ()
108+
109+ def __init__ (self , template_for_dispvms = False ,
110+ appmenus_dispvm = False ):
111+ self .name = 'test-ext-vm'
112+ self .template_for_dispvms = template_for_dispvms
113+ self .features = TestFeatures (self )
114+ if appmenus_dispvm :
115+ self .features ['appmenus-dispvm' ] = '1'
116+
98117VMPREFIX = 'test-'
99118
100119class TC_00_Appmenus (unittest .TestCase ):
@@ -146,6 +165,59 @@ def assertPathNotExists(self, path):
146165 if os .path .exists (path ):
147166 self .fail ("Path {} exists while it should not" .format (path ))
148167
168+ def assertUpdateScheduled (self , callback , should_schedule ):
169+ ext = qubesappmenusext .AppmenusExtension ()
170+ ext .collect_done_tasks = unittest .mock .Mock ()
171+ ext .update_appmenus = unittest .mock .Mock (return_value = 'update-task' )
172+ with unittest .mock .patch ('asyncio.ensure_future' ) as ensure_future :
173+ callback (ext )
174+ if should_schedule :
175+ ext .collect_done_tasks .assert_called_once ()
176+ ext .update_appmenus .assert_called_once ()
177+ ensure_future .assert_called_once_with ('update-task' )
178+ else :
179+ ext .collect_done_tasks .assert_not_called ()
180+ ext .update_appmenus .assert_not_called ()
181+ ensure_future .assert_not_called ()
182+
183+ def test_000_appmenus_ext_template_for_dispvms_needs_feature (self ):
184+ vm = TestAppmenusExtVM (
185+ template_for_dispvms = True ,
186+ appmenus_dispvm = False )
187+
188+ self .assertUpdateScheduled (
189+ lambda ext : ext .template_for_dispvms_setter (vm , None ),
190+ False )
191+
192+ vm .features ['appmenus-dispvm' ] = '1'
193+ self .assertUpdateScheduled (
194+ lambda ext : ext .template_for_dispvms_setter (vm , None ),
195+ True )
196+
197+ def test_000_appmenus_ext_dispvm_feature_needs_property (self ):
198+ vm = TestAppmenusExtVM (
199+ template_for_dispvms = False ,
200+ appmenus_dispvm = True )
201+
202+ self .assertUpdateScheduled (
203+ lambda ext : ext .on_feature_set_appmenus_dispvm (
204+ vm , None , 'appmenus-dispvm' , '1' ),
205+ False )
206+ self .assertUpdateScheduled (
207+ lambda ext : ext .on_feature_del_appmenus_dispvm (
208+ vm , None , 'appmenus-dispvm' ),
209+ False )
210+
211+ vm .template_for_dispvms = True
212+ self .assertUpdateScheduled (
213+ lambda ext : ext .on_feature_set_appmenus_dispvm (
214+ vm , None , 'appmenus-dispvm' , '1' ),
215+ True )
216+ self .assertUpdateScheduled (
217+ lambda ext : ext .on_feature_del_appmenus_dispvm (
218+ vm , None , 'appmenus-dispvm' ),
219+ True )
220+
149221
150222 def test_000_templates_dirs (self ):
151223 self .assertEqual (
0 commit comments