pipecircuit-cli 0.0.13

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