use std::path::PathBuf;
use tempfile::TempDir;
use super::manager::ManagedError;
use super::record::ManagedSessionState;
use super::tests::make_manager;
#[tokio::test]
async fn manager_adopt_existing_registers_active() {
let dir = TempDir::new().unwrap();
let (mgr, fake) = make_manager(&dir).await;
fake.seeded_names
.lock()
.unwrap()
.push("tmpm-hand-started".into());
let record = mgr
.adopt_existing(
"tmpm-hand-started",
PathBuf::from("/Users/op/work/proj"),
"drive my hand-started session".into(),
crate::runtime::RuntimeKind::default(),
false,
)
.await
.expect("adopt existing");
assert_eq!(record.tmux_name, "tmpm-hand-started");
assert_eq!(record.state, ManagedSessionState::Active);
assert_eq!(record.cwd, PathBuf::from("/Users/op/work/proj"));
assert_eq!(record.task, "drive my hand-started session");
assert!(
fake.create_cwd_calls.lock().unwrap().is_empty(),
"adopt_existing must NOT call create_session; calls: {:?}",
fake.create_cwd_calls.lock().unwrap()
);
let got = mgr.get(&record.id).await.expect("get adopted");
assert_eq!(got.id, record.id);
assert_eq!(got.state, ManagedSessionState::Active);
}
#[tokio::test]
async fn manager_adopt_existing_missing_tmux_errors() {
let dir = TempDir::new().unwrap();
let (mgr, _fake) = make_manager(&dir).await;
let err = mgr
.adopt_existing(
"tmpm-not-here",
PathBuf::from("/tmp/x"),
String::new(),
crate::runtime::RuntimeKind::default(),
false,
)
.await
.expect_err("adopting a nonexistent pane must fail");
assert!(
matches!(err, ManagedError::TmuxSessionMissing(ref n) if n == "tmpm-not-here"),
"expected TmuxSessionMissing, got {err:?}"
);
}
#[tokio::test]
async fn manager_adopt_existing_double_adopt_errors() {
let dir = TempDir::new().unwrap();
let (mgr, fake) = make_manager(&dir).await;
fake.seeded_names.lock().unwrap().push("tmpm-once".into());
mgr.adopt_existing(
"tmpm-once",
PathBuf::from("/tmp/once"),
String::new(),
crate::runtime::RuntimeKind::default(),
false,
)
.await
.expect("first adopt succeeds");
let err = mgr
.adopt_existing(
"tmpm-once",
PathBuf::from("/tmp/once"),
String::new(),
crate::runtime::RuntimeKind::default(),
false,
)
.await
.expect_err("second adopt of the same pane must fail");
assert!(
matches!(err, ManagedError::AlreadyAdopted(ref n) if n == "tmpm-once"),
"expected AlreadyAdopted, got {err:?}"
);
}
#[tokio::test]
async fn manager_adopt_existing_allows_non_tmpm_name() {
let dir = TempDir::new().unwrap();
let (mgr, fake) = make_manager(&dir).await;
fake.seeded_names
.lock()
.unwrap()
.push("my-cli-session".into());
let record = mgr
.adopt_existing(
"my-cli-session",
PathBuf::from("/Users/op/repo"),
"adopt non-prefixed".into(),
crate::runtime::RuntimeKind::default(),
false,
)
.await
.expect("non-tmpm names are adoptable on the explicit path");
assert_eq!(record.tmux_name, "my-cli-session");
assert_eq!(record.state, ManagedSessionState::Active);
}
#[tokio::test]
async fn manager_adopt_existing_persists_ephemeral_flag() {
let dir = TempDir::new().unwrap();
let (mgr, fake) = make_manager(&dir).await;
fake.seeded_names
.lock()
.unwrap()
.push("tmpm-eph-adopt".into());
let record = mgr
.adopt_existing(
"tmpm-eph-adopt",
PathBuf::from("/tmp/adopt"),
"throwaway adopt".into(),
crate::runtime::RuntimeKind::default(),
true,
)
.await
.expect("adopt ephemeral");
assert!(
mgr.get(&record.id).await.unwrap().ephemeral,
"adopted ephemeral flag persisted"
);
}