httpmock 0.9.0

HTTP mocking library for Rust
Documentation
use std::{net::SocketAddr, sync::Arc};

#[cfg(feature = "proxy")]
use crate::common::data::{ActiveForwardingRule, ActiveProxyRule, ForwardingRuleConfig, ProxyRuleConfig};
#[cfg(feature = "record")]
use crate::common::data::{ActiveRecording, RecordingRuleConfig};
#[cfg(feature = "record")]
use bytes::Bytes;

use crate::{
    api::adapter::{
        MockServerAdapter, ServerAdapterError,
        ServerAdapterError::{MockNotFound, UpstreamError},
    },
    common::data::{ActiveMock, ClosestMatch, MockDefinition, RequestRequirements},
    server::state,
};

pub(in crate::api) struct LocalMockServerAdapter {
    pub(in crate::api) addr: SocketAddr,
    state: Arc<state::HttpMockStateManager>,
}

impl LocalMockServerAdapter {
    pub(in crate::api) fn new(addr: SocketAddr, local_state: Arc<state::HttpMockStateManager>) -> Self {
        LocalMockServerAdapter {
            addr,
            state: local_state,
        }
    }
}

impl MockServerAdapter for LocalMockServerAdapter {
    fn host(&self) -> String {
        self.addr.ip().to_string()
    }

    fn port(&self) -> u16 {
        self.addr.port()
    }

    fn address(&self) -> &SocketAddr {
        &self.addr
    }

    async fn reset(&self) -> Result<(), ServerAdapterError> {
        self.state.reset();
        Ok(())
    }

    async fn create_mock(&self, mock: &MockDefinition) -> Result<ActiveMock, ServerAdapterError> {
        let active_mock = self
            .state
            .add_mock(mock.clone(), false)
            .map_err(|e| UpstreamError(e.to_string()))?;
        Ok(active_mock)
    }

    async fn fetch_mock(&self, mock_id: usize) -> Result<ActiveMock, ServerAdapterError> {
        let mock = self
            .state
            .read_mock(mock_id)
            .map_err(|e| UpstreamError(e.to_string()))?
            .ok_or(MockNotFound(mock_id))?;
        Ok(mock)
    }

    async fn delete_mock(&self, mock_id: usize) -> Result<(), ServerAdapterError> {
        self.state
            .delete_mock(mock_id)
            .map_err(|e| UpstreamError(format!("Cannot delete mock: {:?}", e)))?;
        Ok(())
    }

    async fn set_up_to_n_times(&self, mock_id: usize, count: usize) -> Result<(), ServerAdapterError> {
        let updated = self
            .state
            .set_up_to_n_times(mock_id, count)
            .map_err(|e| UpstreamError(e.to_string()))?;
        if !updated {
            return Err(MockNotFound(mock_id));
        }
        Ok(())
    }

    async fn verify(&self, mock_rr: &RequestRequirements) -> Result<Option<ClosestMatch>, ServerAdapterError> {
        let closest_match = self
            .state
            .verify(mock_rr)
            .map_err(|e| UpstreamError(format!("Cannot verify mock: {:?}", e)))?;
        Ok(closest_match)
    }

    #[cfg(feature = "proxy")]
    async fn create_forwarding_rule(
        &self,
        config: ForwardingRuleConfig,
    ) -> Result<ActiveForwardingRule, ServerAdapterError> {
        Ok(self.state.create_forwarding_rule(config))
    }

    #[cfg(feature = "proxy")]
    async fn delete_forwarding_rule(&self, id: usize) -> Result<(), ServerAdapterError> {
        self.state.delete_forwarding_rule(id);
        Ok(())
    }

    #[cfg(feature = "proxy")]
    async fn create_proxy_rule(&self, config: ProxyRuleConfig) -> Result<ActiveProxyRule, ServerAdapterError> {
        Ok(self.state.create_proxy_rule(config))
    }

    #[cfg(feature = "proxy")]
    async fn delete_proxy_rule(&self, id: usize) -> Result<(), ServerAdapterError> {
        self.state.delete_proxy_rule(id);
        Ok(())
    }

    #[cfg(feature = "record")]
    async fn create_recording(&self, config: RecordingRuleConfig) -> Result<ActiveRecording, ServerAdapterError> {
        Ok(self.state.create_recording(config))
    }

    #[cfg(feature = "record")]
    async fn delete_recording(&self, id: usize) -> Result<(), ServerAdapterError> {
        self.state.delete_recording(id);
        Ok(())
    }

    #[cfg(feature = "record")]
    async fn export_recording(&self, id: usize) -> Result<Option<Bytes>, ServerAdapterError> {
        self.state
            .export_recording(id)
            .map_err(|err| UpstreamError(err.to_string()))
    }

    #[cfg(feature = "record")]
    async fn create_mocks_from_recording(
        &self,
        recording_file_content: &str,
    ) -> Result<Vec<usize>, ServerAdapterError> {
        self.state
            .load_mocks_from_recording(recording_file_content)
            .map_err(|err| UpstreamError(err.to_string()))
    }
}