use assert_cmd::Command;
use std::path::PathBuf;
fn find_real_binary(names: &[&str]) -> PathBuf {
for name in names {
let path = PathBuf::from(name);
if path.is_file() {
return path;
}
}
panic!("none of {names:?} exist on this system -- test environment assumption violated");
}
fn path_dir_with_addon(addon_name: &str, real_binary: &PathBuf) -> tempfile::TempDir {
let dir = tempfile::tempdir().expect("should create tempdir");
std::os::unix::fs::symlink(real_binary, dir.path().join(format!("zhao-{addon_name}")))
.expect("should create symlink");
dir
}
#[test]
fn an_addon_on_path_receives_forwarded_arguments_and_stdout_passes_through() {
let echo = find_real_binary(&["/usr/bin/echo", "/bin/echo"]);
let path_dir = path_dir_with_addon("echo-stub", &echo);
Command::cargo_bin("zhao")
.expect("binary should build")
.arg("echo-stub")
.arg("hello")
.arg("world")
.env("PATH", path_dir.path())
.assert()
.success()
.stdout(predicates::str::contains("hello world"));
}
#[test]
fn an_addons_non_zero_exit_code_passes_through_unmodified() {
let false_bin = find_real_binary(&["/usr/bin/false", "/bin/false"]);
let path_dir = path_dir_with_addon("false-stub", &false_bin);
Command::cargo_bin("zhao")
.expect("binary should build")
.arg("false-stub")
.env("PATH", path_dir.path())
.assert()
.code(1);
}
#[test]
fn an_unknown_subcommand_with_no_matching_addon_still_produces_clap_own_error() {
let empty_dir = tempfile::tempdir().expect("should create tempdir");
Command::cargo_bin("zhao")
.expect("binary should build")
.arg("totally-not-a-real-subcommand-or-addon")
.env("PATH", empty_dir.path())
.assert()
.failure()
.stderr(predicates::str::contains("unrecognized"));
}
#[test]
fn a_builtin_subcommand_name_is_never_treated_as_an_addon_even_if_one_exists_on_path() {
let echo = find_real_binary(&["/usr/bin/echo", "/bin/echo"]);
let path_dir = path_dir_with_addon("check", &echo);
let output = Command::cargo_bin("zhao")
.expect("binary should build")
.arg("check")
.arg("--project-dir")
.arg("/nonexistent-path-for-this-test")
.env("PATH", path_dir.path())
.output()
.expect("command should run");
assert_eq!(output.status.code(), Some(2));
}