Skip to content

Commit 6935f60

Browse files
committed
Polish ResourceBundleConstraintDescriptionResolver and related tests
Closes gh-234
1 parent 4715351 commit 6935f60

File tree

4 files changed

+65
-155
lines changed

4 files changed

+65
-155
lines changed

build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ ext {
3737
springVersion = '4.2.5.RELEASE'
3838
javadocLinks = [
3939
'http://docs.oracle.com/javase/8/docs/api/',
40-
"http://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/",
41-
'https://docs.jboss.org/hibernate/stable/beanvalidation/api/'
40+
'http://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/',
41+
'https://docs.jboss.org/hibernate/stable/beanvalidation/api/',
42+
'https://docs.jboss.org/hibernate/stable/validator/api/'
4243
] as String[]
4344
}
4445

spring-restdocs-core/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ dependencies {
3434
optional 'commons-codec:commons-codec'
3535
optional 'javax.validation:validation-api'
3636
optional 'junit:junit'
37+
optional 'org.hibernate:hibernate-validator'
3738
testCompile 'org.mockito:mockito-core'
3839
testCompile 'org.hamcrest:hamcrest-core'
3940
testCompile 'org.hamcrest:hamcrest-library'
40-
testCompile 'org.hibernate:hibernate-validator'
4141
testCompile 'org.springframework:spring-test'
4242
testRuntime 'org.glassfish:javax.el:3.0.0'
4343
}

spring-restdocs-core/src/main/java/org/springframework/restdocs/constraints/ResourceBundleConstraintDescriptionResolver.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@
3434
import javax.validation.constraints.Pattern;
3535
import javax.validation.constraints.Size;
3636

37+
import org.hibernate.validator.constraints.CreditCardNumber;
38+
import org.hibernate.validator.constraints.EAN;
39+
import org.hibernate.validator.constraints.Email;
40+
import org.hibernate.validator.constraints.Length;
41+
import org.hibernate.validator.constraints.LuhnCheck;
42+
import org.hibernate.validator.constraints.Mod10Check;
43+
import org.hibernate.validator.constraints.Mod11Check;
44+
import org.hibernate.validator.constraints.NotBlank;
45+
import org.hibernate.validator.constraints.NotEmpty;
46+
import org.hibernate.validator.constraints.Range;
47+
import org.hibernate.validator.constraints.SafeHtml;
48+
import org.hibernate.validator.constraints.URL;
49+
3750
import org.springframework.util.PropertyPlaceholderHelper;
3851
import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
3952

@@ -62,6 +75,24 @@
6275
* <li>{@link Size}
6376
* </ul>
6477
*
78+
* <p>
79+
* Default descriptions are also provided for Hibernate Validator's constraints:
80+
*
81+
* <ul>
82+
* <li>{@link CreditCardNumber}
83+
* <li>{@link EAN}
84+
* <li>{@link Email}
85+
* <li>{@link Length}
86+
* <li>{@link LuhnCheck}
87+
* <li>{@link Mod10Check}
88+
* <li>{@link Mod11Check}
89+
* <li>{@link NotBlank}
90+
* <li>{@link NotEmpty}
91+
* <li>{@link Range}
92+
* <li>{@link SafeHtml}
93+
* <li>{@link URL}
94+
* </ul>
95+
*
6596
* @author Andy Wilkinson
6697
*/
6798
public class ResourceBundleConstraintDescriptionResolver

spring-restdocs-core/src/test/java/org/springframework/restdocs/constraints/ConstraintDescriptionsTests.java

Lines changed: 30 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,17 @@
1616

1717
package org.springframework.restdocs.constraints;
1818

19-
import java.math.BigDecimal;
20-
import java.util.Date;
21-
22-
import javax.validation.constraints.AssertFalse;
23-
import javax.validation.constraints.AssertTrue;
24-
import javax.validation.constraints.DecimalMax;
25-
import javax.validation.constraints.DecimalMin;
26-
import javax.validation.constraints.Digits;
27-
import javax.validation.constraints.Future;
28-
import javax.validation.constraints.Max;
29-
import javax.validation.constraints.Min;
30-
import javax.validation.constraints.NotNull;
31-
import javax.validation.constraints.Null;
32-
import javax.validation.constraints.Past;
33-
import javax.validation.constraints.Pattern;
34-
import javax.validation.constraints.Size;
19+
import java.util.Arrays;
20+
import java.util.Collections;
3521

3622
import org.junit.Test;
3723

24+
import static org.hamcrest.CoreMatchers.equalTo;
25+
import static org.hamcrest.CoreMatchers.is;
3826
import static org.hamcrest.Matchers.contains;
39-
import static org.hamcrest.Matchers.hasSize;
4027
import static org.junit.Assert.assertThat;
28+
import static org.mockito.BDDMockito.given;
29+
import static org.mockito.Mockito.mock;
4130

