use super::*;
#[tokio::test]
async fn send_message_returns_completed_task() {
let handler = RequestHandlerBuilder::new(EchoExecutor)
.build()
.expect("build handler");
let result = handler
.on_send_message(make_send_params("hello"), false, None)
.await
.expect("send message");
match result {
SendMessageResult::Response(SendMessageResponse::Task(task)) => {
assert_eq!(
task.status.state,
TaskState::Completed,
"task should be in Completed state"
);
assert!(
task.artifacts.is_some(),
"completed task must have artifacts"
);
let artifacts = task.artifacts.unwrap();
assert_eq!(
artifacts.len(),
1,
"expected exactly 1 artifact, got {}",
artifacts.len()
);
}
_ => panic!("expected Response(Task)"),
}
}
#[tokio::test]
async fn send_message_streaming_returns_reader() {
let handler = RequestHandlerBuilder::new(EchoExecutor)
.build()
.expect("build handler");
let result = handler
.on_send_message(make_send_params("hello"), true, None)
.await
.expect("send streaming message");
match result {
SendMessageResult::Stream(mut reader) => {
let mut events = vec![];
while let Some(event) = reader.read().await {
events.push(event.expect("event should be ok"));
}
assert_eq!(
events.len(),
4,
"expected 4 events (Task + Working + Artifact + Completed), got {}",
events.len()
);
assert!(
matches!(&events[0], StreamResponse::Task(_)),
"first event must be Task snapshot, got {:?}",
std::mem::discriminant(&events[0])
);
match &events[1] {
StreamResponse::StatusUpdate(u) => {
assert_eq!(
u.status.state,
TaskState::Working,
"first event must be Working status"
);
}
other => panic!("expected StatusUpdate(Working), got {other:?}"),
}
assert!(
matches!(&events[2], StreamResponse::ArtifactUpdate(_)),
"third event must be ArtifactUpdate, got {:?}",
events[2]
);
match &events[3] {
StreamResponse::StatusUpdate(u) => {
assert_eq!(
u.status.state,
TaskState::Completed,
"fourth event must be Completed status"
);
}
other => panic!("expected StatusUpdate(Completed), got {other:?}"),
}
}
_ => panic!("expected Stream, got unexpected variant"),
}
}
#[tokio::test]
async fn send_message_executor_failure_results_in_failed_task() {
let handler = RequestHandlerBuilder::new(FailingExecutor)
.build()
.expect("build handler");
let result = handler
.on_send_message(make_send_params("boom"), false, None)
.await;
match result {
Ok(SendMessageResult::Response(SendMessageResponse::Task(task))) => {
assert_eq!(
task.status.state,
TaskState::Failed,
"executor failure must produce a Failed task"
);
}
Err(e) => {
assert!(
format!("{e:?}").contains("fail")
|| format!("{e:?}").contains("Fail")
|| format!("{e:?}").contains("Internal"),
"expected failure-related error, got: {e:?}"
);
}
_ => panic!("expected failed task or error, got unexpected variant"),
}
}