use super::state_unit::{FINISH_END, lock, refusal, resp, why, write, writer};
use crate::git_tree::Probe;
use tempfile::tempdir;
const REFUSED_END: &[u8] = br#"{"type":"message_start","v":1,"role":"assistant"}
{"type":"error","kind":"http","status":401,"message":"invalid api key"}
{"type":"end"}
"#;
const RESET_END: &[u8] = br#"{"type":"message_start","v":1,"role":"assistant"}
{"type":"error","kind":"transport","message":"connection reset"}
{"type":"end"}
"#;
#[test]
fn a_rest_whose_latest_call_was_refused_says_so_beside_the_state() {
let dir = tempdir().unwrap();
let agent = "20260427T140000Z-rrrr";
write(&resp(dir.path(), agent, "001"), REFUSED_END);
assert!(refusal(
dir.path(),
agent,
&lock(Probe::Free),
&writer(Probe::Free)
));
}
#[test]
fn an_adapter_that_died_before_the_contract_is_still_a_refusal() {
let dir = tempdir().unwrap();
let agent = "20260427T140000Z-aaaa";
let step = resp(dir.path(), agent, "001");
write(&step, b"");
let stderr = step.with_file_name("stderr.log");
std::fs::write(&stderr, "bz: no credential for provider row \"work\"\n").unwrap();
let free = || (lock(Probe::Free), writer(Probe::Free));
let (l, w) = free();
assert_eq!(
why(dir.path(), agent, &l, &w).as_deref(),
Some("bz: no credential for provider row \"work\"")
);
let (l, w) = free();
assert!(
refusal(dir.path(), agent, &l, &w),
"a missing credential is auth-shaped wherever it is said"
);
}
#[test]
fn a_rest_that_failed_on_anything_else_is_not_a_refusal() {
let dir = tempdir().unwrap();
for (agent, tail) in [
("20260427T140000Z-tttt", RESET_END),
("20260427T140000Z-qqqq", FINISH_END),
] {
write(&resp(dir.path(), agent, "001"), tail);
assert!(
!refusal(dir.path(), agent, &lock(Probe::Free), &writer(Probe::Free)),
"{agent}"
);
}
assert!(
why(
dir.path(),
"20260427T140000Z-tttt",
&lock(Probe::Free),
&writer(Probe::Free)
)
.is_some_and(|said| said.contains("connection reset"))
);
assert_eq!(
why(
dir.path(),
"20260427T140000Z-qqqq",
&lock(Probe::Free),
&writer(Probe::Free)
),
None,
"a whole tail did not fail at all"
);
}
#[test]
fn a_driver_at_work_over_a_refused_step_reads_nothing() {
let dir = tempdir().unwrap();
let agent = "20260427T140000Z-dddd";
write(&resp(dir.path(), agent, "001"), REFUSED_END);
assert!(!refusal(
dir.path(),
agent,
&lock(Probe::Held),
&writer(Probe::Free)
));
}
#[test]
fn a_conversation_with_no_step_at_all_is_not_a_refusal() {
let dir = tempdir().unwrap();
assert!(!refusal(
dir.path(),
"20260427T140000Z-nnnn",
&lock(Probe::Free),
&writer(Probe::Free)
));
}