socktop 1.60.1

Remote system monitor over WebSocket, TUI like top
Documentation
//! CLI arg parsing tests for socktop (client)
use std::process::Command;

// We test the parsing by invoking the binary with --help and ensuring the help mentions short and long flags.
// Also directly test the parse_args function via a tiny helper in a doctest-like fashion using a small
// reimplementation here kept in sync with main (compile-time test).

#[test]
fn test_help_mentions_short_and_long_flags() {
    let output = Command::new(env!("CARGO_BIN_EXE_socktop"))
        .arg("--help")
        .output()
        .expect("run socktop --help");
    let text = format!(
        "{}{}",
        String::from_utf8_lossy(&output.stdout),
        String::from_utf8_lossy(&output.stderr)
    );
    assert!(
        text.contains("--tls-ca")
            && text.contains("-t")
            && text.contains("--profile")
            && text.contains("-P"),
        "help text missing expected flags (--tls-ca/-t, --profile/-P)\n{text}"
    );
}

#[test]
fn test_tlc_ca_arg_long_and_short_parsed() {
    // Use --help combined with flags to avoid network and still exercise arg acceptance
    let exe = env!("CARGO_BIN_EXE_socktop");
    // Long form with help
    let out = Command::new(exe)
        .args(["--tls-ca", "/tmp/cert.pem", "--help"])
        .output()
        .expect("run socktop");
    assert!(
        out.status.success(),
        "socktop --tls-ca … --help did not succeed"
    );
    let text = format!(
        "{}{}",
        String::from_utf8_lossy(&out.stdout),
        String::from_utf8_lossy(&out.stderr)
    );
    assert!(text.contains("Usage:"));
    // Short form with help
    let out2 = Command::new(exe)
        .args(["-t", "/tmp/cert.pem", "--help"])
        .output()
        .expect("run socktop");
    assert!(out2.status.success(), "socktop -t … --help did not succeed");
    let text2 = format!(
        "{}{}",
        String::from_utf8_lossy(&out2.stdout),
        String::from_utf8_lossy(&out2.stderr)
    );
    assert!(text2.contains("Usage:"));

    // Profile flags with help (should not error)
    let out3 = Command::new(exe)
        .args(["--profile", "dev", "--help"])
        .output()
        .expect("run socktop");
    assert!(
        out3.status.success(),
        "socktop --profile dev --help did not succeed"
    );
    let text3 = format!(
        "{}{}",
        String::from_utf8_lossy(&out3.stdout),
        String::from_utf8_lossy(&out3.stderr)
    );
    assert!(text3.contains("Usage:"));
}

#[test]
fn test_compact_flag_documented_and_accepted() {
    let exe = env!("CARGO_BIN_EXE_socktop");
    let out = Command::new(exe)
        .args(["--compact", "--help"])
        .output()
        .expect("run socktop --compact --help");
    assert!(
        out.status.success(),
        "socktop --compact --help did not succeed"
    );
    let text = format!(
        "{}{}",
        String::from_utf8_lossy(&out.stdout),
        String::from_utf8_lossy(&out.stderr)
    );
    assert!(
        text.contains("--compact"),
        "help text missing --compact\n{text}"
    );

    // The flag must not be mistaken for the positional URL argument.
    let out2 = Command::new(exe)
        .args(["--compact", "--dry-run", "ws://127.0.0.1:3000/ws"])
        .output()
        .expect("run socktop --compact --dry-run");
    assert!(
        out2.status.success(),
        "socktop --compact with a URL was rejected: {}",
        String::from_utf8_lossy(&out2.stderr)
    );
}