#![cfg(feature = "embedded")]
use std::path::{Path, PathBuf};
use std::process::{Command, Output};
const QUAKES: &str = r#"{"type":"FeatureCollection","features":[
{"type":"Feature","properties":{"mag":4.5,"place":"north"}},
{"type":"Feature","properties":{"mag":2.1,"place":"south"}},
{"type":"Feature","properties":{"mag":5.2,"place":"east"}}
]}"#;
fn scratch(case: &str) -> PathBuf {
let dir = std::env::temp_dir().join(format!("iki-json-{}-{case}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(dir.join("config").join("ikigai")).expect("scratch config home");
std::fs::create_dir_all(dir.join("files")).expect("scratch workspace");
std::fs::write(dir.join("files").join("quakes.json"), QUAKES).expect("a GeoJSON file");
dir
}
fn run(home: &Path, args: &[&str]) -> Output {
Command::new(env!("CARGO_BIN_EXE_ikigai"))
.args(args)
.current_dir(home)
.env("HOME", home)
.env("XDG_CONFIG_HOME", home.join("config"))
.env("IKIGAI_FILES", home.join("files"))
.stdin(std::process::Stdio::null())
.output()
.expect("the binary under test runs")
}
#[test]
fn a_jq_query_over_a_file_answers_from_the_cli() {
let home = scratch("query");
let out = run(
&home,
&[
"--quiet",
"-c",
r#"source urn:json:query src=urn:file:quakes.json q=".features|length""#,
],
);
let stdout = String::from_utf8_lossy(&out.stdout);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(out.status.success(), "stdout: {stdout}\nstderr: {stderr}");
assert_eq!(stdout.trim(), "3", "stderr: {stderr}");
}
#[test]
fn compose_splices_a_jq_marker() {
let home = scratch("compose");
std::fs::write(
home.join("files").join("count.txt"),
"quakes: $j{urn:file:quakes.json .features|length}\n",
)
.expect("a template");
let out = run(
&home,
&[
"--quiet",
"-c",
"source urn:iki:fn:compose src=urn:file:count.txt",
],
);
let stdout = String::from_utf8_lossy(&out.stdout);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(out.status.success(), "stdout: {stdout}\nstderr: {stderr}");
assert_eq!(stdout.trim(), "quakes: 3", "stderr: {stderr}");
}
#[test]
fn csv_reads_as_json_and_back() {
let home = scratch("csv");
std::fs::write(
home.join("files").join("people.csv"),
"name,age\nada,36\nlin,29\n",
)
.expect("a CSV file");
let out = run(
&home,
&[
"--quiet",
"-c",
"source urn:file:people.csv | urn:json:from-csv | urn:json:to-csv",
],
);
let stdout = String::from_utf8_lossy(&out.stdout);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(out.status.success(), "stdout: {stdout}\nstderr: {stderr}");
assert_eq!(
stdout.trim().replace("\r\n", "\n"),
"name,age\nada,36\nlin,29",
"stderr: {stderr}"
);
}