aro-web 1.0.0

HTTP/ADR layer for the Aro web framework
Documentation
//! Integration tests for the request timeout middleware.

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);
    }
}