Skip to content

Commit 0639611

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

File tree

1 file changed

+140
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)