use super::*;
use crate::cli_outbound::Cli;
use serde_json::json;
use tempfile::tempdir;
fn set() -> serde_json::Value {
json!([{"name": "Bash", "description": "run a command",
"input_schema": {"type": "object"}}])
}
fn quiet(root: &std::path::Path, data: &std::path::Path) -> ConsumerCtx {
over(
root,
world_of(data, &["home"]),
data.to_path_buf(),
Cli::new("/no/such/litany"),
)
}
#[test]
fn a_connections_advertisement_lands_under_its_own_identity() {
let root = tempdir().unwrap();
let data = tempdir().unwrap();
let ctx = quiet(root.path(), data.path());
let laptop = seat("laptop");
let reply = ctx.answer_as(&laptop, &json!({"op": "advertise", "tools": set()}));
assert_eq!(reply["kind"], "advertised");
assert_eq!(reply["ok"], true);
let stored = crate::registry::tools::read(root.path(), &laptop.client);
assert_eq!(stored.len(), 1);
assert_eq!(stored[0].name, "Bash");
ctx.answer_as(&seat("phone"), &json!({"op": "advertise", "tools": set()}));
assert_eq!(
crate::registry::tools::read(root.path(), &client("phone"))[0].name,
"Bash"
);
}
#[test]
fn the_in_world_intake_refuses_an_advertisement() {
let root = tempdir().unwrap();
let data = tempdir().unwrap();
let refusal =
quiet(root.path(), data.path()).answer(&json!({"op": "advertise", "tools": set()}));
assert_eq!(refusal["ok"], false);
assert!(
refusal["error"]
.as_str()
.unwrap_or_default()
.contains("no client identity"),
"{refusal}"
);
}
#[test]
fn the_roster_answers_the_registered_set_of_a_scoped_workspace() {
let root = tempdir().unwrap();
let data = tempdir().unwrap();
let ctx = quiet(root.path(), data.path());
let laptop = seat("laptop");
crate::registry::register(root.path(), &laptop.client, "home").unwrap();
ctx.answer_as(&laptop, &json!({"op": "advertise", "tools": set()}));
let reply = ctx.answer_as(&laptop, &json!({"op": "clients", "workspace": "home"}));
assert_eq!(reply["kind"], "clients");
assert_eq!(reply["rows"][0]["client"], "laptop");
assert_eq!(reply["rows"][0]["tools"][0]["name"], "Bash");
assert_eq!(reply["rows"][0]["present"], false);
let refusal = ctx.answer_as(
&seat("stranger"),
&json!({"op": "clients", "workspace": "home"}),
);
assert_eq!(refusal["error"], "unknown workspace \"home\"");
}