#![cfg(feature = "cli")]
use std::process::Command;
const EXPECTED_SUBCOMMANDS: &[&str] = &[
"inject",
"probe",
"query",
"associate",
"export",
"import",
"version",
"completions",
"index-jsonl",
"index-dir",
"delete",
"get",
"update",
"disassociate",
"associations",
"traverse",
"path",
"probe-filtered",
"stats",
"metrics",
"watch",
"probe-graph",
];
fn csm_bin() -> std::path::PathBuf {
std::path::PathBuf::from(env!("CARGO_BIN_EXE_csm"))
}
#[test]
fn cli_help_lists_every_expected_subcommand() {
let output = Command::new(csm_bin())
.arg("--help")
.output()
.expect("failed to spawn csm --help");
assert!(output.status.success(), "csm --help exited non-zero");
let stdout = String::from_utf8(output.stdout).expect("csm --help non-UTF8");
let mut missing = Vec::new();
for cmd in EXPECTED_SUBCOMMANDS {
let needle = format!(" {cmd} ");
let needle_eol = format!(" {cmd}\n");
if !stdout.contains(&needle) && !stdout.contains(&needle_eol) {
missing.push(*cmd);
}
}
assert!(
missing.is_empty(),
"csm --help is missing subcommands required by ADR-0066: {missing:?}\nFull help output:\n{stdout}"
);
}
#[test]
fn cli_each_subcommand_has_help() {
for cmd in EXPECTED_SUBCOMMANDS {
let output = Command::new(csm_bin())
.args([cmd, "--help"])
.output()
.unwrap_or_else(|e| panic!("failed to spawn csm {cmd} --help: {e}"));
assert!(
output.status.success(),
"csm {cmd} --help exited non-zero: stderr={}",
String::from_utf8_lossy(&output.stderr)
);
}
}