Skip to content

Commit f5fb1c8

Browse files
committed
add ability to extend validation tester with functional validations
1 parent b08107a commit f5fb1c8

5 files changed

Lines changed: 40 additions & 4 deletions

File tree

src/main/java/it/aboutbits/springboot/testing/validation/core/BaseRuleBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ public abstract class BaseRuleBuilder<R extends BaseRuleBuilder<R>> implements
4646
@Getter(AccessLevel.PACKAGE)
4747
private final List<Rule> rules = new ArrayList<>();
4848

49+
@Getter(AccessLevel.PACKAGE)
50+
private final List<CustomValidationFunction> validationFunctions = new ArrayList<>();
51+
4952
@Setter(AccessLevel.PACKAGE)
5053
private Runnable triggerValidation;
5154

@@ -54,6 +57,11 @@ public void addRule(@NonNull Rule rule) {
5457
rules.add(rule);
5558
}
5659

60+
@Override
61+
public void addValidationFunction(@NonNull CustomValidationFunction function) {
62+
validationFunctions.add(function);
63+
}
64+
5765
public <T extends BaseRuleBuilder<T>> T withAdditionalRules(Consumer<T> registrar) {
5866
var self = (T) this;
5967
registrar.accept(self);

src/main/java/it/aboutbits/springboot/testing/validation/core/BaseValidationAssert.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ private void assertValidation() {
133133
parameterUnderTest,
134134
functionToCallWithParameter,
135135
ruleBuilder.getRules(),
136+
ruleBuilder.getValidationFunctions(),
136137
NON_BEAN_TYPES
137138
)
138139
);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package it.aboutbits.springboot.testing.validation.core;
2+
3+
import java.util.function.Function;
4+
5+
public interface CustomValidationFunction extends Function<Object, CustomValidationFunction.Result> {
6+
record Result(boolean valid, String message) {
7+
}
8+
}

src/main/java/it/aboutbits/springboot/testing/validation/core/RuleValidator.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ record AssertionParameter<P>(
5050
@NonNull
5151
List<Rule> rules,
5252
@NonNull
53+
List<CustomValidationFunction> functions,
54+
@NonNull
5355
Set<Class<?>> nonBeanTypes
5456
) {
5557
}
@@ -59,11 +61,22 @@ void assertValidation(AssertionParameter<P> assertionParameter) {
5961
@SuppressWarnings("unchecked")
6062
var functionToCallWithParameter = (Consumer<P>) assertionParameter.functionToCallWithParameter();
6163
var rules = assertionParameter.rules();
64+
var functions = assertionParameter.functions();
6265
var nonBeanTypes = assertionParameter.nonBeanTypes();
6366

64-
assertThat(rules)
67+
var rulesAndFunctions = rules.size() + functions.size();
68+
69+
assertThat(rulesAndFunctions)
6570
.withFailMessage("Validation failed: no rules were defined.")
66-
.isNotEmpty();
71+
.isNotZero();
72+
73+
for (var function : functions) {
74+
var result = function.apply(parameterUnderTest);
75+
assertThat(result.valid())
76+
.withFailMessage(
77+
"Validation failed: %s", result.message())
78+
.isTrue();
79+
}
6780

6881
var validator = VALIDATOR_FACTORY.getValidator();
6982

@@ -126,14 +139,18 @@ private static <P> void assertThatValidationIsCompliantForEachProperty(
126139
)
127140
);
128141

129-
assertThat(violations)
142+
var violatingProperties = violations.stream().map(
143+
f -> f.getPropertyPath().toString()
144+
).collect(Collectors.toSet());
145+
146+
assertThat(violatingProperties)
130147
.withFailMessage(
131148
"More than one property failed to validate during mutation. The supplied parameter possibly contains invalid values: %s",
132149
violatingFieldMessages.collect(Collectors.joining(" | "))
133150
)
134151
.hasSizeLessThan(2);
135152

136-
assertThat(violations)
153+
assertThat(violatingProperties)
137154
.withFailMessage("Validation failed for property: " + rule.getProperty() + " [" + alteredValue + "]")
138155
.hasSize(1);
139156
}

src/main/java/it/aboutbits/springboot/testing/validation/core/ValidationRulesData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44

55
public interface ValidationRulesData {
66
void addRule(@NonNull Rule rule);
7+
8+
void addValidationFunction(@NonNull CustomValidationFunction function);
79
}

0 commit comments

Comments
 (0)