From 2b35c16149c87380f85d8a38f8fac805366cf0bd Mon Sep 17 00:00:00 2001 From: lsocha Date: Tue, 16 Jul 2024 13:08:53 +0200 Subject: [PATCH] fix: Fix order of file upload multipart request --- .../box/sdk/AbstractBoxMultipartRequest.java | 13 ++++--- src/test/java/com/box/sdk/BoxFolderTest.java | 39 +++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/box/sdk/AbstractBoxMultipartRequest.java b/src/main/java/com/box/sdk/AbstractBoxMultipartRequest.java index a3759af47..0419c5bd3 100644 --- a/src/main/java/com/box/sdk/AbstractBoxMultipartRequest.java +++ b/src/main/java/com/box/sdk/AbstractBoxMultipartRequest.java @@ -141,13 +141,14 @@ protected String bodyToString() { protected void writeMethodWithBody(Request.Builder requestBuilder, ProgressListener progressListener) { MultipartBody.Builder bodyBuilder = new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart( - getPartName(), - filename, - getBody(progressListener) - ); + .setType(MultipartBody.FORM); + // Attributes should go first this.fields.forEach(bodyBuilder::addFormDataPart); + // File should go second + bodyBuilder.addFormDataPart( + getPartName(), + filename, + getBody(progressListener)); requestBuilder.post(bodyBuilder.build()); } diff --git a/src/test/java/com/box/sdk/BoxFolderTest.java b/src/test/java/com/box/sdk/BoxFolderTest.java index 6242065a4..d2ebbcbeb 100644 --- a/src/test/java/com/box/sdk/BoxFolderTest.java +++ b/src/test/java/com/box/sdk/BoxFolderTest.java @@ -25,6 +25,8 @@ import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.junit.WireMockRule; import com.github.tomakehurst.wiremock.matching.EqualToJsonPattern; +import com.github.tomakehurst.wiremock.matching.EqualToPattern; +import com.github.tomakehurst.wiremock.matching.MultipartValuePatternBuilder; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -1235,6 +1237,43 @@ public void testDeleteClassification() { WireMock.verify(1, WireMock.deleteRequestedFor(WireMock.urlPathEqualTo(metadataURL))); } + @Test + public void testUploadFileWithCorrectMultipartOrder() { + final String folderID = "0"; + final String fileURL = "/2.0/files/content"; + final String fileContent = "Test file"; + final String fileName = "Test File.txt"; + final String fileDescription = "Test Description"; + InputStream stream = new ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8)); + final String expectedAttributesJson = + "{\"name\":\"Test File.txt\",\"parent\":{\"id\": \"0\"},\"description\":\"Test Description\"}"; + + String result = TestUtils.getFixture("BoxFile/CreateFileWithDescription201"); + + wireMockRule.stubFor(WireMock.post(WireMock.urlPathEqualTo(fileURL)) + .withRequestBody(WireMock.matching(".*attributes.*file.*")) // Check that attributes comes before file + .withMultipartRequestBody( + new MultipartValuePatternBuilder() + .withName("attributes") + .withBody(new EqualToJsonPattern(expectedAttributesJson, false, false)) + ).withMultipartRequestBody( + new MultipartValuePatternBuilder() + .withName("file") + .withBody(new EqualToPattern(fileContent)) + ) + .willReturn(WireMock.aResponse() + .withHeader("Content-Type", APPLICATION_JSON_PATCH) + .withBody(result) + .withStatus(201))); + + BoxFolder folder = new BoxFolder(this.api, folderID); + BoxFile.Info file = folder.uploadFile(stream, fileName, fileDescription); + + assertEquals(fileDescription, file.getDescription()); + assertEquals(folderID, file.getParent().getID()); + assertEquals(fileName, file.getName()); + } + @Test public void testUploadFileWithDescriptionSucceeds() { final String folderID = "12345";