ralph-coder 0.2.1

An agentic code generation CLI powered by multiple LLM backends
Documentation
/// Search tool tests — web search mocked, codebase search uses TempDir.
use ralph::tools::search_tools;
use tempfile::TempDir;

#[test]
fn search_codebase_finds_pattern() {
    let dir = TempDir::new().unwrap();
    let file = dir.path().join("main.rs");
    std::fs::write(&file, "fn main() {\n    println!(\"hello\");\n}\n").unwrap();

    let result = search_tools::search_codebase("println", dir.path()).unwrap();
    assert!(result.contains("main.rs"));
    assert!(result.contains("println"));
}

#[test]
fn search_codebase_no_match() {
    let dir = TempDir::new().unwrap();
    let file = dir.path().join("empty.rs");
    std::fs::write(&file, "fn main() {}").unwrap();

    let result = search_tools::search_codebase("XYZZY_NOTFOUND", dir.path()).unwrap();
    assert!(result.contains("No matches"));
}

#[test]
fn search_codebase_invalid_regex_errors() {
    let dir = TempDir::new().unwrap();
    let result = search_tools::search_codebase("[invalid regex", dir.path());
    assert!(result.is_err());
}

#[test]
fn search_codebase_shows_line_numbers() {
    let dir = TempDir::new().unwrap();
    let file = dir.path().join("code.rs");
    std::fs::write(&file, "line1\nTODO fix this\nline3\n").unwrap();

    let result = search_tools::search_codebase("TODO", dir.path()).unwrap();
    assert!(result.contains("2")); // line number
    assert!(result.contains("TODO fix this"));
}

#[tokio::test]
async fn search_web_without_key_returns_degradation_message() {
    let result = search_tools::search_web("rust async traits", None, None)
        .await
        .unwrap();
    assert!(result.contains("BRAVE_API_KEY") || result.contains("SERP_API_KEY"));
}