Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package example.avaje.composable;

import io.avaje.validation.constraints.NotBlank;
import io.avaje.validation.constraints.Valid;

@Valid
public record MyCustomPattern(
@MyKey String key,
@NotBlank String value) {
}
22 changes: 22 additions & 0 deletions blackbox-test/src/main/java/example/avaje/composable/MyKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package example.avaje.composable;

import io.avaje.validation.constraints.Constraint;
import io.avaje.validation.constraints.Pattern;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.SOURCE;

@Pattern(regexp = "[A-Z0-9_]{2,8}")
@Constraint
@Retention(SOURCE)
@Target({METHOD, FIELD, ANNOTATION_TYPE, PARAMETER, TYPE_USE})
public @interface MyKey {

String message() default "{example.avaje.MyKey.message}";

Class<?>[] groups() default {};
}
23 changes: 23 additions & 0 deletions blackbox-test/src/main/java/example/avaje/composable/MySerial.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package example.avaje.composable;

import io.avaje.validation.constraints.Constraint;
import io.avaje.validation.constraints.Length;
import io.avaje.validation.constraints.Pattern;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.SOURCE;

@Pattern(regexp = "[A-Z]+")
@Length(max = 5)
@Constraint
@Retention(SOURCE)
@Target({METHOD, FIELD, ANNOTATION_TYPE, PARAMETER, TYPE_USE})
public @interface MySerial {

String message() default "{example.avaje.MySerial.message}";

Class<?>[] groups() default {};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package example.avaje.composable;

import io.avaje.validation.constraints.NotBlank;
import io.avaje.validation.constraints.Valid;

@Valid
public record MySerialExample(
@MySerial String key,
@NotBlank String value) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
example.avaje.MyKey.message=Invalid MyKey
example.avaje.MySerial.message=Invalid my serial
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
example.avaje.MyKey.message=darf nicht MyKey
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# intentionally blank
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package example.avaje.composable;

import io.avaje.validation.ConstraintViolation;
import io.avaje.validation.ConstraintViolationException;
import io.avaje.validation.Validator;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Locale;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;

class MyCustomPatternTest {

final Validator validator = Validator.builder()
.addResourceBundles("example.avaje.CustomMessages")
.addLocales(Locale.GERMAN)
.build();

@Test
void valid() {
validator.validate(new MyCustomPattern("SDFS", "Hi"));
validator.validate(new MyCustomPattern("12", "Hi"));
validator.validate(new MyCustomPattern("12345678", "Hi"));
validator.validate(new MyCustomPattern("A234567Z", "Hi"));
validator.validate(new MyCustomPattern("A2_456_Z", "Hi"));
}

@Test
void notValid() {
var violation = one(new MyCustomPattern("SD*FS", "Hi"));
assertThat(violation.message()).isEqualTo("Invalid MyKey");

assertThat(one(new MyCustomPattern("S", "Hi")).message()).isEqualTo("Invalid MyKey");
assertThat(one(new MyCustomPattern("", "Hi")).message()).isEqualTo("Invalid MyKey");
assertThat(one(new MyCustomPattern("123456789", "Hi")).message()).isEqualTo("Invalid MyKey");
}

@Test
void notValid_DE() {
var violation = one(new MyCustomPattern("SD*FS", "Hi"), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("darf nicht MyKey");
}

ConstraintViolation one(Object any) {
return one(any, Locale.ENGLISH);
}

ConstraintViolation one(Object any, Locale locale) {
try {
validator.validate(any, locale);
fail("not expected");
return null;
} catch (ConstraintViolationException e) {
var violations = new ArrayList<>(e.violations());
assertThat(violations).hasSize(1);
return violations.get(0);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package example.avaje.composable;

import io.avaje.validation.ConstraintViolation;
import io.avaje.validation.ConstraintViolationException;
import io.avaje.validation.Validator;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Locale;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;

class MySerialTest {

final Validator validator = Validator.builder()
.addResourceBundles("example.avaje.CustomMessages")
.addLocales(Locale.GERMAN)
.build();

@Test
void valid() {
validator.validate(new MySerialExample("A", "Hi"));
validator.validate(new MySerialExample("ABCDE", "Hi"));
}

@Test
void notValid() {
var violation = one(new MySerialExample("*", "Hi"));
assertThat(violation.message()).isEqualTo("Invalid my serial");

assertThat(one(new MySerialExample("ABCDEF", "Hi")).message()).isEqualTo("Invalid my serial");
assertThat(one(new MySerialExample("", "Hi")).message()).isEqualTo("Invalid my serial");
assertThat(one(new MySerialExample("123456789", "Hi")).message()).isEqualTo("Invalid my serial");
}

@Test
void notValid_DE() {
var violation = one(new MySerialExample("*", "Hi"), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("Invalid my serial"); // not translated for DE
}

ConstraintViolation one(Object any) {
return one(any, Locale.ENGLISH);
}

ConstraintViolation one(Object any, Locale locale) {
try {
validator.validate(any, locale);
fail("not expected");
return null;
} catch (ConstraintViolationException e) {
var violations = new ArrayList<>(e.violations());
assertThat(violations).hasSize(1);
return violations.get(0);
}
}
}