rover-fetch 0.2.0

An MCP server for fetching and prepping web content for LLM agents.
Documentation
//! Subprocess tests for `rover config show` and `rover config set`.
#![cfg(feature = "test-loopback")]

use std::process::Command;
use tempfile::tempdir;

fn rover_bin() -> std::path::PathBuf {
    std::path::PathBuf::from(env!("CARGO_BIN_EXE_rover"))
}

#[test]
fn config_show_marks_provenance() {
    let tmp = tempdir().unwrap();
    let cfg = tmp.path().join("rover.toml");
    std::fs::write(&cfg, "[ssrf]\nlevel = \"loopback\"\n").unwrap();
    let out = Command::new(rover_bin())
        .arg("--config")
        .arg(&cfg)
        .arg("config")
        .arg("show")
        .output()
        .expect("rover config show");
    let stdout = String::from_utf8_lossy(&out.stdout);
    let stderr = String::from_utf8_lossy(&out.stderr);
    assert!(
        out.status.success(),
        "exit: {:?}\nstdout: {stdout}\nstderr: {stderr}",
        out.status
    );
    assert!(
        stdout.contains("ssrf.level")
            && stdout.contains("loopback")
            && stdout.contains("# from: file"),
        "expected ssrf.level marked file; got:\n{stdout}",
    );
    assert!(
        stdout.contains("ssrf.project_root") && stdout.contains("# from: defaults"),
        "expected project_root marked defaults; got:\n{stdout}",
    );
}

#[test]
fn config_set_writes_value() {
    let tmp = tempdir().unwrap();
    let cfg = tmp.path().join("rover.toml");
    std::fs::write(&cfg, "[ssrf]\nlevel = \"strict\"\n").unwrap();
    let out = Command::new(rover_bin())
        .args(["--config"])
        .arg(&cfg)
        .args(["config", "set", "ssrf.level", "loopback"])
        .output()
        .expect("rover config set");
    assert!(
        out.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&out.stderr)
    );
    let after = std::fs::read_to_string(&cfg).unwrap();
    assert!(after.contains("level = \"loopback\""), "file:\n{after}");
}

#[test]
fn config_set_rejects_unknown_key() {
    let tmp = tempdir().unwrap();
    let cfg = tmp.path().join("rover.toml");
    std::fs::write(&cfg, "").unwrap();
    let out = Command::new(rover_bin())
        .args(["--config"])
        .arg(&cfg)
        .args(["config", "set", "bogus.field", "x"])
        .output()
        .expect("rover config set");
    assert!(!out.status.success(), "expected non-zero exit");
    let stderr = String::from_utf8_lossy(&out.stderr);
    assert!(
        stderr.contains("not settable") || stderr.contains("Unsettable"),
        "stderr:\n{stderr}",
    );
}

#[test]
fn config_set_rejects_invalid_enum_value() {
    let tmp = tempdir().unwrap();
    let cfg = tmp.path().join("rover.toml");
    std::fs::write(&cfg, "[ssrf]\nlevel = \"strict\"\n").unwrap();
    let out = Command::new(rover_bin())
        .args(["--config"])
        .arg(&cfg)
        .args(["config", "set", "ssrf.level", "bogus"])
        .output()
        .expect("rover config set");
    assert!(!out.status.success(), "expected non-zero exit");
    let after = std::fs::read_to_string(&cfg).unwrap();
    assert!(after.contains("strict"), "file modified: {after}");
}