use crate::brain::agent::service::background_tasks::{register_session_route, resolve_route};
use crate::brain::agent::service::{MessageEnqueueCallback, QueuedUserMessage};
use std::sync::{Arc, Mutex};
use uuid::Uuid;
type DeliveryLog = Arc<Mutex<Vec<(&'static str, Uuid)>>>;
fn recording_callback(name: &'static str, log: DeliveryLog) -> MessageEnqueueCallback {
Arc::new(move |session_id, _msg: QueuedUserMessage| {
log.lock()
.expect("delivery log lock")
.push((name, session_id));
})
}
fn msg() -> QueuedUserMessage {
QueuedUserMessage::system("context".to_string(), "display".to_string())
}
#[test]
fn a_claimed_session_resumes_on_its_own_surface_not_the_executing_one() {
let log: DeliveryLog = Arc::new(Mutex::new(Vec::new()));
let session = Uuid::new_v4();
let executing = recording_callback("tui", log.clone());
register_session_route(session, recording_callback("channel", log.clone()));
resolve_route(session, &executing)(session, msg());
assert_eq!(
*log.lock().expect("delivery log lock"),
vec![("channel", session)],
"the owning surface must receive the completion, and the executing one must not"
);
}
#[test]
fn an_unclaimed_session_still_resumes_on_the_executing_surface() {
let log: DeliveryLog = Arc::new(Mutex::new(Vec::new()));
let session = Uuid::new_v4();
let executing = recording_callback("tui", log.clone());
resolve_route(session, &executing)(session, msg());
assert_eq!(
*log.lock().expect("delivery log lock"),
vec![("tui", session)],
"with nothing claiming the session the executing surface still delivers"
);
}
#[test]
fn claiming_a_session_twice_keeps_the_latest_surface() {
let log: DeliveryLog = Arc::new(Mutex::new(Vec::new()));
let session = Uuid::new_v4();
let executing = recording_callback("tui", log.clone());
register_session_route(session, recording_callback("stale", log.clone()));
register_session_route(session, recording_callback("channel", log.clone()));
resolve_route(session, &executing)(session, msg());
assert_eq!(
*log.lock().expect("delivery log lock"),
vec![("channel", session)],
"the most recent claim wins; a stale callback must not receive it"
);
}
#[test]
fn one_sessions_claim_does_not_capture_another_session() {
let log: DeliveryLog = Arc::new(Mutex::new(Vec::new()));
let claimed = Uuid::new_v4();
let local = Uuid::new_v4();
let executing = recording_callback("tui", log.clone());
register_session_route(claimed, recording_callback("channel", log.clone()));
resolve_route(claimed, &executing)(claimed, msg());
resolve_route(local, &executing)(local, msg());
assert_eq!(
*log.lock().expect("delivery log lock"),
vec![("channel", claimed), ("tui", local)],
"routing must be per session, not global"
);
}