use std::path::Path;
use std::process::Command;
const BIN: &str = env!("CARGO_BIN_EXE_roteiro");
fn roteiro(dir: &Path, args: &[&str]) -> std::process::Output {
Command::new(BIN)
.args(args)
.current_dir(dir)
.env("ROTEIRO_HOME", dir)
.output()
.expect("run roteiro")
}
#[test]
fn config_reflects_project_toml_and_rejects_malformed() {
let dir = std::env::temp_dir().join(format!("roteiro-config-cli-{}", std::process::id()));
std::fs::remove_dir_all(&dir).ok();
std::fs::create_dir_all(&dir).expect("mkdir");
std::fs::create_dir_all(dir.join(".git")).expect("mkdir .git");
std::fs::write(
dir.join("roteiro.toml"),
"[infer]\nmin_confidence = 0.66\n[duplicates]\nlimit = 7\n[ingest]\npdf = false\n\
[serve]\naddr = \"127.0.0.1:9100\"\ntools = false\n\
[debt]\nignore = [\"vendor/**\", \"**/generated/*\"]\n\
[paths]\nmodel_store = \"~/models\"\n",
)
.expect("write config");
let out = roteiro(&dir, &["config", "--json"]);
assert!(out.status.success(), "config failed: {out:?}");
let cfg: serde_json::Value =
serde_json::from_slice(&out.stdout).expect("config --json is valid JSON");
assert_eq!(cfg["infer"]["min_confidence"], 0.66);
assert_eq!(cfg["duplicates"]["limit"], 7);
assert_eq!(cfg["ingest"]["pdf"], false);
assert_eq!(cfg["serve"]["addr"], "127.0.0.1:9100");
assert_eq!(cfg["serve"]["tools"], false);
assert_eq!(cfg["debt"]["ignore"][0], "vendor/**");
assert_eq!(cfg["debt"]["ignore"][1], "**/generated/*");
assert_eq!(cfg["paths"]["model_store"], "~/models");
let human = roteiro(&dir, &["config"]);
let text = String::from_utf8_lossy(&human.stdout);
assert!(text.contains("(project)"), "provenance shown: {text}");
std::fs::write(dir.join("roteiro.toml"), "[infer]\nmin_confidence = = =\n").expect("write");
let bad = roteiro(&dir, &["config"]);
assert!(!bad.status.success(), "malformed config must fail");
assert!(
String::from_utf8_lossy(&bad.stderr).contains("config"),
"error mentions the config: {:?}",
String::from_utf8_lossy(&bad.stderr)
);
std::fs::remove_dir_all(&dir).ok();
}