use crate::testing::mock_transport::MockTransport;
use crate::types::messages::Message;
pub struct ScenarioBuilder {
session_id: String,
exchanges: Vec<Vec<Message>>,
}
impl ScenarioBuilder {
#[must_use]
pub fn new(session_id: impl Into<String>) -> Self {
Self {
session_id: session_id.into(),
exchanges: Vec::new(),
}
}
#[must_use]
pub fn exchange(mut self, messages: Vec<Message>) -> Self {
self.exchanges.push(messages);
self
}
#[must_use]
pub fn build(self) -> MockTransport {
let transport = MockTransport::new();
let init = crate::testing::builders::system_init(&self.session_id);
transport.enqueue_value(&init);
for exchange in &self.exchanges {
for msg in exchange {
transport.enqueue_value(msg);
}
}
let result = crate::testing::builders::result_success(&self.session_id);
transport.enqueue_value(&result);
transport
}
#[must_use]
pub fn build_raw(self) -> MockTransport {
let transport = MockTransport::new();
for exchange in &self.exchanges {
for msg in exchange {
transport.enqueue_value(msg);
}
}
transport
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::testing::builders::*;
#[test]
fn scenario_builder_creates_transport_with_bookends() {
let transport = ScenarioBuilder::new("s1")
.exchange(vec![assistant_text("Hello!")])
.build();
assert_eq!(transport.queued_count(), 3);
}
#[test]
fn scenario_builder_empty_exchange() {
let transport = ScenarioBuilder::new("s1").build();
assert_eq!(transport.queued_count(), 2);
}
#[test]
fn scenario_builder_multiple_exchanges() {
let transport = ScenarioBuilder::new("s1")
.exchange(vec![assistant_text("Turn 1")])
.exchange(vec![assistant_text("Turn 2")])
.build();
assert_eq!(transport.queued_count(), 4);
}
#[test]
fn scenario_builder_raw() {
let transport = ScenarioBuilder::new("s1")
.exchange(vec![assistant_text("raw")])
.build_raw();
assert_eq!(transport.queued_count(), 1);
}
}