Coverage for test/unittests/test_manager.py: 99%
119 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-17 13:44 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-17 13:44 +0000
1import unittest
2from os.path import join, dirname
3from unittest.mock import MagicMock, patch
5from ovos_bus_client.message import Message
7from ovos_core.skill_manager import SkillManager
10class TestSkillManager(unittest.TestCase):
12 def setUp(self):
13 self.bus = MagicMock()
14 self.skill_manager = SkillManager(self.bus)
16 def test_blacklist_property(self):
17 blacklist = self.skill_manager.blacklist
18 self.assertIsInstance(blacklist, list)
20 @patch('ovos_core.skill_manager.LOG')
21 def test_handle_settings_file_change(self, mock_log):
22 path = '/some/path/skills/settings.json'
23 self.skill_manager._handle_settings_file_change(path)
24 self.bus.emit.assert_called_once_with(Message("ovos.skills.settings_changed", {"skill_id": "skills"}))
25 mock_log.info.assert_called_once_with(f"skill settings.json change detected for skills")
27 @patch('ovos_core.skill_manager.find_skill_plugins', return_value={'mock_plugin': 'path/to/mock_plugin'})
28 def test_load_plugin_skills(self, mock_find_skill_plugins):
29 self.skill_manager._load_plugin_skill = MagicMock(return_value=True)
30 self.skill_manager.load_plugin_skills(network=True, internet=True)
31 self.assertTrue(self.skill_manager._load_plugin_skill.called)
32 mock_find_skill_plugins.assert_called_once()
34 @patch('ovos_core.skill_manager.is_gui_connected', return_value=True)
35 def test_handle_gui_connected(self, mock_is_gui_connected):
36 self.skill_manager._allow_state_reloads = True
37 self.skill_manager._gui_event.clear()
38 self.skill_manager._load_new_skills = MagicMock()
39 self.skill_manager.handle_gui_connected(Message("", data={"permanent": False}))
40 self.assertTrue(self.skill_manager._gui_event.is_set())
41 self.assertTrue(self.skill_manager._load_new_skills.called)
43 @patch('ovos_core.skill_manager.is_gui_connected', return_value=False)
44 def test_handle_gui_disconnected(self, mock_is_gui_connected):
45 self.skill_manager._allow_state_reloads = True
46 self.skill_manager._gui_event.set()
47 self.skill_manager._unload_on_gui_disconnect = MagicMock()
48 self.skill_manager.handle_gui_disconnected(Message(""))
49 self.assertFalse(self.skill_manager._gui_event.is_set())
50 self.assertTrue(self.skill_manager._unload_on_gui_disconnect.called)
52 @patch('ovos_core.skill_manager.is_connected_http', return_value=True)
53 def test_handle_internet_connected(self, mock_is_connected):
54 self.skill_manager._connected_event.clear()
55 self.skill_manager._network_event.clear()
56 self.skill_manager._network_loaded.set()
57 self.skill_manager._load_on_internet = MagicMock()
58 self.skill_manager.handle_internet_connected(Message(""))
59 self.assertTrue(self.skill_manager._connected_event.is_set())
60 self.assertTrue(self.skill_manager._network_loaded.is_set())
61 self.assertTrue(self.skill_manager._load_on_internet.called)
63 @patch('ovos_core.skill_manager.is_connected_http', return_value=False)
64 def test_handle_internet_disconnected(self, mock_is_connected):
65 self.skill_manager._allow_state_reloads = True
66 self.skill_manager._connected_event.set()
67 self.skill_manager._internet_loaded.set()
68 self.skill_manager._unload_on_internet_disconnect = MagicMock()
69 self.skill_manager.handle_internet_disconnected(Message(""))
70 self.assertFalse(self.skill_manager._connected_event.is_set())
71 self.assertTrue(self.skill_manager._unload_on_internet_disconnect.called)
73 @patch('ovos_core.skill_manager.is_connected_http', return_value=True)
74 def test_handle_network_connected(self, mock_is_connected):
75 self.skill_manager._network_event.clear()
76 self.skill_manager._load_on_network = MagicMock()
77 self.skill_manager.handle_network_connected(Message(""))
78 self.assertTrue(self.skill_manager._network_event.is_set())
79 self.assertTrue(self.skill_manager._load_on_network.called)
81 @patch('ovos_core.skill_manager.is_connected_http', return_value=False)
82 def test_handle_network_disconnected(self, mock_is_connected):
83 self.skill_manager._allow_state_reloads = True
84 self.skill_manager._network_event.set()
85 self.skill_manager._unload_on_network_disconnect = MagicMock()
86 self.skill_manager.handle_network_disconnected(Message(""))
87 self.assertFalse(self.skill_manager._network_event.is_set())
88 self.assertTrue(self.skill_manager._unload_on_network_disconnect.called)
90 @patch('ovos_core.skill_manager.is_gui_connected', return_value=True)
91 @patch('ovos_core.skill_manager.is_connected_http', return_value=True)
92 def test_sync_skill_loading_state_no_phal_plugin(self, mock_is_connected, mock_is_gui_connected):
93 self.bus.wait_for_response.return_value = None
95 self.skill_manager._gui_event.clear()
96 self.skill_manager._connected_event.clear()
97 self.skill_manager._network_event.clear()
99 self.skill_manager._sync_skill_loading_state()
101 self.assertTrue(self.skill_manager._gui_event.is_set())
102 self.assertTrue(self.bus.emit.called)
103 self.assertEqual(self.bus.emit.call_args[0][0].msg_type, 'mycroft.internet.connected')
105 @patch('ovos_core.skill_manager.is_gui_connected', return_value=False)
106 def test_sync_skill_loading_state_phal_plugin_no_gui(self, mock_is_gui_connected):
107 self.bus.wait_for_response.return_value = Message("ovos.PHAL.internet_check", data={"internet_connected": True})
109 self.skill_manager._gui_event.clear()
110 self.skill_manager._connected_event.clear()
111 self.skill_manager._network_event.clear()
113 self.skill_manager._sync_skill_loading_state()
115 self.assertFalse(self.skill_manager._gui_event.is_set())
116 self.assertTrue(self.bus.emit.called)
117 self.assertEqual(self.bus.emit.call_args[0][0].msg_type, 'mycroft.internet.connected')
119 @patch('ovos_core.skill_manager.is_gui_connected', return_value=True)
120 def test_sync_skill_loading_state_gui_no_internet_but_network(self, mock_is_gui_connected):
121 self.bus.wait_for_response.return_value = Message("ovos.PHAL.internet_check",
122 data={"internet_connected": False,
123 "network_connected": True})
125 self.skill_manager._gui_event.clear()
126 self.skill_manager._connected_event.clear()
127 self.skill_manager._network_event.clear()
129 self.skill_manager._sync_skill_loading_state()
131 self.assertTrue(self.skill_manager._gui_event.is_set())
132 self.assertTrue(self.bus.emit.called)
133 self.assertEqual(self.bus.emit.call_args[0][0].msg_type, 'mycroft.network.connected')
135 @patch('ovos_core.skill_manager.MessageBusClient', autospec=True)
136 def test_get_internal_skill_bus_shared_connection(self, mock_MessageBusClient):
137 # Set the configuration to use shared_connection=True
138 self.skill_manager.config = {'websocket': {'shared_connection': True}}
140 # Call the method under test
141 result = self.skill_manager._get_internal_skill_bus()
143 # Ensure the shared connection is returned
144 self.assertEqual(result, self.bus)
145 # Ensure that MessageBusClient is not called since shared_connection=True
146 self.assertFalse(mock_MessageBusClient.called)
148 @patch('ovos_core.skill_manager.MessageBusClient', autospec=True)
149 def test_get_internal_skill_bus_not_shared_connection(self, mock_MessageBusClient):
150 # Set the configuration to use shared_connection=False
151 self.skill_manager.config = {'websocket': {'shared_connection': False}}
153 # Call the method under test
154 result = self.skill_manager._get_internal_skill_bus()
156 # Ensure a new MessageBusClient is created and returned
157 mock_MessageBusClient.assert_called_once_with(cache=True)
158 self.assertTrue(result.run_in_thread.called)
161if __name__ == '__main__':
162 unittest.main()