4231
/**
4332
* Tests for {@link ConstraintDescriptions}.
@@ -46,152 +35,41 @@
4635
*/
4736
public class ConstraintDescriptionsTests {
4837

49-
private final ConstraintDescriptions constraintDescriptions = new ConstraintDescriptions(
50-
Constrained.class);
51-
52-
@Test
53-
public void assertFalse() {
54-
assertThat(this.constraintDescriptions.descriptionsForProperty("assertFalse"),
55-
contains("Must be false"));
56-
}
38+
private final ConstraintResolver constraintResolver = mock(ConstraintResolver.class);
5739

58-
@Test
59-
public void assertTrue() {
60-
assertThat(this.constraintDescriptions.descriptionsForProperty("assertTrue"),
61-
contains("Must be true"));
62-
}
40+
private final ConstraintDescriptionResolver constraintDescriptionResolver = mock(
41+
ConstraintDescriptionResolver.class);
6342

64-
@Test
65-
public void decimalMax() {
66-
assertThat(this.constraintDescriptions.descriptionsForProperty("decimalMax"),
67-
contains("Must be at most 9.875"));
68-
}
69-
70-
@Test
71-
public void decimalMin() {
72-
assertThat(this.constraintDescriptions.descriptionsForProperty("decimalMin"),
73-
contains("Must be at least 1.5"));
74-
}
75-
76-
@Test
77-
public void digits() {
78-
assertThat(this.constraintDescriptions.descriptionsForProperty("digits"),
79-
contains("Must have at most 2 integral digits and 5 fractional digits"));
80-
}
81-
82-
@Test
83-
public void future() {
84-
assertThat(this.constraintDescriptions.descriptionsForProperty("future"),
85-
contains("Must be in the future"));
86-
}
87-
88-
@Test
89-
public void max() {
90-
assertThat(this.constraintDescriptions.descriptionsForProperty("max"),
91-
contains("Must be at most 10"));
92-
}
93-
94-
@Test
95-
public void min() {
96-
assertThat(this.constraintDescriptions.descriptionsForProperty("min"),
97-
contains("Must be at least 5"));
98-
}
99-
100-
@Test
101-
public void notNull() {
102-
assertThat(this.constraintDescriptions.descriptionsForProperty("notNull"),
103-
contains("Must not be null"));
104-
}
105-
106-
@Test
107-
public void nul() {
108-
assertThat(this.constraintDescriptions.descriptionsForProperty("nul"),
109-
contains("Must be null"));
110-
}
111-
112-
@Test
113-
public void past() {
114-
assertThat(this.constraintDescriptions.descriptionsForProperty("past"),
115-
contains("Must be in the past"));
116-
}
117-
118-
@Test
119-
public void pattern() {
120-
assertThat(this.constraintDescriptions.descriptionsForProperty("pattern"),
121-
contains("Must match the regular expression `[A-Z][a-z]+`"));
122-
}
123-
124-
@Test
125-
public void size() {
126-
assertThat(this.constraintDescriptions.descriptionsForProperty("size"),
127-
contains("Size must be between 0 and 10 inclusive"));
128-
}
129-
130-
@Test
131-
public void sizeList() {
132-
assertThat(this.constraintDescriptions.descriptionsForProperty("sizeList"),
133-
contains("Size must be between 1 and 4 inclusive",
134-
"Size must be between 8 and 10 inclusive"));
135-
}
43+
private final ConstraintDescriptions constraintDescriptions = new ConstraintDescriptions(
44+
Constrained.class, this.constraintResolver,
45+
this.constraintDescriptionResolver);
13646

13747
@Test
138-
public void unconstrained() {
139-
assertThat(this.constraintDescriptions.descriptionsForProperty("unconstrained"),
140-
hasSize(0));
48+
public void descriptionsForConstraints() {
49+
Constraint constraint1 = new Constraint("constraint1",
50+
Collections.<String, Object>emptyMap());
51+
Constraint constraint2 = new Constraint("constraint2",
52+
Collections.<String, Object>emptyMap());
53+
given(this.constraintResolver.resolveForProperty("foo", Constrained.class))
54+
.willReturn(Arrays.asList(constraint1, constraint2));
55+
given(this.constraintDescriptionResolver.resolveDescription(constraint1))
56+
.willReturn("Bravo");
57+
given(this.constraintDescriptionResolver.resolveDescription(constraint2))
58+
.willReturn("Alpha");
59+
assertThat(this.constraintDescriptions.descriptionsForProperty("foo"),
60+
contains("Alpha", "Bravo"));
14161
}
14262

14363
@Test
144-
public void nonExistentProperty() {
145-
assertThat(this.constraintDescriptions.descriptionsForProperty("doesNotExist"),
146-
hasSize(0));
64+
public void emptyListOfDescriptionsWhenThereAreNoConstraints() {
65+
given(this.constraintResolver.resolveForProperty("foo", Constrained.class))
66+
.willReturn(Collections.<Constraint>emptyList());
67+
assertThat(this.constraintDescriptions.descriptionsForProperty("foo").size(),
68+
is(equalTo(0)));
14769
}
14870

14971
private static class Constrained {
15072

151-
@AssertFalse
152-
private boolean assertFalse;
153-
154-
@AssertTrue
155-
private boolean assertTrue;
156-
157-
@DecimalMax("9.875")
158-
private BigDecimal decimalMax;
159-
160-
@DecimalMin("1.5")
161-
private BigDecimal decimalMin;
162-
163-
@Digits(fraction = 5, integer = 2)
164-
private BigDecimal digits;
165-
166-
@Future
167-
private Date future;
168-
169-
@NotNull
170-
private String notNull;
171-
172-
@Max(10)
173-
private int max;
174-
175-
@Min(5)
176-
private int min;
177-
178-
@Null
179-
private String nul;
180-
181-
@Past
182-
private Date past;
183-
184-
@Pattern(regexp = "[A-Z][a-z]+")
185-
private String pattern;
186-
187-
@Size(min = 0, max = 10)
188-
private String size;
189-
190-
@Size.List({ @Size(min = 1, max = 4), @Size(min = 8, max = 10) })
191-
private String sizeList;
192-
193-
@SuppressWarnings("unused")
194-
private String unconstrained;
19573
}
19674

19775
}

0 commit comments

Comments
 (0)