2323import java .util .Map ;
2424import java .util .Set ;
2525
26+ import org .junit .jupiter .api .Nested ;
2627import org .junit .jupiter .api .Test ;
28+ import org .junit .jupiter .params .Parameter ;
29+ import org .junit .jupiter .params .ParameterizedClass ;
30+ import org .junit .jupiter .params .ParameterizedTest ;
31+ import org .junit .jupiter .params .provider .ValueSource ;
2732
2833import org .springframework .beans .PropertyValue ;
2934import org .springframework .beans .PropertyValues ;
3742import org .springframework .web .testfixture .servlet .MockMultipartHttpServletRequest ;
3843
3944import static org .assertj .core .api .Assertions .assertThat ;
45+ import static org .springframework .web .bind .WebDataBinder .DEFAULT_FIELD_DEFAULT_PREFIX ;
46+ import static org .springframework .web .bind .WebDataBinder .DEFAULT_FIELD_MARKER_PREFIX ;
4047
4148/**
49+ * Tests for {@link WebRequestDataBinder}.
50+ *
4251 * @author Juergen Hoeller
52+ * @author Brian Clozel
53+ * @author Sam Brannen
4354 */
4455class WebRequestDataBinderTests {
4556
@@ -79,10 +90,13 @@ void bindingWithNestedObjectCreationThroughAutoGrow() {
7990 assertThat (tb .getSpouse ().getName ()).isEqualTo ("test" );
8091 }
8192
82- @ Test
83- void fieldPrefixCausesFieldReset () {
93+ @ ParameterizedTest
94+ @ ValueSource (booleans = { true , false })
95+ void markerPrefixCausesFieldReset (boolean ignoreUnknownFields ) {
8496 TestBean target = new TestBean ();
97+
8598 WebRequestDataBinder binder = new WebRequestDataBinder (target );
99+ binder .setIgnoreUnknownFields (ignoreUnknownFields );
86100
87101 MockHttpServletRequest request = new MockHttpServletRequest ();
88102 request .addParameter ("_postProcessed" , "visible" );
@@ -96,23 +110,30 @@ void fieldPrefixCausesFieldReset() {
96110 }
97111
98112 @ Test
99- void fieldPrefixCausesFieldResetWithIgnoreUnknownFields () {
113+ void fieldWithArrayIndices () {
100114 TestBean target = new TestBean ();
101115 WebRequestDataBinder binder = new WebRequestDataBinder (target );
102- binder .setIgnoreUnknownFields (false );
103116
104117 MockHttpServletRequest request = new MockHttpServletRequest ();
105- request .addParameter ("_postProcessed " , "visible " );
106- request .addParameter ("postProcessed " , "on " );
118+ request .addParameter ("stringArray[0] " , "ONE " );
119+ request .addParameter ("stringArray[1] " , "TWO " );
107120 binder .bind (new ServletWebRequest (request ));
108- assertThat (target .isPostProcessed ()).isTrue ();
121+ assertThat (target .getStringArray ()).containsExactly ("ONE" , "TWO" );
122+ }
109123
110- request .removeParameter ("postProcessed" );
124+ @ Test
125+ void fieldWithMissingArrayIndex () {
126+ TestBean target = new TestBean ();
127+ WebRequestDataBinder binder = new WebRequestDataBinder (target );
128+
129+ MockHttpServletRequest request = new MockHttpServletRequest ();
130+ request .addParameter ("stringArray" , "ONE" );
131+ request .addParameter ("stringArray" , "TWO" );
111132 binder .bind (new ServletWebRequest (request ));
112- assertThat (target .isPostProcessed ()).isFalse ( );
133+ assertThat (target .getStringArray ()).containsExactly ( "ONE" , "TWO" );
113134 }
114135
115- @ Test // gh-25836
136+ @ Test // gh-25836
116137 void fieldWithEmptyArrayIndex () {
117138 TestBean target = new TestBean ();
118139 WebRequestDataBinder binder = new WebRequestDataBinder (target );
@@ -140,8 +161,7 @@ void fieldDefault() {
140161 assertThat (target .isPostProcessed ()).isFalse ();
141162 }
142163
143- // SPR-13502
144- @ Test
164+ @ Test // SPR-13502
145165 void collectionFieldsDefault () {
146166 TestBean target = new TestBean ();
147167 target .setSomeSet (null );
@@ -332,7 +352,7 @@ void doTestTony(PropertyValues pvs) {
332352 for (PropertyValue pv : pvArray ) {
333353 Object val = m .get (pv .getName ());
334354 assertThat (val ).as ("Can't have unexpected value" ).isNotNull ();
335- assertThat (val ).as ("Val i string" ).isInstanceOf (String .class );
355+ assertThat (val ).as ("Val is string" ).isInstanceOf (String .class );
336356 assertThat (val ).as ("val matches expected" ).isEqualTo (pv .getValue ());
337357 m .remove (pv .getName ());
338358 }
@@ -359,21 +379,80 @@ void multipleValuesForParameter() {
359379 assertThat (Arrays .asList (original )).as ("Correct values" ).isEqualTo (Arrays .asList (values ));
360380 }
361381
362- @ Test
363- void defaultArgumentShouldNotTriggerAutoGrowWhenDisallowed () {
364- TestBean tb = new TestBean ();
365- tb .setSomeMap (null );
366382
367- WebRequestDataBinder binder = new WebRequestDataBinder (tb , "person" );
368- binder .setAllowedFields ("name" );
383+ @ ParameterizedClass // gh-36625
384+ @ ValueSource (strings = { DEFAULT_FIELD_DEFAULT_PREFIX , DEFAULT_FIELD_MARKER_PREFIX })
385+ @ Nested
386+ class DefaultAndMarkerPrefixTests {
369387
370- MockHttpServletRequest request = new MockHttpServletRequest ();
371- request .addParameter ("name" , "spring" );
372- request .addParameter ("!someMap[key1]" , "test" );
373- binder .bind (new ServletWebRequest (request ));
388+ @ Parameter
389+ String prefix ;
390+
391+ @ Test
392+ void shouldNotTriggerBindingWhenFieldIsNotAllowed () {
393+ TestBean tb = new TestBean ();
394+
395+ WebRequestDataBinder binder = new WebRequestDataBinder (tb , "person" );
396+ binder .setAllowedFields ("name" );
397+
398+ MockHttpServletRequest request = new MockHttpServletRequest ();
399+ request .addParameter ("name" , "spring" );
400+ request .addParameter (prefix + "country" , "test" );
401+ binder .bind (new ServletWebRequest (request ));
402+
403+ assertThat (tb .getName ()).isEqualTo ("spring" );
404+ assertThat (tb .getCountry ()).isNull ();
405+ }
406+
407+ @ Test
408+ void shouldNotTriggerBindingWhenFieldIsDisallowed () {
409+ TestBean tb = new TestBean ();
410+
411+ WebRequestDataBinder binder = new WebRequestDataBinder (tb , "person" );
412+ binder .setDisallowedFields ("country" );
413+
414+ MockHttpServletRequest request = new MockHttpServletRequest ();
415+ request .addParameter ("name" , "spring" );
416+ request .addParameter (prefix + "country" , "test" );
417+ binder .bind (new ServletWebRequest (request ));
418+
419+ assertThat (tb .getName ()).isEqualTo ("spring" );
420+ assertThat (tb .getCountry ()).isNull ();
421+ }
374422
375- assertThat (tb .getName ()).isEqualTo ("spring" );
376- assertThat (tb .getSomeMap ()).isNull ();
423+ @ Test
424+ void shouldNotTriggerAutoGrowWhenFieldIsNotAllowed () {
425+ TestBean tb = new TestBean ();
426+ tb .setSomeMap (null );
427+
428+ WebRequestDataBinder binder = new WebRequestDataBinder (tb , "person" );
429+ binder .setAllowedFields ("name" );
430+
431+ MockHttpServletRequest request = new MockHttpServletRequest ();
432+ request .addParameter ("name" , "spring" );
433+ request .addParameter (prefix + "someMap[key1]" , "test" );
434+ binder .bind (new ServletWebRequest (request ));
435+
436+ assertThat (tb .getName ()).isEqualTo ("spring" );
437+ assertThat (tb .getSomeMap ()).isNull ();
438+ }
439+
440+ @ Test
441+ void shouldNotTriggerAutoGrowWhenFieldIsDisallowed () {
442+ TestBean tb = new TestBean ();
443+ tb .setSomeMap (null );
444+
445+ WebRequestDataBinder binder = new WebRequestDataBinder (tb , "person" );
446+ binder .setDisallowedFields ("someMap[key1]" );
447+
448+ MockHttpServletRequest request = new MockHttpServletRequest ();
449+ request .addParameter ("name" , "spring" );
450+ request .addParameter (prefix + "someMap[key1]" , "test" );
451+ binder .bind (new ServletWebRequest (request ));
452+
453+ assertThat (tb .getName ()).isEqualTo ("spring" );
454+ assertThat (tb .getSomeMap ()).isNull ();
455+ }
377456 }
378457
379458
@@ -404,5 +483,4 @@ public TestBean getConcreteSpouse() {
404483 }
405484 }
406485
407-
408486}
0 commit comments