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(())
}