diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/request/AbstractMockMultipartHttpServletRequestBuilderTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/request/AbstractMockMultipartHttpServletRequestBuilderTests.java index ea4b4a95b8..0ae56091fb 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/request/AbstractMockMultipartHttpServletRequestBuilderTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/request/AbstractMockMultipartHttpServletRequestBuilderTests.java @@ -17,13 +17,18 @@ package org.springframework.test.web.servlet.request; import jakarta.servlet.ServletContext; +import jakarta.servlet.http.Part; import org.junit.jupiter.api.Test; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.mock.web.MockMultipartHttpServletRequest; +import org.springframework.mock.web.MockPart; import org.springframework.mock.web.MockServletContext; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; /** @@ -35,13 +40,60 @@ public class AbstractMockMultipartHttpServletRequestBuilderTests { private final ServletContext servletContext = new MockServletContext(); + @Test // gh-26166 + void addFileAndParts() throws Exception { + MockMultipartHttpServletRequest mockRequest = + (MockMultipartHttpServletRequest) createBuilder("/upload") + .file(new MockMultipartFile("file", "test.txt", "text/plain", "Test".getBytes(UTF_8))) + .part(new MockPart("name", "value".getBytes(UTF_8))) + .buildRequest(new MockServletContext()); + + assertThat(mockRequest.getFileMap()).containsOnlyKeys("file"); + assertThat(mockRequest.getParameterMap()).containsOnlyKeys("name"); + assertThat(mockRequest.getParts()).extracting(Part::getName).containsExactly("name"); + } + + @Test // gh-26261, gh-26400 + void addFileWithoutFilename() throws Exception { + MockPart jsonPart = new MockPart("data", "{\"node\":\"node\"}".getBytes(UTF_8)); + jsonPart.getHeaders().setContentType(MediaType.APPLICATION_JSON); + + MockMultipartHttpServletRequest mockRequest = + (MockMultipartHttpServletRequest) createBuilder("/upload") + .file(new MockMultipartFile("file", "Test".getBytes(UTF_8))) + .part(jsonPart) + .buildRequest(new MockServletContext()); + + assertThat(mockRequest.getFileMap()).containsOnlyKeys("file"); + assertThat(mockRequest.getParameterMap()).hasSize(1); + assertThat(mockRequest.getParameter("data")).isEqualTo("{\"node\":\"node\"}"); + assertThat(mockRequest.getParts()).extracting(Part::getName).containsExactly("data"); + } + + @Test + void mergeAndBuild() { + MockHttpServletRequestBuilder parent = new MockHttpServletRequestBuilder(HttpMethod.GET).uri("/"); + parent.characterEncoding("UTF-8"); + Object result = createBuilder("/fileUpload").merge(parent); + + assertThat(result).isNotNull(); + assertThat(result.getClass()).isEqualTo(TestRequestBuilder.class); + + TestRequestBuilder builder = (TestRequestBuilder) result; + MockHttpServletRequest request = builder.buildRequest(new MockServletContext()); + assertThat(request.getCharacterEncoding()).isEqualTo("UTF-8"); + } + @Test void builderSetsRequestContentType() { - MockHttpServletRequest request = buildRequest(new TestRequestBuilder(HttpMethod.PUT).uri("/upload")); + MockHttpServletRequest request = buildRequest(createBuilder("/upload")); assertThat(request.getContentType()).isEqualTo(MediaType.MULTIPART_FORM_DATA_VALUE); } + private TestRequestBuilder createBuilder(String uri) { + return new TestRequestBuilder(HttpMethod.POST).uri(uri); + } private MockHttpServletRequest buildRequest(AbstractMockHttpServletRequestBuilder builder) { return builder.buildRequest(this.servletContext);