pipecircuit-cli 0.0.13

Command-line architectural tools for Pipecircuit programs
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(())
}