mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-10 02:45:32 +00:00
This suddenly started failing. I guess there was a deprecated `assertEquals` in older Python libraries, but with the latest version in Ubuntu 24.04 Noble this disappeared. Anyway, with this change we use the same assert method as in the other test files.
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_desktop')
|
|
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.assertEqual(mockCustomKeyboardsInstance.remove.call_count, 2)
|