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