use tempfile::TempDir;
use super::manager::ManagedError;
use super::record::{ManagedSessionId, ManagedSessionState};
use super::tests::{make_manager, seed_record};
#[tokio::test]
async fn stop_refuses_terminal_record() {
let dir = TempDir::new().unwrap();
let (mgr, _fake) = make_manager(&dir).await;
for terminal in [
ManagedSessionState::Deleted,
ManagedSessionState::Decommissioned,
] {
let id = ManagedSessionId::new();
seed_record(&mgr, &dir, id, terminal.clone(), false).await;
let err = mgr
.stop(&id)
.await
.expect_err("a terminal record must not be stoppable (resurrection guard)");
assert!(
matches!(err, ManagedError::InvalidState(_, _)),
"expected InvalidState for {terminal:?}, got {err:?}"
);
assert_eq!(mgr.get(&id).await.expect("record present").state, terminal);
}
}
#[tokio::test]
async fn delete_record_marks_deleted() {
let dir = TempDir::new().unwrap();
let (mgr, _fake) = make_manager(&dir).await;
let id = ManagedSessionId::new();
seed_record(&mgr, &dir, id, ManagedSessionState::Stopped, false).await;
let prior = mgr.delete_record(&id, false).await.expect("delete");
assert_eq!(prior.state, ManagedSessionState::Stopped);
let after = mgr.get(&id).await.expect("record must still exist");
assert_eq!(after.state, ManagedSessionState::Deleted);
}
#[tokio::test]
async fn delete_record_refuses_running_without_force() {
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;
let err = mgr
.delete_record(&id, false)
.await
.expect_err("must refuse to delete a running session without --force");
assert!(
matches!(err, ManagedError::InvalidState(ref sid, _) if sid == &id.to_string()),
"expected InvalidState for {id}, got: {err:?}"
);
let still_there = mgr.get(&id).await.expect("record must still exist");
assert_eq!(still_there.state, ManagedSessionState::Active);
}
#[tokio::test]
async fn delete_record_force_bypasses_running_guard() {
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;
mgr.delete_record(&id, true)
.await
.expect("--force must bypass the running guard");
let after = mgr.get(&id).await.expect("record must still exist");
assert_eq!(after.state, ManagedSessionState::Deleted);
}
#[tokio::test]
async fn delete_record_never_touches_workspace_dir() {
let dir = TempDir::new().unwrap();
let (mgr, _fake) = make_manager(&dir).await;
let id = ManagedSessionId::new();
let ws = seed_record(&mgr, &dir, id, ManagedSessionState::Stopped, false).await;
assert!(ws.exists(), "test invariant: workspace dir must pre-exist");
mgr.delete_record(&id, false).await.expect("delete");
assert_eq!(
mgr.get(&id).await.expect("record still tracked").state,
ManagedSessionState::Deleted,
"record must be marked Deleted (kept in the store)"
);
assert!(
ws.exists(),
"workspace directory must NOT be removed by delete_record (store-only op)"
);
}