use std::process::Command;
use std::process::Stdio;
fn hvac_bin() -> &'static str {
env!("CARGO_BIN_EXE_hvac")
}
fn run(args: &[&str]) -> std::process::Output {
Command::new(hvac_bin())
.args(args)
.stdin(Stdio::null())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("failed to launch hvac binary")
}
#[test]
fn help_flag_works_and_mentions_key_features() {
let out = run(&["--help"]);
assert!(out.status.success(), "hvac --help should exit 0");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.contains("hvac"),
"help output should mention the binary name: {stdout}"
);
for needle in ["--dry-run", "--no-overwrite", "--config", "--dump-config"] {
assert!(
stdout.contains(needle),
"help output missing flag {needle}: {stdout}"
);
}
}
#[test]
fn version_flag_prints_a_version_string() {
let out = run(&["--version"]);
assert!(out.status.success(), "hvac --version should exit 0");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.starts_with("hvac"),
"expected 'hvac X.Y.Z\\n', got: {stdout}"
);
let has_digit = stdout.chars().any(|c| c.is_ascii_digit());
assert!(has_digit, "no version number in: {stdout}");
}
#[test]
fn dump_config_emits_a_yaml_document() {
let out = run(&["--dump-config"]);
assert!(out.status.success(), "hvac --dump-config should exit 0");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.contains("target:"),
"missing target section: {stdout}"
);
assert!(
stdout.contains("media_extensions:"),
"missing media_extensions: {stdout}"
);
assert!(stdout.contains("codec:"), "missing codec field: {stdout}");
}
#[test]
fn missing_path_argument_fails_with_clap_error() {
let out = run(&[]);
assert!(!out.status.success(), "should exit non-zero without a path");
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.to_lowercase().contains("required") || stderr.to_lowercase().contains("usage"),
"expected a clap-style error, got: {stderr}"
);
}
#[test]
fn launchdarkly_sdk_key_is_not_read_from_environment() {
let out = Command::new(hvac_bin())
.arg("--dump-config")
.env("LAUNCHDARKLY_SDK_KEY", "should-not-be-read-by-hvac")
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("failed to launch hvac");
assert!(
out.status.success(),
"hvac --dump-config should ignore LAUNCHDARKLY_SDK_KEY in env"
);
}
#[test]
fn setup_launchdarkly_without_api_key_fails_clearly() {
let out = run(&["--setup-launchdarkly"]);
assert!(!out.status.success(), "should require --ld-api-key");
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("ld-api-key") || stderr.contains("ld_api_key"),
"expected mention of --ld-api-key, got: {stderr}"
);
}
#[test]
fn dry_run_against_empty_directory_exits_cleanly() {
let tmp = tempfile::tempdir().expect("tempdir");
let out = Command::new(hvac_bin())
.arg("--dry-run")
.arg(tmp.path())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("failed to launch hvac");
let stderr = String::from_utf8_lossy(&out.stderr);
if !out.status.success() {
let lower = stderr.to_lowercase();
assert!(
lower.contains("gpu") || lower.contains("ffmpeg") || lower.contains("encoder"),
"non-zero exit without a recognised reason; stderr was: {stderr}"
);
return;
}
assert!(
stderr.contains("No media files") || stderr.contains("Nothing to do"),
"expected an empty-dir notice, got: {stderr}"
);
}