use semver::Version;
use crate::node::types::UpgradeChannel;
#[must_use]
pub fn version_matches_channel(version: &Version, channel: UpgradeChannel) -> bool {
if version.pre.is_empty() {
return true;
}
match channel {
UpgradeChannel::Stable => false,
UpgradeChannel::Beta => version.pre.as_str().split('.').next() == Some("beta"),
}
}
#[cfg(test)]
mod tests {
use super::*;
fn v(s: &str) -> Version {
Version::parse(s).expect("test version parses")
}
#[test]
fn stable_accepts_finals() {
assert!(version_matches_channel(
&v("0.16.0"),
UpgradeChannel::Stable
));
assert!(version_matches_channel(&v("1.0.0"), UpgradeChannel::Stable));
}
#[test]
fn stable_rejects_every_pre_release() {
assert!(!version_matches_channel(
&v("0.17.0-beta.1"),
UpgradeChannel::Stable
));
assert!(!version_matches_channel(
&v("0.17.0-rc.1"),
UpgradeChannel::Stable
));
assert!(!version_matches_channel(
&v("0.17.0-alpha.1"),
UpgradeChannel::Stable
));
}
#[test]
fn beta_accepts_finals_and_beta_pre_releases() {
assert!(version_matches_channel(&v("0.16.0"), UpgradeChannel::Beta));
assert!(version_matches_channel(
&v("0.17.0-beta.1"),
UpgradeChannel::Beta
));
assert!(version_matches_channel(
&v("0.17.0-beta"),
UpgradeChannel::Beta
));
}
#[test]
fn beta_rejects_release_candidates() {
assert!(!version_matches_channel(
&v("0.17.0-rc.1"),
UpgradeChannel::Beta
));
assert!(!version_matches_channel(
&v("0.17.0-rc"),
UpgradeChannel::Beta
));
}
#[test]
fn beta_rejects_other_pre_release_suffixes() {
assert!(!version_matches_channel(
&v("0.17.0-alpha.1"),
UpgradeChannel::Beta
));
assert!(!version_matches_channel(
&v("0.17.0-betamax.1"),
UpgradeChannel::Beta
));
}
#[test]
fn highest_eligible_of_a_mixed_release_list() {
let releases = ["0.16.0", "0.17.0-beta.1", "0.17.0-rc.1"];
let highest = |channel| {
releases
.iter()
.map(|s| v(s))
.filter(|version| version_matches_channel(version, channel))
.max()
.map(|version| version.to_string())
};
assert_eq!(highest(UpgradeChannel::Stable), Some("0.16.0".to_string()));
assert_eq!(
highest(UpgradeChannel::Beta),
Some("0.17.0-beta.1".to_string())
);
}
#[test]
fn beta_hops_past_a_promoted_stable_to_the_next_beta() {
let current = v("0.16.0-beta.1");
let highest = ["0.16.0", "0.17.0-beta.1"]
.iter()
.map(|s| v(s))
.filter(|version| *version > current)
.filter(|version| version_matches_channel(version, UpgradeChannel::Beta))
.max()
.map(|version| version.to_string());
assert_eq!(highest, Some("0.17.0-beta.1".to_string()));
}
}