sync from monorepo @ 2452e92e

This commit is contained in:
2026-05-08 01:59:04 +02:00
commit b03dc15371
459 changed files with 129586 additions and 0 deletions
@@ -0,0 +1,138 @@
use dirigent_testing::{load_fixture, Direction};
#[test]
fn test_zed_claude_fixture_loads() {
let replay = load_fixture("zed_claude_session.json").unwrap();
assert!(!replay.messages.is_empty());
assert!(!replay.client_messages().is_empty());
assert!(!replay.agent_messages().is_empty());
}
#[test]
fn test_zed_claude_starts_with_initialize() {
let replay = load_fixture("zed_claude_session.json").unwrap();
let first = &replay.messages[0];
assert_eq!(first.direction, Direction::ClientToAgent);
let method = first.payload.get("method").and_then(|m| m.as_str());
assert_eq!(method, Some("initialize"));
}
#[test]
fn test_zed_claude_message_counts() {
let replay = load_fixture("zed_claude_session.json").unwrap();
// 3 client messages: initialize, session/load, session/list
assert_eq!(replay.client_messages().len(), 3);
// 6 agent messages: initialize response, 2x session/update notifications,
// session/load response, available_commands_update, session/list response
assert_eq!(replay.agent_messages().len(), 6);
// Total: 9 messages
assert_eq!(replay.messages.len(), 9);
}
#[test]
fn test_zed_claude_initialize_has_client_info() {
let replay = load_fixture("zed_claude_session.json").unwrap();
let init = &replay.messages[0].payload;
let client_info = init
.pointer("/params/clientInfo/name")
.and_then(|v| v.as_str());
assert_eq!(client_info, Some("zed"));
}
#[test]
fn test_zed_claude_initialize_response_has_agent_info() {
let replay = load_fixture("zed_claude_session.json").unwrap();
let init_resp = &replay.messages[1].payload;
assert_eq!(init_resp.get("id").and_then(|v| v.as_u64()), Some(0));
let agent_name = init_resp
.pointer("/params/agentInfo/name")
.and_then(|v| v.as_str());
assert_eq!(agent_name, Some("@zed-industries/claude-agent-acp"));
}
#[test]
fn test_zed_claude_session_load_flow() {
let replay = load_fixture("zed_claude_session.json").unwrap();
// Message at index 2 is the session/load request
let session_load = &replay.messages[2];
assert_eq!(session_load.direction, Direction::ClientToAgent);
let method = session_load
.payload
.get("method")
.and_then(|m| m.as_str());
assert_eq!(method, Some("session/load"));
let session_id = session_load
.payload
.pointer("/params/sessionId")
.and_then(|v| v.as_str());
assert_eq!(
session_id,
Some("cb878ad6-d72b-43c9-93e0-8228f309a786")
);
}
#[test]
fn test_zed_claude_contains_session_list() {
let replay = load_fixture("zed_claude_session.json").unwrap();
let list_request = replay
.messages
.iter()
.find(|m| {
m.direction == Direction::ClientToAgent
&& m.payload.get("method").and_then(|v| v.as_str()) == Some("session/list")
})
.expect("should contain a session/list request");
assert_eq!(list_request.payload.get("id").and_then(|v| v.as_u64()), Some(2));
// Find the matching response
let list_response = replay
.messages
.iter()
.find(|m| {
m.direction == Direction::AgentToClient
&& m.payload.get("method").and_then(|v| v.as_str()) == Some("session/list")
&& m.payload.get("id").and_then(|v| v.as_u64()) == Some(2)
})
.expect("should contain a session/list response");
let sessions = list_response
.payload
.pointer("/params/sessions")
.and_then(|v| v.as_array())
.expect("should have sessions array");
assert_eq!(sessions.len(), 2);
}
#[test]
fn test_zed_claude_has_delay_timings() {
let replay = load_fixture("zed_claude_session.json").unwrap();
// First message (initialize request from client) has no delay
assert!(replay.messages[0].delay_ms.is_none());
// Most subsequent messages should have delay_ms set
let messages_with_delay = replay
.messages
.iter()
.filter(|m| m.delay_ms.is_some())
.count();
assert!(
messages_with_delay > 0,
"at least some messages should have delay timing"
);
}
#[test]
fn test_zed_claude_serde_roundtrip() {
let replay = load_fixture("zed_claude_session.json").unwrap();
let json = serde_json::to_string_pretty(&replay).unwrap();
let parsed: dirigent_testing::AcpReplay = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.name, replay.name);
assert_eq!(parsed.messages.len(), replay.messages.len());
for (original, roundtripped) in replay.messages.iter().zip(parsed.messages.iter()) {
assert_eq!(original.direction, roundtripped.direction);
assert_eq!(original.payload, roundtripped.payload);
assert_eq!(original.delay_ms, roundtripped.delay_ms);
}
}