use std::{io::Write, net::SocketAddr};
use tabwriter::TabWriter;
use crate::api::output;
#[cfg(feature = "color")]
use colored::*;
use serde::{Deserialize, Serialize};
use crate::api::server::MockServer;
use crate::common::util::Join;
pub struct Mock<'a> {
pub id: usize,
pub(crate) server: &'a MockServer,
}
impl<'a> Mock<'a> {
pub fn new(id: usize, server: &'a MockServer) -> Self {
Self { id, server }
}
pub fn assert(&self) {
self.assert_async().join()
}
pub async fn assert_async(&self) {
self.assert_hits_async(1).await
}
#[deprecated(since = "0.8.0", note = "please use `assert_calls` instead")]
pub fn assert_hits(&self, hits: usize) {
self.assert_calls(hits)
}
pub fn assert_calls(&self, count: usize) {
self.assert_calls_async(count).join()
}
#[deprecated(since = "0.8.0", note = "please use `assert_calls_async` instead")]
pub async fn assert_hits_async(&self, hits: usize) {
self.assert_calls_async(hits).await
}
pub async fn assert_calls_async(&self, hits: usize) {
let active_mock = self
.server
.server_adapter
.as_ref()
.unwrap()
.fetch_mock(self.id)
.await
.expect("cannot deserialize mock server response");
if active_mock.call_counter == hits {
return;
}
if active_mock.call_counter > hits {
assert_eq!(
active_mock.call_counter, hits,
"The number of matching requests was higher than expected (expected {} but was {})",
hits, active_mock.call_counter
)
}
let closest_match = self
.server
.server_adapter
.as_ref()
.unwrap()
.verify(&active_mock.definition.request)
.await
.expect("Cannot contact mock server");
output::fail_with(active_mock.call_counter, hits, closest_match)
}
#[deprecated(since = "0.8.0", note = "please use `calls` instead")]
pub fn hits(&self) -> usize {
self.calls()
}
pub fn calls(&self) -> usize {
self.calls_async().join()
}
#[deprecated(since = "0.8.0", note = "please use `calls_async` instead")]
pub async fn hits_async(&self) -> usize {
self.calls_async().await
}
pub async fn calls_async(&self) -> usize {
let response = self
.server
.server_adapter
.as_ref()
.unwrap()
.fetch_mock(self.id)
.await
.expect("cannot deserialize mock server response");
response.call_counter
}
pub fn delete(&mut self) {
self.delete_async().join();
}
pub async fn delete_async(&self) {
self.server
.server_adapter
.as_ref()
.unwrap()
.delete_mock(self.id)
.await
.expect("could not delete mock from server");
}
pub fn server_address(&self) -> &SocketAddr {
self.server.server_adapter.as_ref().unwrap().address()
}
}
pub trait MockExt<'a> {
fn new(id: usize, mock_server: &'a MockServer) -> Mock<'a>;
fn id(&self) -> usize;
}
impl<'a> MockExt<'a> for Mock<'a> {
fn new(id: usize, mock_server: &'a MockServer) -> Mock<'a> {
Mock {
id,
server: mock_server,
}
}
fn id(&self) -> usize {
self.id
}
}
pub struct MockSet<'a> {
pub ids: Vec<usize>,
pub(crate) server: &'a MockServer,
}
impl<'a> MockSet<'a> {
pub fn delete(&mut self) {
self.delete_async().join();
}
pub async fn delete_async(&self) {
for id in &self.ids {
self.server
.server_adapter
.as_ref()
.unwrap()
.delete_mock(*id)
.await
.expect("could not delete mock from server");
}
}
}