#[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());
}
}