use assert_cmd::prelude::*;
use predicates::prelude::*;
use std::process::Command;
fn fake_socket(dir: &tempfile::TempDir) -> std::path::PathBuf {
dir.path().join("does-not-exist.sock")
}
fn cli() -> Command {
Command::cargo_bin("sysknife").expect("sysknife binary builds")
}
#[test]
fn help_lists_every_top_level_subcommand() {
let output = cli()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("doctor"))
.stdout(predicate::str::contains("history"))
.stdout(predicate::str::contains("audit"))
.stdout(predicate::str::contains("mcp-server"))
.stdout(predicate::str::contains("completions"));
drop(output);
}
#[test]
fn unknown_subcommand_via_clap_usage_error() {
cli()
.arg("--no-such-flag")
.assert()
.failure()
.stderr(predicate::str::contains("unexpected").or(predicate::str::contains("unknown")));
}
#[test]
fn doctor_fails_loudly_when_daemon_socket_is_unreachable() {
let dir = tempfile::tempdir().unwrap();
cli()
.env("SYSKNIFE_SOCKET", fake_socket(&dir))
.arg("doctor")
.assert()
.failure();
}
#[test]
fn history_rejects_unparseable_since_timestamp() {
let dir = tempfile::tempdir().unwrap();
cli()
.env("SYSKNIFE_SOCKET", fake_socket(&dir))
.arg("history")
.arg("--since")
.arg("not-a-timestamp")
.assert()
.failure();
}
#[test]
fn completions_subcommand_emits_a_shell_script() {
cli()
.arg("completions")
.arg("bash")
.assert()
.success()
.stdout(predicate::str::contains("_sysknife").or(predicate::str::starts_with("#")));
}