5 tests RED as expected: jinja2 missing, colorama/termcolor/bare-dot still present, aiohttp not in [project.dependencies]. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
114 lines
3.5 KiB
Python
114 lines
3.5 KiB
Python
"""Packaging correctness tests for specs/002-manager-compatible-install."""
|
|
|
|
import tomllib
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).parent.parent
|
|
REQUIREMENTS = REPO_ROOT / "requirements.txt"
|
|
PYPROJECT = REPO_ROOT / "pyproject.toml"
|
|
|
|
BANNED_PACKAGES = {"colorama", "termcolor", "rich"}
|
|
|
|
|
|
def _requirements_lines() -> list[str]:
|
|
return [
|
|
line.strip()
|
|
for line in REQUIREMENTS.read_text().splitlines()
|
|
if line.strip() and not line.strip().startswith("#")
|
|
]
|
|
|
|
|
|
def _pyproject_runtime_deps() -> list[str]:
|
|
data = tomllib.loads(PYPROJECT.read_text())
|
|
return data.get("project", {}).get("dependencies", [])
|
|
|
|
|
|
class TestRequirementsTxt:
|
|
"""US1 — Clean dependency install from a fresh clone."""
|
|
|
|
def test_requirements_txt_exists(self):
|
|
assert REQUIREMENTS.exists(), "requirements.txt not found at repo root"
|
|
|
|
def test_requirements_txt_contains_jinja2(self):
|
|
lines = _requirements_lines()
|
|
assert any("jinja2" in line.lower() for line in lines), (
|
|
f"jinja2 not found in requirements.txt; got: {lines}"
|
|
)
|
|
|
|
def test_requirements_txt_has_no_removed_packages(self):
|
|
lines = _requirements_lines()
|
|
for line in lines:
|
|
pkg = line.split("=")[0].split(">")[0].split("<")[0].split("[")[0].lower()
|
|
assert pkg not in BANNED_PACKAGES, (
|
|
f"Removed package {pkg!r} still in requirements.txt"
|
|
)
|
|
|
|
def test_requirements_txt_has_no_bare_dot(self):
|
|
lines = _requirements_lines()
|
|
assert "." not in lines, (
|
|
"requirements.txt contains bare '.' (editable install marker) — remove it"
|
|
)
|
|
|
|
def test_requirements_txt_packages_in_pyproject_dependencies(self):
|
|
req_lines = _requirements_lines()
|
|
runtime_deps = [d.split(">=")[0].split("==")[0].split("!=")[0].lower() for d in _pyproject_runtime_deps()]
|
|
for line in req_lines:
|
|
pkg = line.split("=")[0].split(">")[0].split("<")[0].split("[")[0].lower()
|
|
assert pkg in runtime_deps, (
|
|
f"Package {pkg!r} is in requirements.txt but not in pyproject.toml [project.dependencies]"
|
|
)
|
|
|
|
def test_aiohttp_in_project_dependencies(self):
|
|
runtime_deps = [d.split(">=")[0].split("==")[0].lower() for d in _pyproject_runtime_deps()]
|
|
assert "aiohttp" in runtime_deps, (
|
|
"aiohttp must be in pyproject.toml [project.dependencies], not only in [dependency-groups]"
|
|
)
|
|
|
|
|
|
class TestManagerEntry:
|
|
"""US2 — ComfyUI Manager registration."""
|
|
|
|
def test_manager_entry_json_exists(self):
|
|
pass
|
|
|
|
def test_manager_entry_json_is_valid(self):
|
|
pass
|
|
|
|
def test_manager_entry_has_required_fields(self):
|
|
pass
|
|
|
|
def test_manager_entry_nodenames_match_node_class_mappings(self):
|
|
pass
|
|
|
|
|
|
class TestMetadata:
|
|
"""US3 — Accurate package metadata."""
|
|
|
|
def test_description_does_not_mention_model_unloader(self):
|
|
pass
|
|
|
|
def test_description_does_not_mention_model_memory_management(self):
|
|
pass
|
|
|
|
def test_description_mentions_existing_nodes(self):
|
|
pass
|
|
|
|
|
|
class TestDockerCompose:
|
|
"""US4 — Docker Compose local test harness."""
|
|
|
|
def test_docker_compose_yml_exists(self):
|
|
pass
|
|
|
|
def test_docker_compose_has_comfyui_service(self):
|
|
pass
|
|
|
|
def test_docker_compose_exposes_port_8188(self):
|
|
pass
|
|
|
|
def test_dockerfile_exists(self):
|
|
pass
|
|
|
|
def test_dockerfile_uses_python_311_base(self):
|
|
pass
|