use predicates::prelude::*;
#[allow(unused_imports)]
use assert_cmd::cargo::CommandCargoExt;
#[allow(deprecated)]
fn raps_cmd() -> assert_cmd::Command {
assert_cmd::Command::cargo_bin("raps").unwrap()
}
#[test]
fn test_auth_test_no_panic() {
raps_cmd()
.args(["auth", "test"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_auth_login_no_panic() {
raps_cmd()
.args(["--non-interactive", "auth", "login"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_auth_logout_no_panic() {
raps_cmd()
.args(["auth", "logout"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_bucket_list_no_panic() {
raps_cmd()
.args(["bucket", "list"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_object_list_no_panic() {
raps_cmd()
.args(["object", "list", "test-bucket"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_translate_status_no_panic() {
raps_cmd()
.args(["translate", "status", "dXJuOnRlc3Q"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_hub_list_no_panic() {
raps_cmd()
.args(["hub", "list"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_webhook_list_no_panic() {
raps_cmd()
.args(["webhook", "list"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_da_engine_list_no_panic() {
raps_cmd()
.args(["da", "engine", "list"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_plugin_list_no_panic() {
raps_cmd()
.args(["plugin", "list"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_config_profile_list_no_panic() {
raps_cmd()
.args(["config", "profile", "list"])
.assert()
.success()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
#[ignore = "Known clap config issue with positional arg ordering in debug builds"]
fn test_completions_bash_no_panic() {
raps_cmd()
.args(["completions", "bash"])
.assert()
.success()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_reality_job_list_no_panic() {
raps_cmd()
.args(["reality", "job", "list"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}
#[test]
fn test_all_commands_dispatch_no_panic() {
let subcommands: Vec<Vec<&str>> = vec![
vec!["auth", "test"],
vec!["auth", "logout"],
vec!["bucket", "list"],
vec!["object", "list", "test-bucket"],
vec!["translate", "status", "dXJuOnRlc3Q"],
vec!["hub", "list"],
vec!["webhook", "list"],
vec!["da", "engine", "list"],
vec!["reality", "job", "list"],
vec!["plugin", "list"],
vec!["config", "profile", "list"],
];
for args in &subcommands {
raps_cmd()
.args(args)
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not())
.stderr(predicates::str::contains("RUST_BACKTRACE").not());
}
}
#[test]
fn test_auth_test_graceful_failure() {
let output = raps_cmd()
.env_remove("APS_CLIENT_ID")
.env_remove("APS_CLIENT_SECRET")
.env_remove("FORGE_CLIENT_ID")
.env_remove("FORGE_CLIENT_SECRET")
.args(["auth", "test"])
.output()
.unwrap();
let exit_code = output.status.code().unwrap_or(-1);
assert_ne!(
exit_code, 101,
"Command panicked (exit 101) instead of failing gracefully"
);
}
#[test]
fn test_bucket_list_graceful_failure() {
let output = raps_cmd()
.env_remove("APS_CLIENT_ID")
.env_remove("APS_CLIENT_SECRET")
.env_remove("FORGE_CLIENT_ID")
.env_remove("FORGE_CLIENT_SECRET")
.args(["bucket", "list"])
.output()
.unwrap();
let exit_code = output.status.code().unwrap_or(-1);
assert_ne!(
exit_code, 101,
"Command panicked (exit 101) instead of failing gracefully"
);
}
#[test]
fn test_all_help_flags_work() {
let subcommands = [
"auth",
"bucket",
"object",
"translate",
"hub",
"project",
"folder",
"item",
"webhook",
"da",
"issue",
"acc",
"rfi",
"reality",
"plugin",
"generate",
"demo",
"config",
"pipeline",
];
for subcmd in subcommands {
raps_cmd()
.args([subcmd, "--help"])
.assert()
.stdout(predicates::str::contains("Usage"))
.stderr(predicates::str::contains("panicked").not());
}
}
#[test]
fn test_auth_not_routed_to_completions() {
raps_cmd()
.args(["auth", "test"])
.assert()
.stderr(predicates::str::contains("unreachable").not())
.stdout(predicates::str::contains("_raps").not())
.stdout(predicates::str::contains("complete -F").not())
.stdout(predicates::str::contains("Register-ArgumentCompleter").not());
}
#[test]
fn test_config_dispatch_isolation() {
raps_cmd()
.args(["config", "profile", "list"])
.assert()
.success();
raps_cmd()
.args(["auth", "test"])
.assert()
.stderr(predicates::str::contains("panicked").not())
.stderr(predicates::str::contains("unreachable").not());
}