#[derive(Debug, Clone, PartialEq)]
pub enum ReleaseStatus {
Unreleased,
Latest,
Pending,
Inconsistent,
Unknown,
}
#[derive(Debug)]
pub struct ReleaseState {
pub status: ReleaseStatus,
pub scope: String,
pub scope_path: String,
pub current_version: Option<String>,
pub pending_commits: usize,
pub changelog: String,
pub version_consistent: Option<bool>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_release_status_variants() {
assert_ne!(ReleaseStatus::Unreleased, ReleaseStatus::Latest);
assert_ne!(ReleaseStatus::Latest, ReleaseStatus::Pending);
assert_ne!(ReleaseStatus::Pending, ReleaseStatus::Inconsistent);
assert_ne!(ReleaseStatus::Inconsistent, ReleaseStatus::Unknown);
}
#[test]
fn test_release_status_debug() {
let s = format!("{:?}", ReleaseStatus::Unreleased);
assert_eq!(s, "Unreleased");
}
#[test]
fn test_release_state_unreleased() {
let state = ReleaseState {
status: ReleaseStatus::Unreleased,
scope: "cli".into(),
scope_path: "src/cli".into(),
current_version: None,
pending_commits: 0,
changelog: "CHANGELOG.md".into(),
version_consistent: None,
};
assert_eq!(state.status, ReleaseStatus::Unreleased);
assert!(state.current_version.is_none());
assert_eq!(state.pending_commits, 0);
}
#[test]
fn test_release_state_pending() {
let state = ReleaseState {
status: ReleaseStatus::Pending,
scope: "core".into(),
scope_path: "packages/core".into(),
current_version: Some("v1.2.3".into()),
pending_commits: 5,
changelog: "CHANGELOG.md".into(),
version_consistent: Some(true),
};
assert_eq!(state.status, ReleaseStatus::Pending);
assert_eq!(state.current_version.as_deref(), Some("v1.2.3"));
assert_eq!(state.pending_commits, 5);
assert_eq!(state.version_consistent, Some(true));
}
#[test]
fn test_release_state_latest() {
let state = ReleaseState {
status: ReleaseStatus::Latest,
scope: "(root)".into(),
scope_path: ".".into(),
current_version: Some("v5.0.0".into()),
pending_commits: 0,
changelog: "CHANGELOG.md".into(),
version_consistent: Some(true),
};
assert_eq!(state.status, ReleaseStatus::Latest);
assert_eq!(state.pending_commits, 0);
}
#[test]
fn test_release_state_inconsistent() {
let state = ReleaseState {
status: ReleaseStatus::Inconsistent,
scope: "web".into(),
scope_path: "src/web".into(),
current_version: Some("v2.0.0".into()),
pending_commits: 3,
changelog: "CHANGELOG.md".into(),
version_consistent: Some(false),
};
assert_eq!(state.status, ReleaseStatus::Inconsistent);
assert_eq!(state.version_consistent, Some(false));
}
#[test]
fn test_release_state_unknown() {
let state = ReleaseState {
status: ReleaseStatus::Unknown,
scope: "service".into(),
scope_path: "apps/service".into(),
current_version: None,
pending_commits: 0,
changelog: "CHANGELOG.md".into(),
version_consistent: None,
};
assert_eq!(state.status, ReleaseStatus::Unknown);
}
}