-
Notifications
You must be signed in to change notification settings - Fork 113
Expand file tree
/
Copy pathcut_release_test.py
More file actions
101 lines (78 loc) · 2.99 KB
/
Copy pathcut_release_test.py
File metadata and controls
101 lines (78 loc) · 2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env python3
"""Unit tests for scripts/cut_release.py."""
from __future__ import annotations
import unittest
from cut_release import (
bump_semver,
has_releasable_changes,
latest_semver_tag,
promote_changelog,
resolve_version,
unreleased_body,
)
SAMPLE = """# Changelog
All user-visible bugs and enhancements should be recorded here.
## Unreleased
### Fixed
- [2026-07-15] example fix
## v1.2.2 - 2026-06-29
### Fixed
- [2026-06-29] older fix
"""
class CutReleaseTest(unittest.TestCase):
def test_bump_semver(self) -> None:
self.assertEqual(bump_semver("1.2.2", "patch"), "1.2.3")
self.assertEqual(bump_semver("1.2.2", "minor"), "1.3.0")
self.assertEqual(bump_semver("1.2.2", "major"), "2.0.0")
self.assertEqual(bump_semver("v1.2.2", "patch"), "1.2.3")
def test_latest_semver_tag(self) -> None:
self.assertEqual(
latest_semver_tag(["v1.2.0", "v1.2.2", "v1.1.9", "not-a-tag"]),
"v1.2.2",
)
self.assertIsNone(latest_semver_tag(["foo", "bar"]))
def test_resolve_version(self) -> None:
self.assertEqual(
resolve_version(explicit="1.2.3", bump="patch", tags=["v1.2.2"]),
"1.2.3",
)
self.assertEqual(
resolve_version(explicit="v1.2.3", bump="patch", tags=["v1.2.2"]),
"1.2.3",
)
self.assertEqual(
resolve_version(explicit=None, bump="patch", tags=["v1.2.2"]),
"1.2.3",
)
self.assertEqual(
resolve_version(explicit=None, bump="patch", tags=[]),
"0.0.1",
)
def test_unreleased_body(self) -> None:
body = unreleased_body(SAMPLE)
self.assertIn("example fix", body)
self.assertNotIn("v1.2.2", body)
def test_has_releasable_changes(self) -> None:
self.assertTrue(has_releasable_changes("### Fixed\n\n- fix\n"))
self.assertFalse(has_releasable_changes("\n\n"))
self.assertFalse(has_releasable_changes("### Fixed\n\n"))
def test_promote_changelog(self) -> None:
out = promote_changelog(SAMPLE, "1.2.3", "2026-07-15")
self.assertIn("## Unreleased\n\n## v1.2.3 - 2026-07-15\n\n### Fixed\n", out)
self.assertIn("- [2026-07-15] example fix", out)
self.assertIn("## v1.2.2 - 2026-06-29", out)
# Unreleased should no longer contain the shipped bullet.
body = unreleased_body(out)
self.assertFalse(has_releasable_changes(body))
def test_promote_rejects_duplicate_version(self) -> None:
with self.assertRaises(ValueError):
promote_changelog(SAMPLE, "1.2.2", "2026-07-15")
def test_promote_rejects_empty_unreleased(self) -> None:
empty = SAMPLE.replace(
"## Unreleased\n\n### Fixed\n\n- [2026-07-15] example fix\n",
"## Unreleased\n\n",
)
with self.assertRaises(ValueError):
promote_changelog(empty, "1.2.3", "2026-07-15")
if __name__ == "__main__":
unittest.main()