Skip to content

Commit 5e2099a

Browse files
authored
Merge pull request #5 from aboutbits/aic-1195-be-improve-validation-tests
add bean validation for ScaledBigDecimal
2 parents 69d3b5a + 562120a commit 5e2099a

10 files changed

Lines changed: 376 additions & 2 deletions

File tree

src/main/java/it/aboutbits/springboot/toolbox/reflection/util/ClassScannerUtil.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ public static final class ClassScanner implements AutoCloseable {
1919
private final ScanResult scanResult;
2020

2121
private ClassScanner(String... packages) {
22-
var result = new ClassGraph()
22+
this.scanResult = new ClassGraph()
2323
.enableAllInfo()
2424
.acceptPackages(packages)
2525
.scan();
26-
this.scanResult = result;
2726
}
2827

2928
@SuppressWarnings("unchecked")
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.ConstraintValidator;
5+
import jakarta.validation.ConstraintValidatorContext;
6+
import jakarta.validation.constraints.Max;
7+
8+
public class MaxScaledBigDecimalValidator implements ConstraintValidator<Max, ScaledBigDecimal> {
9+
10+
private long upperBound;
11+
12+
@Override
13+
public void initialize(Max constraintAnnotation) {
14+
this.upperBound = constraintAnnotation.value();
15+
}
16+
17+
@Override
18+
public boolean isValid(ScaledBigDecimal scaledBigDecimal, ConstraintValidatorContext context) {
19+
if (scaledBigDecimal == null) {
20+
return true;
21+
}
22+
23+
return scaledBigDecimal.compareTo(new ScaledBigDecimal(upperBound)) <= 0;
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.ConstraintValidator;
5+
import jakarta.validation.ConstraintValidatorContext;
6+
import jakarta.validation.constraints.Min;
7+
8+
public class MinScaledBigDecimalValidator implements ConstraintValidator<Min, ScaledBigDecimal> {
9+
10+
private Long lowerBound;
11+
12+
@Override
13+
public void initialize(Min constraintAnnotation) {
14+
this.lowerBound = constraintAnnotation.value();
15+
}
16+
17+
@Override
18+
public boolean isValid(ScaledBigDecimal scaledBigDecimal, ConstraintValidatorContext context) {
19+
if (scaledBigDecimal == null) {
20+
return true;
21+
}
22+
23+
return scaledBigDecimal.compareTo(new ScaledBigDecimal(lowerBound)) >= 0;
24+
}
25+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.ConstraintValidator;
5+
import jakarta.validation.ConstraintValidatorContext;
6+
import jakarta.validation.constraints.NegativeOrZero;
7+
8+
public class NegativeOrZeroScaledBigDecimalValidator implements ConstraintValidator<NegativeOrZero, ScaledBigDecimal> {
9+
@Override
10+
public boolean isValid(ScaledBigDecimal value, ConstraintValidatorContext context) {
11+
if (value == null) {
12+
return true;
13+
}
14+
15+
return value.compareTo(ScaledBigDecimal.ZERO) < 1;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.ConstraintValidator;
5+
import jakarta.validation.ConstraintValidatorContext;
6+
import jakarta.validation.constraints.Negative;
7+
8+
public class NegativeScaledBigDecimalValidator implements ConstraintValidator<Negative, ScaledBigDecimal> {
9+
@Override
10+
public boolean isValid(ScaledBigDecimal value, ConstraintValidatorContext context) {
11+
if (value == null) {
12+
return true;
13+
}
14+
15+
return value.compareTo(ScaledBigDecimal.ZERO) < 0;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.ConstraintValidator;
5+
import jakarta.validation.ConstraintValidatorContext;
6+
import jakarta.validation.constraints.PositiveOrZero;
7+
8+
public class PositiveOrZeroScaledBigDecimalValidator implements ConstraintValidator<PositiveOrZero, ScaledBigDecimal> {
9+
@Override
10+
public boolean isValid(ScaledBigDecimal value, ConstraintValidatorContext context) {
11+
if (value == null) {
12+
return true;
13+
}
14+
15+
return value.compareTo(ScaledBigDecimal.ZERO) > -1;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.ConstraintValidator;
5+
import jakarta.validation.ConstraintValidatorContext;
6+
import jakarta.validation.constraints.Positive;
7+
8+
public class PositiveScaledBigDecimalValidator implements ConstraintValidator<Positive, ScaledBigDecimal> {
9+
@Override
10+
public boolean isValid(ScaledBigDecimal value, ConstraintValidatorContext context) {
11+
if (value == null) {
12+
return true;
13+
}
14+
15+
return value.compareTo(ScaledBigDecimal.ZERO) > 0;
16+
}
17+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<validation-config
3+
xmlns="https://jakarta.ee/xml/ns/validation/configuration"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="https://jakarta.ee/xml/ns/validation/configuration
6+
https://jakarta.ee/xml/ns/validation/configuration/validation-configuration-3.0.xsd"
7+
version="3.0">
8+
<constraint-mapping>
9+
META-INF/validation/scaled-big-decimal.xml
10+
</constraint-mapping>
11+
</validation-config>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<constraint-mappings
2+
xmlns="https://jakarta.ee/xml/ns/validation/mapping"
3+
version="3.0">
4+
<constraint-definition annotation="jakarta.validation.constraints.Max">
5+
<validated-by include-existing-validators="true">
6+
<value>
7+
it.aboutbits.springboot.toolbox.validation.validator.MaxScaledBigDecimalValidator
8+
</value>
9+
</validated-by>
10+
</constraint-definition>
11+
<constraint-definition annotation="jakarta.validation.constraints.Min">
12+
<validated-by include-existing-validators="true">
13+
<value>
14+
it.aboutbits.springboot.toolbox.validation.validator.MinScaledBigDecimalValidator
15+
</value>
16+
</validated-by>
17+
</constraint-definition>
18+
<constraint-definition annotation="jakarta.validation.constraints.Negative">
19+
<validated-by include-existing-validators="true">
20+
<value>
21+
it.aboutbits.springboot.toolbox.validation.validator.NegativeScaledBigDecimalValidator
22+
</value>
23+
</validated-by>
24+
</constraint-definition>
25+
<constraint-definition annotation="jakarta.validation.constraints.NegativeOrZero">
26+
<validated-by include-existing-validators="true">
27+
<value>
28+
it.aboutbits.springboot.toolbox.validation.validator.NegativeOrZeroScaledBigDecimalValidator
29+
</value>
30+
</validated-by>
31+
</constraint-definition>
32+
<constraint-definition annotation="jakarta.validation.constraints.Positive">
33+
<validated-by include-existing-validators="true">
34+
<value>
35+
it.aboutbits.springboot.toolbox.validation.validator.PositiveScaledBigDecimalValidator
36+
</value>
37+
</validated-by>
38+
</constraint-definition>
39+
<constraint-definition annotation="jakarta.validation.constraints.PositiveOrZero">
40+
<validated-by include-existing-validators="true">
41+
<value>
42+
it.aboutbits.springboot.toolbox.validation.validator.PositiveOrZeroScaledBigDecimalValidator
43+
</value>
44+
</validated-by>
45+
</constraint-definition>
46+
</constraint-mappings>
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
package it.aboutbits.springboot.toolbox.validation.validator;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import jakarta.validation.Validation;
5+
import jakarta.validation.ValidatorFactory;
6+
import jakarta.validation.constraints.Max;
7+
import jakarta.validation.constraints.Min;
8+
import jakarta.validation.constraints.Negative;
9+
import jakarta.validation.constraints.NegativeOrZero;
10+
import jakarta.validation.constraints.Positive;
11+
import jakarta.validation.constraints.PositiveOrZero;
12+
import org.junit.jupiter.api.Nested;
13+
import org.junit.jupiter.params.ParameterizedTest;
14+
import org.junit.jupiter.params.provider.ValueSource;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
public class ScaledBigDecimalValidatorTest {
19+
private static final ValidatorFactory VALIDATOR_FACTORY = Validation.buildDefaultValidatorFactory();
20+
21+
@Nested
22+
class PositiveConstraint {
23+
record Sut(@Positive ScaledBigDecimal value) {
24+
}
25+
26+
@ParameterizedTest
27+
@ValueSource(doubles = {0.0000001, 1, 100_000_000.9999})
28+
void valid_shouldSucceed(double doubleValue) {
29+
var validator = VALIDATOR_FACTORY.getValidator();
30+
31+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
32+
33+
var violations = validator.validate(instance);
34+
35+
assertThat(violations).isEmpty();
36+
}
37+
38+
@ParameterizedTest
39+
@ValueSource(doubles = {-1, -0.0000001, 0})
40+
void inValid_shouldFail(double doubleValue) {
41+
var validator = VALIDATOR_FACTORY.getValidator();
42+
43+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
44+
45+
var violations = validator.validate(instance);
46+
47+
assertThat(violations).isNotEmpty();
48+
}
49+
}
50+
51+
@Nested
52+
class PositiveOrZeroConstraint {
53+
record Sut(@PositiveOrZero ScaledBigDecimal value) {
54+
}
55+
56+
@ParameterizedTest
57+
@ValueSource(doubles = {0, 0.0000001, 1, 100_000_000.9999})
58+
void valid_shouldSucceed(double doubleValue) {
59+
var validator = VALIDATOR_FACTORY.getValidator();
60+
61+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
62+
63+
var violations = validator.validate(instance);
64+
65+
assertThat(violations).isEmpty();
66+
}
67+
68+
@ParameterizedTest
69+
@ValueSource(doubles = {-1, -0.0000001})
70+
void inValid_shouldFail(double doubleValue) {
71+
var validator = VALIDATOR_FACTORY.getValidator();
72+
73+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
74+
75+
var violations = validator.validate(instance);
76+
77+
assertThat(violations).isNotEmpty();
78+
}
79+
}
80+
81+
@Nested
82+
class NegativeConstraint {
83+
record Sut(@Negative ScaledBigDecimal value) {
84+
}
85+
86+
@ParameterizedTest
87+
@ValueSource(doubles = {-1, -0.0000001})
88+
void valid_shouldSucceed(double doubleValue) {
89+
var validator = VALIDATOR_FACTORY.getValidator();
90+
91+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
92+
93+
var violations = validator.validate(instance);
94+
95+
assertThat(violations).isEmpty();
96+
}
97+
98+
@ParameterizedTest
99+
@ValueSource(doubles = {0, 0.0000001, 1, 100_000_000.9999})
100+
void inValid_shouldFail(double doubleValue) {
101+
var validator = VALIDATOR_FACTORY.getValidator();
102+
103+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
104+
105+
var violations = validator.validate(instance);
106+
107+
assertThat(violations).isNotEmpty();
108+
}
109+
}
110+
111+
@Nested
112+
class NegativeOrZeroConstraint {
113+
record Sut(@NegativeOrZero ScaledBigDecimal value) {
114+
}
115+
116+
@ParameterizedTest
117+
@ValueSource(doubles = {-1, -0.0000001, 0})
118+
void valid_shouldSucceed(double doubleValue) {
119+
var validator = VALIDATOR_FACTORY.getValidator();
120+
121+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
122+
123+
var violations = validator.validate(instance);
124+
125+
assertThat(violations).isEmpty();
126+
}
127+
128+
@ParameterizedTest
129+
@ValueSource(doubles = {0.0000001, 1, 100_000_000.9999})
130+
void inValid_shouldFail(double doubleValue) {
131+
var validator = VALIDATOR_FACTORY.getValidator();
132+
133+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
134+
135+
var violations = validator.validate(instance);
136+
137+
assertThat(violations).isNotEmpty();
138+
}
139+
}
140+
141+
@Nested
142+
class MinConstraint {
143+
record Sut(@Min(50) ScaledBigDecimal value) {
144+
}
145+
146+
@ParameterizedTest
147+
@ValueSource(doubles = {50, 50.0000001, 100_000_000.9999})
148+
void valid_shouldSucceed(double doubleValue) {
149+
var validator = VALIDATOR_FACTORY.getValidator();
150+
151+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
152+
153+
var violations = validator.validate(instance);
154+
155+
assertThat(violations).isEmpty();
156+
}
157+
158+
@ParameterizedTest
159+
@ValueSource(doubles = {-1, -0.0000001, 0, 49, 49.999999})
160+
void inValid_shouldFail(double doubleValue) {
161+
var validator = VALIDATOR_FACTORY.getValidator();
162+
163+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
164+
165+
var violations = validator.validate(instance);
166+
167+
assertThat(violations).isNotEmpty();
168+
}
169+
}
170+
171+
@Nested
172+
class MaxConstraint {
173+
record Sut(@Max(-50) ScaledBigDecimal value) {
174+
}
175+
176+
@ParameterizedTest
177+
@ValueSource(doubles = {-100_000_000.99999, -50.000001, -50})
178+
void valid_shouldSucceed(double doubleValue) {
179+
var validator = VALIDATOR_FACTORY.getValidator();
180+
181+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
182+
183+
var violations = validator.validate(instance);
184+
185+
assertThat(violations).isEmpty();
186+
}
187+
188+
@ParameterizedTest
189+
@ValueSource(doubles = {-49.999999, -49, 0, 100_000_000})
190+
void inValid_shouldFail(double doubleValue) {
191+
var validator = VALIDATOR_FACTORY.getValidator();
192+
193+
var instance = new Sut(ScaledBigDecimal.valueOf(doubleValue));
194+
195+
var violations = validator.validate(instance);
196+
197+
assertThat(violations).isNotEmpty();
198+
}
199+
}
200+
}

0 commit comments

Comments
 (0)