use tempfile::TempDir;
use super::manager::ManagedTmuxDriver;
use super::record::{ManagedSessionId, ManagedSessionState};
use super::tests::{make_manager, seed_record};
#[tokio::test]
async fn delete_record_stale_active_deletable_when_tmux_dead() {
let dir = TempDir::new().unwrap();
let (mgr, fake) = make_manager(&dir).await;
let id = ManagedSessionId::new();
seed_record(&mgr, &dir, id, ManagedSessionState::Active, false).await;
fake.kill_session(&format!("tmpm-seed-{id}"))
.expect("simulate tmux death");
mgr.delete_record(&id, false).await.expect(
"a stale Active record whose tmux is actually dead must be deletable without --force",
);
assert_eq!(
mgr.get(&id).await.expect("record still tracked").state,
ManagedSessionState::Deleted
);
}
#[tokio::test]
async fn prune_stale_active_removable_without_force_when_tmux_dead() {
let dir = TempDir::new().unwrap();
let (mgr, fake) = make_manager(&dir).await;
let stale = ManagedSessionId::new();
let live = ManagedSessionId::new();
seed_record(&mgr, &dir, stale, ManagedSessionState::Active, false).await;
seed_record(&mgr, &dir, live, ManagedSessionState::Active, false).await;
fake.kill_session(&format!("tmpm-seed-{stale}"))
.expect("simulate tmux death");
let outcome = mgr
.prune_managed(crate::session_manager::PruneFilter::All, false, false, None)
.await
.expect("prune all");
assert_eq!(
outcome.count(),
1,
"only the stale (tmux-dead) Active record is reaped"
);
assert_eq!(
mgr.get(&stale).await.unwrap().state,
ManagedSessionState::Decommissioned,
"stale Active with dead tmux must be reaped without --force (#2022)"
);
assert_eq!(
mgr.get(&live).await.unwrap().state,
ManagedSessionState::Active,
"a genuinely live (tmux-alive) session must still be guarded"
);
}