use serde_json::{Value, json};
use tokio::io::{AsyncBufReadExt as _, AsyncWriteExt as _, BufReader};
#[tokio::test]
async fn round4_1_front_answers_each_lys_request_before_eof() -> anyhow::Result<()> {
let (client, server) = tokio::io::duplex(1024);
let (read, write) = tokio::io::split(server);
let serving = tokio::spawn(super::serve(
BufReader::new(read),
write,
4096,
"seat-session".into(),
));
let mut client = BufReader::new(client);
for (id, method, params) in [
(
"lys-initialize",
"initialize",
json!({"protocolVersion":1,"clientCapabilities":{},"clientInfo":{"name":"lys","version":"fixture"}}),
),
(
"lys-seat-session",
"session/new",
json!({"cwd":"/tmp","mcpServers":[]}),
),
] {
let mut request =
serde_json::to_vec(&json!({"jsonrpc":"2.0","id":id,"method":method,"params":params}))?;
request.push(b'\n');
client.get_mut().write_all(&request).await?;
let mut line = String::new();
client.read_line(&mut line).await?;
let response: Value = serde_json::from_str(&line)?;
assert_eq!(response["id"], id);
assert!(response.get("error").is_none());
if method == "initialize" {
let answer: agent_client_protocol_schema::v1::InitializeResponse =
serde_json::from_value(response["result"].clone())?;
assert_eq!(
answer.protocol_version,
agent_client_protocol_schema::ProtocolVersion::V1
);
} else {
let answer: agent_client_protocol_schema::v1::NewSessionResponse =
serde_json::from_value(response["result"].clone())?;
assert_eq!(answer.session_id.to_string(), "seat-session");
}
}
client.get_mut().shutdown().await?;
serving.await??;
Ok(())
}