#![cfg(feature = "cargo")]
use std::path::PathBuf;
use std::process::{Command, Output};
fn binary() -> PathBuf {
env!("CARGO_BIN_EXE_socket-patch").into()
}
fn run(args: &[&str], cwd: &std::path::Path) -> Output {
Command::new(binary())
.args(args)
.current_dir(cwd)
.env("CARGO_HOME", cwd.join(".cargo"))
.output()
.expect("Failed to run socket-patch binary")
}
#[test]
fn scan_discovers_fake_registry_crates() {
let dir = tempfile::tempdir().unwrap();
let index_dir = dir
.path()
.join(".cargo")
.join("registry")
.join("src")
.join("index.crates.io-test");
let serde_dir = index_dir.join("serde-1.0.200");
std::fs::create_dir_all(&serde_dir).unwrap();
std::fs::write(
serde_dir.join("Cargo.toml"),
"[package]\nname = \"serde\"\nversion = \"1.0.200\"\n",
)
.unwrap();
let tokio_dir = index_dir.join("tokio-1.38.0");
std::fs::create_dir_all(&tokio_dir).unwrap();
std::fs::write(
tokio_dir.join("Cargo.toml"),
"[package]\nname = \"tokio\"\nversion = \"1.38.0\"\n",
)
.unwrap();
let output = run(&["scan", "--cwd", dir.path().to_str().unwrap()], dir.path());
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
let combined = format!("{stdout}{stderr}");
assert!(
combined.contains("Found") || combined.contains("packages"),
"Expected scan to discover crate packages, got:\n{combined}"
);
}
#[test]
fn scan_discovers_vendor_crates() {
let dir = tempfile::tempdir().unwrap();
let vendor_dir = dir.path().join("vendor");
let serde_dir = vendor_dir.join("serde");
std::fs::create_dir_all(&serde_dir).unwrap();
std::fs::write(
serde_dir.join("Cargo.toml"),
"[package]\nname = \"serde\"\nversion = \"1.0.200\"\n",
)
.unwrap();
let output = run(
&["scan", "--json", "--cwd", dir.path().to_str().unwrap()],
dir.path(),
);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
let combined = format!("{stdout}{stderr}");
assert!(
combined.contains("scannedPackages") || combined.contains("Found"),
"Expected scan output, got:\n{combined}"
);
}