Skip to content

Commit

Permalink
Minor adjustments to GuiWebsocketHandler with added unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
NeonDaniel committed Jul 6, 2023
1 parent 5cbea01 commit ecda815
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 13 deletions.
21 changes: 12 additions & 9 deletions ovos_gui/bus.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ def create_gui_service(nsmanager=None) -> Application:
parse_command_line(['--logging=None'])

routes = [(websocket_config['route'], GUIWebsocketHandler)]
application = Application(routes)
application.nsmanager = nsmanager
application = Application(routes, namespace_manager=nsmanager)
application.listen(
websocket_config['base_port'], websocket_config['host']
)
Expand Down Expand Up @@ -101,7 +100,14 @@ class GUIWebsocketHandler(WebSocketHandler):
def __init__(self, *args, **kwargs):
WebSocketHandler.__init__(self, *args, **kwargs)
self._framework = "qt5"
self.ns_manager = self.application.nsmanager
self.ns_manager = self.application.settings.get("namespace_manager")

@property
def framework(self) -> str:
"""
Get the GUI framework used by this client
"""
return self._framework or "qt5"

def open(self):
"""
Expand Down Expand Up @@ -162,10 +168,6 @@ def synchronize(self):
})
namespace_pos += 1

@property
def framework(self):
return self._framework or "qt5"

def on_message(self, message: str):
"""
Handle a message on the GUI websocket. Deserialize the message, map
Expand Down Expand Up @@ -275,9 +277,10 @@ def send(self, data: dict):
@param data: Data to send to the GUI
"""
s = json.dumps(data)
# LOG.info('Sending {}'.format(s))
self.write_message(s)

def check_origin(self, origin):
"""Disable origin check to make js connections work."""
"""
Override origin check to make js connections work.
"""
return True
127 changes: 123 additions & 4 deletions test/unittests/test_bus.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import unittest
from unittest.mock import patch, Mock

import ovos_gui.bus


class TestBus(unittest.TestCase):
@patch("ovos_gui.bus.Configuration")
Expand All @@ -17,9 +19,17 @@ def test_get_gui_websocket_config(self, configuration):
with self.assertRaises(KeyError):
get_gui_websocket_config()

def test_create_gui_service(self):
@patch("ovos_gui.bus.create_daemon")
@patch("ovos_gui.bus.ioloop")
def test_create_gui_service(self, ioloop, create_daemon):
from ovos_gui.bus import create_gui_service
# TODO
ioloop_instance = Mock()
ioloop.IOLoop.instance.return_value = ioloop_instance
mock_nsmanager = Mock()
application = create_gui_service(mock_nsmanager)
create_daemon.assert_called_once_with(ioloop_instance.start)
self.assertEqual(application.settings.get("namespace_manager"),
mock_nsmanager)

@patch("ovos_gui.bus.GUIWebsocketHandler")
def test_send_message_to_gui(self, handler):
Expand All @@ -41,5 +51,114 @@ def test_determine_if_gui_connected(self, handler):


class TestGUIWebsocketHandler(unittest.TestCase):
from ovos_gui.bus import GUIWebsocketHandler
# TODO
mock_nsmanager = Mock()

class WebSocketMock:
def __init__(self, *args, **kwargs):
ns_manager = TestGUIWebsocketHandler.mock_nsmanager
application_mock = Mock()
application_mock.settings = {"namespace_manager": ns_manager}
self.application = application_mock

@classmethod
def setUpClass(cls):
from ovos_gui.bus import GUIWebsocketHandler
ovos_gui.bus.WebSocketHandler = cls.WebSocketMock
cls.handler = GUIWebsocketHandler()

def test_00_websocket_init(self):
self.assertEqual(self.handler.framework, "qt5")
self.assertEqual(self.handler.ns_manager, self.mock_nsmanager)

def test_on_open(self):
# TODO
pass

def test_on_close(self):
# TODO
pass

def test_get_client_pages(self):
from ovos_gui.namespace import Namespace
test_namespace = Namespace("test")
page_1 = Mock()
page_1.get_uri.return_value = "page_1_uri"
page_2 = Mock()
page_2.get_uri.return_value = "page_2_uri"
test_namespace.pages = [page_1, page_2]

# Test no server_url
self.handler.ns_manager.qml_server = None
pages = self.handler.get_client_pages(test_namespace)
page_1.get_uri.assert_called_once_with(self.handler.framework, None)
page_2.get_uri.assert_called_once_with(self.handler.framework, None)
self.assertEqual(pages, ["page_1_uri", "page_2_uri"])

# Test with server_url
self.handler.ns_manager.qml_server = Mock()
self.handler.ns_manager.qml_server.url = "server_url"
pages = self.handler.get_client_pages(test_namespace)
page_1.get_uri.assert_called_with(self.handler.framework, "server_url")
page_2.get_uri.assert_called_with(self.handler.framework, "server_url")
self.assertEqual(pages, ["page_1_uri", "page_2_uri"])

def test_synchronize(self):
# TODO
pass

def test_on_message(self):
# TODO
pass

def test_write_message(self):
# TODO
pass

def test_send_gui_pages(self):
real_send = self.handler.send
self.handler.send = Mock()
test_ns = "test_namespace"
test_pos = 0

from ovos_gui.page import GuiPage
page_1 = GuiPage(None, "", False, False)
page_1.get_uri = Mock(return_value="page_1")

page_2 = GuiPage(None, "", False, False)
page_2.get_uri = Mock(return_value="page_2")

# Test no server_url
self.handler.ns_manager.qml_server = None
self.handler._framework = "qt5"
self.handler.send_gui_pages([page_1, page_2], test_ns, test_pos)
page_1.get_uri.assert_called_once_with("qt5", None)
page_2.get_uri.assert_called_once_with("qt5", None)
self.handler.send.assert_called_once_with(
{"type": "mycroft.gui.list.insert",
"namespace": test_ns,
"position": test_pos,
"data": [{"url": "page_1"}, {"url": "page_2"}]})

# Test with server_url
self.handler.ns_manager.qml_server = Mock()
self.handler.ns_manager.qml_server.url = "server_url"
self.handler._framework = "qt6"
test_pos = 3
self.handler.send_gui_pages([page_2, page_1], test_ns, test_pos)
page_1.get_uri.assert_called_with("qt6", "server_url")
page_2.get_uri.assert_called_with("qt6", "server_url")
self.handler.send.assert_called_with(
{"type": "mycroft.gui.list.insert",
"namespace": test_ns,
"position": test_pos,
"data": [{"url": "page_2"}, {"url": "page_1"}]})

self.handler.send = real_send

def test_send(self):
# TODO
pass

def test_check_origin(self):
self.assertTrue(self.handler.check_origin("test"))
self.assertTrue(self.handler.check_origin(""))

0 comments on commit ecda815

Please sign in to comment.