Polish ResourceBundleConstraintDescriptionResolver and related tests
Closes gh-234
This commit is contained in:
@@ -37,8 +37,9 @@ ext {
|
||||
springVersion = '4.2.5.RELEASE'
|
||||
javadocLinks = [
|
||||
'http://docs.oracle.com/javase/8/docs/api/',
|
||||
"http://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/",
|
||||
'https://docs.jboss.org/hibernate/stable/beanvalidation/api/'
|
||||
'http://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/',
|
||||
'https://docs.jboss.org/hibernate/stable/beanvalidation/api/',
|
||||
'https://docs.jboss.org/hibernate/stable/validator/api/'
|
||||
] as String[]
|
||||
}
|
||||
|
||||
|
||||
@@ -34,10 +34,10 @@ dependencies {
|
||||
optional 'commons-codec:commons-codec'
|
||||
optional 'javax.validation:validation-api'
|
||||
optional 'junit:junit'
|
||||
optional 'org.hibernate:hibernate-validator'
|
||||
testCompile 'org.mockito:mockito-core'
|
||||
testCompile 'org.hamcrest:hamcrest-core'
|
||||
testCompile 'org.hamcrest:hamcrest-library'
|
||||
testCompile 'org.hibernate:hibernate-validator'
|
||||
testCompile 'org.springframework:spring-test'
|
||||
testRuntime 'org.glassfish:javax.el:3.0.0'
|
||||
}
|
||||
|
||||
@@ -34,6 +34,19 @@ import javax.validation.constraints.Past;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import javax.validation.constraints.Size;
|
||||
|
||||
import org.hibernate.validator.constraints.CreditCardNumber;
|
||||
import org.hibernate.validator.constraints.EAN;
|
||||
import org.hibernate.validator.constraints.Email;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
import org.hibernate.validator.constraints.LuhnCheck;
|
||||
import org.hibernate.validator.constraints.Mod10Check;
|
||||
import org.hibernate.validator.constraints.Mod11Check;
|
||||
import org.hibernate.validator.constraints.NotBlank;
|
||||
import org.hibernate.validator.constraints.NotEmpty;
|
||||
import org.hibernate.validator.constraints.Range;
|
||||
import org.hibernate.validator.constraints.SafeHtml;
|
||||
import org.hibernate.validator.constraints.URL;
|
||||
|
||||
import org.springframework.util.PropertyPlaceholderHelper;
|
||||
import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
|
||||
|
||||
@@ -62,6 +75,24 @@ import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
|
||||
* <li>{@link Size}
|
||||
* </ul>
|
||||
*
|
||||
* <p>
|
||||
* Default descriptions are also provided for Hibernate Validator's constraints:
|
||||
*
|
||||
* <ul>
|
||||
* <li>{@link CreditCardNumber}
|
||||
* <li>{@link EAN}
|
||||
* <li>{@link Email}
|
||||
* <li>{@link Length}
|
||||
* <li>{@link LuhnCheck}
|
||||
* <li>{@link Mod10Check}
|
||||
* <li>{@link Mod11Check}
|
||||
* <li>{@link NotBlank}
|
||||
* <li>{@link NotEmpty}
|
||||
* <li>{@link Range}
|
||||
* <li>{@link SafeHtml}
|
||||
* <li>{@link URL}
|
||||
* </ul>
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class ResourceBundleConstraintDescriptionResolver
|
||||
|
||||
@@ -16,28 +16,17 @@
|
||||
|
||||
package org.springframework.restdocs.constraints;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
import javax.validation.constraints.AssertFalse;
|
||||
import javax.validation.constraints.AssertTrue;
|
||||
import javax.validation.constraints.DecimalMax;
|
||||
import javax.validation.constraints.DecimalMin;
|
||||
import javax.validation.constraints.Digits;
|
||||
import javax.validation.constraints.Future;
|
||||
import javax.validation.constraints.Max;
|
||||
import javax.validation.constraints.Min;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Null;
|
||||
import javax.validation.constraints.Past;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.Matchers.contains;
|
||||
import static org.hamcrest.Matchers.hasSize;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link ConstraintDescriptions}.
|
||||
@@ -46,152 +35,41 @@ import static org.junit.Assert.assertThat;
|
||||
*/
|
||||
public class ConstraintDescriptionsTests {
|
||||
|
||||
private final ConstraintResolver constraintResolver = mock(ConstraintResolver.class);
|
||||
|
||||
private final ConstraintDescriptionResolver constraintDescriptionResolver = mock(
|
||||
ConstraintDescriptionResolver.class);
|
||||
|
||||
private final ConstraintDescriptions constraintDescriptions = new ConstraintDescriptions(
|
||||
Constrained.class);
|
||||
Constrained.class, this.constraintResolver,
|
||||
this.constraintDescriptionResolver);
|
||||
|
||||
@Test
|
||||
public void assertFalse() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("assertFalse"),
|
||||
contains("Must be false"));
|
||||
public void descriptionsForConstraints() {
|
||||
Constraint constraint1 = new Constraint("constraint1",
|
||||
Collections.<String, Object>emptyMap());
|
||||
Constraint constraint2 = new Constraint("constraint2",
|
||||
Collections.<String, Object>emptyMap());
|
||||
given(this.constraintResolver.resolveForProperty("foo", Constrained.class))
|
||||
.willReturn(Arrays.asList(constraint1, constraint2));
|
||||
given(this.constraintDescriptionResolver.resolveDescription(constraint1))
|
||||
.willReturn("Bravo");
|
||||
given(this.constraintDescriptionResolver.resolveDescription(constraint2))
|
||||
.willReturn("Alpha");
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("foo"),
|
||||
contains("Alpha", "Bravo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertTrue() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("assertTrue"),
|
||||
contains("Must be true"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void decimalMax() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("decimalMax"),
|
||||
contains("Must be at most 9.875"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void decimalMin() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("decimalMin"),
|
||||
contains("Must be at least 1.5"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void digits() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("digits"),
|
||||
contains("Must have at most 2 integral digits and 5 fractional digits"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void future() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("future"),
|
||||
contains("Must be in the future"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void max() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("max"),
|
||||
contains("Must be at most 10"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void min() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("min"),
|
||||
contains("Must be at least 5"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void notNull() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("notNull"),
|
||||
contains("Must not be null"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nul() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("nul"),
|
||||
contains("Must be null"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void past() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("past"),
|
||||
contains("Must be in the past"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void pattern() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("pattern"),
|
||||
contains("Must match the regular expression `[A-Z][a-z]+`"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void size() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("size"),
|
||||
contains("Size must be between 0 and 10 inclusive"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sizeList() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("sizeList"),
|
||||
contains("Size must be between 1 and 4 inclusive",
|
||||
"Size must be between 8 and 10 inclusive"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void unconstrained() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("unconstrained"),
|
||||
hasSize(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nonExistentProperty() {
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("doesNotExist"),
|
||||
hasSize(0));
|
||||
public void emptyListOfDescriptionsWhenThereAreNoConstraints() {
|
||||
given(this.constraintResolver.resolveForProperty("foo", Constrained.class))
|
||||
.willReturn(Collections.<Constraint>emptyList());
|
||||
assertThat(this.constraintDescriptions.descriptionsForProperty("foo").size(),
|
||||
is(equalTo(0)));
|
||||
}
|
||||
|
||||
private static class Constrained {
|
||||
|
||||
@AssertFalse
|
||||
private boolean assertFalse;
|
||||
|
||||
@AssertTrue
|
||||
private boolean assertTrue;
|
||||
|
||||
@DecimalMax("9.875")
|
||||
private BigDecimal decimalMax;
|
||||
|
||||
@DecimalMin("1.5")
|
||||
private BigDecimal decimalMin;
|
||||
|
||||
@Digits(fraction = 5, integer = 2)
|
||||
private BigDecimal digits;
|
||||
|
||||
@Future
|
||||
private Date future;
|
||||
|
||||
@NotNull
|
||||
private String notNull;
|
||||
|
||||
@Max(10)
|
||||
private int max;
|
||||
|
||||
@Min(5)
|
||||
private int min;
|
||||
|
||||
@Null
|
||||
private String nul;
|
||||
|
||||
@Past
|
||||
private Date past;
|
||||
|
||||
@Pattern(regexp = "[A-Z][a-z]+")
|
||||
private String pattern;
|
||||
|
||||
@Size(min = 0, max = 10)
|
||||
private String size;
|
||||
|
||||
@Size.List({ @Size(min = 1, max = 4), @Size(min = 8, max = 10) })
|
||||
private String sizeList;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private String unconstrained;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user