"""Tests for AUR client.""" import pytest from unittest.mock import AsyncMock, patch, MagicMock from datetime import datetime from archrepobuild.aur import AURClient, Package @pytest.fixture def sample_package_data(): """Sample AUR RPC response data.""" return { "Name": "test-package", "Version": "1.0.0-1", "Description": "A test package", "URL": "https://example.com", "Maintainer": "testuser", "NumVotes": 100, "Popularity": 1.5, "OutOfDate": None, "FirstSubmitted": 1609459200, "LastModified": 1640995200, "Depends": ["dep1", "dep2"], "MakeDepends": ["makedep1"], "CheckDepends": [], "OptDepends": [], "Provides": [], "Conflicts": [], "Replaces": [], "License": ["MIT"], "Keywords": ["test"], } class TestPackage: """Tests for Package dataclass.""" def test_from_rpc(self, sample_package_data): """Test creating Package from RPC data.""" pkg = Package.from_rpc(sample_package_data) assert pkg.name == "test-package" assert pkg.version == "1.0.0-1" assert pkg.description == "A test package" assert pkg.maintainer == "testuser" assert pkg.votes == 100 assert pkg.depends == ["dep1", "dep2"] assert pkg.makedepends == ["makedep1"] def test_git_url(self, sample_package_data): """Test git_url property.""" pkg = Package.from_rpc(sample_package_data) assert pkg.git_url == "https://aur.archlinux.org/test-package.git" def test_aur_url(self, sample_package_data): """Test aur_url property.""" pkg = Package.from_rpc(sample_package_data) assert pkg.aur_url == "https://aur.archlinux.org/packages/test-package" class TestAURClient: """Tests for AURClient.""" @pytest.mark.asyncio async def test_get_package_cached(self, sample_package_data): """Test that cached packages are returned.""" async with AURClient(cache_ttl=300) as client: # Manually add to cache pkg = Package.from_rpc(sample_package_data) client._set_cached(pkg) # Should return from cache without network request result = await client.get_package("test-package") assert result is not None assert result.name == "test-package" @pytest.mark.asyncio async def test_cache_expiry(self, sample_package_data): """Test cache TTL expiry.""" async with AURClient(cache_ttl=0) as client: pkg = Package.from_rpc(sample_package_data) client._set_cached(pkg) # Cache should be expired immediately assert client._get_cached("test-package") is None @pytest.mark.asyncio async def test_batch_request(self, sample_package_data): """Test batch package requests.""" async with AURClient() as client: # Mock the request method mock_response = { "type": "multiinfo", "results": [sample_package_data], } client._request = AsyncMock(return_value=mock_response) packages = await client.get_packages(["test-package"]) assert len(packages) == 1 assert packages[0].name == "test-package" class TestDependencyParsing: """Tests for dependency string parsing.""" def test_parse_simple(self): """Test parsing simple dependency.""" from archrepobuild.resolver import Dependency dep = Dependency.parse("package") assert dep.name == "package" assert dep.version_constraint is None def test_parse_with_version(self): """Test parsing dependency with version.""" from archrepobuild.resolver import Dependency dep = Dependency.parse("package>=1.0") assert dep.name == "package" assert dep.version_constraint == ">=1.0" def test_parse_exact_version(self): """Test parsing dependency with exact version.""" from archrepobuild.resolver import Dependency dep = Dependency.parse("package=2.0") assert dep.name == "package" assert dep.version_constraint == "=2.0"