2626import os
2727import tempfile
2828import sys
29+ import types
2930
3031import unittest
3132import unittest .mock
3536import qubesappmenus
3637import qubesappmenus .receive
3738
39+ try :
40+ import qubesappmenusext
41+ except ModuleNotFoundError as e :
42+ if e .name .split ('.' )[0 ] != 'qubes' :
43+ raise
44+ qubes_module = types .ModuleType ('qubes' )
45+ qubes_ext_module = types .ModuleType ('qubes.ext' )
46+ qubes_utils_module = types .ModuleType ('qubes.utils' )
47+
48+ def handler (* args , ** kwargs ):
49+ # Only decorator registration is needed for these unit tests.
50+ return lambda func : func
51+
52+ qubes_ext_module .handler = handler
53+ qubes_ext_module .Extension = object
54+ qubes_utils_module .sanitize_stderr_for_log = lambda stderr : stderr
55+ qubes_module .ext = qubes_ext_module
56+ sys .modules ['qubes' ] = qubes_module
57+ sys .modules ['qubes.ext' ] = qubes_ext_module
58+ sys .modules ['qubes.utils' ] = qubes_utils_module
59+ import qubesappmenusext
60+
3861class Label (object ):
3962 def __init__ (self , index , color , name ):
4063 self .index = index
@@ -48,6 +71,12 @@ class TestApp(object):
4871 def __init__ (self ):
4972 self .domains = {}
5073
74+ class TestVMM (object ):
75+ offline_mode = False
76+
77+ class TestAppmenusExtApp (object ):
78+ vmm = TestVMM ()
79+
5180class TestFeatures (dict ):
5281
5382 def __init__ (self , vm , ** kwargs ) -> None :
@@ -95,6 +124,18 @@ def icon(self):
95124 return 'servicevm-' + raw_icon_name
96125 return 'appvm-' + raw_icon_name
97126
127+ class TestAppmenusExtVM (object ):
128+ # pylint: disable=too-few-public-methods
129+ app = TestAppmenusExtApp ()
130+
131+ def __init__ (self , template_for_dispvms = False ,
132+ appmenus_dispvm = False ):
133+ self .name = 'test-ext-vm'
134+ self .template_for_dispvms = template_for_dispvms
135+ self .features = TestFeatures (self )
136+ if appmenus_dispvm :
137+ self .features ['appmenus-dispvm' ] = '1'
138+
98139VMPREFIX = 'test-'
99140
100141class TC_00_Appmenus (unittest .TestCase ):
@@ -146,6 +187,59 @@ def assertPathNotExists(self, path):
146187 if os .path .exists (path ):
147188 self .fail ("Path {} exists while it should not" .format (path ))
148189
190+ def assertUpdateScheduled (self , callback , should_schedule ):
191+ ext = qubesappmenusext .AppmenusExtension ()
192+ ext .collect_done_tasks = unittest .mock .Mock ()
193+ ext .update_appmenus = unittest .mock .Mock (return_value = 'update-task' )
194+ with unittest .mock .patch ('asyncio.ensure_future' ) as ensure_future :
195+ callback (ext )
196+ if should_schedule :
197+ ext .collect_done_tasks .assert_called_once ()
198+ ext .update_appmenus .assert_called_once ()
199+ ensure_future .assert_called_once_with ('update-task' )
200+ else :
201+ ext .collect_done_tasks .assert_not_called ()
202+ ext .update_appmenus .assert_not_called ()
203+ ensure_future .assert_not_called ()
204+
205+ def test_000_appmenus_ext_template_for_dispvms_needs_feature (self ):
206+ vm = TestAppmenusExtVM (
207+ template_for_dispvms = True ,
208+ appmenus_dispvm = False )
209+
210+ self .assertUpdateScheduled (
211+ lambda ext : ext .template_for_dispvms_setter (vm , None ),
212+ False )
213+
214+ vm .features ['appmenus-dispvm' ] = '1'
215+ self .assertUpdateScheduled (
216+ lambda ext : ext .template_for_dispvms_setter (vm , None ),
217+ True )
218+
219+ def test_000_appmenus_ext_dispvm_feature_needs_property (self ):
220+ vm = TestAppmenusExtVM (
221+ template_for_dispvms = False ,
222+ appmenus_dispvm = True )
223+
224+ self .assertUpdateScheduled (
225+ lambda ext : ext .on_feature_set_appmenus_dispvm (
226+ vm , None , 'appmenus-dispvm' , '1' ),
227+ False )
228+ self .assertUpdateScheduled (
229+ lambda ext : ext .on_feature_del_appmenus_dispvm (
230+ vm , None , 'appmenus-dispvm' ),
231+ False )
232+
233+ vm .template_for_dispvms = True
234+ self .assertUpdateScheduled (
235+ lambda ext : ext .on_feature_set_appmenus_dispvm (
236+ vm , None , 'appmenus-dispvm' , '1' ),
237+ True )
238+ self .assertUpdateScheduled (
239+ lambda ext : ext .on_feature_del_appmenus_dispvm (
240+ vm , None , 'appmenus-dispvm' ),
241+ True )
242+
149243
150244 def test_000_templates_dirs (self ):
151245 self .assertEqual (
0 commit comments