use aro_web::App;
use aro_web::test::TestClient;
use axum::Router;
use axum::routing::get;
use std::time::Duration;
#[cfg(feature = "test-utils")]
mod timeout_tests {
use super::*;
#[tokio::test]
async fn fast_request_completes_normally() {
let router = Router::new().route("/fast", get(|| async { "done" }));
let app = App::new()
.routes(router)
.timeout(Duration::from_secs(1))
.build();
let client = TestClient::new(app);
let resp = client.get("/fast").send().await;
resp.assert_status(200);
assert_eq!(resp.text(), "done");
}
#[tokio::test]
async fn slow_request_returns_408() {
let router = Router::new().route(
"/slow",
get(|| async {
tokio::time::sleep(Duration::from_millis(200)).await;
"too late"
}),
);
let app = App::new()
.routes(router)
.timeout(Duration::from_millis(50))
.build();
let client = TestClient::new(app);
let resp = client.get("/slow").send().await;
resp.assert_status(408);
}
#[tokio::test]
async fn slow_stateful_request_returns_408() {
use aro_web::dep::Dep;
use aro_web::state::AroState;
use std::sync::Arc;
trait Marker: Send + Sync {
fn value(&self) -> &'static str;
}
struct TestMarker;
impl Marker for TestMarker {
fn value(&self) -> &'static str {
"marked"
}
}
let stateful_routes: Router<AroState> = Router::new().route(
"/slow",
get(|dep: Dep<dyn Marker>| async move {
tokio::time::sleep(Duration::from_millis(200)).await;
dep.value().to_string()
}),
);
let app = App::new()
.register::<dyn Marker>(Arc::new(TestMarker))
.routes_with_state(stateful_routes)
.timeout(Duration::from_millis(50))
.build();
let client = TestClient::new(app);
let resp = client.get("/slow").send().await;
resp.assert_status(408);
}
}