use std::path::{Path, PathBuf};
use std::process::{Command, Output};
type TestResult = Result<(), Box<dyn std::error::Error>>;
fn absent_variable() -> String {
format!("AION_SLICE1_DEFINITELY_UNSET_{}", std::process::id())
}
fn document_source(env_pass: &str) -> String {
format!(
"//! Absence-report probe.\nworkflow ask\n input question: String\n outcome \
answered: type Answer, route success\n\ntype Answer {{ reply: String }}\n\ntype \
Reply {{ text: String, final_message: String, stop_reason: String, session_id: String }}\n\nworker reviewers\n harness\n \
kind norn\n concurrency 1\n reconnect_initial_backoff 5s\n \
reconnect_max_backoff 1m\n reconnect_max_attempts 10\n env_pass \
{env_pass}\n cwd \"/srv/agents\"\n action ask(prompt: String) -> \
Reply\n agent\n\nstep ask\n \
ask(prompt: question) -> reply\n route answered(reply: reply.text)\n"
)
}
fn write_document(label: &str, env_pass: &str) -> Result<PathBuf, Box<dyn std::error::Error>> {
let path = std::env::temp_dir().join(format!(
"aion-absence-report-{label}-{}.awl",
std::process::id()
));
std::fs::write(&path, document_source(env_pass))?;
Ok(path)
}
fn run_check(document: &Path) -> Result<Output, Box<dyn std::error::Error>> {
Ok(Command::new(env!("CARGO_BIN_EXE_aion"))
.args(["worker", "agent"])
.arg(document)
.arg("--check")
.output()?)
}
#[test]
fn an_absent_declared_variable_is_reported_on_stderr_where_an_operator_reads_it() -> TestResult {
let missing = absent_variable();
let document = write_document("absent", &format!("\"PATH\", \"{missing}\""))?;
let output = run_check(&document)?;
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
output.status.success(),
"an absent pass-through is a warning, not a refusal: stderr was:\n{stderr}"
);
assert!(
stderr.contains(&missing),
"the operator must be told WHICH variable is missing; stderr was:\n{stderr}"
);
assert!(
stderr.contains("reviewers") && stderr.contains("env_pass"),
"the report names the queue and the declaration to correct; stderr was:\n{stderr}"
);
assert!(
!stderr.contains("PATH,"),
"a variable that IS set is not an absence; stderr was:\n{stderr}"
);
let report: serde_json::Value = serde_json::from_str(&stdout)?;
assert_eq!(report["task_queue"], serde_json::json!("reviewers"));
assert_eq!(report["harness"], serde_json::json!("norn"));
std::fs::remove_file(&document)?;
Ok(())
}
#[test]
fn a_declaration_this_machine_can_satisfy_produces_no_warning_at_all() -> TestResult {
assert!(
std::env::var_os("PATH").is_some(),
"this control needs a variable the child really inherits from the test runner"
);
let document = write_document("present", "\"PATH\"")?;
let output = run_check(&document)?;
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(output.status.success(), "stderr was:\n{stderr}");
assert!(
!stderr.contains("environment pass-through"),
"a complete declaration must produce silence — a warning on every start trains \
an operator to skip the one that matters; stderr was:\n{stderr}"
);
std::fs::remove_file(&document)?;
Ok(())
}