summaryrefslogtreecommitdiffstatshomepage
path: root/tests/test_canonical_desktop.py
blob: 9bdace198289ce856ae2f4392446742fba619528 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import importlib.util
import tempfile
import unittest
from pathlib import Path
from unittest.mock import MagicMock, patch

ROOT = Path(__file__).resolve().parents[1]
SPEC = importlib.util.spec_from_file_location(
    "desktop", ROOT / "dot_local/lib/dotfiles/canonical_desktop.py"
)
assert SPEC and SPEC.loader
desktop = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(desktop)


class DesktopTests(unittest.TestCase):
    def test_clipboard_shortcut_preserves_other_display_bindings(self):
        settings = MagicMock()
        settings.get_strv.return_value = ["<Super>p", "XF86Display", "<Super>x"]
        with (
            patch.object(desktop, "settings_object", return_value=settings),
            patch.object(desktop, "write_key") as write,
        ):
            desktop.shortcuts({})
        write.assert_any_call(
            "org.gnome.mutter.keybindings",
            "switch-monitor",
            ["XF86Display", "<Super>x"],
            {},
        )

    def test_panel_settings_disable_external_ip_lookup(self):
        with patch.object(desktop, "write_key") as write:
            desktop.panel({})
        write.assert_any_call(
            "org.gnome.shell.extensions.vitals", "include-public-ip", False, {}
        )
        self.assertIn("corporate-panel@dotfiles", desktop.EXTENSIONS)
        self.assertIn("ubuntu-appindicators@ubuntu.com", desktop.EXTENSIONS)

    def test_unknown_keys_fail_without_writing(self):
        settings = MagicMock()
        settings.props.settings_schema.list_keys.return_value = []
        with (
            patch.object(desktop, "settings_object", return_value=settings),
            self.assertRaisesRegex(RuntimeError, "Unknown setting"),
        ):
            desktop.write_key("schema", "missing", "value", {})
        settings.set_value.assert_not_called()

    def test_launcher_uses_gnome_application_view_key(self):
        with (
            patch.object(desktop, "merge_key"),
            patch.object(desktop, "shortcuts"),
            patch.object(desktop, "workspaces"),
            patch.object(desktop, "write_key") as write,
        ):
            desktop.apply_settings({})
        write.assert_any_call(
            "org.gnome.shell.keybindings", "toggle-application-view", ["<Super>d"], {}
        )

    def test_locked_keys_are_never_written(self):
        settings = MagicMock()
        settings.props.settings_schema.list_keys.return_value = ["key"]
        settings.is_writable.return_value = False
        with patch.object(desktop, "settings_object", return_value=settings):
            desktop.write_key("schema", "key", "value", {})
        settings.set_value.assert_not_called()

    def test_first_snapshot_is_kept_on_repeated_apply(self):
        settings = MagicMock()
        settings.props.settings_schema.list_keys.return_value = ["key"]
        settings.get_user_value.return_value.print_.return_value = "'original'"
        glib = MagicMock()
        glib.Variant.return_value.print_.return_value = "'managed'"
        saved = {}
        with (
            tempfile.TemporaryDirectory() as directory,
            patch.object(desktop, "STATE", Path(directory) / "state.json"),
            patch.object(desktop, "settings_object", return_value=settings),
            patch.object(desktop.importlib, "import_module", return_value=glib),
        ):
            desktop.write_key("schema", "key", "managed", saved)
            settings.get_user_value.return_value.print_.return_value = "'changed'"
            desktop.write_key("schema", "key", "managed", saved)
        self.assertEqual(next(iter(saved.values()))["before"], "'original'")

    def test_merge_keeps_unrelated_entries(self):
        settings = MagicMock()
        settings.get_strv.return_value = ["company", "personal"]
        with (
            patch.object(desktop, "settings_object", return_value=settings),
            patch.object(desktop, "write_key") as write,
        ):
            desktop.merge_key("schema", "key", ["personal", "new"], {})
        write.assert_called_once_with(
            "schema", "key", ["company", "personal", "new"], {}
        )


if __name__ == "__main__":
    unittest.main()