use std::process::Command;
const HTTP_CLIENT_CRATES: &[&str] = &[
"reqwest",
"ureq",
"isahc",
"attohttpc",
"surf",
"minreq",
"curl",
"wreq",
"crabq",
"async-h1",
];
#[test]
fn workspace_dependency_tree_has_no_http_client() {
let output = Command::new(env!("CARGO"))
.args(["metadata", "--format-version", "1"])
.output()
.expect("`cargo metadata` must be runnable for the NFR-2 test");
assert!(
output.status.success(),
"`cargo metadata` failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let meta: serde_json::Value =
serde_json::from_slice(&output.stdout).expect("`cargo metadata` emits valid JSON");
let packages = meta["packages"]
.as_array()
.expect("`metadata.packages` is an array");
let mut names: Vec<&str> = packages.iter().filter_map(|p| p["name"].as_str()).collect();
names.sort_unstable();
names.dedup();
let offenders: Vec<&str> = names
.iter()
.copied()
.filter(|n| HTTP_CLIENT_CRATES.contains(n))
.collect();
assert!(
offenders.is_empty(),
"NFR-2 violation: HTTP client crate(s) present in the workspace dependency tree: {offenders:?}. \
Halfhand must not depend on an HTTP client; see ARCHITECTURE.md."
);
}