1717package org .springframework .test .web .servlet .request ;
1818
1919import jakarta .servlet .ServletContext ;
20+ import jakarta .servlet .http .Part ;
2021import org .junit .jupiter .api .Test ;
2122
2223import org .springframework .http .HttpMethod ;
2324import org .springframework .http .MediaType ;
2425import org .springframework .mock .web .MockHttpServletRequest ;
26+ import org .springframework .mock .web .MockMultipartFile ;
27+ import org .springframework .mock .web .MockMultipartHttpServletRequest ;
28+ import org .springframework .mock .web .MockPart ;
2529import org .springframework .mock .web .MockServletContext ;
2630
31+ import static java .nio .charset .StandardCharsets .UTF_8 ;
2732import static org .assertj .core .api .Assertions .assertThat ;
2833
2934/**
@@ -35,13 +40,60 @@ public class AbstractMockMultipartHttpServletRequestBuilderTests {
3540
3641 private final ServletContext servletContext = new MockServletContext ();
3742
43+ @ Test // gh-26166
44+ void addFileAndParts () throws Exception {
45+ MockMultipartHttpServletRequest mockRequest =
46+ (MockMultipartHttpServletRequest ) createBuilder ("/upload" )
47+ .file (new MockMultipartFile ("file" , "test.txt" , "text/plain" , "Test" .getBytes (UTF_8 )))
48+ .part (new MockPart ("name" , "value" .getBytes (UTF_8 )))
49+ .buildRequest (new MockServletContext ());
50+
51+ assertThat (mockRequest .getFileMap ()).containsOnlyKeys ("file" );
52+ assertThat (mockRequest .getParameterMap ()).containsOnlyKeys ("name" );
53+ assertThat (mockRequest .getParts ()).extracting (Part ::getName ).containsExactly ("name" );
54+ }
55+
56+ @ Test // gh-26261, gh-26400
57+ void addFileWithoutFilename () throws Exception {
58+ MockPart jsonPart = new MockPart ("data" , "{\" node\" :\" node\" }" .getBytes (UTF_8 ));
59+ jsonPart .getHeaders ().setContentType (MediaType .APPLICATION_JSON );
60+
61+ MockMultipartHttpServletRequest mockRequest =
62+ (MockMultipartHttpServletRequest ) createBuilder ("/upload" )
63+ .file (new MockMultipartFile ("file" , "Test" .getBytes (UTF_8 )))
64+ .part (jsonPart )
65+ .buildRequest (new MockServletContext ());
66+
67+ assertThat (mockRequest .getFileMap ()).containsOnlyKeys ("file" );
68+ assertThat (mockRequest .getParameterMap ()).hasSize (1 );
69+ assertThat (mockRequest .getParameter ("data" )).isEqualTo ("{\" node\" :\" node\" }" );
70+ assertThat (mockRequest .getParts ()).extracting (Part ::getName ).containsExactly ("data" );
71+ }
72+
73+ @ Test
74+ void mergeAndBuild () {
75+ MockHttpServletRequestBuilder parent = new MockHttpServletRequestBuilder (HttpMethod .GET ).uri ("/" );
76+ parent .characterEncoding ("UTF-8" );
77+ Object result = createBuilder ("/fileUpload" ).merge (parent );
78+
79+ assertThat (result ).isNotNull ();
80+ assertThat (result .getClass ()).isEqualTo (TestRequestBuilder .class );
81+
82+ TestRequestBuilder builder = (TestRequestBuilder ) result ;
83+ MockHttpServletRequest request = builder .buildRequest (new MockServletContext ());
84+ assertThat (request .getCharacterEncoding ()).isEqualTo ("UTF-8" );
85+ }
86+
3887
3988 @ Test
4089 void builderSetsRequestContentType () {
41- MockHttpServletRequest request = buildRequest (new TestRequestBuilder ( HttpMethod . PUT ). uri ("/upload" ));
90+ MockHttpServletRequest request = buildRequest (createBuilder ("/upload" ));
4291 assertThat (request .getContentType ()).isEqualTo (MediaType .MULTIPART_FORM_DATA_VALUE );
4392 }
4493
94+ private TestRequestBuilder createBuilder (String uri ) {
95+ return new TestRequestBuilder (HttpMethod .POST ).uri (uri );
96+ }
4597
4698 private MockHttpServletRequest buildRequest (AbstractMockHttpServletRequestBuilder <?> builder ) {
4799 return builder .buildRequest (this .servletContext );
0 commit comments