@ -79,6 +79,7 @@ import static org.assertj.core.api.Assertions.entry;
* @author Rob Harrop
* @author Rob Harrop
* @author Kazuki Shimizu
* @author Kazuki Shimizu
* @author Sam Brannen
* @author Sam Brannen
* @author Arjen Poutsma
* /
* /
class DataBinderTests {
class DataBinderTests {
@ -92,6 +93,7 @@ class DataBinderTests {
}
}
} ) ;
} ) ;
@Test
@Test
void bindingNoErrors ( ) throws BindException {
void bindingNoErrors ( ) throws BindException {
TestBean rod = new TestBean ( ) ;
TestBean rod = new TestBean ( ) ;
@ -113,7 +115,7 @@ class DataBinderTests {
TestBean tb = ( TestBean ) map . get ( "person" ) ;
TestBean tb = ( TestBean ) map . get ( "person" ) ;
assertThat ( tb . equals ( rod ) ) . as ( "Same object" ) . isTrue ( ) ;
assertThat ( tb . equals ( rod ) ) . as ( "Same object" ) . isTrue ( ) ;
BindingResult other = new BeanPropertyBindingResult ( rod , "person" ) ;
BindingResult other = new DataBinder ( rod , "person" ) . getBindingResult ( ) ;
assertThat ( binder . getBindingResult ( ) ) . isEqualTo ( other ) ;
assertThat ( binder . getBindingResult ( ) ) . isEqualTo ( other ) ;
assertThat ( other ) . isEqualTo ( binder . getBindingResult ( ) ) ;
assertThat ( other ) . isEqualTo ( binder . getBindingResult ( ) ) ;
BindException ex = new BindException ( other ) ;
BindException ex = new BindException ( other ) ;
@ -167,8 +169,9 @@ class DataBinderTests {
pvs . add ( "name" , "Rod" ) ;
pvs . add ( "name" , "Rod" ) ;
pvs . add ( "age" , 32 ) ;
pvs . add ( "age" , 32 ) ;
pvs . add ( "nonExisting" , "someValue" ) ;
pvs . add ( "nonExisting" , "someValue" ) ;
assertThatExceptionOfType ( NotWritablePropertyException . class ) . isThrownBy ( ( ) - >
binder . bind ( pvs ) ) ;
assertThatExceptionOfType ( NotWritablePropertyException . class )
. isThrownBy ( ( ) - > binder . bind ( pvs ) ) ;
}
}
@Test
@Test
@ -178,8 +181,9 @@ class DataBinderTests {
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
pvs . add ( "name" , "Rod" ) ;
pvs . add ( "name" , "Rod" ) ;
pvs . add ( "spouse.age" , 32 ) ;
pvs . add ( "spouse.age" , 32 ) ;
assertThatExceptionOfType ( NullValueInNestedPathException . class ) . isThrownBy ( ( ) - >
binder . bind ( pvs ) ) ;
assertThatExceptionOfType ( NullValueInNestedPathException . class )
. isThrownBy ( ( ) - > binder . bind ( pvs ) ) ;
}
}
@Test
@Test
@ -207,57 +211,56 @@ class DataBinderTests {
pvs . add ( "age" , "32x" ) ;
pvs . add ( "age" , "32x" ) ;
pvs . add ( "touchy" , "m.y" ) ;
pvs . add ( "touchy" , "m.y" ) ;
binder . bind ( pvs ) ;
binder . bind ( pvs ) ;
assertThatExceptionOfType ( BindException . class ) . isThrownBy (
binder : : close )
assertThatExceptionOfType ( BindException . class ) . isThrownBy ( binder : : close ) . satisfies ( ex - > {
. satisfies ( ex - > {
assertThat ( rod . getName ( ) ) . isEqualTo ( "Rod" ) ;
assertThat ( rod . getName ( ) ) . isEqualTo ( "Rod" ) ;
Map < ? , ? > map = binder . getBindingResult ( ) . getModel ( ) ;
Map < ? , ? > map = binder . getBindingResult ( ) . getModel ( ) ;
TestBean tb = ( TestBean ) map . get ( "person" ) ;
TestBean tb = ( TestBean ) map . get ( "person" ) ;
assertThat ( tb ) . isSameAs ( rod ) ;
assertThat ( tb ) . isSameAs ( rod ) ;
BindingResult br = ( BindingResult ) map . get ( BindingResult . MODEL_KEY_PREFIX + "person" ) ;
BindingResult br = ( BindingResult ) map . get ( BindingResult . MODEL_KEY_PREFIX + "person" ) ;
assertThat ( BindingResultUtils . getBindingResult ( map , "person" ) ) . isEqualTo ( br ) ;
assertThat ( BindingResultUtils . getBindingResult ( map , "person" ) ) . isEqualTo ( br ) ;
assertThat ( BindingResultUtils . getRequiredBindingResult ( map , "person" ) ) . isEqualTo ( br ) ;
assertThat ( BindingResultUtils . getRequiredBindingResult ( map , "person" ) ) . isEqualTo ( br ) ;
assertThat ( BindingResultUtils . getBindingResult ( map , "someOtherName" ) ) . isNull ( ) ;
assertThat ( BindingResultUtils . getBindingResult ( map , "someOtherName" ) ) . isNull ( ) ;
assertThatIllegalStateException ( ) . isThrownBy ( ( ) - >
assertThatIllegalStateException ( ) . isThrownBy ( ( ) - >
BindingResultUtils . getRequiredBindingResult ( map , "someOtherName" ) ) ;
BindingResultUtils . getRequiredBindingResult ( map , "someOtherName" ) ) ;
assertThat ( binder . getBindingResult ( ) ) . as ( "Added itself to map" ) . isSameAs ( br ) ;
assertThat ( binder . getBindingResult ( ) ) . as ( "Added itself to map" ) . isSameAs ( br ) ;
assertThat ( br . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( br . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( br . getErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( br . getErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( br . hasFieldErrors ( "age" ) ) . isTrue ( ) ;
assertThat ( br . hasFieldErrors ( "age" ) ) . isTrue ( ) ;
assertThat ( br . getFieldErrorCount ( "age" ) ) . isEqualTo ( 1 ) ;
assertThat ( br . getFieldErrorCount ( "age" ) ) . isEqualTo ( 1 ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "age" ) ) . isEqualTo ( "32x" ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "age" ) ) . isEqualTo ( "32x" ) ;
FieldError ageError = binder . getBindingResult ( ) . getFieldError ( "age" ) ;
FieldError ageError = binder . getBindingResult ( ) . getFieldError ( "age" ) ;
assertThat ( ageError ) . isNotNull ( ) ;
assertThat ( ageError ) . isNotNull ( ) ;
assertThat ( ageError . getCode ( ) ) . isEqualTo ( "typeMismatch" ) ;
assertThat ( ageError . getCode ( ) ) . isEqualTo ( "typeMismatch" ) ;
assertThat ( ageError . getRejectedValue ( ) ) . isEqualTo ( "32x" ) ;
assertThat ( ageError . getRejectedValue ( ) ) . isEqualTo ( "32x" ) ;
assertThat ( ageError . contains ( TypeMismatchException . class ) ) . isTrue ( ) ;
assertThat ( ageError . contains ( TypeMismatchException . class ) ) . isTrue ( ) ;
assertThat ( ageError . contains ( NumberFormatException . class ) ) . isTrue ( ) ;
assertThat ( ageError . contains ( NumberFormatException . class ) ) . isTrue ( ) ;
assertThat ( ageError . unwrap ( NumberFormatException . class ) . getMessage ( ) ) . contains ( "32x" ) ;
assertThat ( ageError . unwrap ( NumberFormatException . class ) . getMessage ( ) ) . contains ( "32x" ) ;
assertThat ( tb . getAge ( ) ) . isEqualTo ( 0 ) ;
assertThat ( tb . getAge ( ) ) . isEqualTo ( 0 ) ;
assertThat ( br . hasFieldErrors ( "touchy" ) ) . isTrue ( ) ;
assertThat ( br . hasFieldErrors ( "touchy" ) ) . isTrue ( ) ;
assertThat ( br . getFieldErrorCount ( "touchy" ) ) . isEqualTo ( 1 ) ;
assertThat ( br . getFieldErrorCount ( "touchy" ) ) . isEqualTo ( 1 ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "touchy" ) ) . isEqualTo ( "m.y" ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "touchy" ) ) . isEqualTo ( "m.y" ) ;
FieldError touchyError = binder . getBindingResult ( ) . getFieldError ( "touchy" ) ;
FieldError touchyError = binder . getBindingResult ( ) . getFieldError ( "touchy" ) ;
assertThat ( touchyError ) . isNotNull ( ) ;
assertThat ( touchyError ) . isNotNull ( ) ;
assertThat ( touchyError . getCode ( ) ) . isEqualTo ( "methodInvocation" ) ;
assertThat ( touchyError . getCode ( ) ) . isEqualTo ( "methodInvocation" ) ;
assertThat ( touchyError . getRejectedValue ( ) ) . isEqualTo ( "m.y" ) ;
assertThat ( touchyError . getRejectedValue ( ) ) . isEqualTo ( "m.y" ) ;
assertThat ( touchyError . contains ( MethodInvocationException . class ) ) . isTrue ( ) ;
assertThat ( touchyError . contains ( MethodInvocationException . class ) ) . isTrue ( ) ;
assertThat ( touchyError . unwrap ( MethodInvocationException . class ) . getCause ( ) . getMessage ( ) ) . contains ( "a ." ) ;
assertThat ( touchyError . unwrap ( MethodInvocationException . class ) . getCause ( ) . getMessage ( ) ) . contains ( "a ." ) ;
assertThat ( tb . getTouchy ( ) ) . isNull ( ) ;
assertThat ( tb . getTouchy ( ) ) . isNull ( ) ;
DataBinder binder2 = new DataBinder ( new TestBean ( ) , "person" ) ;
DataBinder binder2 = new DataBinder ( new TestBean ( ) , "person" ) ;
MutablePropertyValues pvs2 = new MutablePropertyValues ( ) ;
MutablePropertyValues pvs2 = new MutablePropertyValues ( ) ;
pvs2 . add ( "name" , "Rod" ) ;
pvs2 . add ( "name" , "Rod" ) ;
pvs2 . add ( "age" , "32x" ) ;
pvs2 . add ( "age" , "32x" ) ;
pvs2 . add ( "touchy" , "m.y" ) ;
pvs2 . add ( "touchy" , "m.y" ) ;
binder2 . bind ( pvs2 ) ;
binder2 . bind ( pvs2 ) ;
assertThat ( ex . getBindingResult ( ) ) . isEqualTo ( binder2 . getBindingResult ( ) ) ;
assertThat ( ex . getBindingResult ( ) ) . isEqualTo ( binder2 . getBindingResult ( ) ) ;
} ) ;
} ) ;
}
}
@Test
@Test
@ -267,15 +270,17 @@ class DataBinderTests {
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
pvs . add ( "class.classLoader.URLs[0]" , "https://myserver" ) ;
pvs . add ( "class.classLoader.URLs[0]" , "https://myserver" ) ;
binder . setIgnoreUnknownFields ( false ) ;
binder . setIgnoreUnknownFields ( false ) ;
assertThatExceptionOfType ( NotWritablePropertyException . class ) . isThrownBy ( ( ) - >
binder . bind ( pvs ) )
assertThatExceptionOfType ( NotWritablePropertyException . class )
. withMessageContaining ( "classLoader" ) ;
. isThrownBy ( ( ) - > binder . bind ( pvs ) )
. withMessageContaining ( "classLoader" ) ;
}
}
@Test
@Test
void bindingWithErrorsAndCustomEditors ( ) {
void bindingWithErrorsAndCustomEditors ( ) {
TestBean rod = new TestBean ( ) ;
TestBean rod = new TestBean ( ) ;
DataBinder binder = new DataBinder ( rod , "person" ) ;
DataBinder binder = new DataBinder ( rod , "person" ) ;
binder . registerCustomEditor ( String . class , "touchy" , new PropertyEditorSupport ( ) {
binder . registerCustomEditor ( String . class , "touchy" , new PropertyEditorSupport ( ) {
@Override
@Override
public void setAsText ( String text ) throws IllegalArgumentException {
public void setAsText ( String text ) throws IllegalArgumentException {
@ -296,6 +301,7 @@ class DataBinderTests {
return ( ( TestBean ) getValue ( ) ) . getName ( ) ;
return ( ( TestBean ) getValue ( ) ) . getName ( ) ;
}
}
} ) ;
} ) ;
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
pvs . add ( "name" , "Rod" ) ;
pvs . add ( "name" , "Rod" ) ;
pvs . add ( "age" , "32x" ) ;
pvs . add ( "age" , "32x" ) ;
@ -303,41 +309,39 @@ class DataBinderTests {
pvs . add ( "spouse" , "Kerry" ) ;
pvs . add ( "spouse" , "Kerry" ) ;
binder . bind ( pvs ) ;
binder . bind ( pvs ) ;
assertThatExceptionOfType ( BindException . class ) . isThrownBy (
assertThatExceptionOfType ( BindException . class ) . isThrownBy ( binder : : close ) . satisfies ( ex - > {
binder : : close )
assertThat ( rod . getName ( ) ) . isEqualTo ( "Rod" ) ;
. satisfies ( ex - > {
Map < ? , ? > model = binder . getBindingResult ( ) . getModel ( ) ;
assertThat ( rod . getName ( ) ) . isEqualTo ( "Rod" ) ;
TestBean tb = ( TestBean ) model . get ( "person" ) ;
Map < ? , ? > model = binder . getBindingResult ( ) . getModel ( ) ;
assertThat ( tb ) . isEqualTo ( rod ) ;
TestBean tb = ( TestBean ) model . get ( "person" ) ;
assertThat ( tb ) . isEqualTo ( rod ) ;
BindingResult br = ( BindingResult ) model . get ( BindingResult . MODEL_KEY_PREFIX + "person" ) ;
assertThat ( binder . getBindingResult ( ) ) . isSameAs ( br ) ;
BindingResult br = ( BindingResult ) model . get ( BindingResult . MODEL_KEY_PREFIX + "person" ) ;
assertThat ( br . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( binder . getBindingResult ( ) ) . isSameAs ( br ) ;
assertThat ( br . getErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( br . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( br . getErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( br . hasFieldErrors ( "age" ) ) . isTrue ( ) ;
assertThat ( br . getFieldErrorCount ( "age" ) ) . isEqualTo ( 1 ) ;
assertThat ( br . hasFieldErrors ( "age" ) ) . isTrue ( ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "age" ) ) . isEqualTo ( "32x" ) ;
assertThat ( br . getFieldErrorCount ( "age" ) ) . isEqualTo ( 1 ) ;
FieldError ageError = binder . getBindingResult ( ) . getFieldError ( "age" ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "age" ) ) . isEqualTo ( "32x" ) ;
assertThat ( ageError ) . isNotNull ( ) ;
FieldError ageError = binder . getBindingResult ( ) . getFieldError ( "age" ) ;
assertThat ( ageError . getCode ( ) ) . isEqualTo ( "typeMismatch" ) ;
assertThat ( ageError ) . isNotNull ( ) ;
assertThat ( ageError . getRejectedValue ( ) ) . isEqualTo ( "32x" ) ;
assertThat ( ageError . getCode ( ) ) . isEqualTo ( "typeMismatch" ) ;
assertThat ( tb . getAge ( ) ) . isEqualTo ( 0 ) ;
assertThat ( ageError . getRejectedValue ( ) ) . isEqualTo ( "32x" ) ;
assertThat ( tb . getAge ( ) ) . isEqualTo ( 0 ) ;
assertThat ( br . hasFieldErrors ( "touchy" ) ) . isTrue ( ) ;
assertThat ( br . getFieldErrorCount ( "touchy" ) ) . isEqualTo ( 1 ) ;
assertThat ( br . hasFieldErrors ( "touchy" ) ) . isTrue ( ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "touchy" ) ) . isEqualTo ( "m.y" ) ;
assertThat ( br . getFieldErrorCount ( "touchy" ) ) . isEqualTo ( 1 ) ;
FieldError touchyError = binder . getBindingResult ( ) . getFieldError ( "touchy" ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "touchy" ) ) . isEqualTo ( "m.y" ) ;
assertThat ( touchyError ) . isNotNull ( ) ;
FieldError touchyError = binder . getBindingResult ( ) . getFieldError ( "touchy" ) ;
assertThat ( touchyError . getCode ( ) ) . isEqualTo ( "methodInvocation" ) ;
assertThat ( touchyError ) . isNotNull ( ) ;
assertThat ( touchyError . getRejectedValue ( ) ) . isEqualTo ( "m.y" ) ;
assertThat ( touchyError . getCode ( ) ) . isEqualTo ( "methodInvocation" ) ;
assertThat ( tb . getTouchy ( ) ) . isNull ( ) ;
assertThat ( touchyError . getRejectedValue ( ) ) . isEqualTo ( "m.y" ) ;
assertThat ( tb . getTouchy ( ) ) . isNull ( ) ;
assertThat ( br . hasFieldErrors ( "spouse" ) ) . isFalse ( ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "spouse" ) ) . isEqualTo ( "Kerry" ) ;
assertThat ( br . hasFieldErrors ( "spouse" ) ) . isFalse ( ) ;
assertThat ( tb . getSpouse ( ) ) . isNotNull ( ) ;
assertThat ( binder . getBindingResult ( ) . getFieldValue ( "spouse" ) ) . isEqualTo ( "Kerry" ) ;
} ) ;
assertThat ( tb . getSpouse ( ) ) . isNotNull ( ) ;
} ) ;
}
}
@Test
@Test
@ -1144,12 +1148,11 @@ class DataBinderTests {
tb2 . setAge ( 34 ) ;
tb2 . setAge ( 34 ) ;
tb . setSpouse ( tb2 ) ;
tb . setSpouse ( tb2 ) ;
DataBinder db = new DataBinder ( tb , "tb" ) ;
DataBinder db = new DataBinder ( tb , "tb" ) ;
db . setValidator ( new TestBeanValidator ( ) ) ;
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
MutablePropertyValues pvs = new MutablePropertyValues ( ) ;
pvs . add ( "spouse.age" , "argh" ) ;
pvs . add ( "spouse.age" , "argh" ) ;
db . bind ( pvs ) ;
db . bind ( pvs ) ;
Errors errors = db . getBindingResult ( ) ;
Errors errors = db . getBindingResult ( ) ;
Validator testValidator = new TestBeanValidator ( ) ;
testValidator . validate ( tb , errors ) ;
errors . setNestedPath ( "spouse" ) ;
errors . setNestedPath ( "spouse" ) ;
assertThat ( errors . getNestedPath ( ) ) . isEqualTo ( "spouse." ) ;
assertThat ( errors . getNestedPath ( ) ) . isEqualTo ( "spouse." ) ;
@ -1196,8 +1199,7 @@ class DataBinderTests {
void validatorWithErrors ( ) {
void validatorWithErrors ( ) {
TestBean tb = new TestBean ( ) ;
TestBean tb = new TestBean ( ) ;
tb . setSpouse ( new TestBean ( ) ) ;
tb . setSpouse ( new TestBean ( ) ) ;
Errors errors = new DataBinder ( tb , "tb" ) . getBindingResult ( ) ;
Errors errors = new BeanPropertyBindingResult ( tb , "tb" ) ;
Validator testValidator = new TestBeanValidator ( ) ;
Validator testValidator = new TestBeanValidator ( ) ;
testValidator . validate ( tb , errors ) ;
testValidator . validate ( tb , errors ) ;
@ -1209,7 +1211,11 @@ class DataBinderTests {
errors . setNestedPath ( "" ) ;
errors . setNestedPath ( "" ) ;
assertThat ( errors . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getErrorCount ( ) ) . isEqualTo ( 6 ) ;
assertThat ( errors . getErrorCount ( ) ) . isEqualTo ( 6 ) ;
assertThat ( errors . getAllErrors ( ) )
. containsAll ( errors . getGlobalErrors ( ) )
. containsAll ( errors . getFieldErrors ( ) ) ;
assertThat ( errors . hasGlobalErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "NAME_TOUCHY_MISMATCH" ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "NAME_TOUCHY_MISMATCH" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "NAME_TOUCHY_MISMATCH" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "NAME_TOUCHY_MISMATCH" ) ;
@ -1265,10 +1271,11 @@ class DataBinderTests {
TestBean tb = new TestBean ( ) ;
TestBean tb = new TestBean ( ) ;
tb . setSpouse ( new TestBean ( ) ) ;
tb . setSpouse ( new TestBean ( ) ) ;
BeanPropertyBindingResult errors = new BeanPropertyBindingResult ( tb , "tb" ) ;
DataBinder dataBinder = new DataBinder ( tb , "tb" ) ;
DefaultMessageCodesResolver codesResolver = new DefaultMessageCodesResolver ( ) ;
DefaultMessageCodesResolver codesResolver = new DefaultMessageCodesResolver ( ) ;
codesResolver . setPrefix ( "validation." ) ;
codesResolver . setPrefix ( "validation." ) ;
errors . setMessageCodesResolver ( codesResolver ) ;
dataBinder . setMessageCodesResolver ( codesResolver ) ;
Errors errors = dataBinder . getBindingResult ( ) ;
Validator testValidator = new TestBeanValidator ( ) ;
Validator testValidator = new TestBeanValidator ( ) ;
testValidator . validate ( tb , errors ) ;
testValidator . validate ( tb , errors ) ;
@ -1280,7 +1287,11 @@ class DataBinderTests {
errors . setNestedPath ( "" ) ;
errors . setNestedPath ( "" ) ;
assertThat ( errors . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getErrorCount ( ) ) . isEqualTo ( 6 ) ;
assertThat ( errors . getErrorCount ( ) ) . isEqualTo ( 6 ) ;
assertThat ( errors . getAllErrors ( ) )
. containsAll ( errors . getGlobalErrors ( ) )
. containsAll ( errors . getFieldErrors ( ) ) ;
assertThat ( errors . hasGlobalErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "validation.NAME_TOUCHY_MISMATCH" ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "validation.NAME_TOUCHY_MISMATCH" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "validation.NAME_TOUCHY_MISMATCH" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "validation.NAME_TOUCHY_MISMATCH" ) ;
@ -1331,12 +1342,63 @@ class DataBinderTests {
assertThat ( ( errors . getFieldErrors ( "spouse.age" ) . get ( 0 ) ) . getRejectedValue ( ) ) . isEqualTo ( 0 ) ;
assertThat ( ( errors . getFieldErrors ( "spouse.age" ) . get ( 0 ) ) . getRejectedValue ( ) ) . isEqualTo ( 0 ) ;
}
}
@Test
void validateObjectWithErrors ( ) {
TestBean tb = new TestBean ( ) ;
Errors errors = new SimpleErrors ( tb , "tb" ) ;
Validator testValidator = new TestBeanValidator ( ) ;
testValidator . validate ( tb , errors ) ;
assertThat ( errors . hasErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getErrorCount ( ) ) . isEqualTo ( 5 ) ;
assertThat ( errors . getAllErrors ( ) )
. containsAll ( errors . getGlobalErrors ( ) )
. containsAll ( errors . getFieldErrors ( ) ) ;
assertThat ( errors . hasGlobalErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 2 ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "NAME_TOUCHY_MISMATCH" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "NAME_TOUCHY_MISMATCH" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getObjectName ( ) ) . isEqualTo ( "tb" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 1 ) ) . getCode ( ) ) . isEqualTo ( "GENERAL_ERROR" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 1 ) ) . getDefaultMessage ( ) ) . isEqualTo ( "msg" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 1 ) ) . getArguments ( ) [ 0 ] ) . isEqualTo ( "arg" ) ;
assertThat ( errors . hasFieldErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getFieldErrorCount ( ) ) . isEqualTo ( 3 ) ;
assertThat ( errors . getFieldError ( ) . getCode ( ) ) . isEqualTo ( "TOO_YOUNG" ) ;
assertThat ( ( errors . getFieldErrors ( ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "TOO_YOUNG" ) ;
assertThat ( ( errors . getFieldErrors ( ) . get ( 0 ) ) . getField ( ) ) . isEqualTo ( "age" ) ;
assertThat ( ( errors . getFieldErrors ( ) . get ( 1 ) ) . getCode ( ) ) . isEqualTo ( "AGE_NOT_ODD" ) ;
assertThat ( ( errors . getFieldErrors ( ) . get ( 1 ) ) . getField ( ) ) . isEqualTo ( "age" ) ;
assertThat ( ( errors . getFieldErrors ( ) . get ( 2 ) ) . getCode ( ) ) . isEqualTo ( "NOT_ROD" ) ;
assertThat ( ( errors . getFieldErrors ( ) . get ( 2 ) ) . getField ( ) ) . isEqualTo ( "name" ) ;
assertThat ( errors . hasFieldErrors ( "age" ) ) . isTrue ( ) ;
assertThat ( errors . getFieldErrorCount ( "age" ) ) . isEqualTo ( 2 ) ;
assertThat ( errors . getFieldError ( "age" ) . getCode ( ) ) . isEqualTo ( "TOO_YOUNG" ) ;
assertThat ( ( errors . getFieldErrors ( "age" ) . get ( 0 ) ) . getCode ( ) ) . isEqualTo ( "TOO_YOUNG" ) ;
assertThat ( ( errors . getFieldErrors ( "age" ) . get ( 0 ) ) . getObjectName ( ) ) . isEqualTo ( "tb" ) ;
assertThat ( ( errors . getFieldErrors ( "age" ) . get ( 0 ) ) . getField ( ) ) . isEqualTo ( "age" ) ;
assertThat ( ( errors . getFieldErrors ( "age" ) . get ( 0 ) ) . getRejectedValue ( ) ) . isEqualTo ( 0 ) ;
assertThat ( ( errors . getFieldErrors ( "age" ) . get ( 1 ) ) . getCode ( ) ) . isEqualTo ( "AGE_NOT_ODD" ) ;
assertThat ( errors . hasFieldErrors ( "name" ) ) . isTrue ( ) ;
assertThat ( errors . getFieldErrorCount ( "name" ) ) . isEqualTo ( 1 ) ;
assertThat ( errors . getFieldError ( "name" ) . getCode ( ) ) . isEqualTo ( "NOT_ROD" ) ;
assertThat ( ( errors . getFieldErrors ( "name" ) . get ( 0 ) ) . getField ( ) ) . isEqualTo ( "name" ) ;
assertThat ( ( errors . getFieldErrors ( "name" ) . get ( 0 ) ) . getRejectedValue ( ) ) . isNull ( ) ;
}
@Test
@Test
void validatorWithNestedObjectNull ( ) {
void validatorWithNestedObjectNull ( ) {
TestBean tb = new TestBean ( ) ;
TestBean tb = new TestBean ( ) ;
Errors errors = new BeanPropertyBindingResult ( tb , "tb" ) ;
Errors errors = new DataBinder ( tb , "tb" ) . getBindingResult ( ) ;
Validator testValidator = new TestBeanValidator ( ) ;
Validator testValidator = new TestBeanValidator ( ) ;
testValidator . validate ( tb , errors ) ;
testValidator . validate ( tb , errors ) ;
errors . setNestedPath ( "spouse." ) ;
errors . setNestedPath ( "spouse." ) ;
assertThat ( errors . getNestedPath ( ) ) . isEqualTo ( "spouse." ) ;
assertThat ( errors . getNestedPath ( ) ) . isEqualTo ( "spouse." ) ;
spouseValidator . validate ( tb . getSpouse ( ) , errors ) ;
spouseValidator . validate ( tb . getSpouse ( ) , errors ) ;
@ -1353,13 +1415,12 @@ class DataBinderTests {
void nestedValidatorWithoutNestedPath ( ) {
void nestedValidatorWithoutNestedPath ( ) {
TestBean tb = new TestBean ( ) ;
TestBean tb = new TestBean ( ) ;
tb . setName ( "XXX" ) ;
tb . setName ( "XXX" ) ;
Errors errors = new BeanPropertyBindingResult ( tb , "tb" ) ;
Errors errors = spouseValidator . validateObject ( tb ) ;
spouseValidator . validate ( tb , errors ) ;
assertThat ( errors . hasGlobalErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . hasGlobalErrors ( ) ) . isTrue ( ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 1 ) ;
assertThat ( errors . getGlobalErrorCount ( ) ) . isEqualTo ( 1 ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "SPOUSE_NOT_AVAILABLE" ) ;
assertThat ( errors . getGlobalError ( ) . getCode ( ) ) . isEqualTo ( "SPOUSE_NOT_AVAILABLE" ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getObjectName ( ) ) . isEqualTo ( "tb " ) ;
assertThat ( ( errors . getGlobalErrors ( ) . get ( 0 ) ) . getObjectName ( ) ) . isEqualTo ( "TestBean " ) ;
}
}
@Test
@Test
@ -1770,7 +1831,7 @@ class DataBinderTests {
binder . bind ( pvs ) ;
binder . bind ( pvs ) ;
Errors errors = binder . getBindingResult ( ) ;
Errors errors = binder . getBindingResult ( ) ;
BeanPropertyBindingResult errors2 = new BeanPropertyBindingResult ( rod , "person" ) ;
Errors errors2 = new SimpleErrors ( rod , "person" ) ;
errors . rejectValue ( "name" , "badName" ) ;
errors . rejectValue ( "name" , "badName" ) ;
errors . addAllErrors ( errors2 ) ;
errors . addAllErrors ( errors2 ) ;
@ -1805,16 +1866,16 @@ class DataBinderTests {
tb . setName ( "myName" ) ;
tb . setName ( "myName" ) ;
tb . setAge ( 99 ) ;
tb . setAge ( 99 ) ;
BeanPropertyBindingResult ex = new BeanPropertyBindingResult ( tb , "tb" ) ;
Errors errors = new SimpleErrors ( tb , "tb" ) ;
ex . reject ( "invalid" ) ;
errors . reject ( "invalid" ) ;
ex . rejectValue ( "age" , "invalidField" ) ;
errors . rejectValue ( "age" , "invalidField" ) ;
StaticMessageSource ms = new StaticMessageSource ( ) ;
StaticMessageSource ms = new StaticMessageSource ( ) ;
ms . addMessage ( "invalid" , Locale . US , "general error" ) ;
ms . addMessage ( "invalid" , Locale . US , "general error" ) ;
ms . addMessage ( "invalidField" , Locale . US , "invalid field" ) ;
ms . addMessage ( "invalidField" , Locale . US , "invalid field" ) ;
assertThat ( ms . getMessage ( ex . getGlobalError ( ) , Locale . US ) ) . isEqualTo ( "general error" ) ;
assertThat ( ms . getMessage ( errors . getGlobalError ( ) , Locale . US ) ) . isEqualTo ( "general error" ) ;
assertThat ( ms . getMessage ( ex . getFieldError ( "age" ) , Locale . US ) ) . isEqualTo ( "invalid field" ) ;
assertThat ( ms . getMessage ( errors . getFieldError ( "age" ) , Locale . US ) ) . isEqualTo ( "invalid field" ) ;
}
}
@Test
@Test
@ -1882,13 +1943,13 @@ class DataBinderTests {
void autoGrowBeyondDefaultLimit ( ) {
void autoGrowBeyondDefaultLimit ( ) {
TestBean testBean = new TestBean ( ) ;
TestBean testBean = new TestBean ( ) ;
DataBinder binder = new DataBinder ( testBean , "testBean" ) ;
DataBinder binder = new DataBinder ( testBean , "testBean" ) ;
MutablePropertyValues mpvs = new MutablePropertyValues ( ) ;
MutablePropertyValues mpvs = new MutablePropertyValues ( ) ;
mpvs . add ( "friends[256]" , "" ) ;
mpvs . add ( "friends[256]" , "" ) ;
assertThatExceptionOfType ( InvalidPropertyException . class )
assertThatExceptionOfType ( InvalidPropertyException . class )
. isThrownBy ( ( ) - > binder . bind ( mpvs ) )
. isThrownBy ( ( ) - > binder . bind ( mpvs ) )
. havingRootCause ( )
. havingRootCause ( )
. isInstanceOf ( IndexOutOfBoundsException . class ) ;
. isInstanceOf ( IndexOutOfBoundsException . class ) ;
}
}
@Test
@Test
@ -1909,13 +1970,13 @@ class DataBinderTests {
TestBean testBean = new TestBean ( ) ;
TestBean testBean = new TestBean ( ) ;
DataBinder binder = new DataBinder ( testBean , "testBean" ) ;
DataBinder binder = new DataBinder ( testBean , "testBean" ) ;
binder . setAutoGrowCollectionLimit ( 10 ) ;
binder . setAutoGrowCollectionLimit ( 10 ) ;
MutablePropertyValues mpvs = new MutablePropertyValues ( ) ;
MutablePropertyValues mpvs = new MutablePropertyValues ( ) ;
mpvs . add ( "friends[16]" , "" ) ;
mpvs . add ( "friends[16]" , "" ) ;
assertThatExceptionOfType ( InvalidPropertyException . class )
assertThatExceptionOfType ( InvalidPropertyException . class )
. isThrownBy ( ( ) - > binder . bind ( mpvs ) )
. isThrownBy ( ( ) - > binder . bind ( mpvs ) )
. havingRootCause ( )
. havingRootCause ( )
. isInstanceOf ( IndexOutOfBoundsException . class ) ;
. isInstanceOf ( IndexOutOfBoundsException . class ) ;
}
}
@Test
@Test
@ -2165,6 +2226,7 @@ class DataBinderTests {
}
}
}
}
@SuppressWarnings ( "unused" )
@SuppressWarnings ( "unused" )
private static class GrowingList < E > extends AbstractList < E > {
private static class GrowingList < E > extends AbstractList < E > {