mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-07 01:15:33 +00:00
- during installation add to the list of custom keyboards if necessary - during uninstallation remove from the list of custom keyboards - if list of custom keyboards has invalid values, remove those before saving the list Closes #8598.
320 lines
14 KiB
Python
320 lines
14 KiB
Python
#!/usr/bin/python3
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
from unittest.mock import patch
|
|
from keyman_config.get_kmp import InstallLocation
|
|
|
|
from keyman_config.uninstall_kmp import _uninstall_keyboards_from_gnome, _uninstall_keyboards_from_ibus, _uninstall_kmp_common
|
|
|
|
|
|
class UninstallKmpGnomeTests(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
patcher = patch('keyman_config.uninstall_kmp.GnomeKeyboardsUtil')
|
|
self.mockGnomeKeyboardsUtilClass = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveOneKeyboardFromEmpty(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = []
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome([{'id': 'foo1'}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with([])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveNonExistingKeyboard(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('ibus', 'fooDir/foo2.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome([{'id': 'foo1'}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with([
|
|
('ibus', 'fooDir/foo2.kmx')])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveOneKeyboard(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('xkb', 'en'), ('ibus', 'fooDir/foo1.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome([{'id': 'foo1'}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with(
|
|
[('xkb', 'en')])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveMultipleKeyboards(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('xkb', 'en'), ('ibus', 'fooDir/foo1.kmx'), ('ibus', 'fooDir/foo2.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome([{'id': 'foo1'}, {'id': 'foo2'}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with(
|
|
[('xkb', 'en')])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveAllKeyboards(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('ibus', 'fooDir/foo1.kmx'), ('ibus', 'fooDir/foo2.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome([{'id': 'foo1'}, {'id': 'foo2'}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with([])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveKeyboard_SingleLanguage(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('xkb', 'en'), ('ibus', 'en:fooDir/foo1.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome([{'id': 'foo1', 'languages': [{'id': 'en'}]}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with(
|
|
[('xkb', 'en')])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveKeyboard_MultipleLanguages(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('xkb', 'en'), ('ibus', 'fr:fooDir/foo1.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome(
|
|
[{'id': 'foo1', 'languages': [{'id': 'en'}, {'id': 'fr'}]}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with(
|
|
[('xkb', 'en')])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveKeyboard_OneNotMatchingLanguage(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('xkb', 'en'), ('ibus', 'en:fooDir/foo1.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome(
|
|
[{'id': 'foo1', 'languages': [{'id': 'fr'}]}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with(
|
|
[('xkb', 'en')])
|
|
|
|
def test_UninstallKeyboardsFromGnome_RemoveKeyboard_RemovesAllMatching(self):
|
|
# Setup
|
|
mockGnomeKeyboardsUtilInstance = self.mockGnomeKeyboardsUtilClass.return_value
|
|
mockGnomeKeyboardsUtilInstance.read_input_sources.return_value = [
|
|
('xkb', 'en'), ('ibus', 'en:fooDir/foo1.kmx'), ('ibus', 'fr:fooDir/foo1.kmx')]
|
|
# Execute
|
|
_uninstall_keyboards_from_gnome(
|
|
[{'id': 'foo1', 'languages': [{'id': 'fr'}]}], 'fooDir')
|
|
# Verify
|
|
mockGnomeKeyboardsUtilInstance.write_input_sources.assert_called_once_with(
|
|
[('xkb', 'en')])
|
|
|
|
|
|
class UninstallKmpIbusTests(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.mockIbusUtilClass = self._setupMock('keyman_config.uninstall_kmp.IbusUtil')
|
|
self.mockRestartIbus = self._setupMock('keyman_config.uninstall_kmp.restart_ibus')
|
|
self.mockGetIbusBus = self._setupMock('keyman_config.uninstall_kmp.get_ibus_bus')
|
|
self.mockGetIbusBus.return_value = None
|
|
|
|
def _setupMock(self, arg0):
|
|
patcher = patch(arg0)
|
|
result = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return result
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveOneKeyboardFromEmpty(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = []
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus([{'id': 'foo1'}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_not_called()
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveNonExistingKeyboard(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'fr:fooDir/foo2.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus([{'id': 'foo1'}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(None, [
|
|
'fr:fooDir/foo2.kmx'])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveOneKeyboard(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'xkb:us::eng', 'km:fooDir/foo1.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus([{'id': 'foo1'}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(
|
|
None,
|
|
['xkb:us::eng'])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveMultipleKeyboards(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'xkb:us::eng', 'km:fooDir/foo1.kmx', 'fr:fooDir/foo2.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus([{'id': 'foo1'}, {'id': 'foo2'}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(
|
|
None,
|
|
['xkb:us::eng'])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveAllKeyboards(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'km:fooDir/foo1.kmx', 'fr:fooDir/foo2.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus([{'id': 'foo1'}, {'id': 'foo2'}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(None, [])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveKeyboard_SingleLanguage(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'xkb:us::eng', 'en:fooDir/foo1.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus([{'id': 'foo1', 'languages': [{'id': 'en'}]}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(
|
|
None,
|
|
['xkb:us::eng'])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveKeyboard_MultipleLanguages(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'xkb:us::eng', 'fr:fooDir/foo1.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus(
|
|
[{'id': 'foo1', 'languages': [{'id': 'en'}, {'id': 'fr'}]}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(
|
|
None,
|
|
['xkb:us::eng'])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveKeyboard_OneNotMatchingLanguage(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'xkb:us::eng', 'en:fooDir/foo1.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus(
|
|
[{'id': 'foo1', 'languages': [{'id': 'fr'}]}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(
|
|
None,
|
|
['xkb:us::eng'])
|
|
|
|
def test_UninstallKeyboardsFromIbus_RemoveKeyboard_RemovesAllMatching(self):
|
|
# Setup
|
|
mockIbusUtilInstance = self.mockIbusUtilClass.return_value
|
|
mockIbusUtilInstance.read_preload_engines.return_value = [
|
|
'xkb:us::eng', 'en:fooDir/foo1.kmx', 'fr:fooDir/foo1.kmx', 'km:fooDir/foo2.kmx']
|
|
# Execute
|
|
_uninstall_keyboards_from_ibus(
|
|
[{'id': 'foo1', 'languages': [{'id': 'fr'}]}], 'fooDir')
|
|
# Verify
|
|
mockIbusUtilInstance.write_preload_engines.assert_called_once_with(
|
|
None,
|
|
['xkb:us::eng', 'km:fooDir/foo2.kmx'])
|
|
|
|
|
|
class UninstallKmpCommonTests(unittest.TestCase):
|
|
def setUp(self):
|
|
patcher1 = patch('keyman_config.uninstall_kmp.get_keyboard_dir')
|
|
self.mockGetKeyboardDir = patcher1.start()
|
|
self.addCleanup(patcher1.stop)
|
|
patcher2 = patch('keyman_config.uninstall_kmp.get_keyman_doc_dir')
|
|
self.mockGetKeymanDocDir = patcher2.start()
|
|
self.addCleanup(patcher2.stop)
|
|
patcher3 = patch('keyman_config.uninstall_kmp.get_keyman_font_dir')
|
|
self.mockGetKeymanFontDir = patcher3.start()
|
|
self.addCleanup(patcher3.stop)
|
|
patcher4 = patch('keyman_config.uninstall_kmp.is_gnome_shell')
|
|
self.mockIsGnomeShell = patcher4.start()
|
|
self.addCleanup(patcher4.stop)
|
|
self.mockIsGnomeShell.return_value = False
|
|
patcher5 = patch('keyman_config.uninstall_kmp.is_fcitx_running')
|
|
self.mockIsFcitxRunning = patcher5.start()
|
|
self.addCleanup(patcher5.stop)
|
|
self.mockIsFcitxRunning.return_value = False
|
|
patcher6 = patch('keyman_config.uninstall_kmp._uninstall_keyboards_from_ibus')
|
|
self.mockUninstallKeyboardsFromIbus = patcher6.start()
|
|
self.addCleanup(patcher6.stop)
|
|
patcher7 = patch('keyman_config.uninstall_kmp._uninstall_dir')
|
|
self.mockUninstallDir = patcher7.start()
|
|
self.addCleanup(patcher7.stop)
|
|
patcher8 = patch('keyman_config.uninstall_kmp.get_metadata')
|
|
self.mockGetMetaData = patcher8.start()
|
|
self.addCleanup(patcher8.stop)
|
|
patcher9 = patch('keyman_config.uninstall_kmp.CustomKeyboards')
|
|
self.mockCustomKeyboardsClass = patcher9.start()
|
|
self.addCleanup(patcher9.stop)
|
|
|
|
def test_UninstallKmpCommon_NoRemoveLanguage(self):
|
|
# Setup
|
|
mockCustomKeyboardsInstance = self.mockCustomKeyboardsClass.return_value
|
|
self.mockGetKeyboardDir.return_value = '/tmp/foo'
|
|
keyboards = [{'id': 'foo1', 'languages': [{'id': 'en'}]}]
|
|
self.mockGetMetaData.return_value = (None, None, None, keyboards, None)
|
|
# Execute
|
|
_uninstall_kmp_common(InstallLocation.User, 'foo1', False)
|
|
# Verify
|
|
self.mockUninstallKeyboardsFromIbus.assert_not_called()
|
|
self.mockUninstallDir.assert_called()
|
|
mockCustomKeyboardsInstance.remove.assert_not_called()
|
|
|
|
def test_UninstallKmpCommon_RemoveLanguage(self):
|
|
# Setup
|
|
mockCustomKeyboardsInstance = self.mockCustomKeyboardsClass.return_value
|
|
self.mockGetKeyboardDir.return_value = '/tmp/foo'
|
|
keyboards = [{'id': 'foo1', 'languages': [{'id': 'en'}]}]
|
|
self.mockGetMetaData.return_value = (None, None, None, keyboards, None)
|
|
# Execute
|
|
_uninstall_kmp_common(InstallLocation.User, 'foo1', True)
|
|
# Verify
|
|
self.mockUninstallKeyboardsFromIbus.assert_called_once_with(keyboards, '/tmp/foo')
|
|
self.mockUninstallDir.assert_called()
|
|
mockCustomKeyboardsInstance.remove.assert_called_once_with('/tmp/foo/foo1.kmx')
|
|
|
|
def test_UninstallKmpCommon_RemoveLanguage_NoKeyboards(self):
|
|
# Setup
|
|
mockCustomKeyboardsInstance = self.mockCustomKeyboardsClass.return_value
|
|
self.mockGetKeyboardDir.return_value = '/tmp/foo'
|
|
keyboards = []
|
|
self.mockGetMetaData.return_value = (None, None, None, keyboards, None)
|
|
# Execute
|
|
_uninstall_kmp_common(InstallLocation.User, 'foo1', True)
|
|
# Verify
|
|
self.mockUninstallKeyboardsFromIbus.assert_not_called()
|
|
self.mockUninstallDir.assert_called()
|
|
mockCustomKeyboardsInstance.remove.assert_not_called()
|
|
|
|
def test_UninstallKmpCommon_RemoveLanguage_MultipleKeyboards(self):
|
|
# Setup
|
|
mockCustomKeyboardsInstance = self.mockCustomKeyboardsClass.return_value
|
|
self.mockGetKeyboardDir.return_value = '/tmp/foo'
|
|
keyboards = [{'id': 'foo1', 'languages': [{'id': 'en'}]}, {'id': 'bar2', 'languages': [{'id': 'fr'}]}]
|
|
self.mockGetMetaData.return_value = (None, None, None, keyboards, None)
|
|
# Execute
|
|
_uninstall_kmp_common(InstallLocation.User, 'foo1', True)
|
|
# Verify
|
|
self.mockUninstallKeyboardsFromIbus.assert_called_once_with(keyboards, '/tmp/foo')
|
|
self.mockUninstallDir.assert_called()
|
|
self.assertEquals(mockCustomKeyboardsInstance.remove.call_count, 2)
|