From 9d54299efea0c9c813ff50f34346b002adf0da01 Mon Sep 17 00:00:00 2001 From: overtrue Date: Thu, 16 Apr 2026 10:04:47 +0800 Subject: [PATCH] test(s3): cover batch delete partial response --- crates/s3/src/client.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/crates/s3/src/client.rs b/crates/s3/src/client.rs index 75f0db5..ceaa9fc 100644 --- a/crates/s3/src/client.rs +++ b/crates/s3/src/client.rs @@ -3195,6 +3195,40 @@ mod tests { assert_eq!(request.headers().get("x-rustfs-force-delete"), Some("true")); } + #[tokio::test] + async fn delete_objects_with_partial_errors_returns_deleted_keys() { + let response = http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + + + kept.txt + + + failed.txt + AccessDenied + Access Denied + +"#, + )) + .expect("build partial delete response"); + let (client, request_receiver) = test_s3_client(Some(response)); + + let deleted = client + .delete_objects_with_options( + "bucket", + vec!["kept.txt".to_string(), "failed.txt".to_string()], + DeleteRequestOptions::default(), + ) + .await + .expect("partial delete should still return deleted keys"); + + let request = request_receiver.expect_request(); + assert_eq!(request.uri(), "https://example.com/bucket/?delete"); + assert_eq!(deleted, vec!["kept.txt".to_string()]); + } + #[tokio::test] async fn read_next_part_fills_buffer_until_eof() { use tokio::io::AsyncWriteExt;