64 lines
2.0 KiB
Rust
64 lines
2.0 KiB
Rust
|
|
use super::*;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn dispatch_maps_session_reasoning_and_text() {
|
||
|
|
let mut events = Vec::new();
|
||
|
|
let started = serde_json::json!({ "type": "session", "sessionID": "ses_1" });
|
||
|
|
let reasoning = serde_json::json!({ "type": "reasoning", "text": "Checking links" });
|
||
|
|
let text = serde_json::json!({ "type": "message", "text": "Done" });
|
||
|
|
|
||
|
|
for event in [started, reasoning, text] {
|
||
|
|
dispatch_event(&event, &mut |event| events.push(event));
|
||
|
|
}
|
||
|
|
|
||
|
|
assert!(matches!(
|
||
|
|
&events[0],
|
||
|
|
AiAgentStreamEvent::Init { session_id } if session_id == "ses_1"
|
||
|
|
));
|
||
|
|
assert!(matches!(
|
||
|
|
&events[1],
|
||
|
|
AiAgentStreamEvent::ThinkingDelta { text } if text == "Checking links"
|
||
|
|
));
|
||
|
|
assert!(matches!(
|
||
|
|
&events[2],
|
||
|
|
AiAgentStreamEvent::TextDelta { text } if text == "Done"
|
||
|
|
));
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn dispatch_maps_tool_events() {
|
||
|
|
let mut events = Vec::new();
|
||
|
|
let tool_start = serde_json::json!({
|
||
|
|
"type": "tool_use",
|
||
|
|
"id": "tool_1",
|
||
|
|
"name": "read",
|
||
|
|
"input": { "path": "Note.md" }
|
||
|
|
});
|
||
|
|
let tool_done = serde_json::json!({ "type": "tool_result", "id": "tool_1", "output": "ok" });
|
||
|
|
|
||
|
|
dispatch_event(&tool_start, &mut |event| events.push(event));
|
||
|
|
dispatch_event(&tool_done, &mut |event| events.push(event));
|
||
|
|
|
||
|
|
assert!(matches!(
|
||
|
|
&events[0],
|
||
|
|
AiAgentStreamEvent::ToolStart { tool_name, tool_id, input }
|
||
|
|
if tool_name == "read" && tool_id == "tool_1" && input.as_deref() == Some(r#"{"path":"Note.md"}"#)
|
||
|
|
));
|
||
|
|
assert!(matches!(
|
||
|
|
&events[1],
|
||
|
|
AiAgentStreamEvent::ToolDone { tool_id, output }
|
||
|
|
if tool_id == "tool_1" && output.as_deref() == Some("ok")
|
||
|
|
));
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn format_error_explains_missing_auth_or_provider_setup() {
|
||
|
|
let message = format_error(
|
||
|
|
"provider auth failed: please login".into(),
|
||
|
|
"exit status: 1".into(),
|
||
|
|
);
|
||
|
|
|
||
|
|
assert!(message.contains("OpenCode CLI is not authenticated"));
|
||
|
|
assert!(message.contains("opencode auth login"));
|
||
|
|
}
|