Files
Tools/cc/test_conflict_catcher.py
T

123 lines
4.4 KiB
Python

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<develop", "", ""), ("main", "develop"))
self.assertEqual(parse_branch_spec("", "main", "develop"), ("main", "develop"))
with self.assertRaises(CheckError):
parse_branch_spec("main", "", "")
def test_detects_merge_and_rebase_conflicts(self) -> 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<develop",
"operation": "both",
}
)
self.assertEqual(result["target"], "main")
self.assertEqual(result["source"], "develop")
self.assertEqual(len(result["checks"]), 2)
self.assertTrue(all(not check["ok"] for check in result["checks"]))
self.assertTrue(
all(
any(conflict["path"] == "note.txt" for conflict in check["conflicts"])
for check in result["checks"]
)
)
def test_lists_branches_and_reports_freshness(self) -> 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()