def test_single_click_timeout_single(self, mocked_make_preview): """ Test that when a single click has been registered, the item is sent to preview """ # GIVEN: A service manager. service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview_timeout() # THEN: make_preview() should have been called assert mocked_make_preview.call_count == 1, 'ServiceManager.make_preview() should have been called once'
def setUp(self): """ Create the UI """ Registry.create() self.setup_application() self.build_settings() Settings().extend_default_settings(__default_settings__) self.service_manager = ServiceManager() self.router = HttpRouter()
def test_single_click_timeout_double(self, mocked_make_live, mocked_make_preview): """ Test that when a double click has been registered, the item does not goes to preview """ # GIVEN: A service manager. service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called after a double click service_manager.on_double_click_live() service_manager.on_single_click_preview_timeout() # THEN: make_preview() should not have been called self.assertEqual(mocked_make_preview.call_count, 0, 'ServiceManager.make_preview() should not be called')
def test_single_click_timeout_single(self, mocked_make_preview): """ Test that when a single click has been registered, the item is sent to preview """ # GIVEN: A service manager. service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview_timeout() # THEN: make_preview() should have been called self.assertEqual(mocked_make_preview.call_count, 1, 'ServiceManager.make_preview() should have been called once')
def test_single_click_preview_false(self, mocked_singleShot, MockedSettings): """ Test that when "Preview items when clicked in Service Manager" disabled the preview timer doesn't start """ # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager. mocked_settings = MagicMock() mocked_settings.value.return_value = False MockedSettings.return_value = mocked_settings service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview() # THEN: timer should not be started self.assertEqual(mocked_singleShot.call_count, 0, 'Should not be called')
def supported_suffixes_test(self): """ Test the create basic service array """ # GIVEN: A new service manager instance. service_manager = ServiceManager(None) # WHEN: a suffix is added as an individual or a list. service_manager.supported_suffixes('txt') service_manager.supported_suffixes(['pptx', 'ppt']) # THEN: The suffixes should be available to test. self.assertEqual('txt' in service_manager.suffixes, True, 'The suffix txt should be in the list') self.assertEqual('ppt' in service_manager.suffixes, True, 'The suffix ppt should be in the list') self.assertEqual('pptx' in service_manager.suffixes, True, 'The suffix pptx should be in the list')
def create_basic_service_test(self): """ Test the create basic service array """ # GIVEN: A new service manager instance. service_manager = ServiceManager(None) # WHEN: when the basic service array is created. service_manager._save_lite = False service_manager.service_theme = 'test_theme' service = service_manager.create_basic_service()[0] # THEN: The controller should be registered in the registry. self.assertNotEqual(service, None, 'The base service should be created') self.assertEqual(service['openlp_core']['service-theme'], 'test_theme', 'The test theme should be saved') self.assertEqual(service['openlp_core']['lite-service'], False, 'The lite service should be saved')
def test_single_click_preview_false(self, mocked_singleShot, MockedSettings): """ Test that when "Preview items when clicked in Service Manager" disabled the preview timer doesn't start """ # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager. mocked_settings = MagicMock() mocked_settings.value.return_value = False MockedSettings.return_value = mocked_settings service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview() # THEN: timer should not be started assert mocked_singleShot.call_count == 0, 'Should not be called'
def test_save_file_raises_permission_error(self, mocked_os, mocked_save_file_as, mocked_zipfile): """ Test that when a PermissionError is raised when trying to save a file, it is handled correctly """ # GIVEN: A service manager, a service to save mocked_main_window = MagicMock() mocked_main_window.service_manager_settings_section = 'servicemanager' Registry().register('main_window', mocked_main_window) Registry().register('application', MagicMock()) service_manager = ServiceManager(None) service_manager._service_path = MagicMock() service_manager._save_lite = False service_manager.service_items = [] service_manager.service_theme = 'Default' service_manager.service_manager_list = MagicMock() mocked_save_file_as.return_value = True mocked_zipfile.ZipFile.return_value = MagicMock() mocked_os.link.side_effect = PermissionError # WHEN: The service is saved and a PermissionError is raised result = service_manager.save_file() # THEN: The "save_as" method is called to save the service assert result is True mocked_save_file_as.assert_called_with()
def test_single_click_preview_true(self, mocked_singleShot, MockedSettings): """ Test that when "Preview items when clicked in Service Manager" enabled the preview timer starts """ # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager. mocked_settings = MagicMock() mocked_settings.value.return_value = True MockedSettings.return_value = mocked_settings service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview() # THEN: timer should have been started mocked_singleShot.assert_called_with(PyQt5.QtWidgets.QApplication.instance().doubleClickInterval(), service_manager.on_single_click_preview_timeout)
def test_single_click_preview_double(self, mocked_make_live, mocked_singleShot, MockedSettings): """ Test that when a double click has registered the preview timer doesn't start """ # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager. mocked_settings = MagicMock() mocked_settings.value.return_value = True MockedSettings.return_value = mocked_settings service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called following a double click service_manager.on_double_click_live() service_manager.on_single_click_preview() # THEN: timer should not be started mocked_make_live.assert_called_with() self.assertEqual(mocked_singleShot.call_count, 0, 'Should not be called')
def test_single_click_preview_true(self, mocked_singleShot, MockedSettings): """ Test that when "Preview items when clicked in Service Manager" enabled the preview timer starts """ # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager. mocked_settings = MagicMock() mocked_settings.value.return_value = True MockedSettings.return_value = mocked_settings service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called service_manager.on_single_click_preview() # THEN: timer should have been started mocked_singleShot.assert_called_with( PyQt5.QtWidgets.QApplication.instance().doubleClickInterval(), service_manager.on_single_click_preview_timeout)
def test_save_file_raises_permission_error(self, mocked_save_file_as, mocked_zipfile, mocked_shutil_copy): """ Test that when a PermissionError is raised when trying to save a file, it is handled correctly """ # GIVEN: A service manager, a service to save mocked_main_window = MagicMock() mocked_main_window.service_manager_settings_section = 'servicemanager' Registry().register('main_window', mocked_main_window) Registry().register('application', MagicMock()) service_manager = ServiceManager(None) service_manager._file_name = os.path.join('temp', 'filename.osz') service_manager._save_lite = False service_manager.service_items = [] service_manager.service_theme = 'Default' service_manager.service_manager_list = MagicMock() mocked_save_file_as.return_value = True mocked_zipfile.ZipFile.return_value = MagicMock() mocked_shutil_copy.side_effect = PermissionError # WHEN: The service is saved and a PermissionError is thrown result = service_manager.save_file() # THEN: The "save_as" method is called to save the service self.assertTrue(result) mocked_save_file_as.assert_called_with()
def test_save_local_file_raises_permission_error(self, mocked_save_file_as, mocked_zipfile, mocked_shutil_copy): """ Test that when a PermissionError is raised when trying to save a local file, it is handled correctly """ # GIVEN: A service manager, a service to save mocked_main_window = MagicMock() mocked_main_window.service_manager_settings_section = 'servicemanager' Registry().register('main_window', mocked_main_window) Registry().register('application', MagicMock()) service_manager = ServiceManager(None) service_manager._file_name = os.path.join('temp', 'filename.osz') service_manager._save_lite = False service_manager.service_items = [] service_manager.service_theme = 'Default' mocked_save_file_as.return_value = True mocked_zipfile.ZipFile.return_value = MagicMock() mocked_shutil_copy.side_effect = PermissionError # WHEN: The service is saved and a PermissionError is thrown result = service_manager.save_local_file() # THEN: The "save_as" method is called to save the service self.assertTrue(result) mocked_save_file_as.assert_called_with()
def initial_service_manager_test(self): """ Test the initial of service manager. """ # GIVEN: A new service manager instance. ServiceManager(None) # WHEN: the default service manager is built. # THEN: The the controller should be registered in the registry. self.assertNotEqual(Registry().get('service_manager'), None, 'The base service manager should be registered')
def test_theme_change_song(self, mocked_regenerate_service_items): """ Test that when a Toolbar theme combobox displays correctly when the theme is set to Song """ # GIVEN: A service manager, a service to display with a theme level in the renderer mocked_renderer = MagicMock() service_manager = ServiceManager(None) Registry().register('renderer', mocked_renderer) service_manager.toolbar = OpenLPToolbar(None) service_manager.toolbar.add_toolbar_action('theme_combo_box', triggers=MagicMock()) service_manager.toolbar.add_toolbar_action('theme_label', triggers=MagicMock()) # WHEN: The service manager has a Song theme mocked_renderer.theme_level = ThemeLevel.Song result = service_manager.theme_change() # THEN: The the theme toolbar should be visible self.assertTrue(service_manager.toolbar.actions['theme_combo_box'].isVisible(), 'The visibility should be True')
def test_theme_change_song(self, mocked_regenerate_service_items): """ Test that when a Toolbar theme combobox displays correctly when the theme is set to Song """ # GIVEN: A service manager, a service to display with a theme level in the renderer mocked_renderer = MagicMock() service_manager = ServiceManager(None) Registry().register('renderer', mocked_renderer) service_manager.toolbar = OpenLPToolbar(None) service_manager.toolbar.add_toolbar_action('theme_combo_box', triggers=MagicMock()) service_manager.toolbar.add_toolbar_action('theme_label', triggers=MagicMock()) # WHEN: The service manager has a Song theme mocked_renderer.theme_level = ThemeLevel.Song service_manager.theme_change() # THEN: The the theme toolbar should be visible assert service_manager.toolbar.actions['theme_combo_box'].isVisible() is True, \ 'The visibility should be True'
def test_single_click_timeout_double(self, mocked_make_live, mocked_make_preview): """ Test that when a double click has been registered, the item does not goes to preview """ # GIVEN: A service manager. service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called after a double click service_manager.on_double_click_live() service_manager.on_single_click_preview_timeout() # THEN: make_preview() should not have been called assert mocked_make_preview.call_count == 0, 'ServiceManager.make_preview() should not be called'
def test_supported_suffixes(self): """ Test the create basic service array """ # GIVEN: A new service manager instance. service_manager = ServiceManager(None) # WHEN: a suffix is added as an individual or a list. service_manager.supported_suffixes('txt') service_manager.supported_suffixes(['pptx', 'ppt']) # THEN: The suffixes should be available to test. assert 'txt' in service_manager.suffixes, 'The suffix txt should be in the list' assert 'ppt' in service_manager.suffixes, 'The suffix ppt should be in the list' assert 'pptx' in service_manager.suffixes, 'The suffix pptx should be in the list'
def test_single_click_preview_double(self, mocked_make_live, mocked_singleShot, MockedSettings): """ Test that when a double click has registered the preview timer doesn't start """ # GIVEN: A setting to enable "Preview items when clicked in Service Manager" and a service manager. mocked_settings = MagicMock() mocked_settings.value.return_value = True MockedSettings.return_value = mocked_settings service_manager = ServiceManager(None) # WHEN: on_single_click_preview() is called following a double click service_manager.on_double_click_live() service_manager.on_single_click_preview() # THEN: timer should not be started mocked_make_live.assert_called_with() assert mocked_singleShot.call_count == 0, 'Should not be called'
def test_build_media_context_menu(self): """ Test the creation of a context menu from service item of type Command from Media. """ # GIVEN: A new service manager instance and a default service item. Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', MagicMock()) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.CanAutoStartForLive) service_item.add_capability(ItemCapabilities.CanEditTitle) service_item.add_capability(ItemCapabilities.RequiresMedia) service_item.service_item_type = ServiceItemType.Command service_item.edit_id = 1 service_item._raw_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. assert service_manager.edit_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.rename_action.setVisible.call_count == 2, 'Should have be called twice' assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.notes_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.time_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.auto_start_action.setVisible.call_count == 2, 'Should have be called twice' assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \ 'Should have be called once' assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called' assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called' assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called' assert service_manager.theme_menu.menuAction().setVisible.call_count == 1, \ 'Should have be called once' # THEN I change the length of the media and regenerate the menu. service_item.set_media_length(5) service_manager.context_menu(1) # THEN the following additional calls should have occurred. assert service_manager.time_action.setVisible.call_count == 3, 'Should have be called three times'
class TestRouter(TestCase, TestMixin): """ Test the functions in the :mod:`lib` module. """ def setUp(self): """ Create the UI """ Registry.create() self.setup_application() self.build_settings() Settings().extend_default_settings(__default_settings__) self.service_manager = ServiceManager() self.router = HttpRouter() def tearDown(self): """ Delete all the C++ objects at the end so that we don't have a segfault """ self.destroy_settings() def test_password_encrypter(self): """ Test hash userid and password function """ # GIVEN: A default configuration Settings().setValue('remotes/user id', 'openlp') Settings().setValue('remotes/password', 'password') # WHEN: called with the defined userid router = HttpRouter() router.initialise() test_value = 'b3BlbmxwOnBhc3N3b3Jk' # THEN: the function should return the correct password self.assertEqual( router.auth, test_value, 'The result for make_sha_hash should return the correct encrypted password' ) def test_process_http_request(self): """ Test the router control functionality """ # GIVEN: A testing set of Routes mocked_function = MagicMock() test_route = [ (r'^/stage/api/poll$', { 'function': mocked_function, 'secure': False }), ] self.router.routes = test_route self.router.command = 'GET' # WHEN: called with a poll route function, args = self.router.process_http_request( '/stage/api/poll', None) # THEN: the function should have been called only once self.assertEqual(mocked_function, function['function'], 'The mocked function should match defined value.') self.assertFalse( function['secure'], 'The mocked function should not require any security.') def test_process_secure_http_request(self): """ Test the router control functionality """ # GIVEN: A testing set of Routes mocked_function = MagicMock() test_route = [ (r'^/stage/api/poll$', { 'function': mocked_function, 'secure': True }), ] self.router.routes = test_route self.router.settings_section = 'remotes' Settings().setValue('remotes/authentication enabled', True) self.router.path = '/stage/api/poll' self.router.auth = '' self.router.headers = {'Authorization': None} self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.command = 'GET' # WHEN: called with a poll route self.router.do_post_processor() # THEN: the function should have been called only once self.router.send_response.assert_called_once_with(401) self.assertEqual(self.router.send_header.call_count, 5, 'The header should have been called five times.') def test_get_content_type(self): """ Test the get_content_type logic """ # GIVEN: a set of files and their corresponding types headers = [['test.html', 'text/html'], ['test.css', 'text/css'], ['test.js', 'application/javascript'], ['test.jpg', 'image/jpeg'], ['test.gif', 'image/gif'], ['test.ico', 'image/x-icon'], ['test.png', 'image/png'], ['test.whatever', 'text/plain'], ['test', 'text/plain'], ['', 'text/plain'], [os.path.join(TEST_PATH, 'test.html'), 'text/html']] # WHEN: calling each file type for header in headers: ext, content_type = self.router.get_content_type(header[0]) # THEN: all types should match self.assertEqual(content_type, header[1], 'Mismatch of content type') def test_main_poll(self): """ Test the main poll logic """ # GIVEN: a defined router with two slides Registry.create() Registry().register('live_controller', MagicMock) router = HttpRouter() router.send_response = MagicMock() router.send_header = MagicMock() router.end_headers = MagicMock() router.live_controller.slide_count = 2 # WHEN: main poll called results = router.main_poll() # THEN: the correct response should be returned self.assertEqual(results.decode('utf-8'), '{"results": {"slide_count": 2}}', 'The resulting json strings should match') def test_serve_file_without_params(self): """ Test the serve_file method without params """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath('test/dir') self.router.template_vars = MagicMock() # WHEN: call serve_file with no file_name self.router.serve_file() # THEN: it should return a 404 self.router.send_response.assert_called_once_with(404) self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') def test_serve_file_with_valid_params(self): """ Test the serve_file method with an existing file """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath('test/dir') self.router.template_vars = MagicMock() with patch('openlp.core.lib.os.path.exists') as mocked_exists, \ patch('builtins.open', mock_open(read_data='123')): mocked_exists.return_value = True # WHEN: call serve_file with an existing html file self.router.serve_file(os.path.normpath('test/dir/test.html')) # THEN: it should return a 200 and the file self.router.send_response.assert_called_once_with(200) self.router.send_header.assert_called_once_with( 'Content-type', 'text/html') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') def test_serve_file_with_partial_params(self): """ Test the serve_file method with an existing file """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath('test/dir') self.router.template_vars = MagicMock() with patch('openlp.core.lib.os.path.exists') as mocked_exists, \ patch('builtins.open', mock_open(read_data='123')): mocked_exists.return_value = True # WHEN: call serve_file with an existing html file self.router.serve_file(os.path.normpath('test/dir/test')) # THEN: it should return a 200 and the file self.router.send_response.assert_called_once_with(200) self.router.send_header.assert_called_once_with( 'Content-type', 'text/html') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') def test_serve_thumbnail_without_params(self): """ Test the serve_thumbnail routine without params """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: I request a thumbnail self.router.serve_thumbnail() # THEN: The headers should be set correctly self.router.send_response.assert_called_once_with(404) self.assertEqual(self.router.send_response.call_count, 1, 'Send response should be called once') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers should be called once') def test_serve_thumbnail_with_invalid_params(self): """ Test the serve_thumbnail routine with invalid params """ # GIVEN: Mocked send_header, send_response, end_headers and wfile self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: pass a bad controller self.router.serve_thumbnail('badcontroller', 'tecnologia 1.pptx/slide1.png') # THEN: a 404 should be returned self.assertEqual(len(self.router.send_header.mock_calls), 4, 'header should be called 4 times') self.assertEqual(len(self.router.send_response.mock_calls), 1, 'One response') self.assertEqual(len(self.router.wfile.mock_calls), 1, 'Once call to write to the socket') self.router.send_response.assert_called_once_with(404) # WHEN: pass a bad filename self.router.send_response.reset_mock() self.router.serve_thumbnail('presentations', 'tecnologia 1.pptx/badfilename.png') # THEN: return a 404 self.router.send_response.assert_called_once_with(404) # WHEN: a dangerous URL is passed self.router.send_response.reset_mock() self.router.serve_thumbnail('presentations', '../tecnologia 1.pptx/slide1.png') # THEN: return a 404 self.router.send_response.assert_called_once_with(404) def test_serve_thumbnail_with_valid_params(self): """ Test the serve_thumbnail routine with valid params """ # GIVEN: Mocked send_header, send_response, end_headers and wfile self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() mocked_image_manager = MagicMock() Registry().register('image_manager', mocked_image_manager) file_name = 'another%20test/slide1.png' full_path = os.path.normpath(os.path.join('thumbnails', file_name)) width = 120 height = 90 with patch('openlp.core.lib.os.path.exists') as mocked_exists, \ patch('builtins.open', mock_open(read_data='123')), \ patch('openlp.plugins.remotes.lib.httprouter.AppLocation') as mocked_location, \ patch('openlp.plugins.remotes.lib.httprouter.image_to_byte') as mocked_image_to_byte: mocked_exists.return_value = True mocked_image_to_byte.return_value = '123' mocked_location.get_section_data_path.return_value = '' # WHEN: pass good controller and filename self.router.serve_thumbnail('presentations', '{0}x{1}'.format(width, height), file_name) # THEN: a file should be returned self.assertEqual(self.router.send_header.call_count, 1, 'One header') self.assertEqual(self.router.send_response.call_count, 1, 'Send response called once') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') mocked_exists.assert_called_with(urllib.parse.unquote(full_path)) self.assertEqual(mocked_image_to_byte.call_count, 1, 'Called once') mocked_image_manager.add_image.assert_any_call( os.path.normpath( os.path.join('thumbnails', 'another test', 'slide1.png')), 'slide1.png', None, width, height) mocked_image_manager.get_image.assert_any_call( os.path.normpath( os.path.join('thumbnails', 'another test', 'slide1.png')), 'slide1.png', width, height) def test_remote_next(self): """ Test service manager receives remote next click properly (bug 1407445) """ # GIVEN: initial setup and mocks self.router.routes = [(r'^/api/service/(.*)$', { 'function': self.router.service, 'secure': False })] self.router.request_data = False mocked_next_item = MagicMock() self.service_manager.next_item = mocked_next_item with patch.object(self.service_manager, 'setup_ui'), \ patch.object(self.router, 'do_json_header'): self.service_manager.bootstrap_initialise() self.app.processEvents() # WHEN: Remote next is received self.router.service(action='next') self.app.processEvents() # THEN: service_manager.next_item() should have been called self.assertTrue( mocked_next_item.called, 'next_item() should have been called in service_manager') def test_remote_previous(self): """ Test service manager receives remote previous click properly (bug 1407445) """ # GIVEN: initial setup and mocks self.router.routes = [(r'^/api/service/(.*)$', { 'function': self.router.service, 'secure': False })] self.router.request_data = False mocked_previous_item = MagicMock() self.service_manager.previous_item = mocked_previous_item with patch.object(self.service_manager, 'setup_ui'), \ patch.object(self.router, 'do_json_header'): self.service_manager.bootstrap_initialise() self.app.processEvents() # WHEN: Remote next is received self.router.service(action='previous') self.app.processEvents() # THEN: service_manager.next_item() should have been called self.assertTrue( mocked_previous_item.called, 'previous_item() should have been called in service_manager') def test_remote_stage_personal_html(self): """ Test the stage url with a parameter after loaded a url/stage.html file """ # GIVEN: initial route self.router.config_dir = '' self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router._process_file = MagicMock() # WHEN: I call stage with a suffix self.router.stages('stages', 'trb') # THEN: we should use the specific stage file instance self.router._process_file.assert_called_with( os.path.join('trb', 'stage.html')) def test_remote_stage_personal_css(self): """ Test the html with reference stages/trb/trb.css then loaded a stages/trb/trb.css file """ # GIVEN: initial route self.router.config_dir = '' self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router._process_file = MagicMock() # WHEN: I call stage with a suffix self.router.stages('stages', 'stages/trb/trb.css') # THEN: we should use the specific stage file instance self.router._process_file.assert_called_with( os.path.join('trb', 'trb.css'))
def test_build_context_menu(self): """ Test the creation of a context menu from a null service item. """ # GIVEN: A new service manager instance and a default service item. service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. assert service_manager.edit_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.rename_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.notes_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.time_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.auto_start_action.setVisible.call_count == 1, 'Should have been called once' assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \ 'Should have been called once' assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called' assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called' assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called' assert service_manager.theme_menu.menuAction().setVisible.call_count == 1, \ 'Should have been called once'
class TestRouter(TestCase, TestMixin): """ Test the functions in the :mod:`lib` module. """ def setUp(self): """ Create the UI """ Registry.create() self.setup_application() self.build_settings() Settings().extend_default_settings(__default_settings__) self.service_manager = ServiceManager() self.router = HttpRouter() def tearDown(self): """ Delete all the C++ objects at the end so that we don't have a segfault """ self.destroy_settings() def password_encrypter_test(self): """ Test hash userid and password function """ # GIVEN: A default configuration Settings().setValue("remotes/user id", "openlp") Settings().setValue("remotes/password", "password") # WHEN: called with the defined userid router = HttpRouter() router.initialise() test_value = "b3BlbmxwOnBhc3N3b3Jk" # THEN: the function should return the correct password self.assertEqual( router.auth, test_value, "The result for make_sha_hash should return the correct encrypted password" ) def process_http_request_test(self): """ Test the router control functionality """ # GIVEN: A testing set of Routes mocked_function = MagicMock() test_route = [(r"^/stage/api/poll$", {"function": mocked_function, "secure": False})] self.router.routes = test_route # WHEN: called with a poll route function, args = self.router.process_http_request("/stage/api/poll", None) # THEN: the function should have been called only once self.assertEqual(mocked_function, function["function"], "The mocked function should match defined value.") self.assertFalse(function["secure"], "The mocked function should not require any security.") def process_secure_http_request_test(self): """ Test the router control functionality """ # GIVEN: A testing set of Routes mocked_function = MagicMock() test_route = [(r"^/stage/api/poll$", {"function": mocked_function, "secure": True})] self.router.routes = test_route self.router.settings_section = "remotes" Settings().setValue("remotes/authentication enabled", True) self.router.path = "/stage/api/poll" self.router.auth = "" self.router.headers = {"Authorization": None} self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: called with a poll route self.router.do_post_processor() # THEN: the function should have been called only once self.router.send_response.assert_called_once_with(401) self.assertEqual(self.router.send_header.call_count, 5, "The header should have been called five times.") def get_content_type_test(self): """ Test the get_content_type logic """ # GIVEN: a set of files and their corresponding types headers = [ ["test.html", "text/html"], ["test.css", "text/css"], ["test.js", "application/javascript"], ["test.jpg", "image/jpeg"], ["test.gif", "image/gif"], ["test.ico", "image/x-icon"], ["test.png", "image/png"], ["test.whatever", "text/plain"], ["test", "text/plain"], ["", "text/plain"], [os.path.join(TEST_PATH, "test.html"), "text/html"], ] # WHEN: calling each file type for header in headers: ext, content_type = self.router.get_content_type(header[0]) # THEN: all types should match self.assertEqual(content_type, header[1], "Mismatch of content type") def main_poll_test(self): """ Test the main poll logic """ # GIVEN: a defined router with two slides Registry.create() Registry().register("live_controller", MagicMock) router = HttpRouter() router.send_response = MagicMock() router.send_header = MagicMock() router.end_headers = MagicMock() router.live_controller.slide_count = 2 # WHEN: main poll called results = router.main_poll() # THEN: the correct response should be returned self.assertEqual( results.decode("utf-8"), '{"results": {"slide_count": 2}}', "The resulting json strings should match" ) def serve_file_without_params_test(self): """ Test the serve_file method without params """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath("test/dir") self.router.template_vars = MagicMock() # WHEN: call serve_file with no file_name self.router.serve_file() # THEN: it should return a 404 self.router.send_response.assert_called_once_with(404) self.assertEqual(self.router.end_headers.call_count, 1, "end_headers called once") def serve_file_with_valid_params_test(self): """ Test the serve_file method with an existing file """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath("test/dir") self.router.template_vars = MagicMock() with patch("openlp.core.lib.os.path.exists") as mocked_exists, patch( "builtins.open", mock_open(read_data="123") ): mocked_exists.return_value = True # WHEN: call serve_file with an existing html file self.router.serve_file(os.path.normpath("test/dir/test.html")) # THEN: it should return a 200 and the file self.router.send_response.assert_called_once_with(200) self.router.send_header.assert_called_once_with("Content-type", "text/html") self.assertEqual(self.router.end_headers.call_count, 1, "end_headers called once") def serve_thumbnail_without_params_test(self): """ Test the serve_thumbnail routine without params """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: I request a thumbnail self.router.serve_thumbnail() # THEN: The headers should be set correctly self.router.send_response.assert_called_once_with(404) self.assertEqual(self.router.send_response.call_count, 1, "Send response should be called once") self.assertEqual(self.router.end_headers.call_count, 1, "end_headers should be called once") def serve_thumbnail_with_invalid_params_test(self): """ Test the serve_thumbnail routine with invalid params """ # GIVEN: Mocked send_header, send_response, end_headers and wfile self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: pass a bad controller self.router.serve_thumbnail("badcontroller", "tecnologia 1.pptx/slide1.png") # THEN: a 404 should be returned self.assertEqual(len(self.router.send_header.mock_calls), 4, "header should be called 4 times") self.assertEqual(len(self.router.send_response.mock_calls), 1, "One response") self.assertEqual(len(self.router.wfile.mock_calls), 1, "Once call to write to the socket") self.router.send_response.assert_called_once_with(404) # WHEN: pass a bad filename self.router.send_response.reset_mock() self.router.serve_thumbnail("presentations", "tecnologia 1.pptx/badfilename.png") # THEN: return a 404 self.router.send_response.assert_called_once_with(404) # WHEN: a dangerous URL is passed self.router.send_response.reset_mock() self.router.serve_thumbnail("presentations", "../tecnologia 1.pptx/slide1.png") # THEN: return a 404 self.router.send_response.assert_called_once_with(404) def serve_thumbnail_with_valid_params_test(self): """ Test the serve_thumbnail routine with valid params """ # GIVEN: Mocked send_header, send_response, end_headers and wfile self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() mocked_image_manager = MagicMock() Registry.create() Registry().register("image_manager", mocked_image_manager) file_name = "another%20test/slide1.png" full_path = os.path.normpath(os.path.join("thumbnails", file_name)) width = 120 height = 90 with patch("openlp.core.lib.os.path.exists") as mocked_exists, patch( "builtins.open", mock_open(read_data="123") ), patch("openlp.plugins.remotes.lib.httprouter.AppLocation") as mocked_location, patch( "openlp.plugins.remotes.lib.httprouter.image_to_byte" ) as mocked_image_to_byte: mocked_exists.return_value = True mocked_image_to_byte.return_value = "123" mocked_location.get_section_data_path.return_value = "" # WHEN: pass good controller and filename self.router.serve_thumbnail("presentations", "{0}x{1}".format(width, height), file_name) # THEN: a file should be returned self.assertEqual(self.router.send_header.call_count, 1, "One header") self.assertEqual(self.router.send_response.call_count, 1, "Send response called once") self.assertEqual(self.router.end_headers.call_count, 1, "end_headers called once") mocked_exists.assert_called_with(urllib.parse.unquote(full_path)) self.assertEqual(mocked_image_to_byte.call_count, 1, "Called once") mocked_image_manager.assert_called_any( os.path.normpath("thumbnails\\another test"), "slide1.png", None, "120x90" ) mocked_image_manager.assert_called_any(os.path.normpath("thumbnails\\another test"), "slide1.png", "120x90") def remote_next_test(self): """ Test service manager receives remote next click properly (bug 1407445) """ # GIVEN: initial setup and mocks self.router.routes = [(r"^/api/service/(.*)$", {"function": self.router.service, "secure": False})] self.router.request_data = False mocked_next_item = MagicMock() self.service_manager.next_item = mocked_next_item with patch.object(self.service_manager, "setup_ui"), patch.object(self.router, "do_json_header"): self.service_manager.bootstrap_initialise() self.app.processEvents() # WHEN: Remote next is received self.router.service(action="next") self.app.processEvents() # THEN: service_manager.next_item() should have been called self.assertTrue(mocked_next_item.called, "next_item() should have been called in service_manager") def remote_previous_test(self): """ Test service manager receives remote previous click properly (bug 1407445) """ # GIVEN: initial setup and mocks self.router.routes = [(r"^/api/service/(.*)$", {"function": self.router.service, "secure": False})] self.router.request_data = False mocked_previous_item = MagicMock() self.service_manager.previous_item = mocked_previous_item with patch.object(self.service_manager, "setup_ui"), patch.object(self.router, "do_json_header"): self.service_manager.bootstrap_initialise() self.app.processEvents() # WHEN: Remote next is received self.router.service(action="previous") self.app.processEvents() # THEN: service_manager.next_item() should have been called self.assertTrue(mocked_previous_item.called, "previous_item() should have been called in service_manager")
def build_custom_context_menu_test(self): """ Test the creation of a context menu from service item of type text from Custom. """ # GIVEN: A new service manager instance and a default service item. mocked_renderer = MagicMock() mocked_renderer.theme_level = ThemeLevel.Song Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', mocked_renderer) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.CanEdit) service_item.add_capability(ItemCapabilities.CanPreview) service_item.add_capability(ItemCapabilities.CanLoop) service_item.add_capability(ItemCapabilities.CanSoftBreak) service_item.add_capability(ItemCapabilities.OnLoadUpdate) service_item.service_item_type = ServiceItemType.Text service_item.edit_id = 1 service_item._display_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. self.assertEquals(service_manager.edit_action.setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 2, 'Should have be called twice') # THEN we add a 2nd display frame service_item._display_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once')
def build_media_context_menu_test(self): """ Test the creation of a context menu from service item of type Command from Media. """ # GIVEN: A new service manager instance and a default service item. Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', MagicMock()) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.CanAutoStartForLive) service_item.add_capability(ItemCapabilities.CanEditTitle) service_item.add_capability(ItemCapabilities.RequiresMedia) service_item.service_item_type = ServiceItemType.Command service_item.edit_id = 1 service_item._raw_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') # THEN I change the length of the media and regenerate the menu. service_item.set_media_length(5) service_manager.context_menu(1) # THEN the following additional calls should have occurred. self.assertEquals(service_manager.time_action.setVisible.call_count, 3, 'Should have be called three times')
def build_image_context_menu_test(self): """ Test the creation of a context menu from service item of type Image from Image. """ # GIVEN: A new service manager instance and a default service item. Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', MagicMock()) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.CanMaintain) service_item.add_capability(ItemCapabilities.CanPreview) service_item.add_capability(ItemCapabilities.CanLoop) service_item.add_capability(ItemCapabilities.CanAppend) service_item.add_capability(ItemCapabilities.CanEditTitle) service_item.service_item_type = ServiceItemType.Image service_item.edit_id = 1 service_item._raw_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.rename_action.setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.maintain_action.setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') # THEN we add a 2nd display frame and regenerate the menu. service_item._raw_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 2, 'Should have be called twice') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 1, 'Should have be called once')
def test_build_presentation_non_pdf_context_menu(self): """ Test the creation of a context menu from service item of type Command with Impress from Presentation. """ # GIVEN: A new service manager instance and a default service item. Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', MagicMock()) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.ProvidesOwnDisplay) service_item.service_item_type = ServiceItemType.Command service_item.edit_id = 1 service_item._raw_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. assert service_manager.edit_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.rename_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.notes_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.time_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.auto_start_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \ 'Should have be called once' assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called' assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called' assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called' assert service_manager.theme_menu.menuAction().setVisible.call_count == 1, \ 'Should have be called once'
class TestRouter(TestCase, TestMixin): """ Test the functions in the :mod:`lib` module. """ def setUp(self): """ Create the UI """ Registry.create() self.setup_application() self.build_settings() Settings().extend_default_settings(__default_settings__) self.service_manager = ServiceManager() self.router = HttpRouter() def tearDown(self): """ Delete all the C++ objects at the end so that we don't have a segfault """ self.destroy_settings() def test_password_encrypter(self): """ Test hash userid and password function """ # GIVEN: A default configuration Settings().setValue('remotes/user id', 'openlp') Settings().setValue('remotes/password', 'password') # WHEN: called with the defined userid router = HttpRouter() router.initialise() test_value = 'b3BlbmxwOnBhc3N3b3Jk' # THEN: the function should return the correct password self.assertEqual(router.auth, test_value, 'The result for make_sha_hash should return the correct encrypted password') def test_process_http_request(self): """ Test the router control functionality """ # GIVEN: A testing set of Routes mocked_function = MagicMock() test_route = [ (r'^/stage/api/poll$', {'function': mocked_function, 'secure': False}), ] self.router.routes = test_route self.router.command = 'GET' # WHEN: called with a poll route function, args = self.router.process_http_request('/stage/api/poll', None) # THEN: the function should have been called only once self.assertEqual(mocked_function, function['function'], 'The mocked function should match defined value.') self.assertFalse(function['secure'], 'The mocked function should not require any security.') def test_process_secure_http_request(self): """ Test the router control functionality """ # GIVEN: A testing set of Routes mocked_function = MagicMock() test_route = [ (r'^/stage/api/poll$', {'function': mocked_function, 'secure': True}), ] self.router.routes = test_route self.router.settings_section = 'remotes' Settings().setValue('remotes/authentication enabled', True) self.router.path = '/stage/api/poll' self.router.auth = '' self.router.headers = {'Authorization': None} self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.command = 'GET' # WHEN: called with a poll route self.router.do_post_processor() # THEN: the function should have been called only once self.router.send_response.assert_called_once_with(401) self.assertEqual(self.router.send_header.call_count, 5, 'The header should have been called five times.') def test_get_content_type(self): """ Test the get_content_type logic """ # GIVEN: a set of files and their corresponding types headers = [ ['test.html', 'text/html'], ['test.css', 'text/css'], ['test.js', 'application/javascript'], ['test.jpg', 'image/jpeg'], ['test.gif', 'image/gif'], ['test.ico', 'image/x-icon'], ['test.png', 'image/png'], ['test.whatever', 'text/plain'], ['test', 'text/plain'], ['', 'text/plain'], [os.path.join(TEST_PATH, 'test.html'), 'text/html']] # WHEN: calling each file type for header in headers: ext, content_type = self.router.get_content_type(header[0]) # THEN: all types should match self.assertEqual(content_type, header[1], 'Mismatch of content type') def test_main_poll(self): """ Test the main poll logic """ # GIVEN: a defined router with two slides Registry.create() Registry().register('live_controller', MagicMock) router = HttpRouter() router.send_response = MagicMock() router.send_header = MagicMock() router.end_headers = MagicMock() router.live_controller.slide_count = 2 # WHEN: main poll called results = router.main_poll() # THEN: the correct response should be returned self.assertEqual(results.decode('utf-8'), '{"results": {"slide_count": 2}}', 'The resulting json strings should match') def test_serve_file_without_params(self): """ Test the serve_file method without params """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath('test/dir') self.router.template_vars = MagicMock() # WHEN: call serve_file with no file_name self.router.serve_file() # THEN: it should return a 404 self.router.send_response.assert_called_once_with(404) self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') def test_serve_file_with_valid_params(self): """ Test the serve_file method with an existing file """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath('test/dir') self.router.template_vars = MagicMock() with patch('openlp.core.lib.os.path.exists') as mocked_exists, \ patch('builtins.open', mock_open(read_data='123')): mocked_exists.return_value = True # WHEN: call serve_file with an existing html file self.router.serve_file(os.path.normpath('test/dir/test.html')) # THEN: it should return a 200 and the file self.router.send_response.assert_called_once_with(200) self.router.send_header.assert_called_once_with('Content-type', 'text/html') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') def test_serve_file_with_partial_params(self): """ Test the serve_file method with an existing file """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router.html_dir = os.path.normpath('test/dir') self.router.template_vars = MagicMock() with patch('openlp.core.lib.os.path.exists') as mocked_exists, \ patch('builtins.open', mock_open(read_data='123')): mocked_exists.return_value = True # WHEN: call serve_file with an existing html file self.router.serve_file(os.path.normpath('test/dir/test')) # THEN: it should return a 200 and the file self.router.send_response.assert_called_once_with(200) self.router.send_header.assert_called_once_with('Content-type', 'text/html') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') def test_serve_thumbnail_without_params(self): """ Test the serve_thumbnail routine without params """ # GIVEN: mocked environment self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: I request a thumbnail self.router.serve_thumbnail() # THEN: The headers should be set correctly self.router.send_response.assert_called_once_with(404) self.assertEqual(self.router.send_response.call_count, 1, 'Send response should be called once') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers should be called once') def test_serve_thumbnail_with_invalid_params(self): """ Test the serve_thumbnail routine with invalid params """ # GIVEN: Mocked send_header, send_response, end_headers and wfile self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() # WHEN: pass a bad controller self.router.serve_thumbnail('badcontroller', 'tecnologia 1.pptx/slide1.png') # THEN: a 404 should be returned self.assertEqual(len(self.router.send_header.mock_calls), 4, 'header should be called 4 times') self.assertEqual(len(self.router.send_response.mock_calls), 1, 'One response') self.assertEqual(len(self.router.wfile.mock_calls), 1, 'Once call to write to the socket') self.router.send_response.assert_called_once_with(404) # WHEN: pass a bad filename self.router.send_response.reset_mock() self.router.serve_thumbnail('presentations', 'tecnologia 1.pptx/badfilename.png') # THEN: return a 404 self.router.send_response.assert_called_once_with(404) # WHEN: a dangerous URL is passed self.router.send_response.reset_mock() self.router.serve_thumbnail('presentations', '../tecnologia 1.pptx/slide1.png') # THEN: return a 404 self.router.send_response.assert_called_once_with(404) def test_serve_thumbnail_with_valid_params(self): """ Test the serve_thumbnail routine with valid params """ # GIVEN: Mocked send_header, send_response, end_headers and wfile self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() mocked_image_manager = MagicMock() Registry().register('image_manager', mocked_image_manager) file_name = 'another%20test/slide1.png' full_path = os.path.normpath(os.path.join('thumbnails', file_name)) width = 120 height = 90 with patch('openlp.core.lib.os.path.exists') as mocked_exists, \ patch('builtins.open', mock_open(read_data='123')), \ patch('openlp.plugins.remotes.lib.httprouter.AppLocation') as mocked_location, \ patch('openlp.plugins.remotes.lib.httprouter.image_to_byte') as mocked_image_to_byte: mocked_exists.return_value = True mocked_image_to_byte.return_value = '123' mocked_location.get_section_data_path.return_value = '' # WHEN: pass good controller and filename self.router.serve_thumbnail('presentations', '{0}x{1}'.format(width, height), file_name) # THEN: a file should be returned self.assertEqual(self.router.send_header.call_count, 1, 'One header') self.assertEqual(self.router.send_response.call_count, 1, 'Send response called once') self.assertEqual(self.router.end_headers.call_count, 1, 'end_headers called once') mocked_exists.assert_called_with(urllib.parse.unquote(full_path)) self.assertEqual(mocked_image_to_byte.call_count, 1, 'Called once') mocked_image_manager.add_image.assert_any_call(os.path.normpath(os.path.join('thumbnails', 'another test', 'slide1.png')), 'slide1.png', None, width, height) mocked_image_manager.get_image.assert_any_call(os.path.normpath(os.path.join('thumbnails', 'another test', 'slide1.png')), 'slide1.png', width, height) def test_remote_next(self): """ Test service manager receives remote next click properly (bug 1407445) """ # GIVEN: initial setup and mocks self.router.routes = [(r'^/api/service/(.*)$', {'function': self.router.service, 'secure': False})] self.router.request_data = False mocked_next_item = MagicMock() self.service_manager.next_item = mocked_next_item with patch.object(self.service_manager, 'setup_ui'), \ patch.object(self.router, 'do_json_header'): self.service_manager.bootstrap_initialise() self.app.processEvents() # WHEN: Remote next is received self.router.service(action='next') self.app.processEvents() # THEN: service_manager.next_item() should have been called self.assertTrue(mocked_next_item.called, 'next_item() should have been called in service_manager') def test_remote_previous(self): """ Test service manager receives remote previous click properly (bug 1407445) """ # GIVEN: initial setup and mocks self.router.routes = [(r'^/api/service/(.*)$', {'function': self.router.service, 'secure': False})] self.router.request_data = False mocked_previous_item = MagicMock() self.service_manager.previous_item = mocked_previous_item with patch.object(self.service_manager, 'setup_ui'), \ patch.object(self.router, 'do_json_header'): self.service_manager.bootstrap_initialise() self.app.processEvents() # WHEN: Remote next is received self.router.service(action='previous') self.app.processEvents() # THEN: service_manager.next_item() should have been called self.assertTrue(mocked_previous_item.called, 'previous_item() should have been called in service_manager') def test_remote_stage_personal_html(self): """ Test the stage url with a parameter after loaded a url/stage.html file """ # GIVEN: initial route self.router.config_dir = '' self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router._process_file = MagicMock() # WHEN: I call stage with a suffix self.router.stages('stages', 'trb') # THEN: we should use the specific stage file instance self.router._process_file.assert_called_with(os.path.join('trb', 'stage.html')) def test_remote_stage_personal_css(self): """ Test the html with reference stages/trb/trb.css then loaded a stages/trb/trb.css file """ # GIVEN: initial route self.router.config_dir = '' self.router.send_response = MagicMock() self.router.send_header = MagicMock() self.router.end_headers = MagicMock() self.router.wfile = MagicMock() self.router._process_file = MagicMock() # WHEN: I call stage with a suffix self.router.stages('stages', 'stages/trb/trb.css') # THEN: we should use the specific stage file instance self.router._process_file.assert_called_with(os.path.join('trb', 'trb.css'))
def test_build_custom_context_menu(self): """ Test the creation of a context menu from service item of type text from Custom. """ # GIVEN: A new service manager instance and a default service item. mocked_renderer = MagicMock() mocked_renderer.theme_level = ThemeLevel.Song Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', mocked_renderer) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.CanEdit) service_item.add_capability(ItemCapabilities.CanPreview) service_item.add_capability(ItemCapabilities.CanLoop) service_item.add_capability(ItemCapabilities.CanSoftBreak) service_item.add_capability(ItemCapabilities.OnLoadUpdate) service_item.service_item_type = ServiceItemType.Text service_item.edit_id = 1 service_item._display_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. assert service_manager.edit_action.setVisible.call_count == 2, 'Should have be called twice' assert service_manager.rename_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.create_custom_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.maintain_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.notes_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.time_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.auto_start_action.setVisible.call_count == 1, 'Should have be called once' assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 1, \ 'Should have be called once' assert service_manager.auto_play_slides_once.setChecked.call_count == 0, 'Should not be called' assert service_manager.auto_play_slides_loop.setChecked.call_count == 0, 'Should not be called' assert service_manager.timed_slide_interval.setChecked.call_count == 0, 'Should not be called' assert service_manager.theme_menu.menuAction().setVisible.call_count == 2, \ 'Should have be called twice' # THEN we add a 2nd display frame service_item._display_frames.append(MagicMock()) service_manager.context_menu(1) # THEN the following additional calls should have occurred. assert service_manager.auto_play_slides_menu.menuAction().setVisible.call_count == 2, \ 'Should have be called twice' assert service_manager.auto_play_slides_once.setChecked.call_count == 1, 'Should have be called once' assert service_manager.auto_play_slides_loop.setChecked.call_count == 1, 'Should have be called once' assert service_manager.timed_slide_interval.setChecked.call_count == 1, 'Should have be called once'
def build_context_menu_test(self): """ Test the creation of a context menu from a null service item. """ # GIVEN: A new service manager instance and a default service item. service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have been called once') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have been called once')
def build_presentation_non_pdf_context_menu_test(self): """ Test the creation of a context menu from service item of type Command with Impress from Presentation. """ # GIVEN: A new service manager instance and a default service item. Registry().register('plugin_manager', MagicMock()) Registry().register('renderer', MagicMock()) service_manager = ServiceManager(None) item = MagicMock() item.parent.return_value = False item.data.return_value = 0 service_manager.service_manager_list = MagicMock() service_manager.service_manager_list.itemAt.return_value = item service_item = ServiceItem(None) service_item.add_capability(ItemCapabilities.ProvidesOwnDisplay) service_item.service_item_type = ServiceItemType.Command service_item.edit_id = 1 service_item._raw_frames.append(MagicMock()) service_manager.service_items.insert(1, {'service_item': service_item}) service_manager.edit_action = MagicMock() service_manager.rename_action = MagicMock() service_manager.create_custom_action = MagicMock() service_manager.maintain_action = MagicMock() service_manager.notes_action = MagicMock() service_manager.time_action = MagicMock() service_manager.auto_start_action = MagicMock() service_manager.auto_play_slides_menu = MagicMock() service_manager.auto_play_slides_once = MagicMock() service_manager.auto_play_slides_loop = MagicMock() service_manager.timed_slide_interval = MagicMock() service_manager.theme_menu = MagicMock() service_manager.menu = MagicMock() # WHEN I define a context menu service_manager.context_menu(1) # THEN the following calls should have occurred. self.assertEquals(service_manager.edit_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.rename_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.create_custom_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.maintain_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.notes_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.time_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_start_action.setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_menu.menuAction().setVisible.call_count, 1, 'Should have be called once') self.assertEquals(service_manager.auto_play_slides_once.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.auto_play_slides_loop.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.timed_slide_interval.setChecked.call_count, 0, 'Should not be called') self.assertEquals(service_manager.theme_menu.menuAction().setVisible.call_count, 1, 'Should have be called once')