126 lines
3.8 KiB
Rust
126 lines
3.8 KiB
Rust
use assert_cmd::Command;
|
|
use predicates::prelude::*;
|
|
use serde_json::Value;
|
|
|
|
fn cargo_command() -> Command {
|
|
Command::cargo_bin("msudo").expect("binary")
|
|
}
|
|
|
|
#[test]
|
|
fn help_mentions_dangerous_flag_and_shell_presets() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.arg("--help")
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains(
|
|
"current-process, current-user, admin, system, trustedinstaller",
|
|
))
|
|
.stdout(predicate::str::contains("--dangerous"))
|
|
.stdout(predicate::str::contains("trustedinstaller"))
|
|
.stdout(predicate::str::contains("Shell preset"))
|
|
.stdout(predicate::str::contains("pwsh"))
|
|
.stdout(predicate::str::contains("git-bash"));
|
|
}
|
|
|
|
#[test]
|
|
fn status_json_exposes_stable_top_level_fields() {
|
|
let output = cargo_command()
|
|
.args(["status", "--json"])
|
|
.assert()
|
|
.success()
|
|
.get_output()
|
|
.stdout
|
|
.clone();
|
|
|
|
let report: Value = serde_json::from_slice(&output).expect("valid status json");
|
|
let object = report.as_object().expect("status json object");
|
|
for field in [
|
|
"ok",
|
|
"host",
|
|
"supports_runas",
|
|
"is_elevated",
|
|
"is_admin_member",
|
|
"integrity",
|
|
"current_user",
|
|
"session_id",
|
|
"active_session_id",
|
|
"can_admin",
|
|
"can_current_user",
|
|
"can_system",
|
|
"can_trustedinstaller",
|
|
"trustedinstaller_installed",
|
|
"trustedinstaller_running",
|
|
"shells",
|
|
] {
|
|
assert!(object.contains_key(field), "missing status field: {field}");
|
|
}
|
|
|
|
assert_eq!(object.get("ok").and_then(Value::as_bool), Some(true));
|
|
assert!(matches!(object.get("host"), Some(Value::String(_))));
|
|
assert!(matches!(object.get("supports_runas"), Some(Value::Bool(_))));
|
|
assert!(matches!(object.get("is_elevated"), Some(Value::Bool(_))));
|
|
assert!(matches!(
|
|
object.get("is_admin_member"),
|
|
Some(Value::Bool(_))
|
|
));
|
|
assert!(matches!(object.get("integrity"), Some(Value::String(_))));
|
|
assert!(matches!(
|
|
object.get("current_user"),
|
|
Some(Value::Null | Value::String(_))
|
|
));
|
|
assert!(matches!(
|
|
object.get("session_id"),
|
|
Some(Value::Null | Value::Number(_))
|
|
));
|
|
assert!(matches!(
|
|
object.get("active_session_id"),
|
|
Some(Value::Null | Value::Number(_))
|
|
));
|
|
for field in [
|
|
"can_admin",
|
|
"can_current_user",
|
|
"can_system",
|
|
"can_trustedinstaller",
|
|
"trustedinstaller_installed",
|
|
"trustedinstaller_running",
|
|
] {
|
|
assert!(
|
|
matches!(object.get(field), Some(Value::Bool(_))),
|
|
"status field should be boolean: {field}"
|
|
);
|
|
}
|
|
|
|
let shells = object
|
|
.get("shells")
|
|
.and_then(Value::as_array)
|
|
.expect("shells array");
|
|
assert!(!shells.is_empty(), "shell preset list should not be empty");
|
|
|
|
let first_shell = shells[0].as_object().expect("shell status object");
|
|
for field in ["preset", "available", "executable", "error"] {
|
|
assert!(
|
|
first_shell.contains_key(field),
|
|
"missing shell status field: {field}"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn help_mentions_console_and_window_launch_controls() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.arg("--help")
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains(
|
|
"current-process, current-user, admin, system, trustedinstaller",
|
|
))
|
|
.stdout(predicate::str::contains("--same-console"))
|
|
.stdout(predicate::str::contains("Reuse the current console"))
|
|
.stdout(predicate::str::contains("--new-window"))
|
|
.stdout(predicate::str::contains(
|
|
"Force a new window for the launched process",
|
|
));
|
|
}
|