#[path = "support/stub_provider.rs"]
mod stub_provider;
use agent_sdk::{AgentInput, CancellationToken, ThreadId, ToolContext, builder};
use anyhow::Result;
use stub_provider::StubProvider;
#[tokio::test]
async fn ask_returns_assembled_text_without_ceremony() -> Result<()> {
let agent = builder::<()>()
.provider(StubProvider::new(vec![StubProvider::text_response(
"Paris is the capital of France.",
)]))
.build();
let answer = agent
.ask(ThreadId::new(), "What is the capital of France?")
.await?;
assert_eq!(answer, "Paris is the capital of France.");
Ok(())
}
#[tokio::test]
async fn send_accepts_agent_input_and_returns_text() -> Result<()> {
let agent = builder::<()>()
.provider(StubProvider::new(vec![StubProvider::text_response("pong")]))
.build();
let answer = agent
.send(ThreadId::new(), AgentInput::Text("ping".into()))
.await?;
assert_eq!(answer, "pong");
Ok(())
}
#[tokio::test]
async fn ask_returns_only_this_calls_text_per_thread() -> Result<()> {
let agent = builder::<()>()
.provider(StubProvider::new(vec![
StubProvider::text_response("first"),
StubProvider::text_response("second"),
]))
.build();
let first = agent.ask(ThreadId::new(), "one").await?;
let second = agent.ask(ThreadId::new(), "two").await?;
assert_eq!(first, "first");
assert_eq!(second, "second");
Ok(())
}
#[tokio::test]
async fn run_is_an_awaitable_future() -> Result<()> {
let agent = builder::<()>()
.provider(StubProvider::new(vec![StubProvider::text_response("ok")]))
.build();
let state = agent
.run(
ThreadId::new(),
AgentInput::Text("hi".into()),
ToolContext::new(()),
CancellationToken::new(),
)
.await?;
assert!(
matches!(state, agent_sdk::AgentRunState::Done { .. }),
"expected Done; got {state:?}",
);
Ok(())
}