//! 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");
}