use std::time::Duration;
use aether_core::core::agent;
use aether_core::events::{AgentMessage, UserMessage};
use llm::LlmResponse;
use llm::testing::FakeLlmProvider;
#[tokio::test]
async fn test_prompt_after_cancel_produces_response() {
let llm_responses = vec![
vec![
LlmResponse::start("msg_1"),
LlmResponse::text("Hello"),
LlmResponse::text(" world"),
LlmResponse::text(" this"),
LlmResponse::text(" is"),
LlmResponse::text(" a"),
LlmResponse::text(" long"),
LlmResponse::text(" response"),
LlmResponse::done(),
],
vec![LlmResponse::start("msg_2"), LlmResponse::text("Second response"), LlmResponse::done()],
];
let llm = FakeLlmProvider::new(llm_responses);
let (tx, mut rx, _handle) = agent(llm).spawn().await.unwrap();
tx.send(UserMessage::text("first question")).await.unwrap();
tx.send(UserMessage::Cancel).await.unwrap();
loop {
match rx.recv().await {
Some(AgentMessage::Done) => break,
Some(_) => {}
None => panic!("Channel closed before Done"),
}
}
tx.send(UserMessage::text("second question")).await.unwrap();
let mut got_text = false;
let got_done;
let deadline = tokio::time::Instant::now() + Duration::from_secs(5);
loop {
match tokio::time::timeout_at(deadline, rx.recv()).await {
Ok(Some(AgentMessage::Text { is_complete: false, .. })) => {
got_text = true;
}
Ok(Some(AgentMessage::Done)) => {
got_done = true;
break;
}
Ok(Some(_)) => {}
Ok(None) => panic!("Channel closed before second Done"),
Err(elapsed) => panic!("Timed out waiting for second prompt response — agent is stuck: {elapsed}"),
}
}
assert!(got_text, "Expected text from the second prompt");
assert!(got_done, "Expected Done from the second prompt");
}