"""Tests for Git provider abstraction and types.""" from typing import Any import pytest from app.git.provider import GitProvider from app.git.types import ConnectionStatus, CredentialKind, ProviderKind, SshKeyStatus class MinimalGitProvider(GitProvider): """Concrete subclass for testing.""" def get_kind(self) -> ProviderKind: return ProviderKind.generic def validate_connection(self, git_url: str, credential_id: str) -> ConnectionStatus: return ConnectionStatus.connected def list_repositories(self, credential_id: str) -> list[dict[str, Any]]: return [] def create_deploy_key(self, git_url: str, public_key: str) -> str: return "key-id" def delete_deploy_key(self, git_url: str, deploy_key_id: str) -> None: return None def get_default_branch(self, git_url: str, credential_id: str) -> str: return "main" def test_git_provider_cannot_be_instantiated_directly() -> None: with pytest.raises(TypeError): GitProvider() # type: ignore[abstract] def test_minimal_git_provider_implements_all_methods() -> None: provider = MinimalGitProvider() assert provider.get_kind() == ProviderKind.generic status = provider.validate_connection("https://example.com/repo.git", "cred-id") assert status == ConnectionStatus.connected assert provider.list_repositories("cred-id") == [] assert provider.create_deploy_key("https://example.com/repo.git", "ssh-rsa AAAA") == "key-id" provider.delete_deploy_key("https://example.com/repo.git", "key-id") assert provider.get_default_branch("https://example.com/repo.git", "cred-id") == "main" @pytest.mark.parametrize("member", ["github", "gitlab", "gitea", "forgejo", "generic"]) def test_provider_kind_membership(member: str) -> None: assert member in ProviderKind @pytest.mark.parametrize("member", ["ssh_key", "access_token"]) def test_credential_kind_membership(member: str) -> None: assert member in CredentialKind @pytest.mark.parametrize("member", ["pending", "connected", "disconnected", "error"]) def test_connection_status_membership(member: str) -> None: assert member in ConnectionStatus @pytest.mark.parametrize("member", ["generated", "registered", "rotating", "revoked"]) def test_ssh_key_status_membership(member: str) -> None: assert member in SshKeyStatus