diff options
Diffstat (limited to 'tests/cli/agents.rs')
| -rw-r--r-- | tests/cli/agents.rs | 111 |
1 files changed, 57 insertions, 54 deletions
diff --git a/tests/cli/agents.rs b/tests/cli/agents.rs index c3e98f86..cc5af061 100644 --- a/tests/cli/agents.rs +++ b/tests/cli/agents.rs @@ -223,11 +223,9 @@ fn agent_start_command_works() { fs::write( &fake_pi, format!( - "#!/bin/sh\nprintf '%s\\n' \"$@\" > '{}'\nexport HERDR_AGENT=pi\n'{}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state idle >/dev/null\nwhile IFS= read -r prompt; do\n case \"$prompt\" in \"do not transition\"|\"stall\") continue ;; esac\n '{}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state working >/dev/null\n '{}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state idle >/dev/null\n printf '%s\\n' \"$prompt\" >> '{}'\ndone\n", + "#!/bin/sh\nprintf '%s\\n' \"$@\" > '{0}'\nexport HERDR_AGENT=pi\n'{1}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state idle >/dev/null\nwhile IFS= read -r prompt; do\n case \"$prompt\" in\n \"do not transition\") continue ;;\n \"done churn\")\n '{1}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state done >/dev/null\n '{1}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state idle >/dev/null\n continue\n ;;\n \"session churn\")\n '{1}' pane report-agent-session \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --agent-session-id replacement >/dev/null\n continue\n ;;\n \"block after submit\")\n '{1}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state blocked >/dev/null\n continue\n ;;\n esac\n '{1}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state working >/dev/null\n '{1}' pane report-agent \"$HERDR_PANE_ID\" --source custom:fake-pi --agent pi --state idle >/dev/null\n printf '%s\\n' \"$prompt\" >> '{2}'\ndone\n", captured_args.display(), env!("CARGO_BIN_EXE_herdr"), - env!("CARGO_BIN_EXE_herdr"), - env!("CARGO_BIN_EXE_herdr"), captured_prompts.display(), ), ) @@ -394,69 +392,74 @@ fn agent_start_command_works() { thread::sleep(Duration::from_millis(400)); assert_eq!(fs::read(&captured_prompts).unwrap(), prompts_before_blocked); - let idle_report = run_cli( - &socket_path, - &[ - "pane", - "report-agent", - &pane_id, - "--source", - "custom:fake-pi", - "--agent", - "pi", - "--state", - "idle", - ], - ); - assert!(idle_report.status.success()); + let report_agent = |state| { + run_cli( + &socket_path, + &[ + "pane", + "report-agent", + &pane_id, + "--source", + "custom:fake-pi", + "--agent", + "pi", + "--state", + state, + ], + ) + .status + .success() + }; + let prompt_wait = |prompt, timeout| { + run_cli( + &socket_path, + &[ + "agent", + "prompt", + "main", + prompt, + "--wait", + "--timeout", + timeout, + ], + ) + }; - let stale_idle = run_cli( - &socket_path, - &[ - "agent", - "prompt", - "main", - "do not transition", - "--wait", - "--timeout", - "500", - ], - ); + assert!(report_agent("idle")); + let stale_idle = prompt_wait("do not transition", "500"); assert_eq!(stale_idle.status.code(), Some(1)); let stale_idle: serde_json::Value = serde_json::from_slice(&stale_idle.stderr).unwrap(); assert_eq!(stale_idle["error"]["code"], "timeout"); - let stalled = run_cli( - &socket_path, - &[ - "agent", - "prompt", - "main", - "stall", - "--wait", - "--timeout", - "6000", - ], - ); + let stalled = prompt_wait("do not transition", "6000"); assert_eq!(stalled.status.code(), Some(1)); let stalled: serde_json::Value = serde_json::from_slice(&stalled.stderr).unwrap(); assert_eq!(stalled["error"]["code"], "agent_prompt_stalled"); assert!(stalled["error"]["message"] .as_str() - .is_some_and(|message| message.contains("state_change_seq remained"))); + .is_some_and(|message| message.contains("no observed working or blocked state"))); - let prompted = run_cli( - &socket_path, - &[ - "agent", - "prompt", - "main", - "Review this diff", - "--wait", - "--timeout", - "2000", - ], + for prompt in ["done churn", "session churn"] { + let settled_only = prompt_wait(prompt, "500"); + assert_eq!(settled_only.status.code(), Some(1)); + let settled_only: serde_json::Value = serde_json::from_slice(&settled_only.stderr).unwrap(); + assert_eq!(settled_only["error"]["code"], "timeout"); + } + + let blocked_after_submit = prompt_wait("block after submit", "2000"); + assert!(blocked_after_submit.status.success()); + let blocked_after_submit: serde_json::Value = + serde_json::from_slice(&blocked_after_submit.stdout).unwrap(); + assert_eq!( + blocked_after_submit["result"]["agent"]["agent_status"], + "blocked" ); + assert!(report_agent("idle")); + assert!(report_agent("working")); + let already_working = prompt_wait("finish active", "2000"); + assert!(already_working.status.success()); + + let prompted = prompt_wait("Review this diff", "2000"); assert!( prompted.status.success(), "prompt failed: {}", |
