use crate::release::version::Ybf;
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum RegistryStatus {
Published,
Absent,
VersionMismatch { expected: Ybf, found: String },
}
#[allow(dead_code)]
pub(crate) trait RegistryInspector {
fn check_version(&mut self, crate_name: &str, version: &Ybf) -> RegistryStatus;
}
#[cfg(test)]
#[derive(Debug, Default)]
pub(crate) struct FakeRegistry {
pub published: std::collections::BTreeMap<(String, String), bool>,
pub queries: Vec<(String, String)>,
}
#[cfg(test)]
impl RegistryInspector for FakeRegistry {
fn check_version(&mut self, crate_name: &str, version: &Ybf) -> RegistryStatus {
let key = (crate_name.to_string(), version.to_string());
self.queries.push(key.clone());
match self.published.get(&key) {
Some(true) => RegistryStatus::Published,
Some(false) => RegistryStatus::Absent,
None => RegistryStatus::Absent,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fake_registry_reports_published() {
let mut fake = FakeRegistry::default();
fake.published
.insert(("arcature-auth".to_string(), "2026.1.7".to_string()), true);
let v = Ybf::parse("2026.1.7").unwrap();
assert_eq!(
fake.check_version("arcature-auth", &v),
RegistryStatus::Published
);
assert_eq!(fake.queries.len(), 1);
}
#[test]
fn fake_registry_reports_absent() {
let mut fake = FakeRegistry::default();
let v = Ybf::parse("2026.1.7").unwrap();
assert_eq!(
fake.check_version("arcature-auth", &v),
RegistryStatus::Absent
);
}
#[test]
fn fake_registry_records_queries_in_order() {
let mut fake = FakeRegistry::default();
let v1 = Ybf::parse("2026.1.7").unwrap();
let v2 = Ybf::parse("2026.1.9").unwrap();
fake.check_version("arcature-auth", &v1);
fake.check_version("arcature-cli", &v2);
assert_eq!(fake.queries.len(), 2);
assert_eq!(fake.queries[0].0, "arcature-auth");
assert_eq!(fake.queries[1].0, "arcature-cli");
}
}