diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseRuleBuilder.java b/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseRuleBuilder.java index 1a7460a..a20d073 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseRuleBuilder.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseRuleBuilder.java @@ -46,6 +46,9 @@ public abstract class BaseRuleBuilder> implements @Getter(AccessLevel.PACKAGE) private final List rules = new ArrayList<>(); + @Getter(AccessLevel.PACKAGE) + private final List validationFunctions = new ArrayList<>(); + @Setter(AccessLevel.PACKAGE) private Runnable triggerValidation; @@ -54,6 +57,11 @@ public void addRule(@NonNull Rule rule) { rules.add(rule); } + @Override + public void addValidationFunction(@NonNull CustomValidationFunction function) { + validationFunctions.add(function); + } + public > T withAdditionalRules(Consumer registrar) { var self = (T) this; registrar.accept(self); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseValidationAssert.java b/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseValidationAssert.java index 08cb915..a573230 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseValidationAssert.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/core/BaseValidationAssert.java @@ -133,6 +133,7 @@ private void assertValidation() { parameterUnderTest, functionToCallWithParameter, ruleBuilder.getRules(), + ruleBuilder.getValidationFunctions(), NON_BEAN_TYPES ) ); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/core/CustomValidationFunction.java b/src/main/java/it/aboutbits/springboot/testing/validation/core/CustomValidationFunction.java new file mode 100644 index 0000000..d268d3b --- /dev/null +++ b/src/main/java/it/aboutbits/springboot/testing/validation/core/CustomValidationFunction.java @@ -0,0 +1,8 @@ +package it.aboutbits.springboot.testing.validation.core; + +import java.util.function.Function; + +public interface CustomValidationFunction extends Function { + record Result(boolean valid, String message) { + } +} diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/core/RuleValidator.java b/src/main/java/it/aboutbits/springboot/testing/validation/core/RuleValidator.java index 7e7b16f..88ed424 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/core/RuleValidator.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/core/RuleValidator.java @@ -50,6 +50,8 @@ record AssertionParameter

( @NonNull List rules, @NonNull + List functions, + @NonNull Set> nonBeanTypes ) { } @@ -59,11 +61,22 @@ void assertValidation(AssertionParameter

assertionParameter) { @SuppressWarnings("unchecked") var functionToCallWithParameter = (Consumer

) assertionParameter.functionToCallWithParameter(); var rules = assertionParameter.rules(); + var functions = assertionParameter.functions(); var nonBeanTypes = assertionParameter.nonBeanTypes(); - assertThat(rules) + var rulesAndFunctions = rules.size() + functions.size(); + + assertThat(rulesAndFunctions) .withFailMessage("Validation failed: no rules were defined.") - .isNotEmpty(); + .isNotZero(); + + for (var function : functions) { + var result = function.apply(parameterUnderTest); + assertThat(result.valid()) + .withFailMessage( + "Validation failed: %s", result.message()) + .isTrue(); + } var validator = VALIDATOR_FACTORY.getValidator(); @@ -126,14 +139,18 @@ private static

void assertThatValidationIsCompliantForEachProperty( ) ); - assertThat(violations) + var violatingProperties = violations.stream().map( + f -> f.getPropertyPath().toString() + ).collect(Collectors.toSet()); + + assertThat(violatingProperties) .withFailMessage( "More than one property failed to validate during mutation. The supplied parameter possibly contains invalid values: %s", violatingFieldMessages.collect(Collectors.joining(" | ")) ) .hasSizeLessThan(2); - assertThat(violations) + assertThat(violatingProperties) .withFailMessage("Validation failed for property: " + rule.getProperty() + " [" + alteredValue + "]") .hasSize(1); } diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/core/ValidationRulesData.java b/src/main/java/it/aboutbits/springboot/testing/validation/core/ValidationRulesData.java index 2af0435..8c43829 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/core/ValidationRulesData.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/core/ValidationRulesData.java @@ -4,4 +4,6 @@ public interface ValidationRulesData { void addRule(@NonNull Rule rule); + + void addValidationFunction(@NonNull CustomValidationFunction function); }