use std::process::Command;
#[test]
fn successful_command_triggers_review_without_creating_artifacts()
-> Result<(), Box<dyn std::error::Error>> {
let directory = tempfile::tempdir()?;
let output = Command::new(env!("CARGO_BIN_EXE_pipecircuit"))
.current_dir(directory.path())
.args([
"review",
"--",
env!("CARGO_BIN_EXE_pipecircuit"),
"--version",
])
.output()?;
assert!(output.status.success());
let stdout = String::from_utf8(output.stdout)?;
let stderr = String::from_utf8(output.stderr)?;
assert!(stdout.starts_with("pipecircuit "));
assert!(stdout.contains("Evidence command succeeded."));
assert!(stdout.contains("1. Who owns each truth?"));
assert!(stdout.contains("10. Do initialization"));
assert!(stdout.contains("rerun affected evidence"));
assert!(stderr.contains("Running evidence:"));
assert!(stderr.contains("Add no code comments"));
assert_eq!(directory.path().read_dir()?.count(), 0);
Ok(())
}
#[test]
fn failed_command_preserves_failure_status_and_does_not_trigger_review()
-> Result<(), Box<dyn std::error::Error>> {
let output = Command::new(env!("CARGO_BIN_EXE_pipecircuit"))
.args([
"review",
"--",
env!("CARGO_BIN_EXE_pipecircuit"),
"unknown-command",
])
.output()?;
assert_eq!(output.status.code(), Some(2));
let stdout = String::from_utf8(output.stdout)?;
assert!(stdout.contains("Evidence command failed"));
assert!(!stdout.contains("1. Who owns each truth?"));
assert!(!stdout.contains("Evidence command succeeded."));
Ok(())
}
#[test]
fn missing_command_or_executable_never_claims_evidence_passed()
-> Result<(), Box<dyn std::error::Error>> {
let directory = tempfile::tempdir()?;
for arguments in [
vec!["review"],
vec!["review", "--"],
vec!["review", "--", "./missing-evidence-command"],
] {
let output = Command::new(env!("CARGO_BIN_EXE_pipecircuit"))
.current_dir(directory.path())
.args(arguments)
.output()?;
assert_eq!(output.status.code(), Some(2));
assert!(!String::from_utf8(output.stdout)?.contains("Evidence command succeeded."));
}
Ok(())
}
#[test]
fn evidence_arguments_are_passed_literally_without_shell_interpretation()
-> Result<(), Box<dyn std::error::Error>> {
let directory = tempfile::tempdir()?;
let output = Command::new(env!("CARGO_BIN_EXE_pipecircuit"))
.current_dir(directory.path())
.args([
"review",
"--",
env!("CARGO_BIN_EXE_pipecircuit"),
"--version; touch unexpected",
])
.output()?;
assert_eq!(output.status.code(), Some(2));
assert!(!directory.path().join("unexpected").exists());
assert!(String::from_utf8(output.stderr)?.contains("--version; touch unexpected"));
Ok(())
}