use std::process::Command;
fn cleanlib_bin() -> std::path::PathBuf {
let p = std::env!("CARGO_BIN_EXE_cleanlib");
std::path::PathBuf::from(p)
}
fn assert_output_flag_rejects_invalid(args: &[&str], verb: &str) {
let out = Command::new(cleanlib_bin())
.args(args)
.output()
.unwrap_or_else(|e| panic!("[{verb}] failed to invoke cleanlib: {e}"));
assert!(
!out.status.success(),
"[{verb}] expected non-zero exit for --output <invalid>; got success.\n\
args: {args:?}\n\
stdout: {}\n\
stderr: {}",
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr),
);
let stderr = String::from_utf8_lossy(&out.stderr);
let stderr_lc = stderr.to_lowercase();
assert!(
stderr_lc.contains("invalid value"),
"[{verb}] expected 'invalid value' in stderr; got:\n{stderr}"
);
assert!(
stderr_lc.contains("text") && stderr_lc.contains("json") && stderr_lc.contains("sarif"),
"[{verb}] expected valid options 'text', 'json', 'sarif' listed in stderr; got:\n{stderr}"
);
}
#[test]
fn verdict_output_flag_rejects_invalid_value() {
assert_output_flag_rejects_invalid(
&[
"verdict",
"--ecosystem", "npm",
"--package", "cors",
"--version", "2.8.4",
"--output", "invalid",
],
"verdict",
);
}
#[test]
fn scan_output_flag_rejects_invalid_value() {
assert_output_flag_rejects_invalid(
&[
"scan",
"--ecosystem", "npm",
"--packages", "/dev/null",
"--output", "invalid",
],
"scan",
);
}
#[test]
fn audit_output_flag_rejects_invalid_value() {
assert_output_flag_rejects_invalid(
&["audit", "--output", "invalid"],
"audit",
);
}
#[test]
fn policy_preview_output_flag_rejects_invalid_value() {
assert_output_flag_rejects_invalid(
&[
"policy", "preview",
"--policy", "/dev/null",
"--packages", "/dev/null",
"--ecosystem", "npm",
"--output", "invalid",
],
"policy preview",
);
}
#[test]
fn fix_output_flag_rejects_invalid_value() {
assert_output_flag_rejects_invalid(
&[
"fix",
"--lockfile", "/dev/null",
"--output", "invalid",
],
"fix",
);
}
#[test]
fn verdict_output_flag_rejects_typo_josn() {
assert_output_flag_rejects_invalid(
&[
"verdict",
"--ecosystem", "npm",
"--package", "cors",
"--version", "2.8.4",
"--output", "josn",
],
"verdict (typo)",
);
}
#[test]
fn verdict_help_lists_output_possible_values() {
let out = Command::new(cleanlib_bin())
.args(["verdict", "--help"])
.output()
.expect("failed to invoke cleanlib verdict --help");
assert!(out.status.success(), "verdict --help must exit zero");
let stdout = String::from_utf8_lossy(&out.stdout);
let stdout_lc = stdout.to_lowercase();
assert!(
stdout_lc.contains("--output") && stdout_lc.contains("text") && stdout_lc.contains("json"),
"expected --output + [text, json] enumeration in `verdict --help`; got:\n{stdout}"
);
}
fn assert_output_flag_accepts_valid(args: &[&str], verb: &str) {
let out = Command::new(cleanlib_bin())
.args(args)
.output()
.unwrap_or_else(|e| panic!("[{verb}] failed to invoke cleanlib: {e}"));
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.to_lowercase().contains("invalid value"),
"[{verb}] --output <valid> must not emit clap 'invalid value' error; got:\n{stderr}"
);
}
#[test]
fn verdict_output_json_parses() {
assert_output_flag_accepts_valid(
&[
"verdict",
"--ecosystem", "npm",
"--package", "cors",
"--version", "2.8.4",
"--output", "json",
],
"verdict json",
);
}
#[test]
fn verdict_output_text_parses() {
assert_output_flag_accepts_valid(
&[
"verdict",
"--ecosystem", "npm",
"--package", "cors",
"--version", "2.8.4",
"--output", "text",
],
"verdict text",
);
}