Files
ComfyUI/custom_nodes/ComfyUI-Impact-Pack/tests/wildcards/test_progressive_loading.py
jaidaken f09734b0ee
Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
Python Linting / Run Pylint (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Has been cancelled
Execution Tests / test (macos-latest) (push) Has been cancelled
Execution Tests / test (ubuntu-latest) (push) Has been cancelled
Execution Tests / test (windows-latest) (push) Has been cancelled
Test server launches without errors / test (push) Has been cancelled
Unit Tests / test (macos-latest) (push) Has been cancelled
Unit Tests / test (ubuntu-latest) (push) Has been cancelled
Unit Tests / test (windows-2022) (push) Has been cancelled
Add custom nodes, Civitai loras (LFS), and vast.ai setup script
Includes 30 custom nodes committed directly, 7 Civitai-exclusive
loras stored via Git LFS, and a setup script that installs all
dependencies and downloads HuggingFace-hosted models on vast.ai.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 00:56:42 +00:00

248 lines
9.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Progressive On-Demand Wildcard Loading Unit Tests
Tests that wildcard loading happens progressively as wildcards are accessed.
"""
import sys
import os
import tempfile
# Add parent directory to path
test_dir = os.path.dirname(os.path.abspath(__file__))
impact_pack_dir = os.path.dirname(test_dir)
sys.path.insert(0, impact_pack_dir)
from modules.impact import wildcards
def test_early_termination():
"""Test that calculate_directory_size stops early when limit exceeded"""
print("=" * 60)
print("TEST 1: Early Termination Size Calculation")
print("=" * 60)
# Create temporary directory with test files
with tempfile.TemporaryDirectory() as tmpdir:
# Create files totaling 100 bytes
for i in range(10):
with open(os.path.join(tmpdir, f"test{i}.txt"), 'w') as f:
f.write("x" * 10) # 10 bytes each
# Test without limit (should scan all)
total_size = wildcards.calculate_directory_size(tmpdir)
print(f"✓ Total size without limit: {total_size} bytes")
assert total_size == 100, f"Expected 100 bytes, got {total_size}"
# Test with limit (should stop early)
limited_size = wildcards.calculate_directory_size(tmpdir, limit=50)
print(f"✓ Size with 50 byte limit: {limited_size} bytes")
assert limited_size >= 50, f"Expected >= 50 bytes, got {limited_size}"
assert limited_size <= total_size, "Limited should not exceed total"
print(f"✓ Early termination working (stopped at {limited_size} bytes)")
print("\n✅ Early termination test PASSED\n")
def test_metadata_scan():
"""Test that scan_wildcard_metadata only scans file paths, not data"""
print("=" * 60)
print("TEST 2: Metadata-Only Scan")
print("=" * 60)
# Create temporary wildcard directory
with tempfile.TemporaryDirectory() as tmpdir:
# Create test files
test_file1 = os.path.join(tmpdir, "test1.txt")
test_file2 = os.path.join(tmpdir, "test2.txt")
test_yaml = os.path.join(tmpdir, "test3.yaml")
with open(test_file1, 'w') as f:
f.write("option1a\noption1b\noption1c\n")
with open(test_file2, 'w') as f:
f.write("option2a\noption2b\n")
with open(test_yaml, 'w') as f:
f.write("key1:\n - value1\n - value2\n")
# Clear globals
wildcards.available_wildcards = {}
wildcards.loaded_wildcards = {}
# Scan metadata only
print(f"✓ Scanning directory: {tmpdir}")
discovered = wildcards.scan_wildcard_metadata(tmpdir)
print(f"✓ Discovered {discovered} wildcards")
assert discovered == 3, f"Expected 3 wildcards, got {discovered}"
print(f"✓ Available wildcards: {list(wildcards.available_wildcards.keys())}")
assert len(wildcards.available_wildcards) == 3
# Verify that data is NOT loaded
assert len(wildcards.loaded_wildcards) == 0, "Data should not be loaded yet"
print("✓ No data loaded (metadata only)")
# Verify file paths are stored
for key in wildcards.available_wildcards.keys():
file_path = wildcards.available_wildcards[key]
assert os.path.exists(file_path), f"File path should exist: {file_path}"
print(f" - {key} -> {file_path}")
print("\n✅ Metadata scan test PASSED\n")
def test_progressive_loading():
"""Test that wildcards are loaded progressively on access"""
print("=" * 60)
print("TEST 3: Progressive On-Demand Loading")
print("=" * 60)
# Create temporary wildcard directory
with tempfile.TemporaryDirectory() as tmpdir:
# Create test files
test_file1 = os.path.join(tmpdir, "wildcard1.txt")
test_file2 = os.path.join(tmpdir, "wildcard2.txt")
test_file3 = os.path.join(tmpdir, "wildcard3.txt")
with open(test_file1, 'w') as f:
f.write("option1a\noption1b\n")
with open(test_file2, 'w') as f:
f.write("option2a\noption2b\n")
with open(test_file3, 'w') as f:
f.write("option3a\noption3b\n")
# Clear globals
wildcards.available_wildcards = {}
wildcards.loaded_wildcards = {}
wildcards._on_demand_mode = True
# Scan metadata
discovered = wildcards.scan_wildcard_metadata(tmpdir)
print(f"✓ Discovered {discovered} wildcards")
print(f"✓ Available: {len(wildcards.available_wildcards)}")
print(f"✓ Loaded: {len(wildcards.loaded_wildcards)}")
# Initial state: 3 available, 0 loaded
assert len(wildcards.available_wildcards) == 3
assert len(wildcards.loaded_wildcards) == 0
# Access first wildcard
print("\nAccessing wildcard1...")
data1 = wildcards.get_wildcard_value("wildcard1")
assert data1 is not None, "Should load wildcard1"
assert len(data1) == 2, f"Expected 2 options, got {len(data1)}"
print(f"✓ Loaded wildcard1: {data1}")
print(f"✓ Loaded count: {len(wildcards.loaded_wildcards)}")
assert len(wildcards.loaded_wildcards) == 1, "Should have 1 loaded wildcard"
# Access second wildcard
print("\nAccessing wildcard2...")
data2 = wildcards.get_wildcard_value("wildcard2")
assert data2 is not None, "Should load wildcard2"
print(f"✓ Loaded wildcard2: {data2}")
print(f"✓ Loaded count: {len(wildcards.loaded_wildcards)}")
assert len(wildcards.loaded_wildcards) == 2, "Should have 2 loaded wildcards"
# Re-access first wildcard (should use cache)
print("\nRe-accessing wildcard1 (cached)...")
data1_again = wildcards.get_wildcard_value("wildcard1")
assert data1_again == data1, "Cached data should match"
print("✓ Cache hit, data matches")
print(f"✓ Loaded count: {len(wildcards.loaded_wildcards)}")
assert len(wildcards.loaded_wildcards) == 2, "Count should not increase on cache hit"
# Access third wildcard
print("\nAccessing wildcard3...")
data3 = wildcards.get_wildcard_value("wildcard3")
assert data3 is not None, "Should load wildcard3"
print(f"✓ Loaded wildcard3: {data3}")
print(f"✓ Loaded count: {len(wildcards.loaded_wildcards)}")
assert len(wildcards.loaded_wildcards) == 3, "Should have 3 loaded wildcards"
# Verify all loaded
assert set(wildcards.loaded_wildcards.keys()) == {"wildcard1", "wildcard2", "wildcard3"}
print("✓ All wildcards loaded progressively")
print("\n✅ Progressive loading test PASSED\n")
def test_wildcard_list_functions():
"""Test get_wildcard_list() and get_loaded_wildcard_list()"""
print("=" * 60)
print("TEST 4: Wildcard List Functions")
print("=" * 60)
# Create temporary wildcard directory
with tempfile.TemporaryDirectory() as tmpdir:
# Create test files
for i in range(5):
with open(os.path.join(tmpdir, f"test{i}.txt"), 'w') as f:
f.write(f"option{i}a\noption{i}b\n")
# Clear globals
wildcards.available_wildcards = {}
wildcards.loaded_wildcards = {}
wildcards._on_demand_mode = True
# Scan metadata
wildcards.scan_wildcard_metadata(tmpdir)
# Test get_wildcard_list (should return all available)
all_wildcards = wildcards.get_wildcard_list()
print(f"✓ get_wildcard_list(): {len(all_wildcards)} wildcards")
assert len(all_wildcards) == 5, "Should return all available wildcards"
# Test get_loaded_wildcard_list (should return 0 initially)
loaded_wildcards_list = wildcards.get_loaded_wildcard_list()
print(f"✓ get_loaded_wildcard_list(): {len(loaded_wildcards_list)} wildcards (initial)")
assert len(loaded_wildcards_list) == 0, "Should return no loaded wildcards initially"
# Load some wildcards
wildcards.get_wildcard_value("test0")
wildcards.get_wildcard_value("test1")
# Test get_loaded_wildcard_list (should return 2 now)
loaded_wildcards_list = wildcards.get_loaded_wildcard_list()
print(f"✓ get_loaded_wildcard_list(): {len(loaded_wildcards_list)} wildcards (after loading 2)")
assert len(loaded_wildcards_list) == 2, "Should return 2 loaded wildcards"
# Verify loaded list is subset of available list
assert set(loaded_wildcards_list).issubset(set(all_wildcards)), "Loaded should be subset of available"
print("✓ Loaded list is subset of available list")
print("\n✅ Wildcard list functions test PASSED\n")
def main():
"""Run all tests"""
print("\n" + "=" * 60)
print("PROGRESSIVE ON-DEMAND LOADING TEST SUITE")
print("=" * 60 + "\n")
try:
test_early_termination()
test_metadata_scan()
test_progressive_loading()
test_wildcard_list_functions()
print("=" * 60)
print("✅ ALL TESTS PASSED")
print("=" * 60)
return 0
except Exception as e:
print("\n" + "=" * 60)
print(f"❌ TEST FAILED: {e}")
print("=" * 60)
import traceback
traceback.print_exc()
return 1
if __name__ == "__main__":
sys.exit(main())