import unittest from unittest import mock from gnome_extension_manager.cli import main class TestMain(unittest.TestCase): def _patched(self, **returns): return ( mock.patch( "gnome_extension_manager.cli.sync_repository", return_value=returns.get("sync", 0), ), mock.patch( "gnome_extension_manager.cli.build_extension", return_value=returns.get("build", 0), ), mock.patch( "gnome_extension_manager.cli.gnome_extensions", return_value=returns.get("toggle", 0), ), ) def test_disable_only_toggles(self): sync, build, toggle = self._patched() with sync as sync_mock, build as build_mock, toggle as toggle_mock: exit_code = main(["disable", "ext@example"]) sync_mock.assert_not_called() build_mock.assert_not_called() toggle_mock.assert_called_once_with("disable", "ext@example") self.assertEqual(exit_code, 0) def test_enable_without_repository_skips_installation(self): sync, build, toggle = self._patched() with sync as sync_mock, build as build_mock, toggle as toggle_mock: exit_code = main(["enable", "ext@example"]) sync_mock.assert_not_called() build_mock.assert_not_called() toggle_mock.assert_called_once_with("enable", "ext@example") self.assertEqual(exit_code, 0) def test_empty_repository_argument_is_treated_as_absent(self): sync, build, toggle = self._patched() with sync as sync_mock, build, toggle: exit_code = main(["enable", "ext@example", ""]) sync_mock.assert_not_called() self.assertEqual(exit_code, 0) def test_enable_with_repository_installs_into_the_extensions_dir(self): sync, build, toggle = self._patched() with sync as sync_mock, build as build_mock, toggle: exit_code = main( [ "enable", "ext@example", "https://example.com/ext.git", "--extensions-dir", "/opt/ext", ] ) folder = sync_mock.call_args.args[0] self.assertEqual(str(folder), "/opt/ext/ext@example") build_mock.assert_called_once() self.assertEqual(exit_code, 0) def test_failed_clone_stops_before_building(self): sync, build, toggle = self._patched(sync=128) with sync, build as build_mock, toggle as toggle_mock: exit_code = main(["enable", "ext@example", "https://example.com/ext.git"]) build_mock.assert_not_called() toggle_mock.assert_not_called() self.assertEqual(exit_code, 128) def test_failed_build_stops_before_enabling(self): sync, build, toggle = self._patched(build=2) with sync, build, toggle as toggle_mock: exit_code = main(["enable", "ext@example", "https://example.com/ext.git"]) toggle_mock.assert_not_called() self.assertEqual(exit_code, 2) def test_failed_toggle_propagates(self): sync, build, toggle = self._patched(toggle=1) with sync, build, toggle: exit_code = main(["enable", "ext@example"]) self.assertEqual(exit_code, 1) if __name__ == "__main__": unittest.main()