import os import subprocess import sys from pathlib import Path import pytest REPO_ROOT = Path(__file__).resolve().parents[1] PY_ENV = os.environ.copy() PY_ENV["PYTHONPATH"] = ( f"{REPO_ROOT}:{PY_ENV['PYTHONPATH']}" if PY_ENV.get("PYTHONPATH") else str(REPO_ROOT) ) def run(cmd: list[str], cwd: Path) -> subprocess.CompletedProcess[str]: return subprocess.run(cmd, cwd=cwd, check=True, text=True, capture_output=True) @pytest.fixture() def git_repo(tmp_path: Path) -> Path: repo = tmp_path / "repo" repo.mkdir() run(["git", "init"], cwd=repo) run(["git", "config", "user.email", "dev@example.com"], cwd=repo) run(["git", "config", "user.name", "Dev"], cwd=repo) content = """--- type: feature-discussion status: OPEN feature_id: FR_1 --- ## Summary Initial summary ## Participation - Maintainer: Kickoff. VOTE: READY """ (repo / "Docs/features/FR_1/discussions").mkdir(parents=True, exist_ok=True) discussion = repo / "Docs/features/FR_1/discussions/example.discussion.md" discussion.write_text(content, encoding="utf-8") run(["git", "add", discussion.as_posix()], cwd=repo) run(["git", "commit", "-m", "init"], cwd=repo) return repo def test_header_change_allowed(git_repo: Path) -> None: discussion = git_repo / "Docs/features/FR_1/discussions/example.discussion.md" lines = discussion.read_text(encoding="utf-8").splitlines() lines[2] = "status: READY_FOR_DESIGN" discussion.write_text("\n".join(lines) + "\n", encoding="utf-8") run(["git", "add", discussion.as_posix()], cwd=git_repo) proc = subprocess.run( [sys.executable, "-m", "automation.append_only", discussion.as_posix()], cwd=git_repo, text=True, env=PY_ENV, ) assert proc.returncode == 0 def test_body_edit_blocked(git_repo: Path) -> None: discussion = git_repo / "Docs/features/FR_1/discussions/example.discussion.md" text = discussion.read_text(encoding="utf-8") discussion.write_text( text.replace("Initial summary", "Updated summary"), encoding="utf-8" ) run(["git", "add", discussion.as_posix()], cwd=git_repo) proc = subprocess.run( [sys.executable, "-m", "automation.append_only", discussion.as_posix()], cwd=git_repo, capture_output=True, text=True, env=PY_ENV, ) assert proc.returncode == 1 assert "append-only" in proc.stderr