import subprocess from pathlib import Path import pytest from automation.config import RulesConfig from automation.ai_config import DEFAULT_SENTINEL from automation.patcher import ModelConfig, PatchGenerationError, generate_output @pytest.fixture() def temp_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) return repo def run(args: list[str], cwd: Path) -> None: subprocess.run(args, cwd=cwd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) def test_generate_output_creates_new_file(temp_repo: Path, tmp_path: Path) -> None: src = temp_repo / "Docs/features/FR_1/discussions/example.discussion.md" src.parent.mkdir(parents=True, exist_ok=True) src.write_text("- Alice: initial note\n", encoding="utf-8") run(["git", "add", src.relative_to(temp_repo).as_posix()], cwd=temp_repo) patch_text = """<<>> diff --git a/Docs/features/FR_1/discussions/example.discussion.sum.md b/Docs/features/FR_1/discussions/example.discussion.sum.md --- /dev/null +++ b/Docs/features/FR_1/discussions/example.discussion.sum.md @@ -0,0 +1,2 @@ +Line one +Line two <<>> """ patch_file = tmp_path / "patch.txt" patch_file.write_text(patch_text, encoding="utf-8") model = ModelConfig( commands=[f"bash -lc 'cat {patch_file.as_posix()}'"], sentinel=DEFAULT_SENTINEL, ) rules = RulesConfig(root=temp_repo, global_rules={"file_associations": {}, "rules": {}}) generate_output( repo_root=temp_repo, rules=rules, model=model, source_rel=Path("Docs/features/FR_1/discussions/example.discussion.md"), output_rel=Path("Docs/features/FR_1/discussions/example.discussion.sum.md"), instruction="Generate summary", ) output_file = temp_repo / "Docs/features/FR_1/discussions/example.discussion.sum.md" assert output_file.exists() assert output_file.read_text(encoding="utf-8") == "Line one\nLine two\n" staged = subprocess.run( ["git", "diff", "--cached", "--name-only"], cwd=temp_repo, check=True, capture_output=True, text=True, ).stdout.split() assert "Docs/features/FR_1/discussions/example.discussion.sum.md" in staged