#![allow(clippy::unwrap_used, clippy::expect_used)]
use std::process::Command;
fn tokf() -> Command {
Command::new(env!("CARGO_BIN_EXE_tokf"))
}
#[test]
fn shell_c_true_exits_zero() {
let output = tokf().args(["-c", "true"]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_c_false_exits_nonzero() {
let output = tokf().args(["-c", "false"]).output().unwrap();
assert!(!output.status.success());
}
#[test]
fn shell_c_echo_produces_output() {
let output = tokf().args(["-c", "echo hello"]).output().unwrap();
assert!(output.status.success());
assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "hello");
}
#[test]
fn shell_c_missing_command_arg() {
let output = tokf().arg("-c").output().unwrap();
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("shell mode requires a command argument"),
"expected error message, got: {stderr}"
);
}
#[test]
fn shell_cu_works() {
let output = tokf().args(["-cu", "true"]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_ec_works() {
let output = tokf().args(["-ec", "true"]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_ecu_works() {
let output = tokf().args(["-ecu", "true"]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_compound_and_delegates() {
let output = tokf().args(["-c", "true && true"]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_compound_failure_propagates() {
let output = tokf().args(["-c", "false && true"]).output().unwrap();
assert!(!output.status.success());
}
#[test]
fn shell_pipe_delegates_to_sh() {
let output = tokf().args(["-c", "echo hello | cat"]).output().unwrap();
assert!(output.status.success());
assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "hello");
}
#[test]
fn shell_redirect_delegates_to_sh() {
let output = tokf()
.args(["-c", "echo hello > /dev/null"])
.output()
.unwrap();
assert!(output.status.success());
assert!(String::from_utf8_lossy(&output.stdout).trim().is_empty());
}
#[test]
fn shell_exit_code_42() {
let output = tokf().args(["-c", "exit 42"]).output().unwrap();
assert_eq!(output.status.code(), Some(42));
}
#[test]
fn shell_empty_command() {
let output = tokf().args(["-c", ""]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_whitespace_only_command() {
let output = tokf().args(["-c", " "]).output().unwrap();
assert!(output.status.success());
}
#[test]
fn shell_tokf_run_not_double_wrapped() {
let inner_cmd = format!("{} run echo not-double-wrapped", env!("CARGO_BIN_EXE_tokf"));
let output = tokf().args(["-c", &inner_cmd]).output().unwrap();
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("not-double-wrapped"),
"expected inner tokf to produce output, got: {stdout}"
);
}
#[test]
fn shell_argv_mode_simple() {
let output = tokf().args(["-c", "echo", "hello"]).output().unwrap();
assert!(output.status.success());
assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "hello");
}
#[test]
fn shell_argv_mode_multiple_args() {
let output = tokf()
.args(["-c", "echo", "hello", "world"])
.output()
.unwrap();
assert!(output.status.success());
assert_eq!(
String::from_utf8_lossy(&output.stdout).trim(),
"hello world"
);
}
#[test]
fn shell_argv_mode_preserves_spaces_in_args() {
let output = tokf().args(["-c", "echo", "hello world"]).output().unwrap();
assert!(output.status.success());
assert_eq!(
String::from_utf8_lossy(&output.stdout).trim(),
"hello world"
);
}
#[test]
fn shell_argv_mode_special_chars() {
let output = tokf()
.args(["-c", "echo", "it's $HOME `whoami`"])
.output()
.unwrap();
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("it's $HOME `whoami`"),
"special chars should be literal, got: {stdout}"
);
}
#[test]
fn shell_argv_mode_exit_code() {
let output = tokf().args(["-c", "false"]).output().unwrap();
assert!(!output.status.success());
}
#[test]
fn shell_argv_mode_double_dash_passthrough() {
let output = tokf().args(["-c", "echo", "--", "hello"]).output().unwrap();
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("-- hello") || stdout.contains("hello"),
"expected -- and hello in output, got: {stdout}"
);
}
#[test]
fn shell_argv_mode_flags_after_separator() {
let output = tokf()
.args(["-c", "echo", "--", "--flag"])
.output()
.unwrap();
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("--flag"),
"expected --flag in output, got: {stdout}"
);
}
#[test]
fn shell_argv_mode_triggers_filtering() {
let output = tokf()
.env("TOKF_VERBOSE", "1")
.args(["-c", "git", "status", "--short"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("rewritten to"),
"expected 'rewritten to' in stderr (filter should match), got: {stderr}"
);
}
#[test]
fn shell_argv_mode_no_filter_delegates_safely() {
let output = tokf()
.env("TOKF_VERBOSE", "1")
.args(["-c", "echo", "hello", "world"])
.output()
.unwrap();
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("no filter match"),
"expected 'no filter match' in stderr, got: {stderr}"
);
assert_eq!(
String::from_utf8_lossy(&output.stdout).trim(),
"hello world"
);
}
#[test]
fn shell_argv_mode_preserves_arg_boundaries_through_filter() {
let output = tokf()
.env("TOKF_VERBOSE", "1")
.args(["-c", "git", "status", "--short"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("rewritten to"),
"expected filter match, got: {stderr}"
);
assert!(
stderr.contains("'git'") && stderr.contains("'status'"),
"expected quoted args in rewritten command for boundary safety, got: {stderr}"
);
}
#[test]
fn shell_argv_mode_multiword_arg_stays_single_token() {
let output = tokf()
.env("TOKF_VERBOSE", "1")
.args(["-c", "git", "log", "--format=hello world"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("rewritten to"),
"expected filter match, got: {stderr}"
);
assert!(
stderr.contains("'--format=hello world'"),
"expected multi-word arg as single quoted token, got: {stderr}"
);
}
#[test]
fn shell_no_filter_env_delegates() {
let output = tokf()
.env("TOKF_NO_FILTER", "1")
.args(["-c", "echo bypassed"])
.output()
.unwrap();
assert!(output.status.success());
assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "bypassed");
}
#[test]
fn shell_argv_mode_no_filter_env_delegates() {
let output = tokf()
.env("TOKF_NO_FILTER", "1")
.env("TOKF_VERBOSE", "1")
.args(["-c", "echo", "bypassed"])
.output()
.unwrap();
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("TOKF_NO_FILTER set"),
"expected TOKF_NO_FILTER message in stderr, got: {stderr}"
);
assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "bypassed");
}
#[test]
fn shell_verbose_env_prints_to_stderr() {
let output = tokf()
.env("TOKF_VERBOSE", "1")
.args(["-c", "true"])
.output()
.unwrap();
assert!(output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("[tokf]"),
"expected verbose output on stderr, got: {stderr}"
);
}