use std::net::SocketAddr;
use std::ops::Deref;
use log::debug;
use crate::wiremock::{
mock::Mock,
mock_server::{bare_server::BareMockServer, MockServerBuilder},
verification::VerificationOutcome,
MockGuard, Request,
};
pub struct MockServer(InnerServer);
pub(super) enum InnerServer {
Bare(BareMockServer),
}
impl Deref for InnerServer {
type Target = BareMockServer;
fn deref(&self) -> &Self::Target {
match self {
InnerServer::Bare(b) => b,
}
}
}
impl MockServer {
pub(super) fn new(server: InnerServer) -> Self {
Self(server)
}
pub fn builder() -> MockServerBuilder {
MockServerBuilder::new()
}
pub async fn register(&self, mock: Mock) {
self.0.register(mock).await
}
pub async fn register_as_scoped(&self, mock: Mock) -> MockGuard {
self.0.register_as_scoped(mock).await
}
pub async fn reset(&self) {
self.0.reset().await;
}
pub async fn verify(&self) {
debug!("Verify mock expectations.");
if let VerificationOutcome::Failure(failed_verifications) = self.0.verify().await {
let received_requests_message = if let Some(received_requests) = self.0.received_requests().await {
if received_requests.is_empty() {
"The server did not receive any request.".into()
} else {
format!(
"Received requests:\n{}",
received_requests
.into_iter()
.enumerate()
.map(|(index, request)| { format!("- Request #{}\n{}", index + 1, &format!("\t{}", request)) })
.collect::<String>()
)
}
} else {
"Enable request recording on the mock server to get the list of incoming requests as part of the panic message.".into()
};
let verifications_errors: String = failed_verifications
.iter()
.map(|m| format!("- {}\n", m.error_message()))
.collect();
let error_message = format!("Verifications failed:\n{}\n{}", verifications_errors, received_requests_message);
if std::thread::panicking() {
debug!("{}", &error_message);
} else {
panic!("{}", &error_message);
}
}
}
pub fn uri(&self) -> String {
self.0.uri()
}
pub fn address(&self) -> &SocketAddr {
self.0.address()
}
pub async fn received_requests(&self) -> Option<Vec<Request>> {
self.0.received_requests().await
}
}
impl Drop for MockServer {
fn drop(&mut self) {
futures::executor::block_on(self.verify())
}
}