Skip to content

Commit e55e6d0

Browse files
committed
Add tests for apt/package_repo_info.py
1 parent 39d21a6 commit e55e6d0

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
from _pytest.fixtures import get_scope_package
2+
import pytest
3+
from types import SimpleNamespace
4+
import types
5+
6+
import gardenlinux.apt.package_repo_info as repoinfo
7+
8+
9+
class FakeAPTRepo:
10+
"""
11+
Fake replacement for apt_repo.APTTRepository.
12+
13+
- stores the contructor args for assertions
14+
- exposes `.packages` and `get_packages_by_name(name)`
15+
"""
16+
17+
def __init__(self, url, dist, components) -> None:
18+
self.url = url
19+
self.dist = dist
20+
self.components = components
21+
# list of objects with .package and .version attributes
22+
self.packages = []
23+
24+
def get_packages_by_name(self, name):
25+
return [p for p in self.packages if p.package == name]
26+
27+
28+
def test_gardenlinuxrepo_init(monkeypatch):
29+
"""
30+
Test if GardenLinuxRepo creates an internal APTRepo
31+
"""
32+
# Arrange
33+
monkeypatch.setattr(repoinfo, "APTRepository", FakeAPTRepo)
34+
35+
# Act
36+
gr = repoinfo.GardenLinuxRepo("dist-123")
37+
38+
# Assert
39+
assert gr.dist == "dist-123"
40+
assert gr.url == "http://packages.gardenlinux.io/gardenlinux"
41+
assert gr.components == ["main"]
42+
# Assert that patch works
43+
assert isinstance(gr.repo, FakeAPTRepo)
44+
# Assert that constructor actually built an internal repo instance
45+
assert gr.repo.url == gr.url
46+
assert gr.repo.dist == gr.dist
47+
assert gr.repo.components == gr.components
48+
49+
50+
def test_get_package_version_by_name(monkeypatch):
51+
# Arrange
52+
monkeypatch.setattr(repoinfo, "APTRepository", FakeAPTRepo)
53+
gr = repoinfo.GardenLinuxRepo("d")
54+
# Fake package objects
55+
gr.repo.packages = [
56+
SimpleNamespace(package="pkg-a", version="1.0"),
57+
SimpleNamespace(package="pkg-b", version="2.0"),
58+
] # type: ignore
59+
60+
# Act
61+
result = gr.get_package_version_by_name("pkg-a")
62+
63+
# Assert
64+
assert result == [("pkg-a", "1.0")]
65+
66+
67+
def test_get_packages_versions_returns_all_pairs(monkeypatch):
68+
# Arrange
69+
monkeypatch.setattr(repoinfo, "APTRepository", FakeAPTRepo)
70+
gr = repoinfo.GardenLinuxRepo("d")
71+
gr.repo.packages = [
72+
SimpleNamespace(package="aa", version="0.1"),
73+
SimpleNamespace(package="bb", version="0.2"),
74+
] # type: ignore
75+
76+
# Act
77+
pv = gr.get_packages_versions()
78+
79+
# Assert
80+
assert pv == [("aa", "0.1"), ("bb", "0.2")]
81+
82+
83+
def test_compare_repo_union_returns_all():
84+
"""
85+
When available_in_both=False, compare_repo returns entries for:
86+
- only names in A
87+
- only names in B
88+
- names in both but with different versions
89+
"""
90+
# Arrange
91+
a = SimpleNamespace(get_packages_versions=lambda: [("a", "1"), ("b", "2")])
92+
b = SimpleNamespace(get_packages_versions=lambda: [("b", "3"), ("c", "4")])
93+
94+
# Act
95+
result = repoinfo.compare_repo(a, b, available_in_both=False)
96+
97+
# Assert
98+
expected = {
99+
("a", "1", None),
100+
("b", "2", "3"),
101+
("c", None, "4"),
102+
}
103+
assert set(result) == expected
104+
105+
106+
def test_compare_repo_intersection_only():
107+
"""
108+
When available_in_both=True, only intersection names are considered;
109+
differences are only returned if versions differ.
110+
"""
111+
# Arrange (both share 'b' with different versions)
112+
a = SimpleNamespace(get_packages_versions=lambda: [("a", "1"), ("b", "2")])
113+
b = SimpleNamespace(get_packages_versions=lambda: [("b", "3"), ("c", "4")])
114+
115+
# Act
116+
result = repoinfo.compare_repo(a, b, available_in_both=True) # type: ignore
117+
118+
# Assert
119+
assert set(result) == {("b", "2", "3")}
120+
121+
122+
def test_compare_same_returns_empty():
123+
"""
124+
When both sets are identical, compare_repo should return an empty set.
125+
"""
126+
# Arrange
127+
a = SimpleNamespace(get_packages_versions=lambda: [("a", "1"), ("b", "2")])
128+
b = SimpleNamespace(get_packages_versions=lambda: [("a", "1"), ("b", "2")])
129+
130+
# Act / Assert
131+
assert repoinfo.compare_repo(a, b, available_in_both=False) == [] # type: ignore
132+
133+
134+
def test_compare_empty_returns_empty():
135+
"""
136+
If both sets are empty, compare_repo should return an empty set.
137+
"""
138+
# Arrange
139+
a = SimpleNamespace(get_packages_versions=lambda: [])
140+
b = SimpleNamespace(get_packages_versions=lambda: [])
141+
142+
# Act / Assert
143+
assert repoinfo.compare_repo(a, b, available_in_both=True) == [] # type: ignore

0 commit comments

Comments
 (0)