mirror of
https://github.com/ChristianLempa/boilerplates.git
synced 2026-08-24 10:04:44 -05:00
102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
"""Tests for managed library repository sync behavior."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from cli.core import repo
|
|
|
|
|
|
def test_clone_or_pull_repo_replaces_checkout_when_origin_changes(monkeypatch, tmp_path: Path) -> None:
|
|
"""Existing managed checkouts should be replaced when config points at a new remote."""
|
|
target_path = tmp_path / "default"
|
|
(target_path / ".git").mkdir(parents=True)
|
|
|
|
clone_calls: list[tuple[str, str, Path, str | None, str | None, str]] = []
|
|
|
|
def fake_get_repo_remote_url(_target_path: Path) -> str:
|
|
return "https://github.com/christianlempa/boilerplates.git"
|
|
|
|
def fake_replace_repo_checkout(
|
|
name: str,
|
|
url: str,
|
|
target_path: Path,
|
|
branch: str | None,
|
|
sparse_dir: str | None,
|
|
*,
|
|
reason: str,
|
|
) -> tuple[bool, str]:
|
|
clone_calls.append((name, url, target_path, branch, sparse_dir, reason))
|
|
return True, "recloned"
|
|
|
|
monkeypatch.setattr(repo, "_get_repo_remote_url", fake_get_repo_remote_url)
|
|
monkeypatch.setattr(repo, "_replace_repo_checkout", fake_replace_repo_checkout)
|
|
|
|
success, message = repo._clone_or_pull_repo(
|
|
"default",
|
|
"https://github.com/christianlempa/boilerplates-library.git",
|
|
target_path,
|
|
branch="main",
|
|
sparse_dir=".",
|
|
)
|
|
|
|
assert success is True
|
|
assert message == "recloned"
|
|
assert clone_calls == [
|
|
(
|
|
"default",
|
|
"https://github.com/christianlempa/boilerplates-library.git",
|
|
target_path,
|
|
"main",
|
|
".",
|
|
"configured remote changed from https://github.com/christianlempa/boilerplates.git to "
|
|
"https://github.com/christianlempa/boilerplates-library.git",
|
|
)
|
|
]
|
|
|
|
|
|
def test_clone_or_pull_repo_replaces_checkout_after_diverged_pull(monkeypatch, tmp_path: Path) -> None:
|
|
"""Fast-forward failures should fall back to a fresh managed clone."""
|
|
target_path = tmp_path / "default"
|
|
(target_path / ".git").mkdir(parents=True)
|
|
|
|
clone_calls: list[str] = []
|
|
|
|
monkeypatch.setattr(
|
|
repo, "_get_repo_remote_url", lambda _target_path: "git@github.com:ChristianLempa/boilerplates-library.git"
|
|
)
|
|
monkeypatch.setattr(
|
|
repo,
|
|
"_pull_repo_updates",
|
|
lambda _name, _target_path, _branch: (
|
|
False,
|
|
"Pull failed: fatal: Not possible to fast-forward, aborting.",
|
|
),
|
|
)
|
|
|
|
def fake_replace_repo_checkout(
|
|
name: str,
|
|
url: str,
|
|
target_path: Path,
|
|
branch: str | None,
|
|
sparse_dir: str | None,
|
|
*,
|
|
reason: str,
|
|
) -> tuple[bool, str]:
|
|
clone_calls.append(reason)
|
|
return True, "recloned after divergence"
|
|
|
|
monkeypatch.setattr(repo, "_replace_repo_checkout", fake_replace_repo_checkout)
|
|
|
|
success, message = repo._clone_or_pull_repo(
|
|
"default",
|
|
"https://github.com/christianlempa/boilerplates-library.git",
|
|
target_path,
|
|
branch="main",
|
|
sparse_dir=".",
|
|
)
|
|
|
|
assert success is True
|
|
assert message == "recloned after divergence"
|
|
assert clone_calls == ["managed checkout diverged from origin"]
|