#![allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
use assert_cmd::Command;
use predicates::prelude::*;
fn doiget() -> Command {
let dir = tempfile::TempDir::new().expect("tempdir");
let mut cmd = Command::cargo_bin("doiget").expect("locate doiget binary");
cmd.env("HOME", dir.path()).env("USERPROFILE", dir.path());
Box::leak(Box::new(dir));
cmd
}
#[test]
fn mode_flag_accepts_all_four_values_on_help() {
for value in ["human", "json", "quiet", "mcp"] {
doiget()
.args(["--mode", value, "--help"])
.assert()
.success();
}
}
#[test]
fn json_short_flag_is_accepted() {
doiget().args(["--json", "--help"]).assert().success();
}
#[test]
fn quiet_short_flag_is_accepted_long_form() {
doiget().args(["--quiet", "--help"]).assert().success();
}
#[test]
fn q_short_flag_is_accepted_short_form() {
doiget().args(["-q", "--help"]).assert().success();
}
#[test]
fn mode_and_json_conflict() {
doiget()
.args(["--mode", "human", "--json", "audit-log", "--verify"])
.assert()
.failure()
.stderr(predicate::str::contains("cannot be used"));
}
#[test]
fn mode_and_quiet_conflict() {
doiget()
.args(["--mode", "human", "--quiet", "audit-log", "--verify"])
.assert()
.failure()
.stderr(predicate::str::contains("cannot be used"));
}
#[test]
fn json_and_quiet_conflict() {
doiget()
.args(["--json", "--quiet", "audit-log", "--verify"])
.assert()
.failure()
.stderr(predicate::str::contains("cannot be used"));
}
#[test]
fn unknown_mode_value_is_rejected() {
doiget()
.args(["--mode", "garbage", "--help"])
.assert()
.failure()
.stderr(predicate::str::contains("invalid value"));
}
#[test]
fn doiget_mode_env_does_not_break_clap_parsing() {
for value in ["human", "json", "quiet", "mcp", "garbage", ""] {
doiget()
.env("DOIGET_MODE", value)
.args(["--help"])
.assert()
.success();
}
}
#[test]
fn mode_flag_is_global_after_subcommand() {
doiget()
.args(["audit-log", "--mode", "human", "--help"])
.assert()
.success();
}