use std::collections::VecDeque;
pub mod http;
pub mod scenarios;
pub mod server;
use http::MockHttpResponse;
#[derive(Clone, Debug, Default)]
pub struct ScriptedResponder {
queue: VecDeque<MockHttpResponse>,
}
impl ScriptedResponder {
#[must_use]
pub fn new(responses: Vec<MockHttpResponse>) -> Self {
Self {
queue: responses.into(),
}
}
pub fn push(&mut self, response: MockHttpResponse) -> &mut Self {
self.queue.push_back(response);
self
}
pub fn next_response(&mut self) -> Option<MockHttpResponse> {
self.queue.pop_front()
}
pub fn next_wire(&mut self) -> Option<Vec<u8>> {
self.queue.pop_front().map(|response| response.to_wire())
}
#[must_use]
pub fn remaining(&self) -> usize {
self.queue.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.queue.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn scripted_responder_yields_in_order_then_empties() {
let mut responder = ScriptedResponder::new(scenarios::poll_progression());
assert_eq!(responder.remaining(), 3);
assert_eq!(responder.next_response().map(|r| r.status), Some(202));
assert_eq!(responder.next_response().map(|r| r.status), Some(202));
let completed = responder.next_wire();
assert!(completed.is_some());
assert!(responder.is_empty());
assert_eq!(responder.next_response().map(|r| r.status), None);
}
}