use api_bones::error::{ApiError, ErrorCode};
use api_bones::pagination::PaginatedResponse;
use axum::Router;
use axum_test::TestServer as AxumTestServer;
use serde::Serialize;
use serde::de::DeserializeOwned;
use crate::axum::assertions::{assert_envelope, assert_paginated, assert_problem_json};
pub struct TestServer {
inner: AxumTestServer,
}
impl TestServer {
#[must_use]
pub fn new(router: Router) -> Self {
let server = AxumTestServer::new(router).expect("failed to create test server");
Self { inner: server }
}
#[must_use]
pub fn inner(&self) -> &AxumTestServer {
&self.inner
}
pub async fn get_envelope<T: DeserializeOwned>(&self, path: &str) -> T {
let resp = self.inner.get(path).await;
assert_envelope::<T>(resp).await
}
pub async fn get_problem(&self, path: &str, expected_code: ErrorCode) -> ApiError {
let resp = self.inner.get(path).await;
assert_problem_json(resp, expected_code).await
}
pub async fn get_paginated<T: DeserializeOwned>(&self, path: &str) -> PaginatedResponse<T> {
let resp = self.inner.get(path).await;
assert_paginated::<T>(resp).await
}
pub async fn post_envelope<B: Serialize, T: DeserializeOwned>(
&self,
path: &str,
body: &B,
) -> T {
let resp = self.inner.post(path).json(body).await;
assert_envelope::<T>(resp).await
}
}