cmdhub-cli 0.1.1

cmdh — the CmdHub CLI client for offline command search and execution
Documentation
use assert_cmd::Command;
use tempfile::TempDir;

#[test]
fn test_boundary_empty_query() {
    let tmp = TempDir::new().unwrap();
    let mut cmd = Command::cargo_bin("cmdh").unwrap();
    cmd.env("XDG_DATA_HOME", tmp.path())
        .env("CMDH_NO_STARTER", "1")
        .env("XDG_CONFIG_HOME", tmp.path())
        .arg("search")
        .arg("");
    let assert = cmd.assert().success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
    let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
    assert!(json.as_array().map(|a| a.is_empty()).unwrap_or(false));
}

#[test]
fn test_boundary_ultra_long_query() {
    let tmp = TempDir::new().unwrap();
    let mut cmd = Command::cargo_bin("cmdh").unwrap();
    let ultra_long = "a".repeat(1500);
    cmd.env("XDG_DATA_HOME", tmp.path())
        .env("CMDH_NO_STARTER", "1")
        .env("XDG_CONFIG_HOME", tmp.path())
        .arg("search")
        .arg(ultra_long);
    let assert = cmd.assert().success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
    let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
    assert!(json.as_array().map(|a| a.is_empty()).unwrap_or(false));
}

#[test]
fn test_boundary_quotes_semicolons_emoji() {
    let tmp = TempDir::new().unwrap();
    let edge_cases = vec![
        "\"double quotes\"",
        "'single quotes'",
        "'; DROP TABLE apps; -- sql injection test",
        "semicolon; test",
        "emoji 🚀🔥🌟 test",
        "\\\\ backslash \\\\",
    ];
    for query in edge_cases {
        let mut cmd = Command::cargo_bin("cmdh").unwrap();
        cmd.env("XDG_DATA_HOME", tmp.path())
        .env("CMDH_NO_STARTER", "1")
            .env("XDG_CONFIG_HOME", tmp.path())
            .arg("search")
            .arg(query);
        let assert = cmd.assert().success();
        let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
        let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
        assert!(json.as_array().map(|a| a.is_empty()).unwrap_or(false));
    }
}

#[test]
fn test_boundary_limit_zero() {
    let tmp = TempDir::new().unwrap();
    let mut cmd = Command::cargo_bin("cmdh").unwrap();
    cmd.env("XDG_DATA_HOME", tmp.path())
        .env("CMDH_NO_STARTER", "1")
        .env("XDG_CONFIG_HOME", tmp.path())
        .arg("search")
        .arg("test")
        .arg("--limit")
        .arg("0");
    let assert = cmd.assert().success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
    let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
    assert!(json.as_array().map(|a| a.is_empty()).unwrap_or(false));
}

#[test]
fn test_boundary_limit_large() {
    let tmp = TempDir::new().unwrap();
    let mut cmd = Command::cargo_bin("cmdh").unwrap();
    cmd.env("XDG_DATA_HOME", tmp.path())
        .env("CMDH_NO_STARTER", "1")
        .env("XDG_CONFIG_HOME", tmp.path())
        .arg("search")
        .arg("test")
        .arg("--limit")
        .arg("999999");
    let assert = cmd.assert().success();
    let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
    let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
    assert!(json.as_array().map(|a| a.is_empty()).unwrap_or(false));
}