osp-cli 1.5.1

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

#[cfg(unix)]
use std::time::Duration;

#[cfg(unix)]
use crate::support::{ReplPtyColorMode, ReplPtyConfig, ReplPtySession};

#[cfg(unix)]
fn run_repl_command(command: &str, colored: bool) -> (String, String) {
    let color_mode = if colored {
        ReplPtyColorMode::Always
    } else {
        ReplPtyColorMode::Plain
    };
    let mut session = ReplPtySession::spawn(ReplPtyConfig::default().with_color_mode(color_mode));

    let start = session.output_len();
    assert!(
        session.wait_for_plain_output_since(start, "default>", Duration::from_secs(3)),
        "expected prompt output after REPL startup; output:\n{}",
        session.output_snapshot(4000),
    );

    let start = session.output_len();
    session.write_bytes(format!("{command}\r").as_bytes());
    assert!(
        session.wait_for_plain_output_since(start, "default>", Duration::from_secs(3)),
        "expected prompt after `{command}`; output:\n{}",
        session.output_snapshot(4000),
    );

    let raw = session.output_since(start);
    let plain = crate::support::strip_terminal_noise(&raw);

    session.write_bytes(b"exit\r");
    assert!(
        session.wait_for_exit(Duration::from_secs(3)),
        "expected REPL to exit after `{command}`; output:\n{}",
        session.output_snapshot(4000),
    );

    (raw, plain)
}

#[cfg(unix)]
fn help_body(text: &str) -> String {
    text.find("Usage")
        .map(|idx| text[idx..].to_string())
        .unwrap_or_else(|| text.to_string())
}

#[cfg(unix)]
#[test]
fn repl_help_alias_and_verbose_help_route_to_the_canonical_help_surface_end_to_end() {
    let (_, alias_plain) = run_repl_command("help history", false);
    let (_, canonical_plain) = run_repl_command("history --help", false);
    assert_eq!(help_body(&alias_plain), help_body(&canonical_plain));

    let (_, alias_verbose_plain) = run_repl_command("help history -v", false);
    let (_, canonical_verbose_plain) = run_repl_command("history --help -v", false);
    assert_eq!(
        help_body(&alias_verbose_plain),
        help_body(&canonical_verbose_plain)
    );
}

#[cfg(unix)]
#[test]
fn repl_help_alias_rejects_invalid_targets_end_to_end() {
    for command in ["help help", "help --help"] {
        let (_, plain) = run_repl_command(command, false);
        assert!(
            plain.contains("invalid help target"),
            "command={command} output={plain:?}"
        );
        assert!(
            plain.contains("default>"),
            "command={command} output={plain:?}"
        );
    }
}

#[cfg(unix)]
#[test]
fn repl_invalid_subcommand_renders_inline_help_end_to_end() {
    let (_, plain) = run_repl_command("config sho", false);
    assert!(
        plain.contains("unrecognized subcommand"),
        "output={plain:?}"
    );
    assert!(plain.contains("config <COMMAND>"), "output={plain:?}");
    assert!(
        !plain.contains("For more information, try '--help'."),
        "output={plain:?}"
    );
}

#[cfg(unix)]
#[test]
fn repl_help_alias_keeps_the_colored_tty_path_end_to_end() {
    let (alias_raw, alias_plain) = run_repl_command("help history", true);
    let (canonical_raw, canonical_plain) = run_repl_command("history --help", true);
    assert!(alias_raw.contains("\u{1b}["), "output={alias_raw:?}");
    assert!(
        canonical_raw.contains("\u{1b}["),
        "output={canonical_raw:?}"
    );
    assert_eq!(help_body(&alias_plain), help_body(&canonical_plain));
}