169 lines
5.9 KiB
Python
169 lines
5.9 KiB
Python
"""
|
|
Unit tests for ComfyUI Selector nodes.
|
|
"""
|
|
|
|
import pytest # noqa: F401
|
|
|
|
|
|
class TestNodeStructure:
|
|
"""Test that all nodes have the required ComfyUI structure."""
|
|
|
|
def test_node_has_required_attributes(self, all_nodes):
|
|
"""Test that each node has all required ComfyUI attributes."""
|
|
required_attrs = ["INPUT_TYPES", "RETURN_TYPES", "FUNCTION", "CATEGORY"]
|
|
|
|
for node_name, node_class in all_nodes.items():
|
|
for attr in required_attrs:
|
|
assert hasattr(
|
|
node_class, attr
|
|
), f"{node_name} missing required attribute: {attr}"
|
|
|
|
def test_input_types_method(self, all_nodes):
|
|
"""Test that INPUT_TYPES() method returns valid structure."""
|
|
for node_name, node_class in all_nodes.items():
|
|
input_types = node_class.INPUT_TYPES()
|
|
assert isinstance(
|
|
input_types, dict
|
|
), f"{node_name}.INPUT_TYPES() must return a dict"
|
|
assert (
|
|
"required" in input_types
|
|
), f"{node_name}.INPUT_TYPES() must have 'required' key"
|
|
|
|
def test_function_method_exists(self, all_nodes):
|
|
"""Test that the function method specified in FUNCTION exists."""
|
|
for node_name, node_class in all_nodes.items():
|
|
function_name = node_class.FUNCTION
|
|
assert hasattr(
|
|
node_class, function_name
|
|
), f"{node_name} missing function method: {function_name}"
|
|
|
|
def test_node_instantiation(self, all_nodes):
|
|
"""Test that all nodes can be instantiated."""
|
|
for node_name, node_class in all_nodes.items():
|
|
instance = node_class()
|
|
assert instance is not None, f"{node_name} failed to instantiate"
|
|
|
|
|
|
class TestSamplerSelector:
|
|
"""Test SamplerSelector node functionality."""
|
|
|
|
def test_select_sampler(self, sampler_selector):
|
|
"""Test sampler selection."""
|
|
result = sampler_selector.select_sampler("euler")
|
|
assert result == ("euler",)
|
|
|
|
def test_input_types(self, sampler_selector):
|
|
"""Test input types structure."""
|
|
input_types = sampler_selector.INPUT_TYPES()
|
|
assert "sampler_name" in input_types["required"]
|
|
|
|
def test_return_types(self, sampler_selector):
|
|
"""Test return types."""
|
|
assert len(sampler_selector.RETURN_TYPES) == 1
|
|
assert isinstance(sampler_selector.RETURN_TYPES[0], list)
|
|
|
|
def test_category(self, sampler_selector):
|
|
"""Test node category."""
|
|
assert sampler_selector.CATEGORY == "Selectors/Sampling"
|
|
|
|
|
|
class TestSchedulerSelector:
|
|
"""Test SchedulerSelector node functionality."""
|
|
|
|
def test_select_scheduler(self, scheduler_selector):
|
|
"""Test scheduler selection."""
|
|
result = scheduler_selector.select_scheduler("karras")
|
|
assert result == ("karras",)
|
|
|
|
def test_input_types(self, scheduler_selector):
|
|
"""Test input types structure."""
|
|
input_types = scheduler_selector.INPUT_TYPES()
|
|
assert "scheduler" in input_types["required"]
|
|
|
|
def test_category(self, scheduler_selector):
|
|
"""Test node category."""
|
|
assert scheduler_selector.CATEGORY == "Selectors/Sampling"
|
|
|
|
|
|
class TestSeedGenerator:
|
|
"""Test SeedGenerator node functionality."""
|
|
|
|
def test_generate_seed_fixed(self, seed_generator):
|
|
"""Test fixed seed generation."""
|
|
result = seed_generator.generate_seed(42, "fixed")
|
|
assert result == (42,)
|
|
|
|
def test_generate_seed_increment(self, seed_generator):
|
|
"""Test increment seed generation."""
|
|
result = seed_generator.generate_seed(42, "increment")
|
|
assert result == (43,)
|
|
|
|
def test_generate_seed_randomize(self, seed_generator):
|
|
"""Test random seed generation."""
|
|
result = seed_generator.generate_seed(42, "randomize")
|
|
assert isinstance(result[0], int)
|
|
assert result[0] != 42 # Should be different from input
|
|
|
|
def test_category(self, seed_generator):
|
|
"""Test node category."""
|
|
assert seed_generator.CATEGORY == "Selectors/Generation"
|
|
|
|
|
|
class TestWidthNode:
|
|
"""Test WidthNode functionality."""
|
|
|
|
def test_custom_width(self, width_node):
|
|
"""Test custom width selection."""
|
|
result = width_node.get_width(512, "custom")
|
|
assert result == (512,)
|
|
|
|
def test_preset_width(self, width_node):
|
|
"""Test preset width selection."""
|
|
result = width_node.get_width(512, "1024")
|
|
assert result == (1024,)
|
|
|
|
def test_category(self, width_node):
|
|
"""Test node category."""
|
|
assert width_node.CATEGORY == "Selectors/Dimensions"
|
|
|
|
|
|
class TestHeightNode:
|
|
"""Test HeightNode functionality."""
|
|
|
|
def test_custom_height(self, height_node):
|
|
"""Test custom height selection."""
|
|
result = height_node.get_height(512, "custom")
|
|
assert result == (512,)
|
|
|
|
def test_preset_height(self, height_node):
|
|
"""Test preset height selection."""
|
|
result = height_node.get_height(512, "768")
|
|
assert result == (768,)
|
|
|
|
def test_category(self, height_node):
|
|
"""Test node category."""
|
|
assert height_node.CATEGORY == "Selectors/Dimensions"
|
|
|
|
|
|
class TestWidthHeightNode:
|
|
"""Test WidthHeightNode functionality."""
|
|
|
|
def test_custom_dimensions(self, width_height_node):
|
|
"""Test custom dimensions."""
|
|
result = width_height_node.get_dimensions(512, 768, "custom", False)
|
|
assert result == (512, 768)
|
|
|
|
def test_preset_dimensions(self, width_height_node):
|
|
"""Test preset dimensions."""
|
|
result = width_height_node.get_dimensions(512, 768, "1024x768", False)
|
|
assert result == (1024, 768)
|
|
|
|
def test_swap_dimensions(self, width_height_node):
|
|
"""Test dimension swapping."""
|
|
result = width_height_node.get_dimensions(512, 768, "custom", True)
|
|
assert result == (768, 512)
|
|
|
|
def test_category(self, width_height_node):
|
|
"""Test node category."""
|
|
assert width_height_node.CATEGORY == "Selectors/Dimensions"
|