tests/cli_json.rs

//! End-to-end tests for `ripgrab json`.

use std::io::Write;

use assert_cmd::Command;
use serde_json::Value;
use tempfile::NamedTempFile;

fn bin() -> Command {
    Command::cargo_bin("ripgrab").unwrap()
}

#[test]
fn json_emits_one_object_per_line() {
    let mut tmp = NamedTempFile::new().unwrap();
    writeln!(tmp, "first").unwrap();
    writeln!(tmp, "second").unwrap();
    tmp.flush().unwrap();

    let out = bin()
        .args(["json", tmp.path().to_str().unwrap()])
        .env("NO_COLOR", "1")
        .output()
        .unwrap();
    let stdout = String::from_utf8(out.stdout).unwrap();
    let lines: Vec<_> = stdout.lines().collect();
    assert_eq!(lines.len(), 2);
    for line in lines {
        let v: Value = serde_json::from_str(line).unwrap();
        assert!(v.get("origin").is_some());
        assert!(v.get("raw").is_some());
    }
}

#[test]
fn json_pretty_emits_multiline_objects() {
    let mut tmp = NamedTempFile::new().unwrap();
    writeln!(tmp, "hi").unwrap();
    tmp.flush().unwrap();

    let out = bin()
        .args(["json", tmp.path().to_str().unwrap(), "--pretty"])
        .env("NO_COLOR", "1")
        .output()
        .unwrap();
    let stdout = String::from_utf8(out.stdout).unwrap();
    assert!(stdout.contains("\n  \"origin\""));
}

#[test]
fn json_where_clause_filters_rows() {
    let mut tmp = NamedTempFile::new().unwrap();
    writeln!(tmp, "keep this").unwrap();
    writeln!(tmp, "drop this").unwrap();
    tmp.flush().unwrap();

    let out = bin()
        .args([
            "json",
            tmp.path().to_str().unwrap(),
            "--where", "body ~ /keep/",
        ])
        .env("NO_COLOR", "1")
        .output()
        .unwrap();
    let stdout = String::from_utf8(out.stdout).unwrap();
    let lines: Vec<_> = stdout.lines().collect();
    assert_eq!(lines.len(), 1);
    let v: Value = serde_json::from_str(lines[0]).unwrap();
    assert_eq!(v["raw"], "keep this");
}