aboutsummaryrefslogtreecommitdiff
path: root/tests/test_generate.py
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-10-17 12:52:42 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-10-17 12:52:42 +0200
commit5edb6e2fd048f369828984aaae6f7ce83d683201 (patch)
tree50de87735605b4936d0378754c3d51602e8f0c20 /tests/test_generate.py
parent3f88638e4d1c380d730274f46bac6670b1c6a35e (diff)
downloadcomfier-5edb6e2fd048f369828984aaae6f7ce83d683201.tar.xz
comfier-5edb6e2fd048f369828984aaae6f7ce83d683201.zip
claude: improved dev-setup
Diffstat (limited to 'tests/test_generate.py')
-rw-r--r--tests/test_generate.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/tests/test_generate.py b/tests/test_generate.py
new file mode 100644
index 0000000..37dda32
--- /dev/null
+++ b/tests/test_generate.py
@@ -0,0 +1,93 @@
+import asyncio
+from collections.abc import Callable
+from types import SimpleNamespace
+from typing import Any
+
+import pytest
+
+from tests.conftest import FakeComfy
+
+
+async def _run(tools: Any, **kw: Any) -> tuple[dict[str, Any], list[dict[str, Any]]]:
+ events: list[dict[str, Any]] = []
+
+ async def emit(e: dict[str, Any]) -> None:
+ events.append(e)
+
+ result = await tools.comfier_generate_image(
+ positive_prompt="a marble",
+ seed="5",
+ size="64x64",
+ __request__=SimpleNamespace(),
+ __user__={"id": "u"},
+ __event_emitter__=emit,
+ **kw,
+ )
+ return result, events
+
+
+async def test_success(make_tools: Callable[[], Any], comfy: FakeComfy) -> None:
+ tools, env = make_tools()
+ result, events = await _run(tools)
+ assert result["status"] == "success"
+ assert len(result["images"]) == 1 and len(env.stored) == 1
+ assert comfy.submitted[0]["520:517"]["inputs"]["seed"] == 5
+ assert comfy.submitted[0]["520:518"]["inputs"]["value"] == 64
+ assert events[-1]["type"] == "files"
+
+
+async def test_execution_error(make_tools: Callable[[], Any], comfy: FakeComfy) -> None:
+ comfy.script = [
+ {
+ "type": "execution_error",
+ "data": {"prompt_id": "pid-1", "exception_message": "boom"},
+ }
+ ]
+ tools, _ = make_tools()
+ with pytest.raises(RuntimeError, match="boom"):
+ await _run(tools)
+
+
+async def test_ws_drop_retry_declined(
+ make_tools: Callable[[], Any], comfy: FakeComfy
+) -> None:
+ comfy.drop_ws = True
+ tools, _ = make_tools()
+ asked: list[dict[str, Any]] = []
+
+ async def call(e: dict[str, Any]) -> bool:
+ asked.append(e)
+ return False
+
+ with pytest.raises(ConnectionError):
+ await _run(tools, __event_call__=call)
+ assert len(asked) == 1
+
+
+async def test_ws_drop_retry_accepted(
+ make_tools: Callable[[], Any], comfy: FakeComfy
+) -> None:
+ comfy.drop_ws = True
+ tools, _ = make_tools()
+
+ async def call(e: dict[str, Any]) -> bool:
+ comfy.drop_ws = False
+ return True
+
+ result, _ = await _run(tools, __event_call__=call)
+ assert result["status"] == "success"
+
+
+async def test_cancel_interrupts_backend(
+ make_tools: Callable[[], Any], comfy: FakeComfy
+) -> None:
+ comfy.hang = True
+ tools, _ = make_tools()
+ task = asyncio.create_task(_run(tools))
+ while not comfy.submitted:
+ await asyncio.sleep(0.05)
+ await asyncio.sleep(0.1)
+ task.cancel()
+ with pytest.raises(asyncio.CancelledError):
+ await task
+ assert comfy.interrupts == [{"prompt_id": "pid-1"}]