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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
import asyncio
import sys
import types
import unittest
from unittest.mock import Mock
sys.modules.setdefault(
"decky",
types.SimpleNamespace(
DECKY_HOME="/decky",
DECKY_USER_HOME="/home/deck",
logger=Mock(),
),
)
sys.modules.setdefault("tomllib", types.SimpleNamespace(loads=Mock()))
sys.path.insert(0, "py_modules")
from lsfg_vk.plugin import Plugin
class PluginFlatpakLifecycleTests(unittest.TestCase):
def test_install_and_reload_ensure_global_flatpak_support(self):
plugin = Plugin.__new__(Plugin)
plugin.installation_service = Mock()
plugin.installation_service.install.return_value = {"success": True}
plugin.installation_service.check_installation.return_value = {"installed": True}
plugin.flatpak_service = Mock()
plugin.flatpak_service.ensure_plugin_support.return_value = {"success": True}
plugin.wrapper_service = Mock()
plugin.wrapper_service.repair.return_value = {"success": True}
installed = asyncio.run(plugin.install_lsfg_vk())
asyncio.run(plugin._main())
self.assertTrue(installed["success"])
self.assertEqual(plugin.flatpak_service.ensure_plugin_support.call_count, 2)
plugin.wrapper_service.repair.assert_called_once_with()
def test_unload_does_not_remove_persistent_flatpak_setup(self):
plugin = Plugin.__new__(Plugin)
plugin.installation_service = Mock()
plugin.flatpak_service = Mock()
asyncio.run(plugin._unload())
plugin.flatpak_service.remove_plugin_owned_extensions.assert_not_called()
def test_uninstall_is_the_flatpak_cleanup_boundary(self):
plugin = Plugin.__new__(Plugin)
plugin.installation_service = Mock()
plugin.flatpak_service = Mock()
plugin.flatpak_service.remove_plugin_owned_extensions.return_value = {"success": True}
asyncio.run(plugin._uninstall())
plugin.installation_service.cleanup_on_uninstall.assert_called_once_with()
plugin.flatpak_service.remove_plugin_owned_extensions.assert_called_once_with()
def test_uninstall_button_also_cleans_flatpak_support(self):
plugin = Plugin.__new__(Plugin)
plugin.installation_service = Mock()
plugin.installation_service.uninstall.return_value = {
"success": True,
"message": "lsfg-vk uninstalled successfully",
"error": None,
"removed_files": ["/home/deck/.local/lib/liblsfg-vk.so"],
}
plugin.flatpak_service = Mock()
plugin.flatpak_service.remove_plugin_owned_extensions.return_value = {
"success": True,
"message": "Plugin-owned Flatpak state removed",
"error": None,
"removed_branches": ["23.08", "24.08", "25.08"],
"preserved_branches": [],
"removed_filesystem_grants": ["/home/deck/.config/lsfg-vk"],
"preserved_filesystem_grants": [],
"ownership_uncertain": False,
}
result = asyncio.run(plugin.uninstall_lsfg_vk())
plugin.installation_service.uninstall.assert_called_once_with()
plugin.flatpak_service.remove_plugin_owned_extensions.assert_called_once_with()
self.assertTrue(result["success"])
self.assertEqual(result["flatpak_cleanup"]["removed_branches"], ["23.08", "24.08", "25.08"])
def test_uninstall_button_reports_flatpak_cleanup_failure(self):
plugin = Plugin.__new__(Plugin)
plugin.installation_service = Mock()
plugin.installation_service.uninstall.return_value = {
"success": True,
"message": "lsfg-vk uninstalled successfully",
"error": None,
"removed_files": [],
}
plugin.flatpak_service = Mock()
plugin.flatpak_service.remove_plugin_owned_extensions.return_value = {
"success": False,
"message": "",
"error": "Flatpak ownership metadata was not trusted",
"ownership_uncertain": True,
}
result = asyncio.run(plugin.uninstall_lsfg_vk())
self.assertFalse(result["success"])
self.assertIn("Flatpak ownership metadata was not trusted", result["error"])
self.assertTrue(result["flatpak_cleanup"]["ownership_uncertain"])
def test_uninstall_button_fails_closed_if_flatpak_cleanup_raises(self):
plugin = Plugin.__new__(Plugin)
plugin.installation_service = Mock()
plugin.installation_service.uninstall.return_value = {
"success": True,
"message": "lsfg-vk uninstalled successfully",
"error": None,
"removed_files": [],
}
plugin.flatpak_service = Mock()
plugin.flatpak_service.remove_plugin_owned_extensions.side_effect = RuntimeError(
"ownership could not be established"
)
result = asyncio.run(plugin.uninstall_lsfg_vk())
self.assertFalse(result["success"])
self.assertIn("ownership could not be established", result["error"])
self.assertTrue(result["flatpak_cleanup"]["ownership_uncertain"])
if __name__ == "__main__":
unittest.main()
|