use super::handshake::Version;
use super::permission::{Decision, Request, decide};
use serde_json::json;
fn request() -> anyhow::Result<Request> {
Request::decode(
Version::One,
json!({"sessionId":"s", "toolCall":{"toolCallId":"t", "title":"Review"},
"options":[{"optionId":"durable","name":"Remember","kind":"allow_always"},
{"optionId":"yes","name":"Approve","kind":"allow_once"},
{"optionId":"no","name":"Refuse","kind":"reject_once"}]}),
"s",
65536,
)
}
#[test]
fn only_an_executed_draft_can_select_the_narrow_approval() -> anyhow::Result<()> {
let request = request()?;
assert_eq!(request.words["title"], "Review");
assert_eq!(
decide(&request, Decision::Executed)["outcome"]["optionId"],
"yes"
);
assert_eq!(
decide(&request, Decision::Refused)["outcome"]["optionId"],
"no"
);
assert_eq!(
decide(&request, Decision::Cancelled)["outcome"]["outcome"],
"cancelled"
);
Ok(())
}
#[test]
fn a_durable_option_never_substitutes_for_a_one_shot_decision() -> anyhow::Result<()> {
let request = Request::decode(
Version::One,
json!({"sessionId":"s", "toolCall":{"toolCallId":"t", "title":"Review"},
"options":[{"optionId":"durable","name":"Remember","kind":"allow_always"}]}),
"s",
65536,
)?;
assert_eq!(
decide(&request, Decision::Executed)["outcome"]["outcome"],
"cancelled"
);
assert_eq!(
decide(&request, Decision::Refused)["outcome"]["outcome"],
"cancelled"
);
Ok(())
}
#[test]
fn words_keep_the_options_but_exclude_raw_input_and_output() -> anyhow::Result<()> {
let request = request()?;
assert_eq!(request.words["options"].as_array().map(Vec::len), Some(3));
assert_eq!(request.act, "agent_permission");
Ok(())
}