import datetime import importlib.util from pathlib import Path from src.config import Config, FetchConfig from src.models import GiteaRepository, GiteaUser def load_mirror_module(): module_path = Path(__file__).parent.parent / "gitea-mirror.py" spec = importlib.util.spec_from_file_location("gitea_mirror", module_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def make_repo() -> GiteaRepository: return GiteaRepository( ssh_url="ssh://git@example.com/alex/repo.git", clone_url="https://example.com/alex/repo.git", name="repo", id=42, updated_at=datetime.datetime.now(), owner=GiteaUser( id=23, login="alex", email="alex@example.com", ), ) def make_config(tmp_path, fetch: FetchConfig) -> Config: return Config( api_token="api-token", endpoint="https://example.com", repository_format="{owner}/{name}", out_dir=str(tmp_path), fetch=fetch, ) def test_process_repo_clones_with_ssh_url_and_key_env(monkeypatch, tmp_path): mirror = load_mirror_module() calls = [] def fake_git_clone(repository_url, repository, env): calls.append((repository_url, repository, env)) return True monkeypatch.setattr(mirror, "git_clone", fake_git_clone) mirror.process_repo( config=make_config(tmp_path, FetchConfig(ssh_key="/tmp/test_key")), repo=make_repo(), ) assert calls == [ ( "ssh://git@example.com/alex/repo.git", str(tmp_path / "alex" / "repo"), { "GIT_SSH_COMMAND": ( "ssh -i /tmp/test_key -o IdentitiesOnly=yes" ), }, ) ] def test_process_repo_clones_with_https_url_and_auth_env(monkeypatch, tmp_path): mirror = load_mirror_module() calls = [] def fake_git_clone(repository_url, repository, env): calls.append((repository_url, repository, env)) return True monkeypatch.setattr(mirror, "git_clone", fake_git_clone) mirror.process_repo( config=make_config(tmp_path, FetchConfig(user="alex", token="secret")), repo=make_repo(), ) repository_url, repository, env = calls[0] assert repository_url == "https://example.com/alex/repo.git" assert repository == str(tmp_path / "alex" / "repo") assert env["GIT_CONFIG_COUNT"] == "1" assert env["GIT_CONFIG_KEY_0"] == "http.extraHeader" assert env["GIT_CONFIG_VALUE_0"].startswith("Authorization: Basic ") def test_process_repo_pulls_existing_repo_with_fetch_env(monkeypatch, tmp_path): mirror = load_mirror_module() calls = [] repo_path = tmp_path / "alex" / "repo" / ".git" repo_path.mkdir(parents=True) def fake_git_pull(repository, env): calls.append((repository, env)) return True monkeypatch.setattr(mirror, "git_pull", fake_git_pull) mirror.process_repo( config=make_config(tmp_path, FetchConfig(ssh_key="/tmp/test_key")), repo=make_repo(), ) assert calls == [ ( str(tmp_path / "alex" / "repo"), { "GIT_SSH_COMMAND": ( "ssh -i /tmp/test_key -o IdentitiesOnly=yes" ), }, ) ]