Skip to content

Commit f3b9424

Browse files
author
Antoine
committed
Adding tests for version
1 parent 9ef105b commit f3b9424

File tree

3 files changed

+396
-28
lines changed

3 files changed

+396
-28
lines changed

http_code/tests.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
from http_code import HttpCode
32
import pytest
43

version/tests.py

Lines changed: 378 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,378 @@
1+
from version import Version
2+
import pytest
3+
4+
def test_version_initialization():
5+
version = Version(1, 0, 0)
6+
assert version.major == 1
7+
assert version.minor == 0
8+
assert version.patch == 0
9+
assert version.prerelease is None
10+
assert version.metadata is None
11+
12+
def test_version_initialization_from_string():
13+
version = Version("1", "2", "3", "alpha", "meta")
14+
assert version.major == 1
15+
assert version.minor == 2
16+
assert version.patch == 3
17+
assert version.prerelease == "alpha"
18+
assert version.metadata == "meta"
19+
20+
def test_version_from_string():
21+
version = Version.from_string("1.2.3-alpha+meta")
22+
assert version.major == 1
23+
assert version.minor == 2
24+
assert version.patch == 3
25+
assert version.prerelease == "alpha"
26+
assert version.metadata == "meta"
27+
28+
def test_version_from_string_invalid():
29+
with pytest.raises(ValueError):
30+
Version.from_string("invalid.version.string")
31+
32+
@pytest.mark.parametrize(
33+
"major, minor, patch, prerelease, metadata, expected_str",
34+
[
35+
(1, 0, 0, None, None, "1.0.0"),
36+
(1, 0, 0, "alpha", None, "1.0.0-alpha"),
37+
(1, 0, 0, None, "meta", "1.0.0+meta"),
38+
(1, 0, 0, "alpha", "meta", "1.0.0-alpha+meta"),
39+
(1, 2, 3, "beta.1", "build.123", "1.2.3-beta.1+build.123"),
40+
],
41+
ids=[
42+
"no_prerelease_no_metadata",
43+
"prerelease_no_metadata",
44+
"no_prerelease_metadata",
45+
"prerelease_metadata",
46+
"prerelease_with_build",
47+
]
48+
)
49+
def test_version_to_string(major, minor, patch, prerelease, metadata, expected_str):
50+
version = Version(major, minor, patch, prerelease, metadata)
51+
assert str(version) == expected_str
52+
53+
@pytest.mark.parametrize(
54+
"major, minor, patch, prerelease, metadata, expected_repr",
55+
[
56+
(1, 0, 0, None, None, "Version(major=1, minor=0, patch=0, prerelease=None, metadata=None)"),
57+
(1, 0, 0, "alpha", None, "Version(major=1, minor=0, patch=0, prerelease=alpha, metadata=None)"),
58+
(1, 0, 0, None, "meta", "Version(major=1, minor=0, patch=0, prerelease=None, metadata=meta)"),
59+
(1, 0, 0, "alpha", "meta", "Version(major=1, minor=0, patch=0, prerelease=alpha, metadata=meta)"),
60+
(1, 2, 3, "beta.1", "build.123", "Version(major=1, minor=2, patch=3, prerelease=beta.1, metadata=build.123)")
61+
],
62+
ids=[
63+
"no_prerelease_no_metadata",
64+
"prerelease_no_metadata",
65+
"no_prerelease_metadata",
66+
"prerelease_metadata",
67+
"prerelease_with_build",
68+
]
69+
)
70+
def test_version_repr(major, minor, patch, prerelease, metadata, expected_repr):
71+
version = Version(major, minor, patch, prerelease, metadata)
72+
assert repr(version) == expected_repr
73+
74+
@pytest.mark.parametrize(
75+
"major, minor, patch, prerelease, metadata",
76+
[
77+
(1, 0, 0, None, None),
78+
(1, 0, 0, "alpha", None),
79+
(1, 0, 0, None, "meta"),
80+
(1, 0, 0, "alpha", "meta"),
81+
(1, 2, 3, "beta.1", "build.123"),
82+
],
83+
ids=[
84+
"no_prerelease_no_metadata",
85+
"prerelease_no_metadata",
86+
"no_prerelease_metadata",
87+
"prerelease_metadata",
88+
"prerelease_with_build",
89+
]
90+
)
91+
def test_hash(major, minor, patch, prerelease, metadata):
92+
version = Version(major, minor, patch, prerelease, metadata)
93+
assert hash(version) == hash((major, minor, patch, prerelease, metadata))
94+
95+
@pytest.mark.parametrize(
96+
"major, minor, patch, prerelease, metadata",
97+
[
98+
(1, 0, 0, None, None),
99+
(1, 0, 0, "alpha", None),
100+
(1, 0, 0, None, "meta"),
101+
(1, 0, 0, "alpha", "meta"),
102+
(1, 2, 3, "beta.1", "build.123"),
103+
],
104+
ids=[
105+
"no_prerelease_no_metadata",
106+
"prerelease_no_metadata",
107+
"no_prerelease_metadata",
108+
"prerelease_metadata",
109+
"prerelease_with_build",
110+
]
111+
)
112+
def test_version_equality_equals(major, minor, patch, prerelease, metadata):
113+
version1 = Version(major, minor, patch, prerelease, metadata)
114+
version2 = Version(major, minor, patch, prerelease, metadata)
115+
assert version1 == version2
116+
assert version1 is not version2 # Different instances should not be the same object
117+
118+
@pytest.mark.parametrize(
119+
"major, minor, patch, prerelease, metadata",
120+
[
121+
(1, 0, 0, None, None),
122+
(1, 0, 0, "alpha", None),
123+
(1, 0, 0, None, "meta"),
124+
(1, 0, 0, "alpha", "meta"),
125+
(1, 2, 3, "beta.1", "build.123"),
126+
],
127+
ids=[
128+
"no_prerelease_no_metadata",
129+
"prerelease_no_metadata",
130+
"no_prerelease_metadata",
131+
"prerelease_metadata",
132+
"prerelease_with_build",
133+
]
134+
)
135+
def test_version_equality_not_equals(major, minor, patch, prerelease, metadata):
136+
version1 = Version(major, minor, patch, prerelease, metadata)
137+
version2 = Version(major + 1, minor, patch, prerelease, metadata)
138+
assert version1 != version2
139+
140+
def test_version_equality_different_metadata():
141+
version1 = Version(1, 0, 0, metadata="meta1")
142+
version2 = Version(1, 0, 0, metadata="meta2")
143+
assert version1 == version2 # Different metadata should not affect equality
144+
145+
def test_version_equality_different_types():
146+
version = Version(1, 0, 0)
147+
assert version != "1.0.0" # Different types should not be equal
148+
assert version != 1.0 # Different types should not be equal
149+
150+
@pytest.mark.parametrize(
151+
"version1, version2",
152+
[
153+
(Version(1, 0, 0), Version(1, 0, 1)), # Same major and minor, different patch
154+
(Version(1, 0, 0), Version(1, 1, 0)), # Same major, different minor
155+
(Version(1, 0, 0), Version(2, 0, 0)), # Different major
156+
(Version(1, 0, 0, "alpha"), Version(1, 0, 0, "beta")), # Same major and minor, different prerelease
157+
(Version(1, 0, 0, "alpha"), Version(1, 0, 0)), # Same major and minor, with and without prerelease
158+
(Version(1, 0, 0, "alpha"), Version(1, 0, 0, "alpha.1")), # Same major and minor, different prerelease (sub version)
159+
(Version(1, 0, 0, "alpha"), Version(1, 0, 0, "beta.1")), # Same major and minor, different prerelease (main version)
160+
(Version(1, 0, 0, "0"), Version(1, 0, 0, "1")), # Same major and minor, different prerelease (numbers)
161+
(Version(1, 0, 0, "0.1"), Version(1, 0, 0, "0.2")), # Same major and minor, different prerelease (numbers, sub version)
162+
],
163+
ids=[
164+
"same_major_minor_different_patch",
165+
"same_major_different_minor",
166+
"different_major",
167+
"same_major_minor_different_prerelease",
168+
"Same major and minor, with and without prerelease",
169+
"same_major_minor_different_prerelease (sub version)",
170+
"same_major_minor_different_prerelease (main version)",
171+
"same_major_minor_different_prerelease (numbers)",
172+
"Same major and minor, different prerelease (numbers, sub version)"
173+
]
174+
)
175+
def test_version_lower_than_good(version1, version2):
176+
assert version1 < version2
177+
178+
@pytest.mark.parametrize(
179+
"version1, version2",
180+
[
181+
(Version(1, 0, 0), Version(1, 0, 0)), # Same version
182+
(Version(1, 0, 0), Version(1, 0, 0, "alpha")), # Same major and minor, with and without prerelease
183+
(Version(1, 0, 0, "alpha.1.0"), Version(1, 0, 0, "alpha.1.0")), # Same major and minor, different prerelease
184+
(Version(1, 0, 0, "alpha.1.1"), Version(1, 0, 0, "alpha.1.0")), # Same major and minor, different prerelease (sub version)
185+
],
186+
ids=[
187+
"same_version",
188+
"same_major_minor_with_prerelease",
189+
"same_major_minor_different_prerelease",
190+
"same_major_minor_different_prerelease (sub version)",
191+
]
192+
)
193+
def test_version_lower_than_bad(version1, version2):
194+
assert not version1 < version2 # Should not be less than or equal to
195+
196+
197+
def test_version_greater_than():
198+
version1 = Version(1, 0, 1)
199+
version2 = Version(1, 0, 0)
200+
assert version1 > version2 # Should be greater than
201+
202+
def test_version_greater_or_equal():
203+
version1 = Version(1, 0, 0)
204+
version2 = Version(1, 0, 0)
205+
version3 = Version(1, 0, 1)
206+
assert version1 >= version2 # Should be greater than or equal to
207+
assert version3 >= version1 # Should be greater than or equal to
208+
209+
def test_version_less_or_equal():
210+
version1 = Version(1, 0, 0)
211+
version2 = Version(1, 0, 1)
212+
version3 = Version(1, 0, 0)
213+
assert version1 <= version2 # Should be less than or equal to
214+
assert version3 <= version1 # Should be less than or equal to
215+
216+
217+
def test_version_increment_major():
218+
version = Version(1, 2, 3)
219+
version.major_increment()
220+
assert version.major == 2
221+
assert version.minor == 0
222+
assert version.patch == 0
223+
224+
def test_version_increment_minor():
225+
version = Version(1, 2, 3)
226+
version.minor_increment()
227+
assert version.major == 1
228+
assert version.minor == 3
229+
assert version.patch == 0
230+
231+
def test_version_increment_patch():
232+
version = Version(1, 2, 3)
233+
version.patch_increment()
234+
assert version.major == 1
235+
assert version.minor == 2
236+
assert version.patch == 4
237+
238+
def test_version_prerelease_increment():
239+
version = Version(1, 2, 3, "alpha.1")
240+
version.prerelease_increment()
241+
assert version.prerelease == "alpha.2"
242+
243+
def test_version_prerelease_increment_no_subversion():
244+
version = Version(1, 2, 3)
245+
with pytest.raises(ValueError):
246+
version.prerelease_increment()
247+
248+
def test_version_metadata_increment():
249+
version = Version(1, 2, 3, metadata="1.2")
250+
version.metadata_increment()
251+
assert version.metadata == "1.3"
252+
253+
def test_version_metadata_increment_no_metadata():
254+
version = Version(1, 2, 3)
255+
with pytest.raises(ValueError):
256+
version.metadata_increment()
257+
258+
def test_version_is_prerelease():
259+
version = Version(1, 2, 3, "alpha")
260+
assert version.is_prerelease() is True
261+
262+
def test_version_has_metadata():
263+
version = Version(1, 2, 3, metadata="meta")
264+
assert version.has_metadata() is True
265+
266+
@pytest.mark.parametrize(
267+
"major, minor, patch, prerelease, metadata",
268+
[
269+
("a", 0, 0, None, None),
270+
(1, "b", 0, None, None),
271+
(1, 0, "c", None, None),
272+
],
273+
ids=[
274+
"invalid_major",
275+
"invalid_minor",
276+
"invalid_patch",
277+
]
278+
)
279+
def test_version_invalid_initialization(major, minor, patch, prerelease, metadata):
280+
with pytest.raises(ValueError):
281+
Version(major, minor, patch, prerelease, metadata)
282+
283+
def test_version_invalid_prerelease():
284+
with pytest.raises(ValueError):
285+
Version(1, 0, 0, prerelease="invalid@prerelease")
286+
287+
def test_version_invalid_metadata():
288+
with pytest.raises(ValueError):
289+
Version(1, 0, 0, metadata="invalid@metadata")
290+
291+
292+
def test_version_major_decrement():
293+
version = Version(1, 2, 3)
294+
version.major_decrement()
295+
assert version.major == 0
296+
assert version.minor == 0
297+
assert version.patch == 0
298+
299+
def test_version_major_decrement_0():
300+
version = Version(0, 0, 0)
301+
with pytest.raises(ValueError):
302+
version.major_decrement()
303+
304+
def test_version_minor_decrement():
305+
version = Version(1, 2, 3)
306+
version.minor_decrement()
307+
assert version.major == 1
308+
assert version.minor == 1
309+
assert version.patch == 0
310+
311+
def test_version_minor_decrement_0():
312+
version = Version(1, 0, 0)
313+
with pytest.raises(ValueError):
314+
version.minor_decrement()
315+
316+
def test_version_patch_decrement():
317+
version = Version(1, 2, 3)
318+
version.patch_decrement()
319+
assert version.major == 1
320+
assert version.minor == 2
321+
assert version.patch == 2
322+
323+
def test_version_patch_decrement_0():
324+
version = Version(1, 2, 0)
325+
with pytest.raises(ValueError):
326+
version.patch_decrement()
327+
328+
329+
def test_version_prerelease_decrement():
330+
version = Version(1, 2, 3, "alpha.2")
331+
version.prerelease_decrement()
332+
assert version.prerelease == "alpha.1"
333+
334+
def test_version_prerelease_decrement_no_subversion():
335+
version = Version(1, 2, 3, "alpha")
336+
with pytest.raises(ValueError):
337+
version.prerelease_decrement()
338+
339+
def test_version_prerelease_decrement_no_prerelease():
340+
version = Version(1, 2, 3)
341+
with pytest.raises(ValueError):
342+
version.prerelease_decrement()
343+
344+
345+
# if __name__ == "__main__":
346+
# assert Version.from_string("1.0.0-alpha") < Version.from_string("1.0.0-alpha.1")
347+
# assert Version.from_string("1.0.0-alpha.1") < Version.from_string("1.0.0-alpha.beta")
348+
# assert Version.from_string("1.0.0-alpha.beta") < Version.from_string("1.0.0-beta")
349+
# assert Version.from_string("1.0.0-beta") < Version.from_string("1.0.0-beta.2")
350+
# assert Version.from_string("1.0.0-beta.2") < Version.from_string("1.0.0-beta.11")
351+
# assert Version.from_string("1.0.0-beta.11") < Version.from_string("1.0.0-rc.1")
352+
# assert Version.from_string("1.0.0-rc.1") < Version.from_string("1.0.0")
353+
354+
@pytest.mark.parametrize(
355+
"version1, version2",
356+
[
357+
(Version(1, 0, 0, "alpha"), Version(1, 0, 0, "alpha.1")),
358+
(Version(1, 0, 0, "alpha.1"), Version(1, 0, 0, "alpha.beta")),
359+
(Version(1, 0, 0, "alpha.beta"), Version(1, 0, 0, "beta")),
360+
(Version(1, 0, 0, "beta"), Version(1, 0, 0, "beta.2")),
361+
(Version(1, 0, 0, "beta.2"), Version(1, 0, 0, "beta.11")),
362+
(Version(1, 0, 0, "beta.11"), Version(1, 0, 0, "rc.1")),
363+
(Version(1, 0, 0, "rc.1"), Version(1, 0, 0, "rc.2")),
364+
(Version(1, 0, 0, "rc.2"), Version(1, 0, 0)),
365+
],
366+
ids=[
367+
"alpha < alpha.1",
368+
"alpha.1 < alpha.beta",
369+
"alpha.beta < beta",
370+
"beta < beta.2",
371+
"beta.2 < beta.11",
372+
"beta.11 < rc.1",
373+
"rc.1 < rc.2",
374+
"rc.2 < 1.0.0",
375+
]
376+
)
377+
def test_version_semver_example(version1, version2):
378+
assert version1 < version2

0 commit comments

Comments
 (0)