1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//! wiremock-multipart adds matchers for use with [wiremock](https://crates.io/crates/wiremock)
//! to check multipart characteristics of requests.
//!
//! ## How to install
//! Add `wiremock-multipart` to your dev-dependencies:
//! ```toml
//! [dev-dependencies]
//! # ...
//! wiremock-multipart = "0.1"
//! ```
//!
//! ## Getting started
//!
//! ```rust
//! use wiremock::{MockServer, Mock, ResponseTemplate};
//! use wiremock::matchers::method;
//! use wiremock_multipart::prelude::*;
//!
//! #[async_std::main]
//! async fn main() {
//!     // Start a background HTTP server on a random local port
//!     let mock_server = MockServer::start().await;
//!
//!     // Arrange the behaviour of the MockServer adding a Mock
//!     Mock::given(method("POST"))
//!         .and(NumberOfParts(2))
//!         .respond_with(ResponseTemplate::new(200))
//!         // Mounting the mock on the mock server - it's now effective!
//!         .mount(&mock_server)
//!         .await;
//!
//!     // if we now send a multipart/form-data request with two parts to it, the request
//!     // will match and return 200.
//! }
//! ```

#[cfg(test)] extern crate indoc;
#[cfg(test)] extern crate maplit;
extern crate wiremock;
extern crate lazy_regex;

mod request_utils;
mod part;
pub mod matchers;

pub mod prelude {
    pub use crate::matchers::*;
}

#[cfg(test)]
mod test_utils {
    use std::collections::HashMap;
    use std::str::FromStr;
    use maplit::hashmap;

    use wiremock::http::{HeaderName, HeaderValue, HeaderValues, Method, Url};
    use wiremock::Request;

    pub fn name(name: &'static str) -> HeaderName {
        HeaderName::from_str(name).unwrap()
    }

    pub fn value(val: &'static str) -> HeaderValue {
        HeaderValue::from_str(val).unwrap()
    }

    pub fn values(val: &'static str) -> HeaderValues {
        value(val).into()
    }

    pub fn request(
        headers: HashMap<HeaderName, HeaderValues>,
    ) -> Request {
        requestb(headers, vec![])
    }

    pub fn requestb(
        headers: HashMap<HeaderName, HeaderValues>,
        body: Vec<u8>,
    ) -> Request {
        Request {
            url: Url::from_str("http://localhost").unwrap(),
            method: Method::Post,
            headers,
            body,
        }
    }

    pub fn multipart_header() -> HashMap<HeaderName, HeaderValues> {
        hashmap!{
            name("content-type") => values("multipart/form-data; boundary=xyz"),
        }
    }
}