use crate::boundary::dispatch::{Caller, Deps, dispatch};
use crate::boundary::reply::Reply;
use crate::boundary::{Action, Query, answer};
use crate::cli_outbound::Cli;
use crate::git_tree::{Agent, AgentState};
use crate::ui_state::UiState;
use std::path::PathBuf;
use std::sync::Arc;
use tempfile::{TempDir, tempdir};
const ROOT: &str = "20260101T000000Z-aaaa";
const MINTED: &str = "pale-otter";
fn world() -> (TempDir, PathBuf, Deps) {
let dir = tempdir().expect("tempdir");
let ws = dir.path().join("names").join("alba");
let named = Agent {
name: Some(MINTED.to_owned()),
..crate::boundary::tests::agent(ROOT, AgentState::Quiescent, 1)
};
let deps = Deps {
litany: Cli::new("/usr/bin/true"),
bl: Cli::new("/no/such/bl"),
state_root: dir.path().join("state"),
home: dir.path().join("home"),
yog_data_root: dir.path().join("data"),
balls_state_root: dir.path().join("balls"),
yog_binary: PathBuf::from("/no/such/yog"),
world: crate::test_support::no_world(),
snapshot: Arc::new(crate::boundary::tests::snapshot(
&ws,
"alba",
vec![named],
vec![],
)),
caller: Caller::default(),
};
(dir, ws, deps)
}
fn ui() -> UiState {
UiState::open(PathBuf::from("/nonexistent/ui.json"))
}
#[test]
fn a_read_asked_by_the_minted_name_answers_about_the_root() {
let (_dir, ws, deps) = world();
let asked = Query::Agent {
workspace: crate::naming::leaf(&ws),
agent: MINTED.to_owned(),
};
match answer::answer(&asked, &deps, &ui(), 0).expect("answered") {
Reply::Agent(view) => {
assert_eq!(view.agent_id, ROOT, "the id the name resolved to");
assert_eq!(view.name, MINTED, "and the §3.3 ladder still names it");
}
other => panic!("a seat read answers an agent, not {other:?}"),
}
}
#[test]
fn a_floor_written_by_name_is_keyed_on_the_resolved_id() {
let (_dir, ws, deps) = world();
let landed = dispatch(
&deps,
&mut ui(),
"1000",
&Action::Floor {
workspace: crate::naming::leaf(&ws),
agent: MINTED.to_owned(),
raised: true,
},
);
assert_eq!(landed.expect("written"), Reply::Floored { standing: true });
let rows = crate::opslog::tail(&deps.state_root, usize::MAX);
assert_eq!(rows.len(), 1, "one row, nothing else");
assert_eq!(rows[0].argv, vec!["yog-control", "floor", ROOT, "raise"]);
}
#[test]
fn an_unknown_name_refuses_before_any_executor_runs() {
let (_dir, ws, deps) = world();
let why = dispatch(
&deps,
&mut ui(),
"1000",
&Action::Floor {
workspace: crate::naming::leaf(&ws),
agent: "grey-heron".to_owned(),
raised: true,
},
)
.expect_err("refused");
assert!(why.contains("unknown conversation"), "{why}");
assert!(
crate::opslog::tail(&deps.state_root, usize::MAX).is_empty(),
"nothing ran"
);
}