actix_web_lab/
test_request_macros.rs

1/// Create a `TestRequest` using a DSL that looks kinda like on-the-wire HTTP/1.x requests.
2///
3/// # Examples
4/// ```
5/// use actix_web::test::TestRequest;
6/// use actix_web_lab::test_request;
7///
8/// let _req: TestRequest = test_request! {
9///     POST "/";
10///     "Origin" => "example.com"
11///     "Access-Control-Request-Method" => "POST"
12///     "Access-Control-Request-Headers" => "Content-Type, X-CSRF-TOKEN";
13///     @json {"abc": "123"}
14/// };
15///
16/// let _req: TestRequest = test_request! {
17///     POST "/";
18///     "Content-Type" => "application/json"
19///     "Origin" => "example.com"
20///     "Access-Control-Request-Method" => "POST"
21///     "Access-Control-Request-Headers" => "Content-Type, X-CSRF-TOKEN";
22///     @raw r#"{"abc": "123"}"#
23/// };
24/// ```
25#[macro_export]
26macro_rules! test_request {
27    ($method:ident $uri:expr) => {{
28        ::actix_web::test::TestRequest::default()
29            .method(::actix_web::http::Method::$method)
30            .uri($uri)
31    }};
32
33    ($method:ident $uri:expr; $($hdr_name:expr => $hdr_val:expr)+) => {{
34        test_request!($method $uri)
35            $(
36                .insert_header(($hdr_name, $hdr_val))
37            )+
38    }};
39
40    ($method:ident $uri:expr; $($hdr_name:expr => $hdr_val:expr)+; @json $payload:tt) => {{
41        test_request!($method $uri; $($hdr_name => $hdr_val)+)
42            .set_json($crate::__reexports::serde_json::json!($payload))
43    }};
44
45    ($method:ident $uri:expr; $($hdr_name:expr => $hdr_val:expr)+; @raw $payload:expr) => {{
46        test_request!($method $uri; $($hdr_name => $hdr_val)+)
47            .set_payload($payload)
48    }};
49}
50
51pub use test_request;
52
53#[cfg(test)]
54mod tests {
55    use actix_web::test::TestRequest;
56
57    use super::*;
58
59    #[test]
60    fn request_builder() {
61        let _req: TestRequest = test_request! {
62            POST "/";
63            "Origin" => "example.com"
64            "Access-Control-Request-Method" => "POST"
65            "Access-Control-Request-Headers" => "Content-Type, X-CSRF-TOKEN";
66            @json { "abc": "123" }
67        };
68
69        let _req: TestRequest = test_request! {
70            POST "/";
71            "Content-Type" => "application/json"
72            "Origin" => "example.com"
73            "Access-Control-Request-Method" => "POST"
74            "Access-Control-Request-Headers" => "Content-Type, X-CSRF-TOKEN";
75            @raw r#"{"abc": "123"}"#
76        };
77    }
78}