stubr 0.6.2

Wiremock implemented in Rust
Documentation
use std::borrow::BorrowMut;
use std::ffi::OsString;

use http_types::Response;

use body::BodyVerifier;
use header::HeaderVerifier;
use status::StatusVerifier;

use crate::model::response::{template::data::RequestData, ResponseStub};

use super::req::StdRequest;

mod body;
mod header;
mod status;

#[derive(Debug)]
pub struct StdResponse(pub Response);

impl Default for StdResponse {
    fn default() -> Self {
        Self(Response::new(200))
    }
}

trait Verifier<'a> {
    fn verify(self, stub: &'a ResponseStub, name: &'a str, req: &'a RequestData, resp: &'a mut StdResponse);
}

pub struct RequestAndStub {
    pub req: StdRequest,
    pub stub: ResponseStub,
    pub name: OsString,
}

impl RequestAndStub {
    pub fn verify(mut self, mut resp: StdResponse) {
        let name = self.name().to_string();
        let req_data = RequestData::from(self.req.0.borrow_mut());
        HeaderVerifier.verify(&self.stub, &name, &req_data, &mut resp);
        StatusVerifier.verify(&self.stub, &name, &req_data, &mut resp);
        BodyVerifier.verify(&self.stub, &name, &req_data, &mut resp);
    }

    fn name(&self) -> &str {
        self.name.to_str().unwrap_or_default()
    }
}

#[cfg(test)]
mod resp_verify_tests {
    use http_types::{Request, Response};

    use crate::model::response::ResponseStub;

    use super::*;

    #[test]
    fn should_verify() {
        let stub = ResponseStub {
            status: Some(200),
            ..Default::default()
        };
        let mut req = Request::get("http://localhost/");
        let mut resp = StdResponse(Response::new(200));
        StatusVerifier.verify(&stub, "ok", &RequestData::from(&mut req), &mut resp);
    }
}