use std::path::PathBuf;
use std::sync::Arc;
use uuid::Uuid;
use crate::brain::agent::service::AgentService;
use crate::brain::provider::Provider;
use crate::db::Database;
use crate::services::ServiceContext;
use crate::tests::agent_service_mocks::MockProvider;
async fn make_service() -> AgentService {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let context = ServiceContext::new(db.pool().clone());
let provider: Arc<dyn Provider> = Arc::new(MockProvider);
AgentService::new_for_test(provider, context).await
}
#[tokio::test]
async fn a_rebuild_replays_every_sessions_own_directory() {
let old = make_service().await;
let global = PathBuf::from("/tmp/rebuild-global");
old.set_working_directory(global.clone());
let pane_a = Uuid::new_v4();
let pane_b = Uuid::new_v4();
let untouched = Uuid::new_v4();
old.set_session_only_working_directory(pane_a, PathBuf::from("/tmp/rebuild-pane-a"));
old.set_session_only_working_directory(pane_b, PathBuf::from("/tmp/rebuild-pane-b"));
let carried_global = old.working_directory().read().unwrap().clone();
let snapshot = old.session_working_dir_snapshot();
let fresh = make_service()
.await
.with_working_directory(carried_global.clone());
for (sid, dir) in snapshot {
fresh.set_session_only_working_directory(sid, dir);
}
assert_eq!(
fresh.get_working_directory_for_session(pane_a),
PathBuf::from("/tmp/rebuild-pane-a"),
"pane A lost its own directory across the rebuild (#2008)"
);
assert_eq!(
fresh.get_working_directory_for_session(pane_b),
PathBuf::from("/tmp/rebuild-pane-b"),
"pane B lost its own directory across the rebuild (#2008)"
);
assert_eq!(
fresh.get_working_directory_for_session(untouched),
carried_global,
"a session that never chose a directory must follow the global"
);
}
#[test]
fn rebuild_agent_service_carries_the_session_directory_snapshot() {
let src = std::fs::read_to_string(concat!(env!("CARGO_MANIFEST_DIR"), "/src/tui/app/state.rs"))
.expect("read tui/app/state.rs");
let mut lines = src.lines();
let mut body: Vec<&str> = Vec::new();
let mut inside = false;
for line in lines.by_ref() {
if line.contains("async fn rebuild_agent_service(") {
inside = true;
continue;
}
if inside {
let is_next_method = line
.strip_prefix(" ")
.is_some_and(|rest| rest.starts_with("pub ") || rest.starts_with("fn "));
if is_next_method {
break;
}
body.push(line);
}
}
assert!(inside, "rebuild_agent_service must still exist in state.rs");
let body = body.join("\n");
assert!(
body.contains(".session_working_dir_snapshot()"),
"#2008: rebuild_agent_service must snapshot the per-session working \
directories before it replaces the service"
);
assert!(
body.contains(".set_session_only_working_directory("),
"#2008: rebuild_agent_service must replay the snapshot onto the new \
service without moving the global"
);
}