123 lines
4.4 KiB
Python
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()
|