use std::{env, process::Command};
#[test]
fn test_env_var_precedence_boolean_fields() {
let guardy_binary = env::var("CARGO_BIN_EXE_guardy")
.or_else(|_| {
let paths = [
"target/release/guardy",
"target/debug/guardy",
"../../target/release/guardy",
"../../target/debug/guardy",
];
for path in &paths {
if std::path::Path::new(path).exists() {
return Ok(path.to_string());
}
}
Err("Could not find guardy binary")
})
.expect("Failed to locate guardy binary for testing");
std::fs::write(
"/tmp/test_secrets.txt",
"sk-1234567890abcdefghijklmnopqrstuvwxyz123456",
)
.unwrap();
let output = Command::new(&guardy_binary)
.args(["scan", "/tmp/test_secrets.txt"])
.env("GUARDY_SCAN_SHOW", "1")
.env("RUST_LOG", "debug")
.output()
.expect("Failed to execute guardy");
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
println!("Binary path: {guardy_binary}");
println!("Exit status: {}", output.status);
println!("Stdout: {stdout}");
println!("Stderr: {stderr}");
if !output.status.success() {
panic!(
"Command failed with status: {}. Stdout: {stdout}. Stderr: {stderr}",
output.status
);
}
let logs = format!("{stdout}{stderr}");
assert!(
logs.contains("Found env var GUARDY_SCAN_SHOW (type: bool): 1"),
"Environment variable should be parsed. Output: {logs}"
);
assert!(
logs.contains("Parsed GUARDY_SCAN_SHOW as boolean: true"),
"Environment variable should be parsed as true. Output: {logs}"
);
assert!(
logs.contains("scanner config check") && logs.contains("show: true"),
"Environment variable should override default in final scanner config. Output: {logs}"
);
let output = Command::new(&guardy_binary)
.args(["scan", "/dev/null"])
.env("GUARDY_SCAN_SENSITIVE", "1")
.env("RUST_LOG", "debug")
.output()
.expect("Failed to execute guardy");
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let logs = format!("{stdout}{stderr}");
assert!(
logs.contains("Found env var GUARDY_SCAN_SENSITIVE (type: bool): 1"),
"GUARDY_SCAN_SENSITIVE should be parsed. Output: {logs}"
);
assert!(
logs.contains("sensitive: true"),
"GUARDY_SCAN_SENSITIVE should override default. Output: {logs}"
);
let output = Command::new(&guardy_binary)
.args(["scan", "/dev/null"])
.env("GUARDY_SCAN_SHOW", "1")
.env("GUARDY_SCAN_SENSITIVE", "1")
.env("RUST_LOG", "debug")
.output()
.expect("Failed to execute guardy");
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let logs = format!("{stdout}{stderr}");
assert!(
logs.contains("show: true") && logs.contains("sensitive: true"),
"Both environment variables should work together. Output: {logs}"
);
}
#[test]
fn test_env_var_boolean_parsing() {
let guardy_binary = env::var("CARGO_BIN_EXE_guardy")
.or_else(|_| {
let paths = [
"target/release/guardy",
"target/debug/guardy",
"../../target/release/guardy",
"../../target/debug/guardy",
];
for path in &paths {
if std::path::Path::new(path).exists() {
return Ok(path.to_string());
}
}
Err("Could not find guardy binary")
})
.expect("Failed to locate guardy binary for testing");
for truthy_val in ["1", "true", "TRUE", "yes", "YES", "on", "ON"] {
let output = Command::new(&guardy_binary)
.args(["scan", "/dev/null"])
.env("GUARDY_SCAN_SHOW", truthy_val)
.env("RUST_LOG", "debug")
.output()
.expect("Failed to execute guardy");
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let logs = format!("{stdout}{stderr}");
assert!(
logs.contains("show: true"),
"Value '{truthy_val}' should be parsed as true. Output: {logs}"
);
}
for falsy_val in ["0", "false", "FALSE", "no", "NO", "off", "OFF"] {
let output = Command::new(&guardy_binary)
.args(["scan", "/dev/null"])
.env("GUARDY_SCAN_SHOW", falsy_val)
.env("RUST_LOG", "debug")
.output()
.expect("Failed to execute guardy");
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let logs = format!("{stdout}{stderr}");
assert!(
logs.contains("show: false"),
"Value '{falsy_val}' should be parsed as false. Output: {logs}"
);
}
}
#[test]
fn test_env_var_non_boolean_precedence() {
let guardy_binary = env::var("CARGO_BIN_EXE_guardy")
.or_else(|_| {
let paths = [
"target/release/guardy",
"target/debug/guardy",
"../../target/release/guardy",
"../../target/debug/guardy",
];
for path in &paths {
if std::path::Path::new(path).exists() {
return Ok(path.to_string());
}
}
Err("Could not find guardy binary")
})
.expect("Failed to locate guardy binary for testing");
let output = Command::new(&guardy_binary)
.args(["scan", "/dev/null"])
.env("GUARDY_SCAN_MAX_SIZE", "50")
.env("RUST_LOG", "debug")
.output()
.expect("Failed to execute guardy");
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let logs = format!("{stdout}{stderr}");
assert!(
logs.contains("Found env var GUARDY_SCAN_MAX_SIZE"),
"Non-boolean environment variable should be parsed. Output: {logs}"
);
}