use assert_cmd::Command;
use predicates::prelude::*;
use serde_json::Value;
fn tr300() -> Command {
Command::new(env!("CARGO_BIN_EXE_tr300"))
}
#[test]
fn test_help_flag() {
tr300()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("TR-300"));
}
#[test]
fn test_version_flag() {
tr300()
.arg("--version")
.assert()
.success()
.stdout(predicate::str::contains("tr300"));
}
#[test]
fn test_default_report() {
tr300()
.assert()
.success()
.stdout(predicate::str::contains("QUBETX DEVELOPER TOOLS"))
.stdout(predicate::str::contains("TR-300 MACHINE REPORT"));
}
#[test]
fn test_ascii_flag() {
tr300()
.arg("--ascii")
.assert()
.success()
.stdout(predicate::str::contains("+"));
}
#[test]
fn test_json_flag() {
tr300()
.arg("--json")
.assert()
.success()
.stdout(predicate::str::contains("\"os\":"))
.stdout(predicate::str::contains("\"cpu\":"))
.stdout(predicate::str::contains("\"memory\":"));
}
#[test]
fn test_json_output_parses() {
let output = tr300()
.arg("--json")
.assert()
.success()
.get_output()
.stdout
.clone();
let value: Value = serde_json::from_slice(&output).expect("--json output should parse");
assert_eq!(value["schema_version"], 1);
assert!(value["os"].is_object());
assert!(value["system"].is_object());
}
#[test]
fn test_custom_title() {
tr300()
.args(["--title", "CUSTOM TITLE"])
.assert()
.success()
.stdout(predicate::str::contains("CUSTOM TITLE"));
}
#[test]
fn test_no_color_flag() {
tr300().arg("--no-color").assert().success();
}
#[test]
fn test_output_contains_expected_fields() {
tr300()
.assert()
.success()
.stdout(predicate::str::contains("OS"))
.stdout(predicate::str::contains("KERNEL"))
.stdout(predicate::str::contains("HOSTNAME"))
.stdout(predicate::str::contains("MACHINE IP"))
.stdout(predicate::str::contains("PROCESSOR"))
.stdout(predicate::str::contains("CORES"))
.stdout(predicate::str::contains("CPU FREQ"))
.stdout(predicate::str::contains("VOLUME"))
.stdout(predicate::str::contains("DISK USAGE"))
.stdout(predicate::str::contains("MEMORY"))
.stdout(predicate::str::contains("UPTIME"));
}
#[test]
fn test_json_includes_schema_version() {
tr300()
.arg("--json")
.assert()
.success()
.stdout(predicate::str::contains("\"schema_version\": 1"));
}
#[test]
fn test_json_includes_elevation_keys() {
tr300()
.arg("--json")
.assert()
.success()
.stdout(predicate::str::contains("\"elevated\":"))
.stdout(predicate::str::contains("\"elevation_unlocks_more\":"));
}
#[test]
fn test_no_elevation_hint_flag_accepted() {
tr300()
.args(["--no-elevation-hint", "--ascii"])
.assert()
.success()
.stdout(predicate::str::contains("Run with sudo").not())
.stdout(predicate::str::contains("Run as Administrator").not());
}
#[test]
fn test_fast_mode_no_elevation_footer() {
tr300()
.args(["--fast", "--ascii"])
.assert()
.success()
.stdout(predicate::str::contains("Run with sudo").not())
.stdout(predicate::str::contains("Run as Administrator").not());
}
#[test]
fn test_fast_mode_omits_slow_conditional_rows() {
tr300()
.args(["--fast", "--ascii"])
.assert()
.success()
.stdout(predicate::str::contains("ZFS HEALTH").not())
.stdout(predicate::str::contains("RAM SLOTS").not())
.stdout(predicate::str::contains("BOARD").not())
.stdout(predicate::str::contains("BIOS").not());
}
#[test]
fn test_ascii_table_lines_keep_fixed_width() {
let output = tr300()
.args(["--ascii", "--no-elevation-hint"])
.assert()
.success()
.get_output()
.stdout
.clone();
let output = String::from_utf8(output).expect("stdout should be utf-8");
for line in output.lines().filter(|line| line.starts_with(['+', '|'])) {
assert_eq!(
line.chars().count(),
51,
"line has unexpected width: {line}"
);
}
}
#[test]
fn test_help_documents_positional_actions() {
tr300()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("[ACTION]"))
.stdout(predicate::str::contains(
"[possible values: update, install, uninstall]",
));
}
#[test]
fn test_json_includes_encryption_key() {
tr300()
.arg("--json")
.assert()
.success()
.stdout(predicate::str::contains("\"encryption\":"));
}
#[test]
fn test_json_includes_session_uptime_seconds_key() {
tr300()
.arg("--json")
.assert()
.success()
.stdout(predicate::str::contains("\"session_uptime_seconds\":"));
}