use assert_cmd::prelude::*;
use std::process::Command;
const BIN: &str = "net-mesh";
fn snapshot(args: &[&str], config: &std::path::Path) -> std::process::Output {
Command::cargo_bin(BIN)
.unwrap()
.args(args)
.arg("--config")
.arg(config)
.output()
.unwrap()
}
fn empty_config() -> tempfile::TempDir {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("config.toml");
std::fs::write(&path, "").unwrap();
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
std::fs::set_permissions(&path, std::fs::Permissions::from_mode(0o600)).unwrap();
}
dir
}
#[test]
fn get_refuses_without_local_rather_than_printing_an_empty_snapshot() {
let dir = empty_config();
let out = snapshot(&["snapshot", "get"], &dir.path().join("config.toml"));
assert_eq!(
out.status.code(),
Some(2),
"expected exit 2 (invalid args); got {:?}\nstdout: {}\nstderr: {}",
out.status.code(),
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr),
);
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
!stdout.contains("\"peers\""),
"a snapshot document was printed anyway — the false success is back:\n{stdout}"
);
}
#[test]
fn status_refuses_without_local_too() {
let dir = empty_config();
let out = snapshot(&["snapshot", "status"], &dir.path().join("config.toml"));
assert_eq!(
out.status.code(),
Some(2),
"expected exit 2 (invalid args); got {:?}",
out.status.code(),
);
}
#[test]
fn the_refusal_explains_what_cannot_be_read_and_what_to_do() {
let dir = empty_config();
let out = snapshot(&["snapshot", "get"], &dir.path().join("config.toml"));
let stderr = String::from_utf8_lossy(&out.stderr);
for expected in [
"cannot read a running deployment", "--local", "aggregator", ] {
assert!(
stderr.contains(expected),
"the refusal never mentions {expected:?}:\n{stderr}"
);
}
}
#[test]
fn local_still_produces_a_snapshot_for_callers_who_ask_for_one() {
let dir = empty_config();
let out = snapshot(
&["snapshot", "get", "--local", "--output", "json"],
&dir.path().join("config.toml"),
);
assert!(
out.status.success(),
"`snapshot get --local` failed: {}",
String::from_utf8_lossy(&out.stderr),
);
let stdout = String::from_utf8_lossy(&out.stdout);
let value: serde_json::Value =
serde_json::from_str(&stdout).expect("--local should emit valid JSON");
assert!(
value.get("peers").is_some(),
"expected a MeshOsSnapshot document, got: {stdout}"
);
}
#[test]
fn local_still_says_the_runtime_was_created_by_this_command() {
let dir = empty_config();
let out = snapshot(
&["snapshot", "get", "--local", "-v"],
&dir.path().join("config.toml"),
);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
stderr.contains("not a view of a running deployment"),
"`--local` produced no caveat on stderr:\n{stderr}"
);
}