* feat(pipeline): add check_project_map to DOCS phase * test(pipeline): add check_project_map unit tests + update check_docs tests * docs(adr): add ADR-028 project map contract * docs(project-map): mention check_project_map guard in Update Protocol * docs(handoff): add PR handoff for check_project_map * docs(handoff): set PR number 67 * docs(review): fix PR#66 to PR#67 typo in project map and handoff * fix(ci): ruff lint errors in pipeline-status and project map test --------- Co-authored-by: opencode-agent <agent@opencode.local>
55 lines
2 KiB
Python
55 lines
2 KiB
Python
"""Tests for .opencode/scripts/pipeline-status.py — mandatory project map.
|
|
|
|
Verifies the deterministic check_project_map: docs/project-map/README.md is
|
|
required for every pipeline-driven PR (ADR-028). Loaded under a unique module
|
|
name (``pipeline_status_project_map``) so it does not collide with other test
|
|
modules that load the same script as ``pipeline_status``.
|
|
"""
|
|
|
|
import importlib.util
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
SCRIPT_PATH = (
|
|
Path(__file__).resolve().parent.parent / ".opencode" / "scripts" / "pipeline-status.py"
|
|
)
|
|
spec = importlib.util.spec_from_file_location("pipeline_status_project_map", SCRIPT_PATH)
|
|
ps = importlib.util.module_from_spec(spec)
|
|
sys.modules["pipeline_status_project_map"] = ps
|
|
spec.loader.exec_module(ps)
|
|
|
|
|
|
def test_project_map_exists(tmp_path, monkeypatch):
|
|
"""PROJECT_MAP_DIR + README.md → DONE, "README.md" в detail."""
|
|
pm_dir = tmp_path / "project-map"
|
|
pm_dir.mkdir()
|
|
(pm_dir / "README.md").write_text("# Project Map\n")
|
|
monkeypatch.setattr(ps, "PROJECT_MAP_DIR", pm_dir)
|
|
|
|
result = ps.check_project_map()
|
|
|
|
assert result.status == ps.PhaseStatus.DONE
|
|
assert "README.md" in result.detail
|
|
|
|
|
|
def test_project_map_dir_missing(tmp_path, monkeypatch):
|
|
"""PROJECT_MAP_DIR не существует → NOT_DONE, "директория" в detail."""
|
|
missing_dir = tmp_path / "does-not-exist"
|
|
monkeypatch.setattr(ps, "PROJECT_MAP_DIR", missing_dir)
|
|
|
|
result = ps.check_project_map()
|
|
|
|
assert result.status == ps.PhaseStatus.NOT_DONE
|
|
assert "директория" in result.detail
|
|
|
|
|
|
def test_project_map_readme_missing(tmp_path, monkeypatch):
|
|
"""Директория есть, README.md нет → NOT_DONE, "README.md не найден" в detail."""
|
|
pm_dir = tmp_path / "project-map"
|
|
pm_dir.mkdir()
|
|
monkeypatch.setattr(ps, "PROJECT_MAP_DIR", pm_dir)
|
|
|
|
result = ps.check_project_map()
|
|
|
|
assert result.status == ps.PhaseStatus.NOT_DONE
|
|
assert "README.md не найден" in result.detail
|