From 0ff59b5f5b59c7e9e2791254df0024b5ed4716e3 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Wed, 7 Oct 2026 18:55:01 -0700 Subject: [PATCH] test: cover __init__ Version parsing from pyproject (and the unknown fallback), and a server whose add_on_prompt_handler raises: nodes and monitoring still come up. --- tests/test_init_package.py | 50 +++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/tests/test_init_package.py b/tests/test_init_package.py index 619df191..b25ee282 100644 --- a/tests/test_init_package.py +++ b/tests/test_init_package.py @@ -48,13 +48,13 @@ def fake_folder_paths_module(output_dir): return module -def load_package(name, db_path, output_dir): +def load_package(name, db_path, output_dir, server=None): """Import ROOT/__init__.py as package ``name`` with ComfyUI stubbed. Returns (package, server instance). The caller stops the image monitor. """ saved = {key: sys.modules.get(key) for key in ("server", "folder_paths")} - server = fake_server_module() + server = server or fake_server_module() sys.modules["server"] = server sys.modules["folder_paths"] = fake_folder_paths_module(output_dir) try: @@ -92,13 +92,17 @@ class PackageTestCase(unittest.TestCase): os.makedirs(cls.output_dir) cls.db_path = cls.make_db_path(cls.tmp.name) cls.package, cls.server = load_package( - cls.package_name, cls.db_path, cls.output_dir + cls.package_name, cls.db_path, cls.output_dir, server=cls.make_server() ) @classmethod def make_db_path(cls, tmp): return os.path.join(tmp, "prompts.db") + @classmethod + def make_server(cls): + return fake_server_module() + @classmethod def tearDownClass(cls): monitor = getattr(cls.package, "_global_image_monitor", None) @@ -174,5 +178,45 @@ class TestPackageWithoutDatabase(PackageTestCase): self.assertIsNotNone(self.server.prompt_queue.get()) +class TestVersion(PackageTestCase): + def test_version_comes_from_pyproject(self): + import re + + with open(os.path.join(ROOT, "pyproject.toml"), encoding="utf-8") as f: + expected = re.search(r'version\s*=\s*["\']([^"\']+)["\']', f.read()) + self.assertEqual(self.package.get_version(), expected.group(1)) + + def test_unreadable_pyproject_gives_unknown(self): + with mock.patch.object(self.package, "Path", side_effect=OSError("denied")): + self.assertEqual(self.package.get_version(), "unknown") + missing = mock.Mock() + missing.parent.__truediv__ = lambda self_, name: mock.Mock(exists=lambda: False) + with mock.patch.object(self.package, "Path", return_value=missing): + self.assertEqual(self.package.get_version(), "unknown") + + +class TestPackageWhenHookRegistrationFails(PackageTestCase): + """A server that rejects the hook must not break the rest of the package.""" + + package_name = "prompt_manager_pkg_nohook" + + @classmethod + def make_server(cls): + module = fake_server_module() + instance = module.PromptServer.instance + + def reject(handler): + raise RuntimeError("hooks unsupported") + + instance.add_on_prompt_handler = reject + return module + + def test_nodes_and_monitoring_still_come_up(self): + self.assertIn("PromptManager", self.package.NODE_CLASS_MAPPINGS) + self.assertIsNotNone(self.package._global_db) + self.assertTrue(self.package._global_image_monitor.is_monitoring) + self.assertEqual(self.server.handlers, []) + + if __name__ == "__main__": unittest.main()