| # Copyright 2021 The Pigweed Authors |
| # |
| # 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 |
| # |
| # https://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 pw_console.console_app""" |
| |
| from datetime import datetime |
| from pathlib import Path |
| import tempfile |
| import unittest |
| |
| import yaml |
| |
| # pylint: disable=protected-access |
| from pw_console.console_prefs import ( |
| ConsolePrefs, |
| _DEFAULT_CONFIG, |
| ) |
| |
| |
| def _create_tempfile(content: str) -> Path: |
| # Grab the current system timestamp as a string. |
| isotime = datetime.now().isoformat(sep='_', timespec='seconds') |
| isotime = isotime.replace(':', '') |
| |
| with tempfile.NamedTemporaryFile(prefix=f'{__package__}_{isotime}_', |
| delete=False) as output_file: |
| file_path = Path(output_file.name) |
| output_file.write(content.encode('UTF-8')) |
| return file_path |
| |
| |
| class TestConsolePrefs(unittest.TestCase): |
| """Tests for ConsolePrefs.""" |
| def setUp(self): |
| self.maxDiff = None # pylint: disable=invalid-name |
| |
| def test_load_no_existing_files(self) -> None: |
| prefs = ConsolePrefs(project_file=False, |
| project_user_file=False, |
| user_file=False) |
| self.assertEqual(_DEFAULT_CONFIG, prefs._config) |
| self.assertTrue(str(prefs.repl_history).endswith('pw_console_history')) |
| self.assertTrue( |
| str(prefs.search_history).endswith('pw_console_search')) |
| |
| def test_load_empty_file(self) -> None: |
| # Create an empty file |
| project_config_file = _create_tempfile('') |
| try: |
| prefs = ConsolePrefs(project_file=project_config_file, |
| project_user_file=False, |
| user_file=False) |
| result_settings = { |
| k: v |
| for k, v in prefs._config.items() |
| if k in _DEFAULT_CONFIG.keys() |
| } |
| other_settings = { |
| k: v |
| for k, v in prefs._config.items() |
| if k not in _DEFAULT_CONFIG.keys() |
| } |
| # Check that only the default config was loaded. |
| self.assertEqual(_DEFAULT_CONFIG, result_settings) |
| self.assertEqual(0, len(other_settings)) |
| finally: |
| project_config_file.unlink() |
| |
| def test_load_project_file(self) -> None: |
| project_config = { |
| 'pw_console': { |
| 'ui_theme': 'light', |
| 'code_theme': 'cool-code', |
| 'swap_light_and_dark': True, |
| }, |
| } |
| project_config_file = _create_tempfile(yaml.dump(project_config)) |
| try: |
| prefs = ConsolePrefs(project_file=project_config_file, |
| project_user_file=False, |
| user_file=False) |
| result_settings = { |
| k: v |
| for k, v in prefs._config.items() |
| if k in project_config['pw_console'].keys() |
| } |
| other_settings = { |
| k: v |
| for k, v in prefs._config.items() |
| if k not in project_config['pw_console'].keys() |
| } |
| self.assertEqual(project_config['pw_console'], result_settings) |
| self.assertNotEqual(0, len(other_settings)) |
| finally: |
| project_config_file.unlink() |
| |
| def test_load_project_and_user_file(self) -> None: |
| """Test user settings override project settings.""" |
| project_config = { |
| 'pw_console': { |
| 'ui_theme': 'light', |
| 'code_theme': 'cool-code', |
| 'swap_light_and_dark': True, |
| 'repl_history': '~/project_history', |
| 'search_history': '~/project_search', |
| }, |
| } |
| project_config_file = _create_tempfile(yaml.dump(project_config)) |
| |
| project_user_config = { |
| 'pw_console': { |
| 'ui_theme': 'nord', |
| 'repl_history': '~/project_user_history', |
| 'search_history': '~/project_user_search', |
| }, |
| } |
| project_user_config_file = _create_tempfile( |
| yaml.dump(project_user_config)) |
| |
| user_config = { |
| 'pw_console': { |
| 'ui_theme': 'dark', |
| 'search_history': '~/user_search', |
| }, |
| } |
| user_config_file = _create_tempfile(yaml.dump(user_config)) |
| try: |
| prefs = ConsolePrefs(project_file=project_config_file, |
| project_user_file=project_user_config_file, |
| user_file=user_config_file) |
| # Set by the project |
| self.assertEqual(project_config['pw_console']['code_theme'], |
| prefs.code_theme) |
| self.assertEqual( |
| project_config['pw_console']['swap_light_and_dark'], |
| prefs.swap_light_and_dark) |
| |
| # Project user setting, result should not be project only setting. |
| project_history = project_config['pw_console']['repl_history'] |
| assert isinstance(project_history, str) |
| self.assertNotEqual( |
| Path(project_history).expanduser(), prefs.repl_history) |
| |
| history = project_user_config['pw_console']['repl_history'] |
| assert isinstance(history, str) |
| self.assertEqual(Path(history).expanduser(), prefs.repl_history) |
| |
| # User config overrides project and project_user |
| self.assertEqual(user_config['pw_console']['ui_theme'], |
| prefs.ui_theme) |
| self.assertEqual( |
| Path(user_config['pw_console']['search_history']).expanduser(), |
| prefs.search_history) |
| # ui_theme should not be the project_user file setting |
| project_user_theme = project_user_config['pw_console']['ui_theme'] |
| self.assertNotEqual(project_user_theme, prefs.ui_theme) |
| finally: |
| project_config_file.unlink() |
| project_user_config_file.unlink() |
| user_config_file.unlink() |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |