ruvector-cli 2.0.4

CLI and MCP server for Ruvector
//! Unit tests for the hooks CLI commands

use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;

/// Helper to get the ruvector binary command
fn ruvector_cmd() -> Command {
    Command::cargo_bin("ruvector").unwrap()
}

#[test]
fn test_hooks_help() {
    ruvector_cmd()
        .arg("hooks")
        .arg("--help")
        .assert()
        .success()
        .stdout(predicate::str::contains("Self-learning intelligence hooks"));
}

#[test]
fn test_hooks_stats() {
    ruvector_cmd()
        .arg("hooks")
        .arg("stats")
        .assert()
        .success()
        .stdout(predicate::str::contains("Q-learning patterns"));
}

#[test]
fn test_hooks_session_start() {
    ruvector_cmd()
        .arg("hooks")
        .arg("session-start")
        .assert()
        .success()
        .stdout(predicate::str::contains("Intelligence Layer Active"));
}

#[test]
fn test_hooks_session_end() {
    ruvector_cmd()
        .arg("hooks")
        .arg("session-end")
        .assert()
        .success()
        .stdout(predicate::str::contains("Session ended"));
}

#[test]
fn test_hooks_pre_edit() {
    ruvector_cmd()
        .arg("hooks")
        .arg("pre-edit")
        .arg("src/main.rs")
        .assert()
        .success()
        .stdout(predicate::str::contains("Intelligence Analysis"));
}

#[test]
fn test_hooks_post_edit_success() {
    ruvector_cmd()
        .arg("hooks")
        .arg("post-edit")
        .arg("--success")
        .arg("src/lib.rs")
        .assert()
        .success()
        .stdout(predicate::str::contains("Learning recorded"));
}

#[test]
fn test_hooks_pre_command() {
    ruvector_cmd()
        .arg("hooks")
        .arg("pre-command")
        .arg("cargo build")
        .assert()
        .success()
        .stdout(predicate::str::contains("Command"));
}

#[test]
fn test_hooks_post_command() {
    ruvector_cmd()
        .arg("hooks")
        .arg("post-command")
        .arg("--success")
        .arg("cargo")
        .arg("test")
        .assert()
        .success()
        .stdout(predicate::str::contains("recorded"));
}

#[test]
fn test_hooks_remember() {
    ruvector_cmd()
        .arg("hooks")
        .arg("remember")
        .arg("--memory-type")
        .arg("test")
        .arg("test content for memory")
        .assert()
        .success()
        .stdout(predicate::str::contains("success"));
}

#[test]
fn test_hooks_recall() {
    ruvector_cmd()
        .arg("hooks")
        .arg("recall")
        .arg("test content")
        .assert()
        .success();
}

#[test]
fn test_hooks_learn() {
    ruvector_cmd()
        .arg("hooks")
        .arg("learn")
        .arg("test-state")
        .arg("test-action")
        .arg("--reward")
        .arg("0.8")
        .assert()
        .success()
        .stdout(predicate::str::contains("success"));
}

#[test]
fn test_hooks_suggest() {
    ruvector_cmd()
        .arg("hooks")
        .arg("suggest")
        .arg("edit-rs")
        .arg("--actions")
        .arg("coder,reviewer,tester")
        .assert()
        .success()
        .stdout(predicate::str::contains("action"));
}

#[test]
fn test_hooks_route() {
    ruvector_cmd()
        .arg("hooks")
        .arg("route")
        .arg("implement feature")
        .assert()
        .success()
        .stdout(predicate::str::contains("recommended"));
}

#[test]
fn test_hooks_should_test() {
    ruvector_cmd()
        .arg("hooks")
        .arg("should-test")
        .arg("src/lib.rs")
        .assert()
        .success()
        .stdout(predicate::str::contains("cargo test"));
}

#[test]
fn test_hooks_suggest_next() {
    ruvector_cmd()
        .arg("hooks")
        .arg("suggest-next")
        .arg("src/main.rs")
        .assert()
        .success();
}

#[test]
fn test_hooks_record_error() {
    ruvector_cmd()
        .arg("hooks")
        .arg("record-error")
        .arg("cargo build")
        .arg("error[E0308]: mismatched types")
        .assert()
        .success()
        .stdout(predicate::str::contains("E0308"));
}

#[test]
fn test_hooks_suggest_fix() {
    ruvector_cmd()
        .arg("hooks")
        .arg("suggest-fix")
        .arg("E0308")
        .assert()
        .success();
}

#[test]
fn test_hooks_swarm_register() {
    ruvector_cmd()
        .arg("hooks")
        .arg("swarm-register")
        .arg("test-agent-1")
        .arg("rust-developer")
        .arg("--capabilities")
        .arg("rust,testing")
        .assert()
        .success()
        .stdout(predicate::str::contains("success"));
}

#[test]
fn test_hooks_swarm_coordinate() {
    ruvector_cmd()
        .arg("hooks")
        .arg("swarm-coordinate")
        .arg("agent-1")
        .arg("agent-2")
        .arg("--weight")
        .arg("0.8")
        .assert()
        .success()
        .stdout(predicate::str::contains("success"));
}

#[test]
fn test_hooks_swarm_optimize() {
    ruvector_cmd()
        .arg("hooks")
        .arg("swarm-optimize")
        .arg("task1,task2,task3")
        .assert()
        .success()
        .stdout(predicate::str::contains("assignments"));
}

#[test]
fn test_hooks_swarm_recommend() {
    ruvector_cmd()
        .arg("hooks")
        .arg("swarm-recommend")
        .arg("rust development")
        .assert()
        .success();
}

#[test]
fn test_hooks_swarm_heal() {
    ruvector_cmd()
        .arg("hooks")
        .arg("swarm-heal")
        .arg("failed-agent")
        .assert()
        .success();
}

#[test]
fn test_hooks_swarm_stats() {
    ruvector_cmd()
        .arg("hooks")
        .arg("swarm-stats")
        .assert()
        .success()
        .stdout(predicate::str::contains("agents"));
}

#[test]
fn test_hooks_pre_compact() {
    ruvector_cmd()
        .arg("hooks")
        .arg("pre-compact")
        .assert()
        .success()
        .stdout(predicate::str::contains("Pre-compact"));
}

#[test]
fn test_hooks_init_creates_config() {
    // Just test that init command runs successfully
    // The actual config is created in ~/.ruvector/ not the current directory
    ruvector_cmd().arg("hooks").arg("init").assert().success();
}

#[test]
fn test_hooks_install_runs() {
    // Just test that install command runs successfully
    ruvector_cmd()
        .arg("hooks")
        .arg("install")
        .assert()
        .success();
}