mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 08:55:34 +00:00
This changes the shebang at the top of the file to allow use Python from a virtual environment instead of hard-coding the path. This might not be strictly necessary, but reduces confusion and doesn't hurt.
194 lines
7.5 KiB
Python
194 lines
7.5 KiB
Python
#!/usr/bin/env python3
|
|
import unittest
|
|
from unittest.mock import patch
|
|
from keyman_config import __version__
|
|
from keyman_config.custom_keyboards import CustomKeyboards
|
|
|
|
class AddCustomKeyboardTests(unittest.TestCase):
|
|
def setUp(self):
|
|
patcher1 = patch('keyman_config.custom_keyboards.GSettings')
|
|
self.mockGSettingsClass = patcher1.start()
|
|
self.addCleanup(patcher1.stop)
|
|
|
|
def test_Add_NoParam(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = None
|
|
# Execute
|
|
CustomKeyboards().add(None)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_not_called()
|
|
|
|
def test_Add_Unset(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = None
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with('additional-keyboards', ['mul:fooDir/foo1.kmx'], 'as')
|
|
|
|
def test_Add_Invalid(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = 'foo'
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with('additional-keyboards', ['mul:fooDir/foo1.kmx'], 'as')
|
|
|
|
def test_Add_InvalidArray(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['garbage', '', 'und:barDir/bar.kmx']
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx', 'mul:fooDir/foo1.kmx'], 'as')
|
|
|
|
def test_Add_EmptyArray(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = []
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with('additional-keyboards', ['mul:fooDir/foo1.kmx'], 'as')
|
|
|
|
def test_Add_EmptyString(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['', 'und:barDir/bar.kmx']
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx', 'mul:fooDir/foo1.kmx'], 'as')
|
|
|
|
def test_Add_PrevVal(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['und:barDir/bar.kmx']
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx', 'mul:fooDir/foo1.kmx'], 'as')
|
|
|
|
def test_Add_Duplicate(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['und:barDir/bar.kmx', 'mul:fooDir/foo1.kmx']
|
|
keyboard = 'mul:fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().add(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_not_called() # nothing changed, so no need to call
|
|
|
|
|
|
class RemoveCustomKeyboardTests(unittest.TestCase):
|
|
def setUp(self):
|
|
patcher1 = patch('keyman_config.custom_keyboards.GSettings')
|
|
self.mockGSettingsClass = patcher1.start()
|
|
self.addCleanup(patcher1.stop)
|
|
|
|
def test_Remove_NoParam(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = None
|
|
# Execute
|
|
CustomKeyboards().remove(None)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_not_called()
|
|
|
|
def test_Remove_Unset(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = None
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with('additional-keyboards', [], 'as')
|
|
|
|
def test_Remove_Invalid(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = 'foo'
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with('additional-keyboards', [], 'as')
|
|
|
|
def test_Remove_InvalidArray(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['garbage', '', 'und:barDir/bar.kmx']
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx'], 'as')
|
|
|
|
def test_Remove_EmptyArray(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = []
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with('additional-keyboards', [], 'as')
|
|
|
|
def test_Remove_EmptyString(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['', 'und:barDir/bar.kmx']
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx'], 'as')
|
|
|
|
def test_Remove_MultipleValues(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['und:barDir/bar.kmx', 'mul:fooDir/foo1.kmx']
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx'], 'as')
|
|
|
|
def test_Remove_MultipleValuesWithSameKeyboard(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['und:barDir/bar.kmx', 'mul:fooDir/foo1.kmx', 'und:fooDir/foo1.kmx']
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', ['und:barDir/bar.kmx'], 'as')
|
|
|
|
def test_Remove_SingleValue(self):
|
|
# Setup
|
|
mockGSettingsInstance = self.mockGSettingsClass.return_value
|
|
mockGSettingsInstance.get.return_value = ['mul:fooDir/foo1.kmx']
|
|
keyboard = 'fooDir/foo1.kmx'
|
|
# Execute
|
|
CustomKeyboards().remove(keyboard)
|
|
# Verify
|
|
mockGSettingsInstance.set.assert_called_once_with(
|
|
'additional-keyboards', [], 'as')
|