use axum::Router;
pub struct TestServer {
inner: axum_test::TestServer,
}
impl TestServer {
pub fn new(app: Router) -> anyhow::Result<Self> {
let inner = axum_test::TestServer::new(app)?;
Ok(Self { inner })
}
pub fn get(&self, path: &str) -> axum_test::TestRequest {
self.inner.get(path)
}
pub fn post(&self, path: &str) -> axum_test::TestRequest {
self.inner.post(path)
}
pub fn put(&self, path: &str) -> axum_test::TestRequest {
self.inner.put(path)
}
pub fn patch(&self, path: &str) -> axum_test::TestRequest {
self.inner.patch(path)
}
pub fn delete(&self, path: &str) -> axum_test::TestRequest {
self.inner.delete(path)
}
#[must_use]
pub const fn inner(&self) -> &axum_test::TestServer {
&self.inner
}
}
#[cfg(test)]
mod tests {
use super::*;
use axum::{routing::get, Router};
#[tokio::test]
async fn test_server_creation() {
let app = Router::new().route("/", get(|| async { "Hello" }));
let server = TestServer::new(app).unwrap();
let response = server.get("/").await;
response.assert_status_ok();
}
#[tokio::test]
async fn test_http_methods() {
let app = Router::new()
.route("/", get(|| async { "GET" }))
.route("/post", axum::routing::post(|| async { "POST" }))
.route("/put", axum::routing::put(|| async { "PUT" }))
.route("/patch", axum::routing::patch(|| async { "PATCH" }))
.route("/delete", axum::routing::delete(|| async { "DELETE" }));
let server = TestServer::new(app).unwrap();
server.get("/").await.assert_status_ok();
server.post("/post").await.assert_status_ok();
server.put("/put").await.assert_status_ok();
server.patch("/patch").await.assert_status_ok();
server.delete("/delete").await.assert_status_ok();
}
}