aboutsummaryrefslogtreecommitdiff
path: root/src/app/mod.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-31 21:18:40 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-31 21:18:40 +0300
commit8cf0e9b35b00f9dd91270fcd3931015d61ffd8a0 (patch)
tree2b76b158344fdbe0de17c6abe98564a262266d2f /src/app/mod.rs
parent859185b491c5a80e888ba8f9dd213d2c35baa034 (diff)
fix: confirm implicit worktree group close
refs #369
Diffstat (limited to 'src/app/mod.rs')
-rw-r--r--src/app/mod.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs
index 11931e51..661926ee 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -2889,6 +2889,47 @@ mod tests {
}
#[test]
+ fn pane_close_request_requires_confirmation_before_closing_parent_worktree_group() {
+ let mut app = test_app();
+ let mut parent = Workspace::test_new("api-pane-close-parent");
+ parent.worktree_space = Some(crate::workspace::WorktreeSpaceMembership {
+ key: "repo-key".into(),
+ label: "herdr".into(),
+ repo_root: "/repo/herdr".into(),
+ checkout_path: "/repo/herdr".into(),
+ is_linked_worktree: false,
+ });
+ let mut child = Workspace::test_new("api-pane-close-child");
+ child.worktree_space = Some(crate::workspace::WorktreeSpaceMembership {
+ key: "repo-key".into(),
+ label: "herdr".into(),
+ repo_root: "/repo/herdr".into(),
+ checkout_path: "/repo/herdr-child".into(),
+ is_linked_worktree: true,
+ });
+ app.state.workspaces = vec![parent, child];
+ app.state.ensure_test_terminals();
+ app.state.active = Some(0);
+ app.state.selected = 1;
+
+ let target_pane = app.state.workspaces[0].tabs[0].root_pane;
+ let target_pane_id = app.pane_info(0, target_pane).unwrap().pane_id;
+
+ let response = app.handle_api_request(crate::api::schema::Request {
+ id: "req_pane_close_parent_group".into(),
+ method: crate::api::schema::Method::PaneClose(crate::api::schema::PaneTarget {
+ pane_id: target_pane_id,
+ }),
+ });
+ let response: serde_json::Value = serde_json::from_str(&response).unwrap();
+
+ assert_eq!(response["error"]["code"], "confirmation_required");
+ assert_eq!(app.state.mode, Mode::ConfirmClose);
+ assert_eq!(app.state.selected, 0);
+ assert_eq!(app.state.workspaces.len(), 2);
+ }
+
+ #[test]
fn session_dirty_flag_schedules_debounced_save() {
let mut app = test_app();
app.no_session = false;