Skip to content

Commit a885718

Browse files
committed
fix: fix and refactor version tests
to handle release candidates correctly
1 parent 8af13c0 commit a885718

File tree

2 files changed

+102
-52
lines changed

2 files changed

+102
-52
lines changed

graphql_server/version.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ def from_str(cls, v: str) -> "VersionInfo":
3636
def __str__(self) -> str:
3737
v = f"{self.major}.{self.minor}.{self.micro}"
3838
level = self.releaselevel
39-
if level and level != "final":
39+
if level == "candidate":
40+
v = f"{v}rc{self.serial}"
41+
elif level and level != "final":
4042
v = f"{v}{level[:1]}{self.serial}"
4143
return v
4244

tests/test_version.py

+99-51
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,115 @@
11
import re
2+
from typing import Tuple, Union
3+
4+
import pytest
25

36
import graphql_server
47
from graphql_server.version import VersionInfo, version, version_info
58

6-
_re_version = re.compile(r"(\d+)\.(\d+)\.(\d+)(?:([abc])(\d+))?$")
7-
8-
9-
def test_create_version_info_from_fields():
10-
v = VersionInfo(1, 2, 3, "alpha", 4)
11-
assert v.major == 1
12-
assert v.minor == 2
13-
assert v.micro == 3
14-
assert v.releaselevel == "alpha"
15-
assert v.serial == 4
16-
17-
18-
def test_create_version_info_from_str():
19-
v = VersionInfo.from_str("1.2.3")
20-
assert v.major == 1
21-
assert v.minor == 2
22-
assert v.micro == 3
23-
assert v.releaselevel == "final"
24-
assert v.serial == 0
25-
v = VersionInfo.from_str("1.2.3a4")
26-
assert v.major == 1
27-
assert v.minor == 2
28-
assert v.micro == 3
29-
assert v.releaselevel == "alpha"
30-
assert v.serial == 4
31-
v = VersionInfo.from_str("1.2.3beta4")
32-
assert v.major == 1
33-
assert v.minor == 2
34-
assert v.micro == 3
35-
assert v.releaselevel == "beta"
36-
assert v.serial == 4
37-
v = VersionInfo.from_str("12.34.56rc789")
38-
assert v.major == 12
39-
assert v.minor == 34
40-
assert v.micro == 56
41-
assert v.releaselevel == "candidate"
42-
assert v.serial == 789
43-
44-
45-
def test_serialize_as_str():
46-
v = VersionInfo(1, 2, 3, "final", 0)
47-
assert str(v) == "1.2.3"
48-
v = VersionInfo(1, 2, 3, "alpha", 4)
49-
assert str(v) == "1.2.3a4"
50-
51-
52-
def test_base_package_has_correct_version():
9+
_re_version = re.compile(r"(\d+)\.(\d+)\.(\d+)(?:([abc]|rc)(\d+))?$")
10+
11+
TEST_CASES = [
12+
(
13+
(1, 2, 3),
14+
"1.2.3",
15+
),
16+
(
17+
(1, 2, 3, "alpha", 4),
18+
"1.2.3a4",
19+
),
20+
(
21+
(1, 2, 3, "beta", 4),
22+
"1.2.3b4",
23+
),
24+
(
25+
(12, 34, 56, "candidate", 789),
26+
"12.34.56rc789",
27+
),
28+
]
29+
30+
31+
PARSED_VERSIONS = [parsed_version for parsed_version, _ in TEST_CASES]
32+
VERSION_STRINGS = [version_string for _, version_string in TEST_CASES]
33+
34+
35+
def extract_version_components(
36+
parsed_version: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]],
37+
) -> Tuple[int, int, int, str, int]:
38+
if len(parsed_version) == 5:
39+
return parsed_version # type: ignore
40+
elif len(parsed_version) == 3:
41+
return tuple([*parsed_version, "final", 0]) # type: ignore
42+
43+
raise ValueError("parsed_version length should be either 3 or 5")
44+
45+
46+
@pytest.mark.parametrize("parsed_version", PARSED_VERSIONS)
47+
def test_create_version_info_from_fields(
48+
parsed_version: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]],
49+
) -> None:
50+
version_components = extract_version_components(parsed_version)
51+
major, minor, micro, releaselevel, serial = version_components
52+
v = VersionInfo(*version_components)
53+
54+
assert v.major == major
55+
assert v.minor == minor
56+
assert v.micro == micro
57+
assert v.releaselevel == releaselevel
58+
assert v.serial == serial
59+
60+
61+
@pytest.mark.parametrize("parsed_version, version_string", TEST_CASES)
62+
def test_create_version_info_from_str(
63+
parsed_version: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]],
64+
version_string: str,
65+
) -> None:
66+
v = VersionInfo.from_str(version_string)
67+
major, minor, micro, releaselevel, serial = extract_version_components(
68+
parsed_version
69+
)
70+
71+
assert v.major == major
72+
assert v.minor == minor
73+
assert v.micro == micro
74+
assert v.releaselevel == releaselevel
75+
assert v.serial == serial
76+
77+
78+
@pytest.mark.parametrize("parsed_version, version_string", TEST_CASES)
79+
def test_serialize_as_str(
80+
parsed_version: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]],
81+
version_string: str,
82+
) -> None:
83+
v = VersionInfo(*extract_version_components(parsed_version))
84+
assert str(v) == version_string
85+
86+
87+
def test_base_package_has_correct_version() -> None:
5388
assert graphql_server.__version__ == version
5489
assert graphql_server.version == version
5590

5691

57-
def test_base_package_has_correct_version_info():
92+
def test_base_package_has_correct_version_info() -> None:
5893
assert graphql_server.__version_info__ is version_info
5994
assert graphql_server.version_info is version_info
6095

6196

62-
def test_version_has_correct_format():
97+
@pytest.mark.parametrize("version", VERSION_STRINGS + [version])
98+
def test_version_has_correct_format(version: str) -> None:
6399
assert isinstance(version, str)
64100
assert _re_version.match(version)
65101

66102

67-
def test_version_info_has_correct_fields():
103+
@pytest.mark.parametrize(
104+
"version,version_info",
105+
zip(
106+
VERSION_STRINGS + [version],
107+
[VersionInfo.from_str(v) for v in VERSION_STRINGS] + [version_info],
108+
),
109+
)
110+
def test_version_info_has_correct_fields(
111+
version: str, version_info: VersionInfo
112+
) -> None:
68113
assert isinstance(version_info, tuple)
69114
assert str(version_info) == version
70115
groups = _re_version.match(version).groups() # type: ignore
@@ -74,5 +119,8 @@ def test_version_info_has_correct_fields():
74119
if groups[3] is None: # pragma: no cover
75120
assert groups[4] is None
76121
else: # pragma: no cover
77-
assert version_info.releaselevel[:1] == groups[3]
122+
if version_info.releaselevel == "candidate":
123+
assert groups[3] == "rc"
124+
else:
125+
assert version_info.releaselevel[:1] == groups[3]
78126
assert version_info.serial == int(groups[4])

0 commit comments

Comments
 (0)