diff --git a/tests/test_async_helpers.py b/tests/test_async_helpers.py new file mode 100644 index 0000000..e5b7759 --- /dev/null +++ b/tests/test_async_helpers.py @@ -0,0 +1,91 @@ +import importlib.util +import sys +import types +import unittest +from pathlib import Path + + +class _PromptQueue: + def __init__(self): + self.items = [] + + def put(self, item): + self.items.append(item) + + +def _load_async_helpers_module(): + module_path = Path("/home/robert/ComfyUI_dev/custom_nodes/ComfyUI-Distributed/utils/async_helpers.py") + package_name = "dist_async_helpers_testpkg" + + for mod_name in list(sys.modules): + if mod_name == package_name or mod_name.startswith(f"{package_name}."): + del sys.modules[mod_name] + + root_pkg = types.ModuleType(package_name) + root_pkg.__path__ = [] + sys.modules[package_name] = root_pkg + + utils_pkg = types.ModuleType(f"{package_name}.utils") + utils_pkg.__path__ = [] + sys.modules[f"{package_name}.utils"] = utils_pkg + + execution_module = types.ModuleType("execution") + + async def _validate_prompt(prompt_id, prompt, partial_execution_targets): + return (True, None, ["9"], {}) + + execution_module.validate_prompt = _validate_prompt + execution_module.SENSITIVE_EXTRA_DATA_KEYS = [] + sys.modules["execution"] = execution_module + + prompt_server = types.SimpleNamespace( + trigger_on_prompt=lambda payload: payload, + number=12, + prompt_queue=_PromptQueue(), + ) + server_module = types.ModuleType("server") + server_module.PromptServer = types.SimpleNamespace(instance=prompt_server) + sys.modules["server"] = server_module + + network_module = types.ModuleType(f"{package_name}.utils.network") + network_module.get_server_loop = lambda: None + sys.modules[f"{package_name}.utils.network"] = network_module + + spec = importlib.util.spec_from_file_location(f"{package_name}.utils.async_helpers", module_path) + module = importlib.util.module_from_spec(spec) + assert spec is not None and spec.loader is not None + spec.loader.exec_module(module) + return module, prompt_server + + +async_helpers, prompt_server = _load_async_helpers_module() + + +class QueuePromptPayloadTests(unittest.IsolatedAsyncioTestCase): + async def test_queue_prompt_payload_includes_create_time_and_client_metadata(self): + result = await async_helpers.queue_prompt_payload( + {"1": {"class_type": "Node"}}, + workflow_meta={"id": "workflow-1"}, + client_id="client-1", + include_queue_metadata=True, + ) + + self.assertIsInstance(result["prompt_id"], str) + self.assertTrue(result["prompt_id"]) + self.assertEqual(result["number"], 12) + self.assertEqual(result["node_errors"], {}) + + self.assertEqual(prompt_server.number, 13) + self.assertEqual(len(prompt_server.prompt_queue.items), 1) + queued_item = prompt_server.prompt_queue.items[0] + self.assertEqual(queued_item[0], 12) + extra_data = queued_item[3] + self.assertEqual(extra_data["client_id"], "client-1") + self.assertIn("create_time", extra_data) + self.assertIsInstance(extra_data["create_time"], int) + self.assertGreater(extra_data["create_time"], 0) + self.assertEqual(extra_data["extra_pnginfo"]["workflow"], {"id": "workflow-1"}) + + +if __name__ == "__main__": + unittest.main() diff --git a/utils/async_helpers.py b/utils/async_helpers.py index 7ea3c00..eb34d15 100644 --- a/utils/async_helpers.py +++ b/utils/async_helpers.py @@ -3,6 +3,7 @@ Async helper utilities for ComfyUI-Distributed. """ import asyncio import threading +import time import uuid import execution import server @@ -122,7 +123,7 @@ async def queue_prompt_payload( node_errors = valid[3] if len(valid) > 3 else {} raise PromptValidationError(error_payload, node_errors) - extra_data = {} + extra_data = {"create_time": int(time.time() * 1000)} if workflow_meta: extra_data.setdefault("extra_pnginfo", {})["workflow"] = workflow_meta if client_id: