axum_webtools/tests/
mod.rs

1use axum::body::Body;
2use axum::http::{HeaderMap, Request, StatusCode};
3use axum::Router;
4use http_body_util::BodyExt;
5use serde::de::DeserializeOwned;
6use serde::Serialize;
7use tower::ServiceExt;
8
9pub struct Response<T: DeserializeOwned> {
10    pub body: Option<T>,
11    pub status_code: StatusCode,
12    pub headers: HeaderMap,
13}
14
15pub async fn request<'a, T, R, F, P>(
16    router: Router,
17    subject: &str,
18    uri: &str,
19    method: &str,
20    body: T,
21) -> Response<R>
22where
23    T: Serialize,
24    R: DeserializeOwned,
25{
26    let request_body = Body::from(serde_json::to_vec(&body).unwrap());
27
28    let request = Request::builder()
29        .header("Content-Type", "application/json")
30        .header("X-Claims-Subject", subject)
31        .uri(uri)
32        .method(method)
33        .body(request_body)
34        .unwrap();
35
36    let response = router.oneshot(request).await.unwrap();
37    let status_code = response.status();
38    let headers = response.headers().clone();
39
40    let body = match status_code.as_u16() {
41        200..=299 => {
42            let body = response.into_body().collect().await.unwrap().to_bytes();
43            let r = serde_json::from_slice::<R>(&body).unwrap();
44            Some(r)
45        }
46        _ => None,
47    };
48    Response {
49        body,
50        status_code,
51        headers,
52    }
53}