pipecircuit-cli 0.0.11

Command-line architectural tools for Pipecircuit programs
use std::{error::Error, fs, process::Command};

#[test]
fn json_analysis_distinguishes_violations_from_incomplete_work() -> Result<(), Box<dyn Error>> {
    let scratch = tempfile::tempdir()?;
    fs::create_dir(scratch.path().join("src"))?;
    fs::write(
        scratch.path().join("src/lib.rs"),
        "pub struct Unclassified;\n",
    )?;
    let manifest = scratch.path().join("Cargo.toml");
    fs::write(
        &manifest,
        "[workspace]\n[package]\nname = \"unclassified\"\nversion = \"0.1.0\"\nedition = \"2024\"\n",
    )?;
    let output = Command::new(env!("CARGO_BIN_EXE_pipec"))
        .args(["arch", "check", "--format", "json", "--manifest-path"])
        .arg(&manifest)
        .output()?;
    assert_eq!(output.status.code(), Some(1));
    let report: serde_json::Value = serde_json::from_slice(&output.stdout)?;
    assert!(
        report
            .get("findings")
            .and_then(serde_json::Value::as_array)
            .is_some_and(|findings| findings.iter().any(|finding| finding
                .get("code")
                .and_then(serde_json::Value::as_str)
                == Some("arch.role.missing")))
    );
    fs::write(&manifest, "malformed manifest")?;
    let output = Command::new(env!("CARGO_BIN_EXE_pipec"))
        .args(["arch", "check", "--format", "json", "--manifest-path"])
        .arg(&manifest)
        .output()?;
    assert_eq!(output.status.code(), Some(2));
    let report: serde_json::Value = serde_json::from_slice(&output.stdout)?;
    assert_eq!(
        report.get("status").and_then(serde_json::Value::as_str),
        Some("incomplete")
    );
    assert!(!output.stderr.is_empty());
    Ok(())
}

#[test]
fn installed_version_is_explicit_and_rejects_trailing_arguments() -> Result<(), Box<dyn Error>> {
    for flag in ["--version", "-V"] {
        let output = Command::new(env!("CARGO_BIN_EXE_pipec"))
            .arg(flag)
            .output()?;
        assert!(output.status.success());
        assert_eq!(
            String::from_utf8(output.stdout)?,
            format!("pipec {}\n", env!("CARGO_PKG_VERSION"))
        );
        assert!(output.stderr.is_empty());
    }
    let output = Command::new(env!("CARGO_BIN_EXE_pipec"))
        .args(["--version", "unexpected"])
        .output()?;
    assert_eq!(output.status.code(), Some(2));
    assert!(output.stdout.is_empty());
    assert!(String::from_utf8(output.stderr)?.contains("does not accept arguments"));
    Ok(())
}