use super::*;
use crate::commands::doctor::{Report, Severity};
fn args_for() -> decdn_common::cli::DoctorArgs {
use clap::Parser;
#[derive(clap::Parser)]
struct W {
#[command(flatten)]
a: decdn_common::cli::DoctorArgs,
}
W::parse_from(["x", "--offline"]).a
}
#[test]
fn invalid_config_is_a_fail_and_returns_none() {
let dir = tempfile::tempdir().unwrap();
let cfg = dir.path().join("node.toml");
std::fs::write(&cfg, "[cache]\ncache_size_mb = 1\n").unwrap();
let mut report = Report::default();
let resolved = check_config(&mut report, &args_for(), Some(&cfg));
assert!(resolved.is_none());
let last = report.findings.last().unwrap();
assert_eq!(last.id, "config.resolves");
assert_eq!(last.severity, Severity::Fail);
}
#[test]
fn warn_notice_becomes_a_warn_finding() {
let mut report = Report::default();
push_notice_findings(
&mut report,
&[ConfigNotice {
level: ConfigNoticeLevel::Warn,
field: "security.max_tracked_sources".into(),
message: "0: rate-limit bookkeeping map is unbounded".into(),
}],
);
let finding = report.findings.last().unwrap();
assert_eq!(finding.id, "config.notice");
assert_eq!(finding.severity, Severity::Warn);
assert!(finding.title.contains("unbounded"));
assert_eq!(
finding.detail.as_deref(),
Some("field=security.max_tracked_sources")
);
assert!(!finding.title.contains("security.max_tracked_sources"));
assert_eq!(
finding.remediation.as_deref(),
Some("review security.max_tracked_sources in the config file")
);
assert!(report.has_warn());
}
#[test]
fn info_notice_is_visible_without_moving_exit_status() {
let mut report = Report::default();
push_notice_findings(
&mut report,
&[ConfigNotice {
level: ConfigNoticeLevel::Info,
field: "security.per_source_rate_per_sec".into(),
message: "0: per-source rate-limit disabled".into(),
}],
);
let finding = report.findings.last().unwrap();
assert_eq!(finding.severity, Severity::Pass);
assert!(finding.title.contains("per-source rate-limit disabled"));
assert!(finding.remediation.is_none());
assert!(!report.has_warn());
assert!(!report.has_fail());
}