quanttide_devops/stage/
release.rs1#[derive(Debug, Clone, PartialEq)]
5pub enum ReleaseStatus {
6 Unreleased,
8 Latest,
10 Pending,
12 Inconsistent,
14 Unknown,
16}
17
18#[derive(Debug)]
24pub struct ReleaseState {
25 pub status: ReleaseStatus,
27 pub scope: String,
29 pub scope_path: String,
31 pub current_version: Option<String>,
33 pub pending_commits: usize,
35 pub changelog: String,
37 pub version_consistent: Option<bool>,
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
48 fn test_release_status_variants() {
49 assert_ne!(ReleaseStatus::Unreleased, ReleaseStatus::Latest);
50 assert_ne!(ReleaseStatus::Latest, ReleaseStatus::Pending);
51 assert_ne!(ReleaseStatus::Pending, ReleaseStatus::Inconsistent);
52 assert_ne!(ReleaseStatus::Inconsistent, ReleaseStatus::Unknown);
53 }
54
55 #[test]
56 fn test_release_status_debug() {
57 let s = format!("{:?}", ReleaseStatus::Unreleased);
58 assert_eq!(s, "Unreleased");
59 }
60
61 #[test]
64 fn test_release_state_unreleased() {
65 let state = ReleaseState {
66 status: ReleaseStatus::Unreleased,
67 scope: "cli".into(),
68 scope_path: "src/cli".into(),
69 current_version: None,
70 pending_commits: 0,
71 changelog: "CHANGELOG.md".into(),
72 version_consistent: None,
73 };
74 assert_eq!(state.status, ReleaseStatus::Unreleased);
75 assert!(state.current_version.is_none());
76 assert_eq!(state.pending_commits, 0);
77 }
78
79 #[test]
80 fn test_release_state_pending() {
81 let state = ReleaseState {
82 status: ReleaseStatus::Pending,
83 scope: "core".into(),
84 scope_path: "packages/core".into(),
85 current_version: Some("v1.2.3".into()),
86 pending_commits: 5,
87 changelog: "CHANGELOG.md".into(),
88 version_consistent: Some(true),
89 };
90 assert_eq!(state.status, ReleaseStatus::Pending);
91 assert_eq!(state.current_version.as_deref(), Some("v1.2.3"));
92 assert_eq!(state.pending_commits, 5);
93 assert_eq!(state.version_consistent, Some(true));
94 }
95
96 #[test]
97 fn test_release_state_latest() {
98 let state = ReleaseState {
99 status: ReleaseStatus::Latest,
100 scope: "(root)".into(),
101 scope_path: ".".into(),
102 current_version: Some("v5.0.0".into()),
103 pending_commits: 0,
104 changelog: "CHANGELOG.md".into(),
105 version_consistent: Some(true),
106 };
107 assert_eq!(state.status, ReleaseStatus::Latest);
108 assert_eq!(state.pending_commits, 0);
109 }
110
111 #[test]
112 fn test_release_state_inconsistent() {
113 let state = ReleaseState {
114 status: ReleaseStatus::Inconsistent,
115 scope: "web".into(),
116 scope_path: "src/web".into(),
117 current_version: Some("v2.0.0".into()),
118 pending_commits: 3,
119 changelog: "CHANGELOG.md".into(),
120 version_consistent: Some(false),
121 };
122 assert_eq!(state.status, ReleaseStatus::Inconsistent);
123 assert_eq!(state.version_consistent, Some(false));
124 }
125
126 #[test]
127 fn test_release_state_unknown() {
128 let state = ReleaseState {
129 status: ReleaseStatus::Unknown,
130 scope: "service".into(),
131 scope_path: "apps/service".into(),
132 current_version: None,
133 pending_commits: 0,
134 changelog: "CHANGELOG.md".into(),
135 version_consistent: None,
136 };
137 assert_eq!(state.status, ReleaseStatus::Unknown);
138 }
139}