osp-cli 1.5.1

CLI and REPL for querying and managing OSP infrastructure data
Documentation
#![allow(missing_docs)]

#[cfg(unix)]
use crate::support::{first_json_row, osp_command, parse_json_stdout, stderr_utf8};
#[cfg(unix)]
use crate::temp_support::make_temp_dir;

#[cfg(unix)]
#[test]
fn binary_help_exits_zero_and_writes_stdout_only() {
    let home = make_temp_dir("osp-e2e-binary-help");
    let output = osp_command(home.path())
        .arg("--help")
        .assert()
        .success()
        .get_output()
        .clone();

    let stdout = String::from_utf8(output.stdout).expect("stdout should be utf-8");
    assert!(stdout.contains("OSP CLI"));
    assert!(stdout.contains("osp [OPTIONS] [COMMAND]"));
    assert!(
        output.stderr.is_empty(),
        "unexpected stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );
}

#[cfg(unix)]
#[test]
fn binary_version_exits_zero_and_writes_stdout_only() {
    let home = make_temp_dir("osp-e2e-binary-version");
    let output = osp_command(home.path())
        .arg("--version")
        .assert()
        .success()
        .get_output()
        .clone();

    assert_eq!(
        String::from_utf8(output.stdout).expect("stdout should be utf-8"),
        format!("osp {}\n", env!("CARGO_PKG_VERSION"))
    );
    assert!(
        output.stderr.is_empty(),
        "unexpected stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );
}

#[cfg(unix)]
#[test]
fn binary_invalid_subcommand_exits_nonzero_and_writes_usage_to_stderr() {
    let home = make_temp_dir("osp-e2e-binary-invalid-subcommand");
    let output = osp_command(home.path())
        .args(["config", "nope"])
        .assert()
        .failure()
        .code(2)
        .get_output()
        .clone();

    assert!(
        output.stdout.is_empty(),
        "stdout should stay empty: {}",
        String::from_utf8_lossy(&output.stdout)
    );
    let stderr = stderr_utf8(output.stderr);
    assert!(stderr.contains("unrecognized subcommand 'nope'"));
    assert!(stderr.contains("Usage: osp config [OPTIONS] <COMMAND>"));
}

#[cfg(unix)]
#[test]
fn binary_builtin_json_command_exits_zero_and_keeps_stdout_machine_readable() {
    let home = make_temp_dir("osp-e2e-binary-json-command");
    let output = osp_command(home.path())
        .args([
            "--json",
            "--no-env",
            "--no-config-file",
            "config",
            "get",
            "theme.name",
        ])
        .assert()
        .success()
        .get_output()
        .clone();

    let payload = parse_json_stdout(&output.stdout);
    let row = first_json_row(&payload, "binary json config get");
    assert_eq!(row["key"], "theme.name");
    assert_eq!(row["value"], "rose-pine-moon");
    assert!(
        output.stderr.is_empty(),
        "unexpected stderr: {}",
        String::from_utf8_lossy(&output.stderr)
    );
}