This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/main by this push:
     new 477ee89c02 Add more @Multipart tests (#2152)
477ee89c02 is described below

commit 477ee89c020bb21c6d2528646bc34230cb6cb719
Author: Andriy Redko <[email protected]>
AuthorDate: Mon Dec 23 10:41:55 2024 -0500

    Add more @Multipart tests (#2152)
---
 .../cxf/systest/jaxrs/JAXRSMultipartTest.java      |  44 ++++++
 .../apache/cxf/systest/jaxrs/MultipartStore.java   |  18 +++
 .../validation/JAXRSMultipartValidationTest.java   | 168 +++++++++++++++++++++
 .../MultipartBookStoreWithValidation.java          |  53 +++++++
 4 files changed, 283 insertions(+)

diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
index 061f4a129b..e1a1984908 100644
--- 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java
@@ -39,6 +39,7 @@ import javax.imageio.ImageIO;
 
 import jakarta.activation.DataHandler;
 import jakarta.mail.util.ByteArrayDataSource;
+import jakarta.ws.rs.client.Client;
 import jakarta.ws.rs.client.ClientBuilder;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.client.WebTarget;
@@ -421,6 +422,49 @@ public class JAXRSMultipartTest extends 
AbstractBusClientServerTestBase {
         doAddBook(address, "attachmentData", 200);
     }
 
+    @Test
+    public void testAddBookWithDetailsAsMultipart() throws Exception {
+        String address = "http://localhost:"; + PORT + 
"/bookstore/books/details";
+
+        final Client client = ClientBuilder.newClient();
+        try (InputStream is = getClass()
+                
.getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/attachmentData")) 
{
+            final MultipartBody builder = new MultipartBody(Arrays.asList(
+                new AttachmentBuilder()
+                    .mediaType("application/xml")
+                    .id("book")
+                    .object(new Book())
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile1Detail")
+                    .object(is)
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field1\";"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile2Detail")
+                    .dataHandler(new DataHandler(
+                        new InputStreamDataSource(new ByteArrayInputStream(new 
byte[0]), "text/xml")))
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field2\";"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile3Detail")
+                    .dataHandler(new DataHandler(new InputStreamDataSource(
+                        new ByteArrayInputStream(new byte[0]), "text/xml")))
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field3\";"))
+                    .build()));
+        
+            final Response response = client
+                .target(address)
+                .request("text/xml")
+                .post(Entity.entity(builder, "multipart/form-data"));
+
+            final Book book = response.readEntity(Book.class);
+            assertThat("Unexpected status code for response:" + response, 
+                response.getStatus(), equalTo(200));
+            assertThat(book.getName(), 
equalTo("upfile1Detail,upfile2Detail,upfile3Detail"));
+        }
+    }
+
     @Test
     public void testAddBookAsJAXBBody() throws Exception {
         String address = "http://localhost:"; + PORT + 
"/bookstore/books/jaxb-body";
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java
index 99965b8370..01190c6185 100644
--- 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/MultipartStore.java
@@ -405,6 +405,24 @@ public class MultipartStore {
         return Response.ok(b1).build();
     }
 
+    @POST
+    @Path("/books/details")
+    @Consumes("multipart/form-data")
+    @Produces("text/xml")
+    public Response addBookWithDetails(@Multipart(value = "book", type = 
"application/xml") Book book,
+            @Multipart("upfile1Detail") Attachment a1,
+            @Multipart("upfile2Detail") Attachment a2,
+            @Multipart("upfile3Detail") Attachment a3)
+        throws Exception {
+
+        if (a1.equals(a2) || a1.equals(a3) || a2.equals(a3)) {
+            throw new WebApplicationException();
+        }
+
+        book.setName(a1.getContentId() + "," + a2.getContentId() + "," + 
a3.getContentId());
+        return Response.ok(book).build();
+    }
+
     @POST
     @Path("/books/jaxb-body")
     @Consumes("multipart/related;type=\"text/xml\"")
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSMultipartValidationTest.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSMultipartValidationTest.java
new file mode 100644
index 0000000000..b855daabfa
--- /dev/null
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSMultipartValidationTest.java
@@ -0,0 +1,168 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs.validation;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+
+import jakarta.activation.DataHandler;
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Response;
+import org.apache.cxf.Bus;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.ext.multipart.AttachmentBuilder;
+import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition;
+import org.apache.cxf.jaxrs.ext.multipart.InputStreamDataSource;
+import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
+import org.apache.cxf.jaxrs.validation.ValidationExceptionMapper;
+import org.apache.cxf.testutil.common.AbstractServerTestServerBase;
+import org.apache.cxf.validation.BeanValidationFeature;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class JAXRSMultipartValidationTest extends AbstractJAXRSValidationTest {
+    public static final String PORT = 
allocatePort(JAXRSMultipartValidationTest.class);
+
+    public static class Server extends AbstractServerTestServerBase {
+        @Override
+        protected org.apache.cxf.endpoint.Server createServer(Bus bus) throws 
Exception {
+            final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+            sf.setResourceClasses(MultipartBookStoreWithValidation.class);
+            sf.setFeatures(List.of(new BeanValidationFeature()));
+            sf.setProvider(new ValidationExceptionMapper());
+            sf.setResourceProvider(new SingletonResourceProvider(new 
MultipartBookStoreWithValidation()));
+            sf.setAddress("http://localhost:"; + PORT + "/");
+            return sf.create();
+        }
+
+        public static void main(String[] args) throws Exception {
+            new Server().start();
+        }
+    }
+    
+    @BeforeClass
+    public static void startServers() throws Exception {
+        AbstractResourceInfo.clearAllMaps();
+        //keep out of process due to stack traces testing failures
+        assertTrue("server did not launch correctly", 
launchServer(Server.class, true));
+    }
+
+    @Test
+    public void testAddBookWithDetailsAsMultipartBadRequest() throws Exception 
{
+        String address = "http://localhost:"; + PORT + 
"/bookstore/books/details";
+
+        final Client client = ClientBuilder.newClient();
+        try (InputStream is = getClass()
+                
.getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/attachmentData")) 
{
+            final MultipartBody builder = new MultipartBody(Arrays.asList(
+                new AttachmentBuilder()
+                    .mediaType("application/xml")
+                    .id("book")
+                    .object(new BookWithValidation())
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile1Detail")
+                    .object(is)
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field1\";"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile2Detail")
+                    .dataHandler(new DataHandler(
+                        new InputStreamDataSource(new ByteArrayInputStream(new 
byte[0]), "text/xml")))
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field2\";"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile3Detail")
+                    .dataHandler(new DataHandler(new InputStreamDataSource(
+                        new ByteArrayInputStream(new byte[0]), "text/xml")))
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field3\";"))
+                    .build()));
+        
+            final Response response = client
+                .target(address)
+                .request("text/xml")
+                .post(Entity.entity(builder, "multipart/form-data"));
+
+            // Book's name is 'null', validation should fail with 400
+            assertThat("Unexpected status code for response:" + response, 
+                response.getStatus(), equalTo(400));
+        }
+    }
+
+    @Test
+    public void testAddBookWithDetailsAsMultipart() throws Exception {
+        String address = "http://localhost:"; + PORT + 
"/bookstore/books/details";
+
+        final Client client = ClientBuilder.newClient();
+        try (InputStream is = getClass()
+                
.getResourceAsStream("/org/apache/cxf/systest/jaxrs/resources/attachmentData")) 
{
+            final MultipartBody builder = new MultipartBody(Arrays.asList(
+                new AttachmentBuilder()
+                    .mediaType("application/xml")
+                    .id("book")
+                    .object(new BookWithValidation("Book", "book1"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile1Detail")
+                    .object(is)
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field1\";"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile2Detail")
+                    .dataHandler(new DataHandler(
+                        new InputStreamDataSource(new ByteArrayInputStream(new 
byte[0]), "text/xml")))
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field2\";"))
+                    .build(),
+                new AttachmentBuilder()
+                    .id("upfile3Detail")
+                    .dataHandler(new DataHandler(new InputStreamDataSource(
+                        new ByteArrayInputStream(new byte[0]), "text/xml")))
+                    .contentDisposition(new ContentDisposition("form-data; 
name=\"field3\";"))
+                    .build()));
+        
+            final Response response = client
+                .target(address)
+                .request("text/xml")
+                .post(Entity.entity(builder, "multipart/form-data"));
+
+            final BookWithValidation book = 
response.readEntity(BookWithValidation.class);
+            assertThat("Unexpected status code for response:" + response, 
+                response.getStatus(), equalTo(200));
+            assertThat(book.getName(), 
equalTo("upfile1Detail,upfile2Detail,upfile3Detail"));
+        }
+    }
+
+    @Override
+    protected String getPort() {
+        return PORT;
+    }
+}
+
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/MultipartBookStoreWithValidation.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/MultipartBookStoreWithValidation.java
new file mode 100644
index 0000000000..52165c301e
--- /dev/null
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/MultipartBookStoreWithValidation.java
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs.validation;
+
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.multipart.Attachment;
+import org.apache.cxf.jaxrs.ext.multipart.Multipart;
+
+@Path("/bookstore")
+public class MultipartBookStoreWithValidation {
+    @POST
+    @Path("/books/details")
+    @Consumes("multipart/form-data")
+    @Produces("text/xml")
+    public Response addBookWithDetails(
+            @Valid @Multipart(value = "book", type = "application/xml") 
BookWithValidation book,
+            @Multipart("upfile1Detail") Attachment a1,
+            @Multipart("upfile2Detail") Attachment a2,
+            @Multipart("upfile3Detail") Attachment a3)
+        throws Exception {
+
+        if (a1.equals(a2) || a1.equals(a3) || a2.equals(a3)) {
+            throw new WebApplicationException();
+        }
+
+        book.setName(a1.getContentId() + "," + a2.getContentId() + "," + 
a3.getContentId());
+        return Response.ok(book, MediaType.APPLICATION_XML_TYPE).build();
+    }
+}

Reply via email to