axum_webtools/tests/
mod.rs1use 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}