diff --git a/pom.xml b/pom.xml index 6df5f46..eb35304 100644 --- a/pom.xml +++ b/pom.xml @@ -1,11 +1,12 @@ - + 4.0.0 org.springframework.boot spring-boot-starter-parent - 4.0.2 + 4.0.4 @@ -16,8 +17,8 @@ 25 - 2.46.0 - 0.12.15 + 2.48.0 + 0.13.1 @@ -25,12 +26,12 @@ it.aboutbits spring-boot-toolbox - 2.1.0 + 2.4.1 it.aboutbits archunit-toolbox - 1.0.0-RC1 + 1.1.0 @@ -77,7 +78,7 @@ net.datafaker datafaker - 2.5.3 + 2.5.4 @@ -106,7 +107,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.14.1 + 3.15.0 ${java.version} ${java.version} @@ -173,7 +174,7 @@ com.puppycrawl.tools checkstyle - 12.3.0 + 13.4.0 it.aboutbits diff --git a/src/main/java/it/aboutbits/springboot/testing/testdata/FakerExtended.java b/src/main/java/it/aboutbits/springboot/testing/testdata/FakerExtended.java new file mode 100644 index 0000000..a6d3018 --- /dev/null +++ b/src/main/java/it/aboutbits/springboot/testing/testdata/FakerExtended.java @@ -0,0 +1,113 @@ +package it.aboutbits.springboot.testing.testdata; + +import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal; +import it.aboutbits.springboot.toolbox.type.identity.EntityId; +import net.datafaker.Faker; +import net.datafaker.service.FakeValuesService; +import net.datafaker.service.FakerContext; +import net.datafaker.service.RandomService; +import org.jspecify.annotations.NullMarked; + +import java.util.Locale; +import java.util.Random; +import java.util.function.Function; +import java.util.function.LongFunction; + +@NullMarked +public class FakerExtended extends Faker { + public FakerExtended() { + super(); + } + + public FakerExtended(Locale locale) { + super(locale); + } + + public FakerExtended(Random random) { + super(random); + } + + public FakerExtended(Locale locale, Random random) { + super(locale, random); + } + + public FakerExtended(Locale locale, RandomService randomService) { + super(locale, randomService); + } + + public FakerExtended(FakeValuesService fakeValuesService, FakerContext context) { + super(fakeValuesService, context); + } + + public > T randomEnumValue(Class enumClass) { + var values = enumClass.getEnumConstants(); + if (values.length == 0) { + throw new IllegalArgumentException("Enum class must have at least one value"); + } + return values[this.random().nextInt(values.length)]; + } + + public > T randomEntityId(LongFunction constructor) { + return constructor.apply( + super.random().nextInt(9999999) + ); + } + + public > T randomEntityId(Function constructor) { + return constructor.apply( + super.internet().uuid() + ); + } + + public String unique(String value) { + return value + "_" + super.random().nextInt(9999999); + } + + public RandomNumericRange numericRange() { + return new RandomNumericRange( + super.getFaker() + ); + } + + public static final class RandomNumericRange { + private final Faker parent; + + private RandomNumericRange(Faker parent) { + this.parent = parent; + } + + public NumericRange random() { + return random(-999999999, 999999999); + } + + public NumericRange positive() { + return random(1, 999999999); + } + + public NumericRange positiveOrZero() { + return random(0, 999999999); + } + + public NumericRange negative() { + return random(-999999999, -1); + } + + public NumericRange negativeOrZero() { + return random(-999999999, 0); + } + + public NumericRange random(double min, double max) { + var lower = parent.random().nextDouble(min, max - 1); + var upper = parent.random().nextDouble(lower, max); + + return new NumericRange( + ScaledBigDecimal.valueOf(lower), + ScaledBigDecimal.valueOf(upper) + ); + } + + public record NumericRange(ScaledBigDecimal lower, ScaledBigDecimal upper) { + + } + } +} diff --git a/src/main/java/it/aboutbits/springboot/testing/testdata/base/FakerExtended.java b/src/main/java/it/aboutbits/springboot/testing/testdata/base/FakerExtended.java index 3fbfb3c..d5a4315 100644 --- a/src/main/java/it/aboutbits/springboot/testing/testdata/base/FakerExtended.java +++ b/src/main/java/it/aboutbits/springboot/testing/testdata/base/FakerExtended.java @@ -13,6 +13,10 @@ import java.util.function.Function; import java.util.function.LongFunction; +/** + * @deprecated Moved. Use {@link it.aboutbits.springboot.testing.testdata.FakerExtended} instead. This class will be removed in a future release. + */ +@Deprecated(forRemoval = true) @NullMarked public class FakerExtended extends Faker { public FakerExtended() { diff --git a/src/main/java/it/aboutbits/springboot/testing/testdata/base/ModifiableTestDataCreator.java b/src/main/java/it/aboutbits/springboot/testing/testdata/base/ModifiableTestDataCreator.java index 208ec51..732004b 100644 --- a/src/main/java/it/aboutbits/springboot/testing/testdata/base/ModifiableTestDataCreator.java +++ b/src/main/java/it/aboutbits/springboot/testing/testdata/base/ModifiableTestDataCreator.java @@ -2,6 +2,7 @@ import lombok.extern.slf4j.Slf4j; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -14,9 +15,6 @@ @Slf4j @NullMarked public abstract class ModifiableTestDataCreator, ITEM, PARAMETER> extends TestDataCreator { - @SuppressWarnings("unused") - protected static final FakerExtended FAKER = new FakerExtended(); - private boolean mutatorSet = false; private boolean mutatorCalled = false; @@ -25,8 +23,8 @@ public abstract class ModifiableTestDataCreator resultMutator = (_, _) -> { - }; + @Nullable + protected ObjIntConsumer resultMutator = null; protected ModifiableTestDataCreator(int count) { super(count); @@ -71,11 +69,15 @@ protected List create() { for (var index = 0; index < numberOfItems; index++) { var item = create(index); - resultMutator.accept(item, index); + if (resultMutator != null) { + resultMutator.accept(item, index); - result.add( - saveMutation(item) - ); + result.add( + saveMutation(item) + ); + } else { + result.add(item); + } } if (mutatorSet && !mutatorCalled) { diff --git a/src/main/java/it/aboutbits/springboot/testing/testdata/base/TestDataCreator.java b/src/main/java/it/aboutbits/springboot/testing/testdata/base/TestDataCreator.java index c5a810a..96287dd 100644 --- a/src/main/java/it/aboutbits/springboot/testing/testdata/base/TestDataCreator.java +++ b/src/main/java/it/aboutbits/springboot/testing/testdata/base/TestDataCreator.java @@ -1,5 +1,6 @@ package it.aboutbits.springboot.testing.testdata.base; +import it.aboutbits.springboot.testing.testdata.FakerExtended; import org.jspecify.annotations.NullMarked; import java.util.ArrayList; diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/core/ValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/core/ValueSource.java index e9e7794..73fbf59 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/core/ValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/core/ValueSource.java @@ -1,10 +1,11 @@ package it.aboutbits.springboot.testing.validation.core; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.stream.Stream; @NullMarked public interface ValueSource { - Stream values(Class propertyClass, Object... args); + Stream<@Nullable T> values(Class propertyClass, Object... args); } diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/BiggerThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/BiggerThanValueSource.java index c025aba..a52a70c 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/BiggerThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/BiggerThanValueSource.java @@ -3,6 +3,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; @@ -48,10 +49,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/BlankValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/BlankValueSource.java index 8e3b96d..df91057 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/BlankValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/BlankValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -26,10 +27,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/EmptyValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/EmptyValueSource.java index 1567f0c..72d6618 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/EmptyValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/EmptyValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; @@ -38,10 +39,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/FutureValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/FutureValueSource.java index 82d5a72..9c1d716 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/FutureValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/FutureValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.time.Instant; import java.time.LocalDate; @@ -43,10 +44,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/InertValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/InertValueSource.java index f833467..bbbae90 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/InertValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/InertValueSource.java @@ -2,13 +2,14 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.stream.Stream; @NullMarked public class InertValueSource implements ValueSource { @Override - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { return Stream.empty(); } } diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/LessThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/LessThanValueSource.java index 798f542..1ba951e 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/LessThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/LessThanValueSource.java @@ -3,6 +3,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; @@ -49,10 +50,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/LongerThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/LongerThanValueSource.java index d4239dc..77ff0fa 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/LongerThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/LongerThanValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -25,10 +26,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/NullValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/NullValueSource.java index 25cb35a..9a5fadc 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/NullValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/NullValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -19,10 +20,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } return Stream.of((T) null); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/PastValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/PastValueSource.java index 2642f83..9893488 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/PastValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/PastValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.time.Instant; import java.time.LocalDate; @@ -43,10 +44,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/ShorterThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/ShorterThanValueSource.java index 2ef0a08..ff56179 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/ShorterThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/ShorterThanValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -25,10 +26,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java index 001a4ae..90cc4d6 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Array; import java.util.ArrayList; @@ -53,16 +54,16 @@ public static void registerType(Class type, LongFunction> source) { @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var value = (Long.valueOf((long) args[0])); if (propertyClass.isArray()) { - return (Stream) arrayFunction(propertyClass, value); + return (Stream<@Nullable T>) arrayFunction(propertyClass, value); } var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(value); + return (Stream<@Nullable T>) sourceFunction.apply(value); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java index 36c96fc..e74af4d 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java @@ -2,6 +2,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Array; import java.util.ArrayList; @@ -53,7 +54,7 @@ public static void registerType(Class type, LongFunction> source) { @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var value = (Long.valueOf((long) args[0])); if (value == 0) { @@ -65,12 +66,12 @@ public Stream values(Class propertyClass, Object... args) { } if (propertyClass.isArray()) { - return (Stream) arrayFunction(propertyClass, value); + return (Stream<@Nullable T>) arrayFunction(propertyClass, value); } var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(value); + return (Stream<@Nullable T>) sourceFunction.apply(value); } throw new IllegalArgumentException("Property class not supported!"); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/ZeroValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/ZeroValueSource.java index 016cbf4..0f27ad3 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/ZeroValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/ZeroValueSource.java @@ -3,6 +3,7 @@ import it.aboutbits.springboot.testing.validation.core.ValueSource; import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; @@ -46,10 +47,10 @@ public static void registerType(Class type, Function> sou @Override @SuppressWarnings("unchecked") - public Stream values(Class propertyClass, Object... args) { + public Stream<@Nullable T> values(Class propertyClass, Object... args) { var sourceFunction = TYPE_SOURCES.get(propertyClass); if (sourceFunction != null) { - return (Stream) sourceFunction.apply(args); + return (Stream<@Nullable T>) sourceFunction.apply(args); } throw new IllegalArgumentException("Property class not supported!");