import tempfile import unittest from pathlib import Path from conflict_catcher import ( CheckError, check_conflicts, compare_freshness, generate_report, list_branches, parse_branch_spec, run_git, ) def git(repo: Path, *args: str) -> None: result = run_git(repo, list(args)) if result.code != 0: raise AssertionError(result.combined) def write(path: Path, text: str) -> None: path.write_text(text, encoding="utf-8") class ConflictCatcherTests(unittest.TestCase): def test_parse_branch_spec(self) -> None: self.assertEqual(parse_branch_spec("main None: with tempfile.TemporaryDirectory() as temp: repo = Path(temp) git(repo, "init", "-b", "main") git(repo, "config", "user.email", "test@example.com") git(repo, "config", "user.name", "Test User") write(repo / "note.txt", "base\n") git(repo, "add", "note.txt") git(repo, "commit", "-m", "base") git(repo, "checkout", "-b", "develop") write(repo / "note.txt", "develop\n") git(repo, "commit", "-am", "develop edit") git(repo, "checkout", "main") write(repo / "note.txt", "main\n") git(repo, "commit", "-am", "main edit") result = check_conflicts( { "repoPath": str(repo), "branchSpec": "main None: with tempfile.TemporaryDirectory() as temp: origin = Path(temp) / "origin.git" repo = Path(temp) / "repo" git(Path(temp), "init", "--bare", str(origin)) git(Path(temp), "clone", str(origin), str(repo)) git(repo, "checkout", "-b", "main") git(repo, "config", "user.email", "test@example.com") git(repo, "config", "user.name", "Test User") write(repo / "note.txt", "base\n") git(repo, "add", "note.txt") git(repo, "commit", "-m", "base") git(repo, "push", "-u", "origin", "main") git(repo, "checkout", "-b", "develop") branches = list_branches(repo) self.assertEqual(branches["current"], "develop") self.assertIn("main", branches["local"]) self.assertIn("develop", branches["local"]) self.assertIn("origin/main", branches["remote"]) freshness = compare_freshness(repo, "main", "develop") self.assertEqual(freshness[0]["state"], "ok") self.assertEqual(freshness[1]["state"], "unknown") def test_generates_markdown_report(self) -> None: report = generate_report( { "repo": "C:/repo", "target": "main", "source": "feature", "targetSha": "abc123", "sourceSha": "def456", "freshness": [{"summary": "main is up to date with origin/main."}], "checks": [ { "ok": False, "operation": "merge", "summary": "feature would conflict when merged into main.", "conflicts": [{"status": "UU", "meaning": "both modified", "path": "note.txt"}], } ], } ) self.assertIn("# Conflict Catcher Report", report) self.assertIn("Target/base: `main`", report) self.assertIn("| UU | both modified | `note.txt` |", report) if __name__ == "__main__": unittest.main()