stubr 0.6.2

Wiremock implemented in Rust
Documentation
use serde_json::{Map, Value};

use crate::model::request::{matcher::MatcherValueStub, query::HttpQueryParamsStub};

use super::super::super::RecordedExchange;

impl From<&mut RecordedExchange> for HttpQueryParamsStub {
    fn from(ex: &mut RecordedExchange) -> Self {
        let req = ex.req();
        let queries = req
            .url()
            .query_pairs()
            .into_iter()
            .map(|(k, v)| {
                let v = MatcherValueStub {
                    equal_to: Some(v.into()),
                    ..Default::default()
                };
                let v = serde_json::to_value(v).unwrap();
                (k.to_string(), v)
            })
            .collect::<Map<String, Value>>();
        if queries.is_empty() {
            Self { query_parameters: None }
        } else {
            Self {
                query_parameters: Some(queries),
            }
        }
    }
}

#[cfg(test)]
mod req_queries_mapping_tests {
    use http_types::Request;
    use serde_json::json;

    use crate::record::RecordedRequest;

    use super::*;

    #[test]
    fn should_map_single_query() {
        let req = Request::get("http://localhost?a=1");
        let mut exchange = RecordedExchange {
            0: RecordedRequest(req),
            ..Default::default()
        };
        let expected = Map::from_iter(vec![("a".to_string(), json!({"equalTo": "1"}))]);
        assert_eq!(
            HttpQueryParamsStub::from(&mut exchange),
            HttpQueryParamsStub {
                query_parameters: Some(expected)
            }
        )
    }

    #[test]
    fn should_map_many_query() {
        let req = Request::get("http://localhost?a=1&b=2");
        let mut exchange = RecordedExchange {
            0: RecordedRequest(req),
            ..Default::default()
        };
        let expected = Map::from_iter(vec![
            ("a".to_string(), json!({"equalTo": "1"})),
            ("b".to_string(), json!({"equalTo": "2"})),
        ]);
        assert_eq!(
            HttpQueryParamsStub::from(&mut exchange),
            HttpQueryParamsStub {
                query_parameters: Some(expected)
            }
        )
    }

    #[test]
    fn should_not_fail_when_no_queries() {
        let req = Request::get("http://localhost");
        let mut exchange = RecordedExchange {
            0: RecordedRequest(req),
            ..Default::default()
        };
        assert_eq!(
            HttpQueryParamsStub::from(&mut exchange),
            HttpQueryParamsStub { query_parameters: None }
        )
    }

    #[test]
    fn should_map_multi_query() {
        let req = Request::get("http://localhost?a=1&a=2");
        let mut exchange = RecordedExchange {
            0: RecordedRequest(req),
            ..Default::default()
        };
        let expected = Map::from_iter(vec![
            ("a".to_string(), json!({"equalTo": "1"})),
            ("a".to_string(), json!({"equalTo": "2"})),
        ]);
        assert_eq!(
            HttpQueryParamsStub::from(&mut exchange),
            HttpQueryParamsStub {
                query_parameters: Some(expected)
            }
        )
    }
}