diff --git a/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs b/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs index fdc35a71d..42832b6ed 100644 --- a/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs +++ b/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs @@ -429,6 +429,53 @@ mod tests { server.abort(); } + #[tokio::test] + async fn vector_engine_curl_transport_posts_raw_edit_options_and_mask() { + let (base_url, server, request_rx) = start_single_response_server().await; + let response = send_vector_engine_multipart_edit_request_with_curl_options( + format!("{base_url}/v1/images/edits").as_str(), + "test-key", + GPT_IMAGE_2_MODEL, + "测试提示词", + None, + "1536x1024", + 1, + &[ReferenceImage { + bytes: b"reference".to_vec(), + mime_type: "image/webp".to_string(), + file_name: "reference.webp".to_string(), + }], + Some(&RawImageEditOptions { + quality: Some("high".to_string()), + background: Some("transparent".to_string()), + output_format: Some("png".to_string()), + width: 1536, + height: 1024, + mask: Some(ReferenceImage { + bytes: b"mask-bytes".to_vec(), + mime_type: "image/png".to_string(), + file_name: "mask.png".to_string(), + }), + }), + 1_000, + ) + .await + .expect("curl multipart raw edit request should succeed"); + + assert_eq!(response.status, 200); + let request = request_rx + .await + .expect("mock server should capture request"); + let request_text = String::from_utf8_lossy(request.as_slice()); + assert!(request_text.contains("name=\"quality\"\r\n\r\nhigh")); + assert!(request_text.contains("name=\"background\"\r\n\r\ntransparent")); + assert!(request_text.contains("name=\"output_format\"\r\n\r\npng")); + assert!(request_text.contains("name=\"mask\"; filename=\"mask.png\"")); + assert!(request_text.contains("Content-Type: image/png")); + assert!(request_text.contains("mask-bytes")); + server.abort(); + } + async fn start_single_response_server() -> ( String, tokio::task::JoinHandle<()>,