use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
#[test]
fn cli_help_flag_succeeds() {
Command::cargo_bin("manta")
.unwrap()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Usage"));
}
#[test]
fn cli_version_flag_succeeds() {
Command::cargo_bin("manta")
.unwrap()
.arg("--version")
.assert()
.success()
.stdout(predicate::str::contains("manta"));
}
#[test]
fn cli_invalid_subcommand_fails() {
Command::cargo_bin("manta")
.unwrap()
.arg("nonexistent-command")
.assert()
.failure();
}
#[test]
fn cli_help_contains_site_flag() {
Command::cargo_bin("manta")
.unwrap()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("--site"));
}
#[test]
fn cli_get_sessions_help_succeeds() {
Command::cargo_bin("manta")
.unwrap()
.args(["get", "sessions", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("--hsm-group"))
.stdout(predicate::str::contains("--limit"))
.stdout(predicate::str::contains("--most-recent"));
}
#[test]
fn cli_site_flag_accepted_with_help() {
Command::cargo_bin("manta")
.unwrap()
.args(["--site", "mysite", "get", "sessions", "--help"])
.assert()
.success();
}
#[test]
fn cli_apply_boot_group_help_uses_group_name_placeholder() {
Command::cargo_bin("manta")
.unwrap()
.args(["apply", "boot", "group", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("<GROUP_NAME>"))
.stdout(predicate::str::contains("CLUSTER_NAME").not());
}
fn site_less_config() -> (tempfile::TempDir, std::path::PathBuf) {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("cli.toml");
fs::write(
&path,
"log = \"info\"\n\
manta_server_url = \"https://manta-server.example.com:8443\"\n",
)
.unwrap();
(dir, path)
}
#[test]
fn config_set_site_works_without_a_site_configured() {
let (_dir, path) = site_less_config();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["config", "set", "site", "mysite"])
.assert()
.success();
let written = fs::read_to_string(&path).unwrap();
assert!(
written.contains("site = \"mysite\""),
"config file should now carry the site key, got:\n{written}"
);
}
#[test]
fn config_show_works_without_a_site() {
let (_dir, path) = site_less_config();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["config", "show"])
.assert()
.success()
.stdout(predicate::str::contains("Current site:"))
.stdout(predicate::str::contains("(unset)"))
.stdout(predicate::str::contains("From JWT token:"))
.stdout(predicate::str::contains("From server API:"))
.stdout(predicate::str::contains("(unavailable — no site selected)"));
}
#[test]
fn config_show_json_without_a_site_has_null_current_site() {
let (_dir, path) = site_less_config();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["config", "show", "--output", "json"])
.assert()
.success()
.stdout(predicate::str::contains("\"current_site\":null"));
}
#[test]
fn config_set_read_only_writes_true_to_cli_toml() {
let (_dir, path) = site_less_config();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["config", "set", "read-only"])
.assert()
.success();
let written = fs::read_to_string(&path).unwrap();
assert!(
written.contains("read_only = true"),
"config file should now carry read_only = true, got:\n{written}"
);
}
#[test]
fn config_unset_read_only_removes_the_key() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("cli.toml");
fs::write(
&path,
"log = \"info\"\n\
manta_server_url = \"https://manta-server.example.com:8443\"\n\
read_only = true\n",
)
.unwrap();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["config", "unset", "read-only"])
.assert()
.success();
let written = fs::read_to_string(&path).unwrap();
assert!(
!written.contains("read_only"),
"read_only key should be gone, got:\n{written}"
);
}
#[test]
fn read_only_gate_refuses_mutating_verb_locally() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("cli.toml");
fs::write(
&path,
"log = \"info\"\n\
site = \"alps\"\n\
manta_server_url = \"https://manta-server.example.com:8443\"\n\
read_only = true\n",
)
.unwrap();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["delete", "session", "any-session-id"])
.assert()
.failure()
.stderr(predicate::str::contains("read-only mode"))
.stderr(predicate::str::contains("manta config unset read-only"));
}
#[test]
fn backend_command_without_a_site_errors_clearly() {
let (_dir, path) = site_less_config();
Command::cargo_bin("manta")
.unwrap()
.env("MANTA_CLI_CONFIG", &path)
.args(["get", "groups"])
.assert()
.failure()
.stderr(predicate::str::contains("No site selected"));
}