use std::process::Command;
#[test]
fn absent_companion_is_actionable_and_headless_commands_still_work()
-> Result<(), Box<dyn std::error::Error>> {
let directory = tempfile::tempdir()?;
let invoke = |arguments: &[&str]| {
Command::new(env!("CARGO_BIN_EXE_pipecircuit"))
.env("PATH", directory.path())
.current_dir(directory.path())
.args(arguments)
.output()
};
let missing = invoke(&["loopback", "status", "--format", "json"])?;
assert_eq!(missing.status.code(), Some(2));
assert!(missing.stdout.is_empty());
let diagnostic = String::from_utf8(missing.stderr)?;
assert!(diagnostic.contains("optional companion"));
assert!(diagnostic.contains("loopback/tools/build"));
assert!(invoke(&["--version"])?.status.success());
assert_eq!(directory.path().read_dir()?.count(), 0);
Ok(())
}
#[cfg(unix)]
#[test]
fn companion_receives_literal_arguments_and_preserves_output_and_failure()
-> Result<(), Box<dyn std::error::Error>> {
use std::os::unix::fs::PermissionsExt as _;
let directory = tempfile::tempdir()?;
let executable = directory.path().join("loopback");
std::fs::write(
&executable,
"#!/bin/sh\nprintf '%s\\n' \"$@\"\nprintf 'companion diagnostic\\n' >&2\nexit 37\n",
)?;
std::fs::set_permissions(&executable, std::fs::Permissions::from_mode(0o700))?;
let output = Command::new(env!("CARGO_BIN_EXE_pipecircuit"))
.env("PATH", directory.path())
.current_dir(directory.path())
.args([
"loopback",
"open",
"a project; touch unexpected",
"$(touch unexpected)",
])
.output()?;
assert_eq!(output.status.code(), Some(37));
assert_eq!(
String::from_utf8(output.stdout)?,
"open\na project; touch unexpected\n$(touch unexpected)\n"
);
assert_eq!(String::from_utf8(output.stderr)?, "companion diagnostic\n");
assert!(!directory.path().join("unexpected").exists());
Ok(())
}