Skip to content
This repository has been archived by the owner on Sep 8, 2024. It is now read-only.

Add basic test cases for gui interface #2697

Merged
merged 1 commit into from
Sep 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
152 changes: 152 additions & 0 deletions test/unittests/enclosure/test_gui.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
# Copyright 2020 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Tests for the Enclosure GUI interface."""

from unittest import TestCase, mock

from mycroft.enclosure.gui import SkillGUI
from mycroft.messagebus import Message
from mycroft.util.file_utils import resolve_resource_file


class TestSkillGUI(TestCase):
def setUp(self):
self.mock_skill = mock.Mock(name='Skill')
self.mock_skill.skill_id = 'fortytwo-skill'

def find_resource(page, folder):
return '/test/{}/{}'.format(folder, page)
self.mock_skill.find_resource = find_resource
self.gui = SkillGUI(self.mock_skill)

def test_show_page(self):
self.gui.show_page('meaning.qml')
sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
self.assertEqual(sent_message.msg_type, 'gui.page.show')
self.assertEqual(sent_message.data['__from'], 'fortytwo-skill')
self.assertEqual(sent_message.data['page'],
['file:///test/ui/meaning.qml'])
self.assertEqual(sent_message.data['__idle'], None)

def test_show_page_idle_override(self):
self.gui.show_page('meaning.qml', override_idle=60)

sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
self.assertEqual(sent_message.data['__idle'], 60)

def test_show_pages(self):
self.gui.show_pages(['meaning.qml', 'life.qml',
'universe.qml', 'everything.qml'])

sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]

expected_pages = ['file:///test/ui/meaning.qml',
'file:///test/ui/life.qml',
'file:///test/ui/universe.qml',
'file:///test/ui/everything.qml']
self.assertEqual(sent_message.data['page'], expected_pages)

def test_remove_page(self):
self.gui.remove_page('vogon_poetry.qml')
sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]

self.assertEqual(sent_message.msg_type, 'gui.page.delete')
self.assertEqual(sent_message.data['__from'], 'fortytwo-skill')
expected_page = 'file:///test/ui/vogon_poetry.qml'
self.assertEqual(sent_message.data['page'], [expected_page])

def test_show_image(self):
self.gui.show_image('arthur_dent.jpg')

sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
page_path = resolve_resource_file('ui/SYSTEM_ImageFrame.qml')
page_url = 'file://{}'.format(page_path)
self.assertEqual(sent_message.data['page'], [page_url])
self.assertEqual(self.gui['image'], 'arthur_dent.jpg')

def test_show_animated_image(self):
self.gui.show_animated_image('dancing_zaphod.gif')

sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
page_path = resolve_resource_file('ui/SYSTEM_AnimatedImageFrame.qml')
page_url = 'file://{}'.format(page_path)
self.assertEqual(sent_message.data['page'], [page_url])
self.assertEqual(self.gui['image'], 'dancing_zaphod.gif')

def test_show_url(self):
page = ('https://en.wikipedia.org/wiki/'
'The_Hitchhiker%27s_Guide_to_the_Galaxy')
self.gui.show_url(page)

sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
page_path = resolve_resource_file('ui/SYSTEM_UrlFrame.qml')
page_url = 'file://{}'.format(page_path)
self.assertEqual(sent_message.data['page'], [page_url])
self.assertEqual(self.gui['url'], page)

def test_show_html(self):
html = '<html><head><title>This Page!</title></head></html>'
self.gui.show_html(html)

sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
page_path = resolve_resource_file('ui/SYSTEM_HtmlFrame.qml')
page_url = 'file://{}'.format(page_path)
self.assertEqual(sent_message.data['page'], [page_url])
self.assertEqual(self.gui['html'], html)

def test_send_event(self):
"""Check that send_event sends message using the correct format."""
params = 'Not again'
self.gui.send_event('not.again', params)
sent_message = self.mock_skill.bus.emit.call_args_list[-1][0][0]
self.assertEqual(sent_message.msg_type, 'gui.event.send')
self.assertEqual(sent_message.data['__from'], 'fortytwo-skill')
self.assertEqual(sent_message.data['params'], params)

def test_on_gui_change_callback(self):
"""Check that the registered function gets called on message from gui.
"""
result = False

def callback():
nonlocal result
result = True

self.gui.set_on_gui_changed(callback)
self.gui.gui_set(Message('dummy'))
self.assertTrue(result)

def test_gui_set(self):
"""Assert that the gui can set gui variables."""
vars_from_gui = {'meaning': 43, 'no': 42}
self.gui.gui_set(Message('dummy', data=vars_from_gui))
self.assertEqual(self.gui['meaning'], 43)
self.assertEqual(self.gui['no'], 42)

def test_not_connected(self):
response = Message('dummy', data={'connected': False})
self.mock_skill.bus.wait_for_response.return_value = response
self.assertFalse(self.gui.connected)

def test_connected(self):
response = Message('dummy', data={'connected': True})
self.mock_skill.bus.wait_for_response.return_value = response
self.assertTrue(self.gui.connected)

def test_connected_no_response(self):
"""Ensure that a timeout response results in not connected."""
response = None
self.mock_skill.bus.wait_for_response.return_value = response
self.assertFalse(self.gui.connected)