aro-web 1.0.0

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

#[cfg(feature = "decompression")]
mod tests {
    use aro_web::App;
    use aro_web::middleware::decompression;
    use axum::Router;
    use axum::body::Body;
    use axum::http::{Request, StatusCode};
    use axum::routing::post;
    use flate2::Compression;
    use flate2::write::GzEncoder;
    use std::io::Write;
    use tower::ServiceExt;

    #[expect(
        clippy::unwrap_used,
        reason = "test helper — gzip encoding of test data cannot fail"
    )]
    fn gzip_encode(data: &[u8]) -> Vec<u8> {
        let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
        encoder.write_all(data).unwrap();
        encoder.finish().unwrap()
    }

    #[tokio::test]
    async fn decompresses_gzip_request_body() {
        let app = App::new()
            .routes(
                Router::new()
                    .route("/echo", post(|body: String| async move { body }))
                    .layer(decompression()),
            )
            .build();

        let original = "hello decompressed world";
        let compressed = gzip_encode(original.as_bytes());

        let request = Request::builder()
            .method("POST")
            .uri("/echo")
            .header("content-encoding", "gzip")
            .header("content-type", "text/plain")
            .body(Body::from(compressed))
            .unwrap();

        let response = app.oneshot(request).await.unwrap();
        assert_eq!(response.status(), StatusCode::OK);

        let body = axum::body::to_bytes(response.into_body(), usize::MAX)
            .await
            .unwrap();
        assert_eq!(body, original.as_bytes());
    }

    #[tokio::test]
    async fn passes_through_uncompressed_body() {
        let app = App::new()
            .routes(
                Router::new()
                    .route("/echo", post(|body: String| async move { body }))
                    .layer(decompression()),
            )
            .build();

        let original = "plain text body";

        let request = Request::builder()
            .method("POST")
            .uri("/echo")
            .header("content-type", "text/plain")
            .body(Body::from(original))
            .unwrap();

        let response = app.oneshot(request).await.unwrap();
        assert_eq!(response.status(), StatusCode::OK);

        let body = axum::body::to_bytes(response.into_body(), usize::MAX)
            .await
            .unwrap();
        assert_eq!(body, original.as_bytes());
    }
}