Files
MercuryToolbox/crates/unityprobe/tests/unityprobe_cli.rs
T

108 lines
3.2 KiB
Rust

//! Integration tests for the `unityprobe` command.
use std::fs;
use std::path::PathBuf;
use std::time::{SystemTime, UNIX_EPOCH};
use assert_cmd::Command;
use predicates::prelude::*;
use serde_json::Value;
fn cargo_command() -> Command {
Command::cargo_bin("unityprobe").expect("binary")
}
#[test]
fn no_args_prints_quick_help_card() {
let mut command = cargo_command();
command
.assert()
.code(2)
.stdout(predicate::str::is_empty())
.stderr(predicate::str::contains(
"error: unityprobe requires a subcommand",
))
.stderr(predicate::str::contains("unityprobe - Mercury Toolbox"))
.stderr(predicate::str::contains("Usage:"))
.stderr(predicate::str::contains(
"unityprobe [OPTIONS] <SUBCOMMAND> [ARGS...]",
))
.stderr(predicate::str::contains("install <PATH>"))
.stderr(predicate::str::contains(
"Type 'unityprobe --help' for the full command reference.",
));
}
fn unique_temp_dir(prefix: &str) -> PathBuf {
let suffix = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("epoch")
.as_nanos();
let path = std::env::temp_dir().join(format!("{prefix}-{suffix}"));
fs::create_dir_all(&path).expect("temp dir");
path
}
#[test]
fn help_calls_out_windows_only_bridge_workflow() {
let mut command = cargo_command();
command
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Windows only"))
.stdout(predicate::str::contains("named pipe JSON"))
.stdout(predicate::str::contains("BepInEx\\plugins"))
.stdout(predicate::str::contains("unityprobe status --game-root"))
.stdout(predicate::str::contains("unityprobe --json find"))
.stdout(predicate::str::contains("unityprobe inspect -- -938"));
}
#[cfg(windows)]
#[test]
fn status_reports_uninstalled_game_root_install_state_as_json() {
let game_root = unique_temp_dir("unityprobe-status");
let mut command = cargo_command();
let output = command
.arg("--json")
.arg("status")
.arg("--game-root")
.arg(&game_root)
.assert()
.success()
.stdout(predicate::str::contains("\"windows_supported\":true"))
.get_output()
.stdout
.clone();
let report: Value = serde_json::from_slice(&output).expect("status json");
assert_eq!(
report.get("game_root").and_then(Value::as_str),
Some(game_root.to_string_lossy().as_ref())
);
assert_eq!(
report.get("installed").and_then(Value::as_bool),
Some(false)
);
assert!(
report
.get("pipe_reachable")
.and_then(Value::as_bool)
.is_some()
);
assert!(report.get("runtime_status").is_some());
}
#[cfg(windows)]
#[test]
fn install_requires_explicit_bepinex_and_managed_layout() {
let game_root = unique_temp_dir("unityprobe-install");
let mut command = cargo_command();
command
.arg("install")
.arg(&game_root)
.assert()
.code(3)
.stderr(predicate::str::contains("BepInEx"))
.stderr(predicate::str::contains("Managed"));
}