From f7c40d48c0727a96843c85990cc36ae5a9ac6888 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Sat, 07 Feb 2026 23:42:43 +0000
Subject: [PATCH] Add integration test for binary
---
tests/test_resolver.py | 131 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 131 insertions(+), 0 deletions(-)
diff --git a/tests/test_resolver.py b/tests/test_resolver.py
new file mode 100644
index 0000000..f2e089b
--- /dev/null
+++ b/tests/test_resolver.py
@@ -0,0 +1,131 @@
+"""Tests for dependency resolver."""
+
+import pytest
+from unittest.mock import AsyncMock, patch
+
+from archbuild.resolver import DependencyResolver, Dependency, DependencyType, BuildOrder
+
+
+class TestDependency:
+ """Tests for Dependency class."""
+
+ def test_parse_simple(self):
+ """Test parsing simple dependency name."""
+ dep = Dependency.parse("packagename")
+ assert dep.name == "packagename"
+ assert dep.version_constraint is None
+ assert dep.dep_type == DependencyType.RUNTIME
+
+ def test_parse_with_gte(self):
+ """Test parsing with >= constraint."""
+ dep = Dependency.parse("package>=1.0")
+ assert dep.name == "package"
+ assert dep.version_constraint == ">=1.0"
+
+ def test_parse_with_lte(self):
+ """Test parsing with <= constraint."""
+ dep = Dependency.parse("package<=2.0")
+ assert dep.name == "package"
+ assert dep.version_constraint == "<=2.0"
+
+ def test_parse_build_dep(self):
+ """Test parsing as build dependency."""
+ dep = Dependency.parse("makedep", DependencyType.BUILD)
+ assert dep.dep_type == DependencyType.BUILD
+
+
+class TestBuildOrder:
+ """Tests for BuildOrder class."""
+
+ def test_iteration(self):
+ """Test BuildOrder iteration."""
+ order = BuildOrder(packages=["a", "b", "c"])
+ assert list(order) == ["a", "b", "c"]
+
+ def test_length(self):
+ """Test BuildOrder length."""
+ order = BuildOrder(packages=["a", "b"])
+ assert len(order) == 2
+
+
+class TestDependencyResolver:
+ """Tests for DependencyResolver."""
+
+ @pytest.fixture
+ def mock_aur_client(self):
+ """Create mock AUR client."""
+ client = AsyncMock()
+ return client
+
+ def test_topological_sort_simple(self, mock_aur_client):
+ """Test topological sort with simple graph."""
+ resolver = DependencyResolver(mock_aur_client)
+
+ # A depends on B, B depends on C
+ graph = {
+ "A": {"B"},
+ "B": {"C"},
+ "C": set(),
+ }
+
+ order = resolver._topological_sort(graph)
+
+ # C must come before B, B must come before A
+ assert order.index("C") < order.index("B")
+ assert order.index("B") < order.index("A")
+
+ def test_topological_sort_parallel(self, mock_aur_client):
+ """Test topological sort with parallel dependencies."""
+ resolver = DependencyResolver(mock_aur_client)
+
+ # A depends on B and C (parallel)
+ graph = {
+ "A": {"B", "C"},
+ "B": set(),
+ "C": set(),
+ }
+
+ order = resolver._topological_sort(graph)
+
+ # B and C must come before A
+ assert order.index("B") < order.index("A")
+ assert order.index("C") < order.index("A")
+
+ def test_detect_cycles_no_cycle(self, mock_aur_client):
+ """Test cycle detection with no cycles."""
+ resolver = DependencyResolver(mock_aur_client)
+
+ graph = {
+ "A": {"B"},
+ "B": {"C"},
+ "C": set(),
+ }
+
+ cycles = resolver.detect_cycles(graph)
+ assert len(cycles) == 0
+
+ def test_detect_cycles_with_cycle(self, mock_aur_client):
+ """Test cycle detection with cycle."""
+ resolver = DependencyResolver(mock_aur_client)
+
+ # A -> B -> C -> A (cycle)
+ graph = {
+ "A": {"B"},
+ "B": {"C"},
+ "C": {"A"},
+ }
+
+ cycles = resolver.detect_cycles(graph)
+ assert len(cycles) > 0
+
+ @patch("archbuild.resolver.subprocess.run")
+ def test_is_in_official_repos(self, mock_run, mock_aur_client):
+ """Test checking official repos."""
+ mock_run.return_value.returncode = 0
+ mock_run.return_value.stdout = "base\ngit\nvim\n"
+
+ resolver = DependencyResolver(mock_aur_client)
+ resolver._refresh_pacman_cache()
+
+ assert resolver.is_in_official_repos("git")
+ assert not resolver.is_in_official_repos("yay")
--
Gitblit v1.10.0