Skip to content

Commit c7b9610

Browse files
authored
Merge pull request #102 from avaje/feature/example-custom-resource
Adjust @Length & @SiZe to have a max only message
2 parents 51a365f + c094e77 commit c7b9610

File tree

10 files changed

+62
-16
lines changed

10 files changed

+62
-16
lines changed

blackbox-test/src/test/java/example/avaje/ACustomerMessageTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,25 @@ void blankDE() {
3636
@Test
3737
void sizeMax() {
3838
var violation = one(new ACustomer("NameIsTooLarge", "Other"));
39-
assertThat(violation.message()).isEqualTo("size must be between 0 and 5");
39+
assertThat(violation.message()).isEqualTo("maximum length 5 exceeded");
4040
}
4141

4242
@Test
4343
void sizeMaxDE() {
4444
var violation = one(new ACustomer("NameIsTooLarge", "Other"), Locale.GERMAN);
45-
assertThat(violation.message()).isEqualTo("Größe muss zwischen 0 und 5 sein");
45+
assertThat(violation.message()).isEqualTo("Länge muss zwischen 0 und 5 sein");
4646
}
4747

4848
@Test
4949
void sizeMinMax() {
5050
var violation = one(new ACustomer("valid", "Other", "TooLarge"));
51-
assertThat(violation.message()).isEqualTo("size must be between 2 and 4");
51+
assertThat(violation.message()).isEqualTo("length must be between 2 and 4");
5252
}
5353

5454
@Test
5555
void sizeMinMaxDE() {
5656
var violation = one(new ACustomer("valid", "Other", "TooLarge"), Locale.GERMAN);
57-
assertThat(violation.message()).isEqualTo("Größe muss zwischen 2 und 4 sein");
57+
assertThat(violation.message()).isEqualTo("Länge muss zwischen 2 und 4 sein");
5858
}
5959

6060
@Test

blackbox-test/src/test/java/example/avaje/length/ALengthTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ void lengthMax() {
4040
assertThat(violation.message()).isEqualTo("length must be between 1 and 3");
4141
}
4242

43+
@Test
44+
void lengthOnlyMax() {
45+
var violation = one(new ALength("ok", "TooLargeHere", "ok", "ok"));
46+
assertThat(violation.message()).isEqualTo("maximum length 5 exceeded");
47+
}
48+
49+
@Test
50+
void lengthOnlyMax_DE() {
51+
// no {avaje.Length.max.message} for DE so uses fallback
52+
var violation = one(new ALength("ok", "TooLargeHere", "ok", "ok"), Locale.GERMAN);
53+
assertThat(violation.message()).isEqualTo("Länge muss zwischen 0 und 5 sein");
54+
}
55+
4356
@Test
4457
void lengthMaxDE() {
4558
var violation = one(new ALength("TooLarge", "ok", "ok", "ok"), Locale.GERMAN);
@@ -49,7 +62,7 @@ void lengthMaxDE() {
4962
@Test
5063
void lengthMinMax() {
5164
var violation = one(new ACustomer("valid", "Other", "TooLarge"));
52-
assertThat(violation.message()).isEqualTo("size must be between 2 and 4");
65+
assertThat(violation.message()).isEqualTo("length must be between 2 and 4");
5366
}
5467

5568
@Test

blackbox-test/src/test/java/example/avaje/nested/ANestedTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void validateNested() {
2626
var v0 = violations.get(0);
2727
assertThat(v0.path()).isEqualTo("lastName");
2828
assertThat(v0.field()).isEqualTo("lastName");
29-
assertThat(v0.message()).isEqualTo("size must be between 0 and 5");
29+
assertThat(v0.message()).isEqualTo("maximum length 5 exceeded");
3030

3131
var v1 = violations.get(1);
3232
assertThat(v1.path()).isEqualTo("address.line1");
@@ -36,7 +36,7 @@ void validateNested() {
3636
var v2 = violations.get(2);
3737
assertThat(v2.path()).isEqualTo("address.line2");
3838
assertThat(v2.field()).isEqualTo("line2");
39-
assertThat(v2.message()).isEqualTo("size must be between 0 and 4");
39+
assertThat(v2.message()).isEqualTo("maximum length 4 exceeded");
4040

4141
var v3 = violations.get(3);
4242
assertThat(v3.path()).isEqualTo("address.longValue");

blackbox-test/src/test/java/example/avaje/nested/ANestedWithNullableTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void validateNestedSkipNullAddress() {
2626
var v0 = violations.get(0);
2727
assertThat(v0.path()).isEqualTo("lastName");
2828
assertThat(v0.field()).isEqualTo("lastName");
29-
assertThat(v0.message()).isEqualTo("size must be between 0 and 5");
29+
assertThat(v0.message()).isEqualTo("maximum length 5 exceeded");
3030
}
3131
}
3232

@@ -44,7 +44,7 @@ void validateNestedAddress() {
4444
var v0 = violations.get(0);
4545
assertThat(v0.path()).isEqualTo("lastName");
4646
assertThat(v0.field()).isEqualTo("lastName");
47-
assertThat(v0.message()).isEqualTo("size must be between 0 and 5");
47+
assertThat(v0.message()).isEqualTo("maximum length 5 exceeded");
4848
}
4949
}
5050

@@ -62,7 +62,7 @@ void validateNested() {
6262
var v0 = violations.get(0);
6363
assertThat(v0.path()).isEqualTo("lastName");
6464
assertThat(v0.field()).isEqualTo("lastName");
65-
assertThat(v0.message()).isEqualTo("size must be between 0 and 5");
65+
assertThat(v0.message()).isEqualTo("maximum length 5 exceeded");
6666

6767
var v1 = violations.get(1);
6868
assertThat(v1.path()).isEqualTo("address.line1");
@@ -72,7 +72,7 @@ void validateNested() {
7272
var v2 = violations.get(2);
7373
assertThat(v2.path()).isEqualTo("address.line2");
7474
assertThat(v2.field()).isEqualTo("line2");
75-
assertThat(v2.message()).isEqualTo("size must be between 0 and 4");
75+
assertThat(v2.message()).isEqualTo("maximum length 4 exceeded");
7676

7777
var v3 = violations.get(3);
7878
assertThat(v3.path()).isEqualTo("address.longValue");

blackbox-test/src/test/java/example/jakarta/JCustomerMessageTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,25 @@ void blankDE() {
3636
@Test
3737
void sizeMax() {
3838
var violation = one(new JCustomer("NameIsTooLarge", "Other"));
39-
assertThat(violation.message()).isEqualTo("size must be between 0 and 5");
39+
assertThat(violation.message()).isEqualTo("maximum length 5 exceeded");
4040
}
4141

4242
@Test
4343
void sizeMaxDE() {
4444
var violation = one(new JCustomer("NameIsTooLarge", "Other"), Locale.GERMAN);
45-
assertThat(violation.message()).isEqualTo("Größe muss zwischen 0 und 5 sein");
45+
assertThat(violation.message()).isEqualTo("Länge muss zwischen 0 und 5 sein");
4646
}
4747

4848
@Test
4949
void sizeMinMax() {
5050
var violation = one(new JCustomer("valid", "Other", "TooLarge"));
51-
assertThat(violation.message()).isEqualTo("size must be between 2 and 4");
51+
assertThat(violation.message()).isEqualTo("length must be between 2 and 4");
5252
}
5353

5454
@Test
5555
void sizeMinMaxDE() {
5656
var violation = one(new JCustomer("valid", "Other", "TooLarge"), Locale.GERMAN);
57-
assertThat(violation.message()).isEqualTo("Größe muss zwischen 2 und 4 sein");
57+
assertThat(violation.message()).isEqualTo("Länge muss zwischen 2 und 4 sein");
5858
}
5959

6060
@Test

validator/src/main/java/io/avaje/validation/adapter/ValidationContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ interface AdapterCreateRequest {
164164

165165
Message message();
166166

167+
Message message(String key);
168+
167169
String targetType();
168170

169171
AdapterCreateRequest withValue(long value);

validator/src/main/java/io/avaje/validation/core/CoreAdapterBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,12 @@ public Request withValue(long value) {
132132
public ValidationContext.Message message() {
133133
return ctx.message(attributes);
134134
}
135+
136+
@Override
137+
public ValidationContext.Message message(String messageKey) {
138+
Map<String, Object> newAttributes = new HashMap<>(attributes);
139+
newAttributes.put("message", messageKey);
140+
return ctx.message(newAttributes);
141+
}
135142
}
136143
}

validator/src/main/java/io/avaje/validation/core/adapters/BasicAdapters.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,36 @@ public boolean isValid(CharSequence value) {
6565

6666
private static final class SizeAdapter implements ValidationAdapter<Object> {
6767

68+
private static final String LENGTH = "{avaje.Length.message}";
69+
private static final String LENGTH_MAX = "{avaje.Length.max.message}";
70+
private static final String SIZE = "{avaje.Size.message}";
71+
private static final String SIZE_MAX = "{avaje.Size.max.message}";
6872
private final ValidationContext.Message message;
6973
private final Set<Class<?>> groups;
7074
private final int min;
7175
private final int max;
7276

7377
SizeAdapter(AdapterCreateRequest request) {
74-
this.message = request.message();
7578
this.groups = request.groups();
7679
this.min = (int) request.attribute("min");
7780
this.max = (int) request.attribute("max");
81+
82+
final Object msgKey = request.attribute("message");
83+
if (min == 0 && LENGTH.equals(msgKey)) {
84+
this.message = request.message(LENGTH_MAX);
85+
} else if (min == 0 && SIZE.equals(msgKey)) {
86+
this.message = request.message(useLength(request) ? LENGTH_MAX : SIZE_MAX);
87+
} else if (SIZE.equals(msgKey) && useLength(request)) {
88+
this.message = request.message(LENGTH);
89+
} else {
90+
this.message = request.message();
91+
}
92+
}
93+
94+
/** Use 'Length' rather than 'Size' for string types */
95+
private static boolean useLength(AdapterCreateRequest request) {
96+
final String targetType = request.targetType();
97+
return "String".equals(targetType) || "CharSequence".equals(targetType);
7898
}
7999

80100
@Override

validator/src/main/resources/io/avaje/validation/Messages.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ avaje.Pattern.message = must match "{regexp}"
2222
avaje.Positive.message = must be greater than 0
2323
avaje.PositiveOrZero.message = must be greater than or equal to 0
2424
avaje.Size.message = size must be between {min} and {max}
25+
avaje.Size.max.message = {avaje.Size.message}
2526

2627
avaje.Length.message = length must be between {min} and {max}
28+
avaje.Length.max.message = {avaje.Length.message}
2729
avaje.Range.message = must be between {min} and {max}
2830
avaje.URI.message = must be a valid URI
2931
avaje.UUID.message = must be a valid UUID
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
## Intentionally blank
2+
avaje.Length.max.message = maximum length {max} exceeded
3+
avaje.Size.max.message = maximum size {max} exceeded

0 commit comments

Comments
 (0)