#[allow(unused_imports)]
use super::status_resource_intel::*;
#[allow(unused_imports)]
use crate::core::types;
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashMap;
fn mk(
machine: &str,
ts: &str,
res: Vec<(&str, types::ResourceType, types::ResourceStatus)>,
) -> types::StateLock {
let mut m = indexmap::IndexMap::new();
for (id, rt, st) in res {
m.insert(
id.to_string(),
types::ResourceLock {
resource_type: rt,
status: st,
applied_at: Some(ts.into()),
duration_seconds: Some(1.0),
hash: "abc".into(),
details: HashMap::new(),
},
);
}
types::StateLock {
schema: "1".into(),
machine: machine.into(),
hostname: machine.into(),
generated_at: ts.into(),
generator: "test".into(),
blake3_version: "1.0".into(),
resources: m,
}
}
fn wr(dir: &std::path::Path, lock: &types::StateLock) {
let d = dir.join(&lock.machine);
std::fs::create_dir_all(&d).unwrap();
std::fs::write(
d.join("state.lock.yaml"),
serde_yaml_ng::to_string(lock).unwrap(),
)
.unwrap();
}
#[test]
fn test_dependency_lag_empty_dir() {
let d = tempfile::tempdir().unwrap();
assert!(cmd_status_fleet_resource_dependency_lag_report(d.path(), None, false).is_ok());
}
#[test]
fn test_dependency_lag_all_converged() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![
(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Converged,
),
],
),
);
assert!(cmd_status_fleet_resource_dependency_lag_report(d.path(), None, false).is_ok());
}
#[test]
fn test_dependency_lag_mixed_status() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![
(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Drifted,
),
(
"cfg",
types::ResourceType::File,
types::ResourceStatus::Failed,
),
],
),
);
assert!(cmd_status_fleet_resource_dependency_lag_report(d.path(), None, false).is_ok());
}
#[test]
fn test_dependency_lag_json() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![
(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Drifted,
),
],
),
);
assert!(cmd_status_fleet_resource_dependency_lag_report(d.path(), None, true).is_ok());
}
#[test]
fn test_dependency_lag_filter() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
wr(
d.path(),
&mk(
"db",
"2026-01-15T10:00:00Z",
vec![(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Failed,
)],
),
);
assert!(
cmd_status_fleet_resource_dependency_lag_report(d.path(), Some("db"), false).is_ok()
);
}
#[test]
fn test_dependency_lag_empty_resources() {
let d = tempfile::tempdir().unwrap();
wr(d.path(), &mk("web", "2026-01-15T10:00:00Z", vec![]));
assert!(cmd_status_fleet_resource_dependency_lag_report(d.path(), None, false).is_ok());
}
#[test]
fn test_convergence_rate_empty_dir() {
let d = tempfile::tempdir().unwrap();
assert!(cmd_status_machine_resource_convergence_rate_trend(d.path(), None, false).is_ok());
}
#[test]
fn test_convergence_rate_all_converged() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![
(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Converged,
),
],
),
);
assert!(cmd_status_machine_resource_convergence_rate_trend(d.path(), None, false).is_ok());
}
#[test]
fn test_convergence_rate_mixed() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![
(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Drifted,
),
(
"cfg",
types::ResourceType::File,
types::ResourceStatus::Failed,
),
(
"mnt",
types::ResourceType::Mount,
types::ResourceStatus::Unknown,
),
],
),
);
assert!(cmd_status_machine_resource_convergence_rate_trend(d.path(), None, false).is_ok());
}
#[test]
fn test_convergence_rate_json() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![
(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Drifted,
),
],
),
);
assert!(cmd_status_machine_resource_convergence_rate_trend(d.path(), None, true).is_ok());
}
#[test]
fn test_convergence_rate_filter() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-15T10:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
wr(
d.path(),
&mk(
"db",
"2026-01-15T10:00:00Z",
vec![(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Failed,
)],
),
);
assert!(
cmd_status_machine_resource_convergence_rate_trend(d.path(), Some("web"), false)
.is_ok()
);
}
#[test]
fn test_convergence_rate_empty_resources() {
let d = tempfile::tempdir().unwrap();
wr(d.path(), &mk("web", "2026-01-15T10:00:00Z", vec![]));
assert!(cmd_status_machine_resource_convergence_rate_trend(d.path(), None, false).is_ok());
}
#[test]
fn test_apply_lag_empty_dir() {
let d = tempfile::tempdir().unwrap();
assert!(cmd_status_fleet_resource_apply_lag(d.path(), None, false).is_ok());
}
#[test]
fn test_apply_lag_recent_data() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-02-28T10:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
assert!(cmd_status_fleet_resource_apply_lag(d.path(), None, false).is_ok());
}
#[test]
fn test_apply_lag_old_data() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2024-01-01T00:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
assert!(cmd_status_fleet_resource_apply_lag(d.path(), None, false).is_ok());
}
#[test]
fn test_apply_lag_json() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2024-06-15T12:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
assert!(cmd_status_fleet_resource_apply_lag(d.path(), None, true).is_ok());
}
#[test]
fn test_apply_lag_filter() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2024-01-01T00:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
wr(
d.path(),
&mk(
"db",
"2026-02-28T10:00:00Z",
vec![(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Converged,
)],
),
);
assert!(cmd_status_fleet_resource_apply_lag(d.path(), Some("web"), false).is_ok());
}
#[test]
fn test_apply_lag_multiple_machines() {
let d = tempfile::tempdir().unwrap();
wr(
d.path(),
&mk(
"web",
"2026-01-01T00:00:00Z",
vec![(
"pkg",
types::ResourceType::Package,
types::ResourceStatus::Converged,
)],
),
);
wr(
d.path(),
&mk(
"db",
"2026-02-15T06:00:00Z",
vec![(
"svc",
types::ResourceType::Service,
types::ResourceStatus::Converged,
)],
),
);
wr(
d.path(),
&mk(
"cache",
"2025-12-01T00:00:00Z",
vec![(
"cfg",
types::ResourceType::File,
types::ResourceStatus::Drifted,
)],
),
);
assert!(cmd_status_fleet_resource_apply_lag(d.path(), None, false).is_ok());
}
#[test]
fn test_classify_resources_all_statuses() {
let lock = mk(
"m",
"2026-01-15T10:00:00Z",
vec![
(
"a",
types::ResourceType::Package,
types::ResourceStatus::Converged,
),
(
"b",
types::ResourceType::Service,
types::ResourceStatus::Drifted,
),
(
"c",
types::ResourceType::File,
types::ResourceStatus::Failed,
),
(
"d",
types::ResourceType::File,
types::ResourceStatus::Unknown,
),
],
);
assert_eq!(classify_resources(&lock), (1, 1, 1, 1));
}
#[test]
fn test_classify_resources_empty() {
let lock = mk("m", "2026-01-15T10:00:00Z", vec![]);
assert_eq!(classify_resources(&lock), (0, 0, 0, 0));
}
#[test]
fn test_parse_rfc3339_valid() {
let e = parse_rfc3339_to_epoch("2024-01-01T00:00:00Z");
assert!(e.is_some());
assert!(e.unwrap() > 1_700_000_000 && e.unwrap() < 1_800_000_000);
}
#[test]
fn test_parse_rfc3339_invalid() {
assert!(parse_rfc3339_to_epoch("").is_none());
assert!(parse_rfc3339_to_epoch("short").is_none());
assert!(parse_rfc3339_to_epoch("not-a-timestamp!!").is_none());
}
}