use assert_cmd::Command;
use predicates::prelude::*;
fn agent() -> Command {
Command::cargo_bin("agent").expect("binary should exist")
}
#[test]
fn output_format_appears_in_help() {
agent()
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("--output-format"));
}
#[test]
fn output_format_invalid_value_fails() {
agent()
.args(["--output-format", "xml", "--prompt", "hello"])
.assert()
.failure()
.stderr(predicate::str::contains("unknown output format"));
}
#[test]
fn output_format_json_without_prompt_fails() {
agent()
.args(["--output-format", "json"])
.assert()
.failure()
.stderr(predicate::str::contains("requires --prompt"));
}
#[test]
fn output_format_text_is_default() {
let output = agent()
.args(["--prompt", "hello"])
.output()
.expect("should execute");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!stderr.contains("unknown output format"),
"text should be the default format, not trigger an error: {stderr}",
);
}
#[test]
fn output_format_json_no_api_key_emits_session_events() {
let output = agent()
.args(["--output-format", "json", "--prompt", "hello"])
.env_remove("AGENT_CODE_API_KEY")
.output()
.expect("should execute");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
if !stdout.is_empty() {
for line in stdout.lines() {
if line.trim().is_empty() {
continue;
}
let parsed: Result<serde_json::Value, _> = serde_json::from_str(line);
assert!(
parsed.is_ok(),
"non-JSON line in JSONL output: {line}\nfull stdout: {stdout}",
);
}
}
assert!(!stderr.contains("panicked"), "agent panicked: {stderr}",);
}
#[test]
fn output_format_case_insensitive() {
let output = agent()
.args(["--output-format", "JSON", "--prompt", "hello"])
.env_remove("AGENT_CODE_API_KEY")
.output()
.expect("should execute");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!stderr.contains("unknown output format"),
"uppercase JSON should be accepted: {stderr}",
);
}