From 54acc36f16e1336772354f979a618cce65061f82 Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Mon, 7 Sep 2026 20:57:26 -0400 Subject: refactor: make runtime installation explicit --- tests/test_plugin_migration.py | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/test_plugin_migration.py (limited to 'tests/test_plugin_migration.py') diff --git a/tests/test_plugin_migration.py b/tests/test_plugin_migration.py new file mode 100644 index 0000000..a392f85 --- /dev/null +++ b/tests/test_plugin_migration.py @@ -0,0 +1,50 @@ +import asyncio +import sys +import types +import unittest +from unittest.mock import Mock + + +class PluginMigrationTests(unittest.TestCase): + def test_migration_only_runs_decky_path_migrations(self): + decky = types.SimpleNamespace( + DECKY_HOME="/decky", + DECKY_USER_HOME="/home/deck", + migrate_logs=Mock(), + migrate_settings=Mock(), + migrate_runtime=Mock(), + logger=Mock(), + ) + previous_decky = sys.modules.get("decky") + previous_tomllib = sys.modules.get("tomllib") + sys.modules["decky"] = decky + sys.modules["tomllib"] = types.SimpleNamespace(loads=Mock()) + try: + sys.path.insert(0, "py_modules") + from lsfg_vk.plugin import Plugin + + plugin = Plugin.__new__(Plugin) + plugin.installation_service = Mock() + plugin.flatpak_service = Mock() + + asyncio.run(plugin._migration()) + + decky.migrate_logs.assert_called_once() + decky.migrate_settings.assert_called_once() + decky.migrate_runtime.assert_called_once() + plugin.installation_service.install.assert_not_called() + plugin.flatpak_service.migrate_v2.assert_not_called() + finally: + sys.path.remove("py_modules") + if previous_decky is None: + sys.modules.pop("decky", None) + else: + sys.modules["decky"] = previous_decky + if previous_tomllib is None: + sys.modules.pop("tomllib", None) + else: + sys.modules["tomllib"] = previous_tomllib + + +if __name__ == "__main__": + unittest.main() -- cgit v1.2.3 From 8a74b326b65d56808cf3ddb464e55ab0d1a45074 Mon Sep 17 00:00:00 2001 From: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> Date: Thu, 10 Sep 2026 15:55:03 -0400 Subject: test: cover flatpak cleanup on plugin uninstall --- tests/test_plugin_migration.py | 49 ++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 14 deletions(-) (limited to 'tests/test_plugin_migration.py') diff --git a/tests/test_plugin_migration.py b/tests/test_plugin_migration.py index a392f85..ab036b0 100644 --- a/tests/test_plugin_migration.py +++ b/tests/test_plugin_migration.py @@ -6,7 +6,7 @@ from unittest.mock import Mock class PluginMigrationTests(unittest.TestCase): - def test_migration_only_runs_decky_path_migrations(self): + def _load_plugin(self): decky = types.SimpleNamespace( DECKY_HOME="/decky", DECKY_USER_HOME="/home/deck", @@ -19,10 +19,24 @@ class PluginMigrationTests(unittest.TestCase): previous_tomllib = sys.modules.get("tomllib") sys.modules["decky"] = decky sys.modules["tomllib"] = types.SimpleNamespace(loads=Mock()) - try: - sys.path.insert(0, "py_modules") - from lsfg_vk.plugin import Plugin + sys.path.insert(0, "py_modules") + from lsfg_vk.plugin import Plugin + return Plugin, decky, previous_decky, previous_tomllib + def _restore(self, previous_decky, previous_tomllib): + sys.path.remove("py_modules") + if previous_decky is None: + sys.modules.pop("decky", None) + else: + sys.modules["decky"] = previous_decky + if previous_tomllib is None: + sys.modules.pop("tomllib", None) + else: + sys.modules["tomllib"] = previous_tomllib + + def test_migration_only_runs_decky_path_migrations(self): + Plugin, decky, previous_decky, previous_tomllib = self._load_plugin() + try: plugin = Plugin.__new__(Plugin) plugin.installation_service = Mock() plugin.flatpak_service = Mock() @@ -33,17 +47,24 @@ class PluginMigrationTests(unittest.TestCase): decky.migrate_settings.assert_called_once() decky.migrate_runtime.assert_called_once() plugin.installation_service.install.assert_not_called() - plugin.flatpak_service.migrate_v2.assert_not_called() + plugin.flatpak_service.prepare_app.assert_not_called() + finally: + self._restore(previous_decky, previous_tomllib) + + def test_uninstall_cleans_owned_flatpak_state(self): + Plugin, _decky, previous_decky, previous_tomllib = self._load_plugin() + try: + plugin = Plugin.__new__(Plugin) + plugin.installation_service = Mock() + plugin.flatpak_service = Mock() + plugin.flatpak_service.remove_plugin_owned_environment.return_value = {"success": True} + + asyncio.run(plugin._uninstall()) + + plugin.flatpak_service.remove_plugin_owned_environment.assert_called_once_with() + plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() finally: - sys.path.remove("py_modules") - if previous_decky is None: - sys.modules.pop("decky", None) - else: - sys.modules["decky"] = previous_decky - if previous_tomllib is None: - sys.modules.pop("tomllib", None) - else: - sys.modules["tomllib"] = previous_tomllib + self._restore(previous_decky, previous_tomllib) if __name__ == "__main__": -- cgit v1.2.3 From b529bc1f0d6a5418cb60ebc6c127796aba08068e Mon Sep 17 00:00:00 2001 From: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:42:30 -0400 Subject: test: cover flatpak profile uninstall cleanup --- tests/test_plugin_migration.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'tests/test_plugin_migration.py') diff --git a/tests/test_plugin_migration.py b/tests/test_plugin_migration.py index ab036b0..824cbf6 100644 --- a/tests/test_plugin_migration.py +++ b/tests/test_plugin_migration.py @@ -51,17 +51,35 @@ class PluginMigrationTests(unittest.TestCase): finally: self._restore(previous_decky, previous_tomllib) - def test_uninstall_cleans_owned_flatpak_state(self): + def test_uninstall_cleans_owned_flatpak_state_and_profiles(self): Plugin, _decky, previous_decky, previous_tomllib = self._load_plugin() try: plugin = Plugin.__new__(Plugin) plugin.installation_service = Mock() plugin.flatpak_service = Mock() + plugin.configuration_service = Mock() plugin.flatpak_service.remove_plugin_owned_environment.return_value = {"success": True} asyncio.run(plugin._uninstall()) plugin.flatpak_service.remove_plugin_owned_environment.assert_called_once_with() + plugin.configuration_service.reset_all_flatpak_configs.assert_called_once_with() + plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() + finally: + self._restore(previous_decky, previous_tomllib) + + def test_uninstall_preserves_profiles_when_flatpak_cleanup_fails(self): + Plugin, _decky, previous_decky, previous_tomllib = self._load_plugin() + try: + plugin = Plugin.__new__(Plugin) + plugin.installation_service = Mock() + plugin.flatpak_service = Mock() + plugin.configuration_service = Mock() + plugin.flatpak_service.remove_plugin_owned_environment.return_value = {"success": False, "error": "changed"} + + asyncio.run(plugin._uninstall()) + + plugin.configuration_service.reset_all_flatpak_configs.assert_not_called() plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() finally: self._restore(previous_decky, previous_tomllib) -- cgit v1.2.3 From 834fa5c585ec94e85cae0ba96a39d72111c9cf4d Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Thu, 10 Sep 2026 19:47:00 -0400 Subject: tests --- tests/test_plugin_migration.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'tests/test_plugin_migration.py') diff --git a/tests/test_plugin_migration.py b/tests/test_plugin_migration.py index 824cbf6..7ab4621 100644 --- a/tests/test_plugin_migration.py +++ b/tests/test_plugin_migration.py @@ -17,13 +17,14 @@ class PluginMigrationTests(unittest.TestCase): ) previous_decky = sys.modules.get("decky") previous_tomllib = sys.modules.get("tomllib") + previous_plugin = sys.modules.pop("lsfg_vk.plugin", None) sys.modules["decky"] = decky sys.modules["tomllib"] = types.SimpleNamespace(loads=Mock()) sys.path.insert(0, "py_modules") from lsfg_vk.plugin import Plugin - return Plugin, decky, previous_decky, previous_tomllib + return Plugin, decky, previous_decky, previous_tomllib, previous_plugin - def _restore(self, previous_decky, previous_tomllib): + def _restore(self, previous_decky, previous_tomllib, previous_plugin): sys.path.remove("py_modules") if previous_decky is None: sys.modules.pop("decky", None) @@ -33,9 +34,13 @@ class PluginMigrationTests(unittest.TestCase): sys.modules.pop("tomllib", None) else: sys.modules["tomllib"] = previous_tomllib + if previous_plugin is None: + sys.modules.pop("lsfg_vk.plugin", None) + else: + sys.modules["lsfg_vk.plugin"] = previous_plugin def test_migration_only_runs_decky_path_migrations(self): - Plugin, decky, previous_decky, previous_tomllib = self._load_plugin() + Plugin, decky, previous_decky, previous_tomllib, previous_plugin = self._load_plugin() try: plugin = Plugin.__new__(Plugin) plugin.installation_service = Mock() @@ -49,10 +54,10 @@ class PluginMigrationTests(unittest.TestCase): plugin.installation_service.install.assert_not_called() plugin.flatpak_service.prepare_app.assert_not_called() finally: - self._restore(previous_decky, previous_tomllib) + self._restore(previous_decky, previous_tomllib, previous_plugin) def test_uninstall_cleans_owned_flatpak_state_and_profiles(self): - Plugin, _decky, previous_decky, previous_tomllib = self._load_plugin() + Plugin, _decky, previous_decky, previous_tomllib, previous_plugin = self._load_plugin() try: plugin = Plugin.__new__(Plugin) plugin.installation_service = Mock() @@ -66,10 +71,10 @@ class PluginMigrationTests(unittest.TestCase): plugin.configuration_service.reset_all_flatpak_configs.assert_called_once_with() plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() finally: - self._restore(previous_decky, previous_tomllib) + self._restore(previous_decky, previous_tomllib, previous_plugin) def test_uninstall_preserves_profiles_when_flatpak_cleanup_fails(self): - Plugin, _decky, previous_decky, previous_tomllib = self._load_plugin() + Plugin, _decky, previous_decky, previous_tomllib, previous_plugin = self._load_plugin() try: plugin = Plugin.__new__(Plugin) plugin.installation_service = Mock() @@ -82,7 +87,7 @@ class PluginMigrationTests(unittest.TestCase): plugin.configuration_service.reset_all_flatpak_configs.assert_not_called() plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() finally: - self._restore(previous_decky, previous_tomllib) + self._restore(previous_decky, previous_tomllib, previous_plugin) if __name__ == "__main__": -- cgit v1.2.3 From 954b2abc47d8772211cb8ecee523900f823184e8 Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Fri, 11 Sep 2026 11:08:12 -0400 Subject: better uninstall cleanup --- tests/test_plugin_migration.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'tests/test_plugin_migration.py') diff --git a/tests/test_plugin_migration.py b/tests/test_plugin_migration.py index 7ab4621..1a7cb29 100644 --- a/tests/test_plugin_migration.py +++ b/tests/test_plugin_migration.py @@ -63,12 +63,16 @@ class PluginMigrationTests(unittest.TestCase): plugin.installation_service = Mock() plugin.flatpak_service = Mock() plugin.configuration_service = Mock() + plugin.wrapper_service = Mock() plugin.flatpak_service.remove_plugin_owned_environment.return_value = {"success": True} + plugin.configuration_service.reset_all_flatpak_configs.return_value = {"success": True} + plugin.wrapper_service.purge.return_value = {"success": True} asyncio.run(plugin._uninstall()) plugin.flatpak_service.remove_plugin_owned_environment.assert_called_once_with() plugin.configuration_service.reset_all_flatpak_configs.assert_called_once_with() + plugin.wrapper_service.purge.assert_called_once_with() plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() finally: self._restore(previous_decky, previous_tomllib, previous_plugin) @@ -80,12 +84,14 @@ class PluginMigrationTests(unittest.TestCase): plugin.installation_service = Mock() plugin.flatpak_service = Mock() plugin.configuration_service = Mock() + plugin.wrapper_service = Mock() plugin.flatpak_service.remove_plugin_owned_environment.return_value = {"success": False, "error": "changed"} asyncio.run(plugin._uninstall()) plugin.configuration_service.reset_all_flatpak_configs.assert_not_called() - plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() + plugin.wrapper_service.purge.assert_not_called() + plugin.installation_service.cleanup_on_uninstall.assert_not_called() finally: self._restore(previous_decky, previous_tomllib, previous_plugin) -- cgit v1.2.3 From c7ca9c7ec2660d279f5e6957ef882390a8783667 Mon Sep 17 00:00:00 2001 From: xXJSONDeruloXx Date: Fri, 11 Sep 2026 11:47:16 -0400 Subject: handle decky uninstall to avoid unlaunchable game wrappers --- tests/test_plugin_migration.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'tests/test_plugin_migration.py') diff --git a/tests/test_plugin_migration.py b/tests/test_plugin_migration.py index 1a7cb29..fc51470 100644 --- a/tests/test_plugin_migration.py +++ b/tests/test_plugin_migration.py @@ -66,13 +66,14 @@ class PluginMigrationTests(unittest.TestCase): plugin.wrapper_service = Mock() plugin.flatpak_service.remove_plugin_owned_environment.return_value = {"success": True} plugin.configuration_service.reset_all_flatpak_configs.return_value = {"success": True} - plugin.wrapper_service.purge.return_value = {"success": True} + plugin.wrapper_service.neutralize.return_value = {"success": True} asyncio.run(plugin._uninstall()) plugin.flatpak_service.remove_plugin_owned_environment.assert_called_once_with() plugin.configuration_service.reset_all_flatpak_configs.assert_called_once_with() - plugin.wrapper_service.purge.assert_called_once_with() + plugin.wrapper_service.neutralize.assert_called_once_with() + plugin.wrapper_service.purge.assert_not_called() plugin.installation_service.cleanup_on_uninstall.assert_called_once_with() finally: self._restore(previous_decky, previous_tomllib, previous_plugin) -- cgit v1.2.3