use std::process::Command;
use tempfile::TempDir;
fn recon() -> Command {
let mut c = Command::new(env!("CARGO_BIN_EXE_recon"));
c.env_remove("RECON_CONFIG");
c.env_remove("RECON_SYSTEM_CONFIG");
c.env_remove("HOMEBREW_PREFIX");
c
}
fn isolated_config(body: &str) -> (TempDir, std::path::PathBuf) {
let dir = TempDir::new().unwrap();
let cfg = dir.path().join("config.toml");
std::fs::write(&cfg, body).unwrap();
(dir, cfg)
}
#[test]
fn explicit_alias_curl_is_noop() {
let out = recon()
.args(["--alias", "curl", "--version-short"])
.output()
.unwrap();
assert!(out.status.success(), "stderr: {}", String::from_utf8_lossy(&out.stderr));
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(stdout.starts_with("recon "), "stdout: {stdout}");
}
#[test]
fn unknown_alias_name_errors() {
let out = recon()
.args(["--alias", "bogus", "https://invalid.example.localhost.test"])
.output()
.unwrap();
assert!(!out.status.success());
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(stderr.contains("bogus"), "stderr: {stderr}");
assert!(stderr.contains("not defined"), "stderr: {stderr}");
}
#[test]
fn default_alias_applied_from_config() {
let (_dir, cfg) = isolated_config(
r#"
[aliases]
default = "mine"
[aliases.mine]
"-X" = "--request"
"#,
);
let out = recon()
.env("RECON_CONFIG", &cfg)
.args(["-X", "HEAD", "https://invalid.example.localhost.test"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains("unexpected argument") && !stderr.contains("unknown flag"),
"stderr: {stderr}"
);
}
#[test]
fn disable_skips_alias_resolution() {
let (_dir, cfg) = isolated_config(
r#"
[aliases]
default = "wget"
"#,
);
let out = recon()
.env("RECON_CONFIG", &cfg)
.args(["-q", "-r", "0-100", "https://invalid.example.localhost.test"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains("--recursive"),
"alias should be skipped under -q; stderr: {stderr}"
);
}
#[test]
fn disable_skips_even_explicit_alias() {
let out = recon()
.args(["-q", "--alias", "wget", "-r", "0-100", "https://invalid.example.localhost.test"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
!stderr.contains("--recursive"),
"explicit --alias should be skipped under -q; stderr: {stderr}"
);
}
#[test]
fn alias_to_unimplemented_long_form_errors_via_clap() {
let out = recon()
.args(["--alias", "wget", "-r", "https://example.com"])
.output()
.unwrap();
assert!(!out.status.success());
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("--recursive") || stderr.contains("unexpected argument"),
"stderr: {stderr}"
);
}
#[test]
fn user_section_merges_into_bundled() {
let (_dir, cfg) = isolated_config(
r#"
[aliases.wget]
"-J" = "--json"
"#,
);
let out = recon()
.env("RECON_CONFIG", &cfg)
.args(["--alias", "wget", "-N", "https://example.com"])
.output()
.unwrap();
assert!(!out.status.success());
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("--timestamping") || stderr.contains("unexpected argument"),
"stderr: {stderr}"
);
}