83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
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
|