#![cfg(feature = "composer")]
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)
.output()
.expect("Failed to run socket-patch binary")
}
#[test]
fn scan_discovers_composer2_packages() {
let dir = tempfile::tempdir().unwrap();
let project_dir = dir.path().join("project");
std::fs::create_dir_all(&project_dir).unwrap();
std::fs::write(
project_dir.join("composer.json"),
r#"{"require": {"monolog/monolog": "^3.0"}}"#,
)
.unwrap();
let vendor_dir = project_dir.join("vendor");
let composer_dir = vendor_dir.join("composer");
std::fs::create_dir_all(&composer_dir).unwrap();
std::fs::write(
composer_dir.join("installed.json"),
r#"{"packages": [
{"name": "monolog/monolog", "version": "3.5.0"},
{"name": "symfony/console", "version": "6.4.1"}
]}"#,
)
.unwrap();
std::fs::create_dir_all(vendor_dir.join("monolog").join("monolog")).unwrap();
std::fs::create_dir_all(vendor_dir.join("symfony").join("console")).unwrap();
let output = run(
&["scan", "--cwd", project_dir.to_str().unwrap()],
&project_dir,
);
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 Composer packages, got:\n{combined}"
);
}
#[test]
fn scan_discovers_composer1_packages() {
let dir = tempfile::tempdir().unwrap();
let project_dir = dir.path().join("project");
std::fs::create_dir_all(&project_dir).unwrap();
std::fs::write(
project_dir.join("composer.lock"),
r#"{"packages": []}"#,
)
.unwrap();
let vendor_dir = project_dir.join("vendor");
let composer_dir = vendor_dir.join("composer");
std::fs::create_dir_all(&composer_dir).unwrap();
std::fs::write(
composer_dir.join("installed.json"),
r#"[
{"name": "guzzlehttp/guzzle", "version": "7.8.1"}
]"#,
)
.unwrap();
std::fs::create_dir_all(vendor_dir.join("guzzlehttp").join("guzzle")).unwrap();
let output = run(
&["scan", "--json", "--cwd", project_dir.to_str().unwrap()],
&project_dir,
);
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}"
);
}