Files
kunail0804-ComfyUI-Scene-Co…/tests/test_scene_analyzer_node.py
T
de5edd7064 fix(nodes): resolve KB path against the package and add raw debug outputs (#78)
Two ComfyUI issues found while testing.

1. Empty output with no error: the Knowledge Base Loader resolved a relative
   `path` against ComfyUI's working directory, not this package, so the default
   `knowledge_base/` loaded 0 entries (an empty KB is valid) and every concept
   became unknown -> empty prompts. Relative paths now resolve against the
   package root, and the loader warns when the Knowledge Base is empty.

2. Add a `raw` string output (a JSON dump of the node's data) to the Scene
   Analyzer, Scene Validator, Resolver, Category Splitter, and Prompt Builder
   nodes, plus a summary `raw` on the Knowledge Base Loader, for inspecting the
   pipeline in the graph. Adds a shared to_raw_json helper.

Tests: package-relative path resolution (independent of cwd), empty-KB warning,
raw output content, and updated node metadata/return-arity expectations.

Co-authored-by: kunail0804 <kunail0804@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 18:54:40 +02:00

78 lines
2.7 KiB
Python

"""Tests for the Scene Analyzer ComfyUI node (issue #19). No live Ollama."""
from __future__ import annotations
import nodes
import nodes.scene_analyzer_node as node_module
from compiler.common.message_codes import message
from compiler.common.result import CompilerResult
from nodes.scene_analyzer_node import SceneAnalyzerNode
def test_input_types_structure() -> None:
inputs = SceneAnalyzerNode.INPUT_TYPES()
assert set(inputs["required"]) == {
"natural_language",
"model_name",
"temperature",
"timeout",
}
assert "system_prompt" in inputs["optional"]
def test_node_metadata() -> None:
assert SceneAnalyzerNode.RETURN_TYPES == ("SCENE", "STRING", "STRING", "STRING")
assert SceneAnalyzerNode.RETURN_NAMES == ("scene", "warnings", "errors", "raw")
assert SceneAnalyzerNode.FUNCTION == "run"
assert SceneAnalyzerNode.CATEGORY == "Scene Compiler"
def test_run_delegates_to_analyzer_and_surfaces_messages(monkeypatch) -> None:
captured = {}
def fake_analyze(description, backend, config):
captured["description"] = description
captured["model"] = config.analyzer.model
return (
CompilerResult(data="SCENE_MODEL")
.add_warning(message("SC0001", "unknown concept 'x'"))
.add_error(message("SC0011", "bad response"))
)
monkeypatch.setattr(node_module, "analyze", fake_analyze)
scene, warnings, errors, *_ = SceneAnalyzerNode().run(
natural_language="A girl.",
model_name="mistral",
temperature=0.0,
timeout=60,
)
assert scene == "SCENE_MODEL"
assert captured["description"] == "A girl."
assert captured["model"] == "mistral"
assert "SC0001: unknown concept 'x'" in warnings
assert "SC0011: bad response" in errors
def test_no_messages_yield_empty_strings(monkeypatch) -> None:
monkeypatch.setattr(node_module, "analyze", lambda d, b, c: CompilerResult(data="S"))
scene, warnings, errors, *_ = SceneAnalyzerNode().run("x", "llama3", 0.0, 60)
assert (warnings, errors) == ("", "")
def test_system_prompt_override_is_passed(monkeypatch) -> None:
captured = {}
def fake_analyze(description, backend, config):
captured["system_prompt"] = config.analyzer.system_prompt
return CompilerResult(data="S")
monkeypatch.setattr(node_module, "analyze", fake_analyze)
SceneAnalyzerNode().run("x", "llama3", 0.0, 60, system_prompt="CUSTOM")
assert captured["system_prompt"] == "CUSTOM"
def test_registered_for_comfyui() -> None:
assert nodes.NODE_CLASS_MAPPINGS["SceneCompilerAnalyzer"] is SceneAnalyzerNode
assert nodes.NODE_DISPLAY_NAME_MAPPINGS["SceneCompilerAnalyzer"] == "Scene Analyzer"