use serde_json::{Value, json};
use std::time::Duration;
use wiremock::ResponseTemplate;
pub fn success(body: impl Into<Value>) -> ResponseTemplate {
ResponseTemplate::new(200).set_body_json(body.into())
}
pub fn created(body: impl Into<Value>) -> ResponseTemplate {
ResponseTemplate::new(201).set_body_json(body.into())
}
pub fn no_content() -> ResponseTemplate {
ResponseTemplate::new(204)
}
pub fn bad_request(message: impl Into<String>) -> ResponseTemplate {
let message = message.into();
ResponseTemplate::new(400).set_body_json(json!({
"error": message,
"code": 400
}))
}
pub fn unauthorized() -> ResponseTemplate {
ResponseTemplate::new(401).set_body_json(json!({
"error": "Unauthorized",
"code": 401
}))
}
pub fn not_found(message: impl Into<String>) -> ResponseTemplate {
let message = message.into();
ResponseTemplate::new(404).set_body_json(json!({
"error": message,
"code": 404
}))
}
pub fn conflict(message: impl Into<String>) -> ResponseTemplate {
let message = message.into();
ResponseTemplate::new(409).set_body_json(json!({
"error": message,
"code": 409
}))
}
pub fn rate_limited(retry_after: Option<Duration>) -> ResponseTemplate {
let mut response = ResponseTemplate::new(429).set_body_json(json!({
"error": "Rate limited",
"code": 429
}));
if let Some(duration) = retry_after {
response = response.insert_header("Retry-After", duration.as_secs().to_string());
}
response
}
pub fn server_error(message: impl Into<String>) -> ResponseTemplate {
let message = message.into();
ResponseTemplate::new(500).set_body_json(json!({
"error": message,
"code": 500
}))
}
pub fn cluster_busy() -> ResponseTemplate {
ResponseTemplate::new(503).set_body_json(json!({
"error": "Cluster is busy or unavailable",
"code": 503
}))
}
pub fn error(code: u16, message: impl Into<String>) -> ResponseTemplate {
let message = message.into();
ResponseTemplate::new(code).set_body_json(json!({
"error": message,
"code": code
}))
}
pub fn delayed(response: ResponseTemplate, delay: Duration) -> ResponseTemplate {
response.set_delay(delay)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_success_response() {
let _resp = success(json!({"status": "ok"}));
}
#[test]
fn test_error_responses() {
let _not_found = not_found("Resource not found");
let _unauthorized = unauthorized();
let _conflict = conflict("Already exists");
let _rate_limited = rate_limited(Some(Duration::from_secs(60)));
let _server_error = server_error("Internal error");
let _cluster_busy = cluster_busy();
}
}