CascadingDev/tests/test_append_only.py

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