aboutsummaryrefslogtreecommitdiff
path: root/tests/api_ping.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-02 23:59:54 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-03 00:04:35 +0300
commit544c7ebebbc1db65a2949642d367edc446ae559b (patch)
treee952f462ab99ebb4375d7952e8994711d30ed019 /tests/api_ping.rs
parente434904d10da1f2517b2c0411946947c37ffee0d (diff)
feat: add tabs to socket api
Diffstat (limited to 'tests/api_ping.rs')
-rw-r--r--tests/api_ping.rs113
1 files changed, 107 insertions, 6 deletions
diff --git a/tests/api_ping.rs b/tests/api_ping.rs
index 6b7cbf24..94e1e3f9 100644
--- a/tests/api_ping.rs
+++ b/tests/api_ping.rs
@@ -230,6 +230,8 @@ fn workspace_list_and_create_round_trip() {
assert_eq!(created["result"]["workspace"]["workspace_id"], "1");
assert_eq!(created["result"]["workspace"]["number"], 1);
assert_eq!(created["result"]["workspace"]["focused"], true);
+ assert_eq!(created["result"]["workspace"]["tab_count"], 1);
+ assert_eq!(created["result"]["workspace"]["active_tab_id"], "1:1");
let listed = send_request(
&socket_path,
@@ -252,6 +254,7 @@ fn workspace_list_and_create_round_trip() {
let panes = panes["result"]["panes"].as_array().unwrap();
assert_eq!(panes.len(), 1);
assert_eq!(panes[0]["workspace_id"], "1");
+ assert_eq!(panes[0]["tab_id"], "1:1");
let pane_id = panes[0]["pane_id"].as_str().unwrap().to_string();
let pane = send_request(
@@ -271,6 +274,7 @@ fn workspace_list_and_create_round_trip() {
),
);
assert_eq!(read["result"]["read"]["pane_id"], pane_id);
+ assert_eq!(read["result"]["read"]["tab_id"], "1:1");
assert!(read["result"]["read"]["text"].is_string());
let send_text = send_request(
@@ -347,6 +351,72 @@ fn workspace_list_and_create_round_trip() {
#[cfg(not(target_os = "macos"))]
#[test]
+fn tab_methods_round_trip_over_socket() {
+ let _lock = test_lock();
+ let base = unique_test_dir();
+ let config_home = base.join("config");
+ let runtime_dir = base.join("runtime");
+ let socket_path = runtime_dir.join("herdr.sock");
+
+ let child = spawn_herdr(&config_home, &runtime_dir, &socket_path);
+ wait_for_socket(&socket_path, Duration::from_secs(5));
+
+ let created = send_request(
+ &socket_path,
+ &format!(
+ r#"{{"id":"req_t1","method":"workspace.create","params":{{"cwd":"{}","focus":true}}}}"#,
+ base.display()
+ ),
+ );
+ assert_eq!(created["result"]["workspace"]["active_tab_id"], "1:1");
+
+ let tab_created = send_request(
+ &socket_path,
+ r#"{"id":"req_t2","method":"tab.create","params":{"workspace_id":"1","focus":true}}"#,
+ );
+ assert_eq!(tab_created["result"]["type"], "tab_info");
+ assert_eq!(tab_created["result"]["tab"]["tab_id"], "1:2");
+ assert_eq!(tab_created["result"]["tab"]["focused"], true);
+
+ let tab_list = send_request(
+ &socket_path,
+ r#"{"id":"req_t3","method":"tab.list","params":{"workspace_id":"1"}}"#,
+ );
+ let tabs = tab_list["result"]["tabs"].as_array().unwrap();
+ assert_eq!(tabs.len(), 2);
+ assert_eq!(tabs[0]["tab_id"], "1:1");
+ assert_eq!(tabs[1]["tab_id"], "1:2");
+
+ let tab_get = send_request(
+ &socket_path,
+ r#"{"id":"req_t4","method":"tab.get","params":{"tab_id":"1:2"}}"#,
+ );
+ assert_eq!(tab_get["result"]["tab"]["tab_id"], "1:2");
+
+ let renamed = send_request(
+ &socket_path,
+ r#"{"id":"req_t5","method":"tab.rename","params":{"tab_id":"1:2","label":"logs"}}"#,
+ );
+ assert_eq!(renamed["result"]["tab"]["label"], "logs");
+
+ let focused = send_request(
+ &socket_path,
+ r#"{"id":"req_t6","method":"tab.focus","params":{"tab_id":"1:1"}}"#,
+ );
+ assert_eq!(focused["result"]["tab"]["tab_id"], "1:1");
+ assert_eq!(focused["result"]["tab"]["focused"], true);
+
+ let closed = send_request(
+ &socket_path,
+ r#"{"id":"req_t7","method":"tab.close","params":{"tab_id":"1:2"}}"#,
+ );
+ assert_eq!(closed["result"]["type"], "ok");
+
+ cleanup_spawned_herdr(child, base);
+}
+
+#[cfg(not(target_os = "macos"))]
+#[test]
fn events_subscribe_streams_lifecycle_and_agent_events() {
let _lock = test_lock();
let base = unique_test_dir();
@@ -382,7 +452,7 @@ fn events_subscribe_streams_lifecycle_and_agent_events() {
let mut reader = open_subscription(
&socket_path,
- r#"{"id":"sub_life","method":"events.subscribe","params":{"subscriptions":[{"type":"workspace.created"},{"type":"workspace.focused"},{"type":"pane.created"},{"type":"pane.focused"},{"type":"pane.agent_detected"},{"type":"pane.closed"},{"type":"workspace.closed"}]}}"#,
+ r#"{"id":"sub_life","method":"events.subscribe","params":{"subscriptions":[{"type":"workspace.created"},{"type":"workspace.focused"},{"type":"tab.created"},{"type":"tab.focused"},{"type":"tab.renamed"},{"type":"tab.closed"},{"type":"pane.created"},{"type":"pane.focused"},{"type":"pane.agent_detected"},{"type":"pane.closed"},{"type":"workspace.closed"}]}}"#,
);
let ack = reader.read_json_line(Duration::from_secs(2));
@@ -410,6 +480,10 @@ fn events_subscribe_streams_lifecycle_and_agent_events() {
let workspace_focused =
wait_for_event(&mut reader, "workspace_focused", Duration::from_secs(2));
assert_eq!(workspace_focused["data"]["workspace_id"], workspace_id);
+ let tab_created = wait_for_event(&mut reader, "tab_created", Duration::from_secs(2));
+ assert_eq!(tab_created["data"]["tab"]["tab_id"], "1:1");
+ let tab_focused = wait_for_event(&mut reader, "tab_focused", Duration::from_secs(2));
+ assert_eq!(tab_focused["data"]["tab_id"], "1:1");
let pane_created = wait_for_event(&mut reader, "pane_created", Duration::from_secs(2));
let pane_id = pane_created["data"]["pane"]["pane_id"]
.as_str()
@@ -439,13 +513,32 @@ fn events_subscribe_streams_lifecycle_and_agent_events() {
assert_eq!(agent_detected["data"]["pane_id"], pane_id);
assert_eq!(agent_detected["data"]["agent"], "pi");
- let split = send_request(
+ let new_tab = send_request(
&socket_path,
&format!(
- r#"{{"id":"req_l4","method":"pane.split","params":{{"target_pane_id":"{}","direction":"right","focus":true}}}}"#,
- pane_id
+ r#"{{"id":"req_l4","method":"tab.create","params":{{"workspace_id":"{}","focus":true}}}}"#,
+ workspace_id
),
);
+ assert_eq!(new_tab["result"]["tab"]["tab_id"], "1:2");
+ let created_tab_event = wait_for_event(&mut reader, "tab_created", Duration::from_secs(2));
+ assert_eq!(created_tab_event["data"]["tab"]["tab_id"], "1:2");
+ let focused_tab_event = wait_for_event(&mut reader, "tab_focused", Duration::from_secs(2));
+ assert_eq!(focused_tab_event["data"]["tab_id"], "1:2");
+
+ let renamed_tab = send_request(
+ &socket_path,
+ r#"{"id":"req_l5","method":"tab.rename","params":{"tab_id":"1:2","label":"logs"}}"#,
+ );
+ assert_eq!(renamed_tab["result"]["tab"]["label"], "logs");
+ let renamed_event = wait_for_event(&mut reader, "tab_renamed", Duration::from_secs(2));
+ assert_eq!(renamed_event["data"]["tab_id"], "1:2");
+ assert_eq!(renamed_event["data"]["label"], "logs");
+
+ let split = send_request(
+ &socket_path,
+ r#"{"id":"req_l6","method":"pane.split","params":{"target_pane_id":"1-2","direction":"right","focus":true}}"#,
+ );
let split_pane_id = split["result"]["pane"]["pane_id"]
.as_str()
.unwrap()
@@ -456,7 +549,7 @@ fn events_subscribe_streams_lifecycle_and_agent_events() {
let closed = send_request(
&socket_path,
&format!(
- r#"{{"id":"req_l5","method":"pane.close","params":{{"pane_id":"{}"}}}}"#,
+ r#"{{"id":"req_l7","method":"pane.close","params":{{"pane_id":"{}"}}}}"#,
split_pane_id
),
);
@@ -464,10 +557,18 @@ fn events_subscribe_streams_lifecycle_and_agent_events() {
let pane_closed = wait_for_event(&mut reader, "pane_closed", Duration::from_secs(2));
assert_eq!(pane_closed["data"]["pane_id"], split_pane_id);
+ let closed_tab = send_request(
+ &socket_path,
+ r#"{"id":"req_l8","method":"tab.close","params":{"tab_id":"1:2"}}"#,
+ );
+ assert_eq!(closed_tab["result"]["type"], "ok");
+ let tab_closed = wait_for_event(&mut reader, "tab_closed", Duration::from_secs(2));
+ assert_eq!(tab_closed["data"]["tab_id"], "1:2");
+
let closed_ws = send_request(
&socket_path,
&format!(
- r#"{{"id":"req_l6","method":"workspace.close","params":{{"workspace_id":"{}"}}}}"#,
+ r#"{{"id":"req_l9","method":"workspace.close","params":{{"workspace_id":"{}"}}}}"#,
workspace_id
),
);