diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-17 23:55:08 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-17 23:59:56 +0300 |
| commit | e0758c32118f2aa006db3d8fa4b41833fe6e7ead (patch) | |
| tree | 2b29dd61ebf870db8d0ac95cc0b4515178c834c4 /tests/api_ping.rs | |
| parent | 040956531f673c8fb7720037494ed4e61b123c6c (diff) | |
feat: harden named agent cli workflows
refs #1525
Diffstat (limited to 'tests/api_ping.rs')
| -rw-r--r-- | tests/api_ping.rs | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/tests/api_ping.rs b/tests/api_ping.rs index a52e71c3..0e0b711e 100644 --- a/tests/api_ping.rs +++ b/tests/api_ping.rs @@ -304,7 +304,7 @@ fn ping_over_socket_returns_version() { assert_eq!(value["result"]["version"], env!("CARGO_PKG_VERSION")); // Intentionally hardcoded so wire protocol bumps require updating this test. // Changing this value means old clients/servers are no longer compatible. - assert_eq!(value["result"]["protocol"], 16); + assert_eq!(value["result"]["protocol"], 17); cleanup_spawned_herdr(child, base); } @@ -1035,50 +1035,76 @@ fn new_terminal_cwd_follow_ignores_nonleader_group_member_cwd() { #[cfg(not(target_os = "macos"))] #[test] -fn agent_start_creates_named_terminal_over_socket() { +fn agent_start_targets_existing_pane_over_socket() { + use std::os::unix::fs::PermissionsExt; + 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 bin = base.join("bin"); + fs::create_dir_all(&bin).unwrap(); + let fake_pi = bin.join("pi"); + fs::write(&fake_pi, "#!/bin/sh\nHERDR_AGENT=pi exec /bin/sleep 20\n").unwrap(); + fs::set_permissions(&fake_pi, fs::Permissions::from_mode(0o755)).unwrap(); - let child = spawn_herdr(&config_home, &runtime_dir, &socket_path); + let child = spawn_herdr_with_path(&config_home, &runtime_dir, &socket_path, Some(&bin)); wait_for_socket(&socket_path, Duration::from_secs(5)); - - let started = send_request( + let workspace = send_request( &socket_path, - &format!( - r#"{{"id":"agent_start","method":"agent.start","params":{{"name":"main","cwd":"{}","argv":["/bin/sh","-c","printf agent-start-ok; sleep 2"]}}}}"#, - base.display() - ), - ); - assert_eq!(started["result"]["type"], "agent_started"); - assert_eq!(started["result"]["agent"]["name"], "main"); - assert_eq!( - started["result"]["agent"]["cwd"], - base.display().to_string() + &serde_json::json!({ + "id": "agent_workspace", + "method": "workspace.create", + "params": { "cwd": base.display().to_string(), "focus": false } + }) + .to_string(), ); - assert_eq!(started["result"]["argv"][0], "/bin/sh"); - let terminal_id = started["result"]["agent"]["terminal_id"] + let pane_id = workspace["result"]["root_pane"]["pane_id"] + .as_str() + .unwrap() + .to_string(); + let terminal_id = workspace["result"]["root_pane"]["terminal_id"] .as_str() .unwrap() .to_string(); - let listed = send_request( + let started = send_request( &socket_path, - r#"{"id":"agent_start_list","method":"agent.list","params":{}}"#, + &serde_json::json!({ + "id": "agent_start", + "method": "agent.start", + "params": { + "name": "main", + "kind": "pi", + "pane_id": pane_id, + "args": ["--no-session"], + "timeout_ms": 8_000 + } + }) + .to_string(), + ); + assert_eq!(started["result"]["type"], "agent_started"); + assert_eq!(started["result"]["agent"]["name"], "main"); + assert_eq!(started["result"]["agent"]["pane_id"], pane_id); + assert_eq!(started["result"]["agent"]["terminal_id"], terminal_id); + assert_eq!( + started["result"]["argv"], + serde_json::json!(["pi", "--no-session"]) ); - let agents = listed["result"]["agents"].as_array().unwrap(); - assert_eq!(agents.len(), 1); - assert_eq!(agents[0]["terminal_id"], terminal_id); - assert_eq!(agents[0]["name"], "main"); let duplicate = send_request( &socket_path, - &format!( - r#"{{"id":"agent_start_duplicate","method":"agent.start","params":{{"name":"main","cwd":"{}","argv":["/bin/sh","-c","true"]}}}}"#, - base.display() - ), + &serde_json::json!({ + "id": "agent_start_duplicate", + "method": "agent.start", + "params": { + "name": "main", + "kind": "pi", + "pane_id": pane_id + } + }) + .to_string(), ); assert_eq!(duplicate["error"]["code"], "agent_name_taken"); assert!(duplicate["error"]["message"] |
