Files
cthulhu/tests/test_toml_backend_legacy_schema_regressions.py

140 lines
4.5 KiB
Python

import tempfile
import unittest
from pathlib import Path
from cthulhu import settings
from cthulhu.backends.toml_backend import Backend
LEGACY_SETTINGS = """format-version = 2
[profiles.default.metadata]
display-name = "Default"
internal-name = "default"
[profiles.default.keybindings]
keyboard-layout = "desktop"
desktop-modifier-keys = ["Insert", "KP_Insert"]
[profiles.default.ai-assistant]
enabled = false
provider = "ollama"
api-key-file = ""
ollama-model = "llama3.2-vision"
ollama-endpoint = "http://localhost:11434"
confirmation-required = true
action-timeout = 30
screenshot-quality = "medium"
max-context-length = 4000
[profiles.default.ocr]
language-code = "eng"
scale-factor = 3
grayscale-image = false
invert-image = false
black-white-image = false
black-white-threshold = 200
color-calculation = false
color-calculation-max = 3
copy-to-clipboard = false
[profiles.default.plugins]
active-plugins = ["Clipboard", "OCR"]
plugin-sources = []
"""
class LegacyTomlSchemaMigrationTests(unittest.TestCase):
def test_backend_migrates_legacy_nested_profile_schema_on_read(self):
with tempfile.TemporaryDirectory() as tempDir:
Path(tempDir, "user-settings.toml").write_text(
LEGACY_SETTINGS,
encoding="utf-8",
)
backend = Backend(tempDir)
self.assertEqual(backend.availableProfiles(), [["Default", "default"]])
general = backend.getGeneral("default")
self.assertEqual(general["profile"], ["Default", "default"])
self.assertEqual(
general["keyboardLayout"],
settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP,
)
self.assertEqual(general["cthulhuModifierKeys"], settings.DESKTOP_MODIFIER_KEYS)
self.assertEqual(
general["activePlugins"],
["Clipboard", "OCR", "WineAccessibility"],
)
self.assertTrue(general["wineAccessibilityPluginMigrated"])
self.assertEqual(general["aiProvider"], settings.AI_PROVIDER_OLLAMA)
self.assertFalse(general["aiAssistantEnabled"])
self.assertEqual(general["ocrLanguageCode"], "eng")
self.assertEqual(backend.getKeybindings("default"), {})
def test_saving_after_legacy_read_rewrites_current_schema(self):
with tempfile.TemporaryDirectory() as tempDir:
settingsPath = Path(tempDir, "user-settings.toml")
settingsPath.write_text(LEGACY_SETTINGS, encoding="utf-8")
backend = Backend(tempDir)
general = backend.getGeneral("default")
backend.saveProfileSettings("default", dict(general), {}, {})
savedSettings = settingsPath.read_text(encoding="utf-8")
self.assertIn('profile = ["Default", "default"]', savedSettings)
self.assertIn(
'activePlugins = ["Clipboard", "OCR", "WineAccessibility"]',
savedSettings,
)
self.assertIn("wineAccessibilityPluginMigrated = true", savedSettings)
self.assertNotIn("format-version = 2", savedSettings)
self.assertNotIn("[profiles.default.metadata]", savedSettings)
def test_wine_accessibility_migration_respects_later_plugin_disable(self):
migratedSettings = """[general]
startingProfile = ["Default", "default"]
[profiles.default]
profile = ["Default", "default"]
activePlugins = ["Clipboard", "OCR"]
wineAccessibilityPluginMigrated = true
"""
with tempfile.TemporaryDirectory() as tempDir:
Path(tempDir, "user-settings.toml").write_text(
migratedSettings,
encoding="utf-8",
)
backend = Backend(tempDir)
general = backend.getGeneral("default")
self.assertEqual(general["activePlugins"], ["Clipboard", "OCR"])
def test_legacy_profile_keybindings_are_preserved(self):
legacySettings = LEGACY_SETTINGS.replace(
'desktop-modifier-keys = ["Insert", "KP_Insert"]',
'desktop-modifier-keys = ["Insert", "KP_Insert"]\ncustom-binding = "kb:cthulhu+x"',
)
with tempfile.TemporaryDirectory() as tempDir:
Path(tempDir, "user-settings.toml").write_text(
legacySettings,
encoding="utf-8",
)
backend = Backend(tempDir)
self.assertEqual(
backend.getKeybindings("default"),
{"custom-binding": "kb:cthulhu+x"},
)
if __name__ == "__main__":
unittest.main()