Skip to content

Commit

Permalink
Fix incorrect @Size constraints propagation
Browse files Browse the repository at this point in the history
Issue #448
  • Loading branch information
murdos authored and fmbenhassine committed Mar 20, 2021
1 parent 97b508e commit 0e56afa
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 8 deletions.
Expand Up @@ -62,8 +62,6 @@ public Randomizer<?> getRandomizer(Field field) {
final int min = sizeAnnotation.min();
final int max = sizeAnnotation.max() == Integer.MAX_VALUE ? 255 : sizeAnnotation.max();
if (easyRandom == null) {
parameters.setCollectionSizeRange(new EasyRandomParameters.Range<>(min, max));
parameters.setStringLengthRange(new EasyRandomParameters.Range<>(min, max));
easyRandom = new EasyRandom(parameters);
}

Expand Down
Expand Up @@ -119,6 +119,9 @@ class BeanValidationAnnotatedBean {
@Size(min = 2, max = 10)
private List<String> sizedList;

@Size(min = 2, max = 10)
private List<EmbeddedBean> sizedListEmbeddedBean;

@Size(min = 2, max = 10)
private Set<String> sizedSet;

Expand Down Expand Up @@ -269,6 +272,10 @@ public String getSizedString() {
return this.sizedString;
}

public List<EmbeddedBean> getSizedListEmbeddedBean() {
return sizedListEmbeddedBean;
}

public String getRegexString() {
return this.regexString;
}
Expand Down Expand Up @@ -405,6 +412,10 @@ public void setSizedString(String sizedString) {
this.sizedString = sizedString;
}

public void setSizedListEmbeddedBean(List<EmbeddedBean> sizedListEmbeddedBean) {
this.sizedListEmbeddedBean = sizedListEmbeddedBean;
}

public void setRegexString(String regexString) {
this.regexString = regexString;
}
Expand Down
Expand Up @@ -41,7 +41,6 @@
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
Expand All @@ -59,6 +58,22 @@ void setUp() {
easyRandom = new EasyRandom();
}

@Test
void sizeConstraintShouldNotBePropagatedToEmbeddedBeans() {

EasyRandomParameters parameters = new EasyRandomParameters()
.collectionSizeRange(11, 15)
.stringLengthRange(16, 20);
easyRandom = new EasyRandom(parameters);
BeanValidationAnnotatedBean bean = easyRandom.nextObject(BeanValidationAnnotatedBean.class);

assertThat(bean.getSizedListEmbeddedBean().size()).isBetween(2, 10); // @Size constraint
assertThat(bean.getSizedListEmbeddedBean()).allSatisfy(embeddedBean -> {
assertThat(embeddedBean.getItems().size()).isBetween(11, 15);
assertThat(embeddedBean.getItems()).allSatisfy(stringItem -> assertThat(stringItem.length()).isBetween(16, 20));
});
}

@Test
void generatedValuesShouldBeValidAccordingToValidationConstraints() {
BeanValidationAnnotatedBean bean = easyRandom.nextObject(BeanValidationAnnotatedBean.class);
Expand Down Expand Up @@ -202,15 +217,15 @@ void generatedValuesShouldBeValidAccordingToValidationConstraintsOnMethod() {
@Test
void generatedValuesForBeanWithoutReadMethod() {
BeanValidationWithoutReadMethodBean bean = easyRandom.nextObject(BeanValidationWithoutReadMethodBean.class);

assertThat(bean).hasNoNullFieldsOrProperties();
}

@Test
void shouldGenerateTheSameValueForTheSameSeed() {
EasyRandomParameters parameters = new EasyRandomParameters().seed(123L);
EasyRandom random = new EasyRandom(parameters);

BeanValidationAnnotatedBean bean = random.nextObject(BeanValidationAnnotatedBean.class);

assertThat(bean.getUsername()).isEqualTo("eOMtThyhVNLWUZNRcBaQKxI");
Expand Down Expand Up @@ -252,14 +267,14 @@ class Salary {
@Digits(integer = 2, fraction = 2) // OSS developer salary.. :-)
private BigDecimal amount;
}

EasyRandomParameters parameters = new EasyRandomParameters()
.randomizerRegistry(new MyCustomBeanValidationRandomizerRegistry());
EasyRandom easyRandom = new EasyRandom(parameters);

// when
Salary salary = easyRandom.nextObject(Salary.class);

// then
assertThat(salary).isNotNull();
assertThat(salary.amount).isLessThanOrEqualTo(new BigDecimal("99.99"));
Expand Down
@@ -0,0 +1,16 @@
package org.jeasy.random.validation;

import java.util.List;

public class EmbeddedBean {

private List<String> items;

public List<String> getItems() {
return items;
}

public void setItems(List<String> items) {
this.items = items;
}
}

0 comments on commit 0e56afa

Please sign in to comment.