use std::path::{Path, PathBuf};
use crate::session_manager::decommission_force::{DecommissionReport, ProvisioningDirt};
use crate::session_manager::manager::SessionManager;
use crate::session_manager::record::ManagedSessionId;
use crate::session_manager::worktree_git_fixture::GitWorktreeFixture;
use crate::session_manager::worktree_ownership_location::write_sentinel_bytes;
const TASK: &str = "Fix the bug\n";
fn tree_with_task_md(fx: &GitWorktreeFixture, name: &str, task_md: &str) -> PathBuf {
let wt = fx.add_worktree(name);
write_sentinel_bytes(&wt, b"").expect("write the admin-dir marker");
std::fs::write(wt.join("TASK.md"), task_md).expect("write TASK.md");
wt
}
async fn force_decommission(
fx: &GitWorktreeFixture,
ws: &Path,
owned: bool,
errored: bool,
) -> DecommissionReport {
let store = crate::test_support::hermetic_temp_dir();
let mgr = SessionManager::new(
store.path(),
crate::session_manager::tests::fake_with_pane(),
)
.await
.expect("manager");
let record = mgr
.create_with_id(
ManagedSessionId::new(),
TASK.into(),
Some(ws.to_path_buf()),
None,
Some(ws.to_path_buf()),
None,
None,
crate::runtime::RuntimeKind::default(),
false,
owned,
)
.await
.expect("create");
if errored {
mgr.mark_errored(&record.id, "spawn failed")
.await
.expect("mark errored");
}
mgr.decommission_with_root_checked(
&record.id,
&fx.repos_root,
None,
true,
ProvisioningDirt::Discard,
)
.await
.expect("a refusal is not an error")
}
#[tokio::test]
async fn force_decommission_through_the_manager_removes_an_unedited_task_md_tree() {
for owned in [false, true] {
for errored in [false, true] {
let fx = GitWorktreeFixture::new();
let name = format!("wire-8688-owned-{owned}-errored-{errored}");
let wt = tree_with_task_md(&fx, &name, TASK);
let report = force_decommission(&fx, &wt, owned, errored).await;
assert!(
report.workspace_removed,
"{name}: kept: {:?}",
report.workspace_kept_reason
);
assert!(!wt.exists(), "{name}: the tree is gone");
}
}
}
#[tokio::test]
async fn force_decommission_through_the_manager_keeps_an_edited_task_md_tree() {
for owned in [false, true] {
let fx = GitWorktreeFixture::new();
let name = format!("wire-8688-edited-owned-{owned}");
let edited = format!("{TASK}\n## Notes\n- keep me\n");
let wt = tree_with_task_md(&fx, &name, &edited);
let report = force_decommission(&fx, &wt, owned, true).await;
assert!(!report.workspace_removed, "{name}: must be kept");
let body = std::fs::read_to_string(wt.join("TASK.md")).expect("TASK.md survives");
assert_eq!(body, edited, "{name}");
let reason = report.workspace_kept_reason.expect("a kept tree names why");
assert!(reason.contains("TASK.md"), "{name}: {reason}");
}
}