Nested validator do not use passed ConstraintGroup #24
Closed
Description
Hi. When I invoke validate with ConstraintGroup it seems that it is not passed to nested validator. Nested object validation works but it do not support mentioned feature.
public class GroupTest {
private Validator<MainObject> mainObjectValidator;
class MainObject {
Long id;
NestedObject nested;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public NestedObject getNested() {
return nested;
}
public void setNested(NestedObject nested) {
this.nested = nested;
}
}
class NestedObject {
Long id;
String text;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
@BeforeEach
void setUp() {
Validator<NestedObject> nestedObjectValidator = ValidatorBuilder.<NestedObject>of()
.constraintOnCondition(ValidationGroups.CREATE.toCondition(), b -> b.constraint(NestedObject::getId, "id", Constraint::isNull))
.constraintOnCondition(ValidationGroups.UPDATE.toCondition(), b -> b.constraint(NestedObject::getId, "id", Constraint::notNull))
.constraint(NestedObject::getText, "text", CharSequenceConstraint::notBlank)
.build();
mainObjectValidator = ValidatorBuilder.<MainObject>of()
.constraintOnCondition(ValidationGroups.CREATE.toCondition(), b -> b.constraint(MainObject::getId, "id", Constraint::isNull))
.constraintOnCondition(ValidationGroups.UPDATE.toCondition(), b -> b.constraint(MainObject::getId, "id", Constraint::notNull))
.nest(MainObject::getNested, "nested", nestedObjectValidator)
.build();
}
@Test
void shouldBeValid() {
var target = new MainObject();
target.setId(1L);
var nested = new NestedObject();
nested.setId(1L);
nested.setText("test");
target.setNested(nested);
var result = mainObjectValidator.validate(target, ValidationGroups.UPDATE);
assertTrue(result.isValid());
}
@Test
void shouldBeInvalid() {
var target = new MainObject();
target.setId(1L);
var nested = new NestedObject();
nested.setId(1L);
target.setNested(nested);
var result = mainObjectValidator.validate(target, ValidationGroups.CREATE);
assertFalse(result.isValid());
/*below assert fails because after validation there is only 2 errors (id in MainObject and lack
of text in NestedObject)*/
assertEquals(3, result.size());
}
}