use std::process::Command;
use tempfile::tempdir;
#[test]
fn test_cli_search_where_only() {
let dir = tempdir().unwrap();
let db_path = dir.path().join("test.db");
let db_path_str = db_path.to_str().unwrap();
let mut bin_path = std::env::current_exe().unwrap();
bin_path.pop(); if bin_path.ends_with("deps") {
bin_path.pop(); }
bin_path.push("asobi");
assert!(
bin_path.exists(),
"Asobi binary not found at {:?}",
bin_path
);
let status = Command::new(&bin_path)
.arg("new")
.arg("task-1")
.arg("task")
.env("ASOBI_DATABASE_URL", db_path_str)
.status()
.expect("failed to execute asobi");
assert!(status.success());
let status = Command::new(&bin_path)
.arg("truth")
.arg("task-1")
.arg("status")
.arg("READY")
.env("ASOBI_DATABASE_URL", db_path_str)
.status()
.expect("failed to execute asobi");
assert!(status.success());
let status = Command::new(&bin_path)
.arg("new")
.arg("task-2")
.arg("task")
.env("ASOBI_DATABASE_URL", db_path_str)
.status()
.expect("failed to execute asobi");
assert!(status.success());
let status = Command::new(&bin_path)
.arg("truth")
.arg("task-2")
.arg("status")
.arg("BLOCKED")
.env("ASOBI_DATABASE_URL", db_path_str)
.status()
.expect("failed to execute asobi");
assert!(status.success());
let output = Command::new(&bin_path)
.arg("search")
.arg("--where")
.arg("status=READY")
.env("ASOBI_DATABASE_URL", db_path_str)
.output()
.expect("failed to execute asobi");
assert!(
output.status.success(),
"Expected search command to succeed, but it failed.\nstdout:\n{}\nstderr:\n{}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)
);
let stdout_str = String::from_utf8(output.stdout).unwrap();
let graph: serde_json::Value = serde_json::from_str(&stdout_str).unwrap();
let entities = graph["entities"]
.as_array()
.expect("entities field missing or not an array");
assert_eq!(entities.len(), 1);
assert_eq!(entities[0]["name"], "task-1");
}