diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-19 23:52:20 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-19 23:56:07 +0300 |
| commit | 3f80947678a9723434aa7fddfe23750b5393e24c (patch) | |
| tree | 6f463797132acfc51dfb6e135820a052954b4f13 /tests/cli/agent_transport.rs | |
| parent | f76f895efe5b9f19aa9db909354c6c0f2195630b (diff) | |
feat: make agent automation a first-class cli primitive
Diffstat (limited to 'tests/cli/agent_transport.rs')
| -rw-r--r-- | tests/cli/agent_transport.rs | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/tests/cli/agent_transport.rs b/tests/cli/agent_transport.rs new file mode 100644 index 00000000..42e67828 --- /dev/null +++ b/tests/cli/agent_transport.rs @@ -0,0 +1,146 @@ +use super::harness::*; + +#[test] +fn agent_start_accepts_durable_readiness_during_detection_gap() { + let base = unique_test_dir(); + fs::create_dir_all(&base).unwrap(); + let socket_path = base.join("herdr.sock"); + let listener = UnixListener::bind(&socket_path).unwrap(); + + let server = thread::spawn(move || { + let (mut start_stream, start_line) = accept_fake_cli_operation(&listener); + let start: serde_json::Value = serde_json::from_str(&start_line).unwrap(); + assert_eq!(start["method"], "agent.start"); + writeln!( + start_stream, + "{}", + serde_json::json!({ + "id": start["id"], + "result": { + "type": "agent_started", + "agent": { + "pane_id": "w1:p1", + "terminal_id": "term_1", + "name": "reviewer" + }, + "argv": ["opencode"] + } + }) + ) + .unwrap(); + start_stream.flush().unwrap(); + + let (mut get_stream, get_line) = accept_fake_cli_operation(&listener); + let get: serde_json::Value = serde_json::from_str(&get_line).unwrap(); + assert_eq!(get["method"], "agent.get"); + assert_eq!(get["params"]["target"], "reviewer"); + writeln!( + get_stream, + "{}", + serde_json::json!({ + "id": get["id"], + "result": { + "type": "agent_info", + "agent": { + "agent": null, + "agent_status": "unknown", + "interactive_ready": true, + "launch_pending": false, + "name": "reviewer", + "pane_id": "w1:p1", + "terminal_id": "term_1" + } + } + }) + ) + .unwrap(); + get_stream.flush().unwrap(); + }); + + let started = run_cli( + &socket_path, + &[ + "agent", "start", "reviewer", "--kind", "opencode", "--pane", "w1:p1", + ], + ); + assert!( + started.status.success(), + "stderr: {}", + String::from_utf8_lossy(&started.stderr) + ); + let started: serde_json::Value = serde_json::from_slice(&started.stdout).unwrap(); + assert_eq!(started["result"]["type"], "agent_started"); + assert_eq!(started["result"]["agent"]["name"], "reviewer"); + assert!(started["result"]["agent"]["interactive_ready"] + .as_bool() + .unwrap()); + + server.join().unwrap(); + cleanup_test_base(&base); +} + +#[test] +fn prompt_wait_is_sent_as_one_agent_request() { + let base = unique_test_dir(); + fs::create_dir_all(&base).unwrap(); + let socket_path = base.join("herdr.sock"); + let listener = UnixListener::bind(&socket_path).unwrap(); + + let server = thread::spawn(move || { + let (mut prompt_stream, prompt_line) = accept_fake_cli_operation(&listener); + let prompt: serde_json::Value = serde_json::from_str(&prompt_line).unwrap(); + assert_eq!(prompt["method"], "agent.prompt"); + assert_eq!(prompt["params"]["target"], "w1:p1"); + assert_eq!( + prompt["params"]["wait"]["until"], + serde_json::json!(["idle"]) + ); + assert!(prompt["params"]["wait"].get("timeout_ms").is_none()); + writeln!( + prompt_stream, + "{}", + serde_json::json!({ + "id": prompt["id"], + "result": { + "type": "agent_prompted", + "agent": { + "pane_id": "w1:p1", + "terminal_id": "term_1", + "name": "reviewer", + "agent": "pi", + "agent_status": "idle", + "workspace_id": "w1", + "tab_id": "w1:t1", + "focused": true, + "revision": 0 + } + } + }) + ) + .unwrap(); + prompt_stream.flush().unwrap(); + }); + + let prompted = run_cli( + &socket_path, + &[ + "agent", + "prompt", + "w1:p1", + "review this", + "--wait", + "--until", + "idle", + ], + ); + assert!( + prompted.status.success(), + "stderr: {}", + String::from_utf8_lossy(&prompted.stderr) + ); + let prompted: serde_json::Value = serde_json::from_slice(&prompted.stdout).unwrap(); + assert_eq!(prompted["result"]["agent"]["name"], "reviewer"); + + server.join().unwrap(); + cleanup_test_base(&base); +} |
