use std::process::{Command, Stdio};
fn binary_path() -> std::path::PathBuf {
let mut path = std::env::current_exe()
.unwrap()
.parent()
.unwrap()
.parent()
.unwrap()
.to_path_buf();
path.push("collet");
path
}
fn ensure_built() {
let status = Command::new("cargo")
.args(["build", "--quiet"])
.current_dir(env!("CARGO_MANIFEST_DIR"))
.status()
.expect("cargo build failed");
assert!(status.success(), "cargo build should succeed");
}
#[test]
fn help_exits_successfully() {
ensure_built();
let output = Command::new(binary_path())
.arg("help")
.env_remove("COLLET_API_KEY")
.env_remove("ZAI_API_KEY")
.output()
.expect("failed to run binary");
assert!(output.status.success(), "help should exit 0");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("USAGE") || stderr.contains("collet"));
}
#[test]
fn short_help_flag_exits_successfully() {
ensure_built();
let output = Command::new(binary_path())
.arg("-h")
.env_remove("COLLET_API_KEY")
.env_remove("ZAI_API_KEY")
.output()
.expect("failed to run binary");
assert!(output.status.success(), "-h should exit 0");
}
#[test]
fn status_runs() {
ensure_built();
let output = Command::new(binary_path())
.arg("status")
.env_remove("COLLET_API_KEY")
.env_remove("ZAI_API_KEY")
.output()
.expect("failed to run binary");
assert!(output.status.success(), "status should exit 0");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("collet status") || stderr.contains("config"));
}
#[test]
fn missing_api_key_shows_error() {
ensure_built();
let tmp_home = std::env::temp_dir().join(format!("collet_test_home_{}", std::process::id()));
std::fs::create_dir_all(&tmp_home).expect("failed to create temp home");
let output = Command::new(binary_path())
.stdin(Stdio::null()) .env("COLLET_HOME", &tmp_home)
.env_remove("COLLET_API_KEY")
.env_remove("ZAI_API_KEY")
.output()
.expect("failed to run binary");
let _ = std::fs::remove_dir_all(&tmp_home);
assert!(
!output.status.success(),
"missing API key should cause non-zero exit"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("API") || stderr.contains("key") || stderr.contains("ZAI"),
"stderr should mention API key, got: {stderr}"
);
}
#[test]
fn prompt_arg_runs_headless() {
ensure_built();
let output = Command::new(binary_path())
.arg("echo hello test")
.env("ZAI_API_KEY", "test-key-no-network")
.output()
.expect("failed to run binary");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!stderr.contains("Usage:"),
"prompt should trigger headless, not show usage: {stderr}"
);
}