use super::{App, AppError};
use axum_test::{TestServer as AxumTestServer, TestServerConfig, Transport};
pub use spikard_http::testing::{
GraphQLSubscriptionSnapshot, MultipartFilePart, ResponseSnapshot, SnapshotError, SseStream, TestClient,
WebSocketConnection, WebSocketMessage, build_multipart_body, encode_urlencoded_body,
};
pub use spikard_http::testing::SseEvent as TestSseEvent;
pub fn test_client_from_app(app: App) -> Result<TestClient, SnapshotError> {
let router = app
.into_router()
.map_err(|e| SnapshotError::Decompression(format!("Failed to build app router: {e}")))?;
TestClient::from_router(router).map_err(SnapshotError::Decompression)
}
pub struct TestServer {
mock_server: AxumTestServer,
http_server: AxumTestServer,
}
impl TestServer {
pub fn from_app(app: App) -> Result<Self, AppError> {
let router = app.into_router()?;
Self::from_router(router)
}
pub fn from_router(router: axum::Router) -> Result<Self, AppError> {
let mock_server = AxumTestServer::try_new(router.clone()).map_err(|err| AppError::Server(err.to_string()))?;
let config = TestServerConfig {
transport: Some(Transport::HttpRandomPort),
..Default::default()
};
let http_server =
AxumTestServer::try_new_with_config(router, config).map_err(|err| AppError::Server(err.to_string()))?;
Ok(Self {
mock_server,
http_server,
})
}
pub async fn call(
&self,
request: axum::http::Request<axum::body::Body>,
) -> Result<ResponseSnapshot, SnapshotError> {
let response = spikard_http::testing::call_test_server(&self.mock_server, request).await;
spikard_http::testing::snapshot_response(response).await
}
pub async fn connect_websocket(&self, path: &str) -> WebSocketConnection {
spikard_http::testing::connect_websocket(&self.http_server, path).await
}
}