mycroft-core/test/unittests/configuration/test_configuration.py

117 lines
4.4 KiB
Python

from unittest.mock import MagicMock, patch
from unittest import TestCase
import mycroft.configuration
class TestConfiguration(TestCase):
def setUp(self):
"""
Clear cached configuration
"""
super(TestConfiguration, self).setUp()
mycroft.configuration.Configuration.load_config_stack([{}], True)
def test_get(self):
d1 = {'a': 1, 'b': {'c': 1, 'd': 2}}
d2 = {'b': {'d': 'changed'}}
d = mycroft.configuration.Configuration.get([d1, d2])
self.assertEqual(d['a'], d1['a'])
self.assertEqual(d['b']['d'], d2['b']['d'])
self.assertEqual(d['b']['c'], d1['b']['c'])
@patch('mycroft.api.DeviceApi')
def test_remote(self, mock_api):
remote_conf = {'TestConfig': True, 'uuid': 1234}
remote_location = {'city': {'name': 'Stockholm'}}
dev_api = MagicMock()
dev_api.get_settings.return_value = remote_conf
dev_api.get_location.return_value = remote_location
mock_api.return_value = dev_api
rc = mycroft.configuration.RemoteConf()
self.assertTrue(rc['test_config'])
self.assertEqual(rc['location']['city']['name'], 'Stockholm')
@patch('mycroft.configuration.config.RemoteConf')
@patch('mycroft.configuration.config.LocalConf')
def test_update(self, mock_remote, mock_local):
mock_remote.return_value = {}
mock_local.return_value = {'a': 1}
c = mycroft.configuration.Configuration.get()
self.assertEqual(c, {'a': 1})
mock_local.return_value = {'a': 2}
mycroft.configuration.Configuration.updated('message')
self.assertEqual(c, {'a': 2})
def tearDown(self):
mycroft.configuration.Configuration.load_config_stack([{}], True)
@patch('mycroft.configuration.config.exists')
@patch('mycroft.configuration.config.isfile')
@patch('mycroft.configuration.config.load_commented_json')
class TestLocalConf(TestCase):
"""Test cases for LocalConf class."""
def test_create(self, mock_json_loader, mock_isfile, mock_exists):
"""Test that initialization and creation works as expected."""
local_conf = {'answer': 42, 'falling_objects': ['flower pot', 'whale']}
mock_exists.return_value = True
mock_isfile.return_value = True
mock_json_loader.return_value = local_conf
lc = mycroft.configuration.LocalConf('test')
self.assertEqual(lc, local_conf)
def test_merge(self, mock_json_loader, mock_isfile, mock_exists):
"""Check that configurations are merged correctly."""
local_conf = {'answer': 42, 'falling_objects': ['flower pot', 'whale']}
mock_exists.return_value = True
mock_isfile.return_value = True
mock_json_loader.return_value = local_conf
lc = mycroft.configuration.LocalConf('test')
merge_conf = {'falling_objects': None, 'has_towel': True}
lc.merge(merge_conf)
self.assertEqual(lc['falling_objects'], None)
self.assertEqual(lc['has_towel'], True)
@patch('json.dump')
def test_store(self, mock_json_dump, mock_json_loader, mock_isfile,
mock_exists):
"""Check that the config is stored correctly."""
local_conf = {'answer': 42, 'falling_objects': ['flower pot', 'whale']}
mock_exists.return_value = True
mock_isfile.return_value = True
mock_json_loader.return_value = local_conf
lc = mycroft.configuration.LocalConf('test')
lc.store('test_conf.json')
self.assertEqual(mock_json_dump.call_args[0][0], lc)
# exists but is not file
mock_isfile.return_value = False
lc = mycroft.configuration.LocalConf('test')
self.assertEqual(lc, {})
# does not exist
mock_exists.return_value = False
lc = mycroft.configuration.LocalConf('test')
self.assertEqual(lc, {})
@patch('json.dump')
def test_store_invalid(self, mock_json_dump, mock_json_loader, mock_isfile,
mock_exists):
"""Storing shouldn't happen when config content is invalid."""
mock_exists.return_value = True
mock_isfile.return_value = True
def raise_error(*arg, **kwarg):
raise Exception('Test exception')
mock_json_loader.side_effect = raise_error
lc = mycroft.configuration.LocalConf('invalid')
self.assertFalse(lc.is_valid)
self.assertFalse(lc.store())
mock_json_dump.assert_not_called()