Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.2</version>
<version>4.0.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

Expand All @@ -16,21 +17,21 @@

<properties>
<java.version>25</java.version>
<errorprone.version>2.46.0</errorprone.version>
<nullaway.version>0.12.15</nullaway.version>
<errorprone.version>2.48.0</errorprone.version>
<nullaway.version>0.13.1</nullaway.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>it.aboutbits</groupId>
<artifactId>spring-boot-toolbox</artifactId>
<version>2.1.0</version>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>it.aboutbits</groupId>
<artifactId>archunit-toolbox</artifactId>
<version>1.0.0-RC1</version>
<version>1.1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
Expand Down Expand Up @@ -77,7 +78,7 @@
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.5.3</version>
<version>2.5.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.tngtech.archunit/archunit-junit5 -->
Expand Down Expand Up @@ -106,7 +107,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.1</version>
<version>3.15.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
Expand Down Expand Up @@ -173,7 +174,7 @@
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>12.3.0</version>
<version>13.4.0</version>
</dependency>
<dependency>
<groupId>it.aboutbits</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -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 extends Enum<?>> T randomEnumValue(Class<T> 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 extends EntityId<Long>> T randomEntityId(LongFunction<T> constructor) {
return constructor.apply(
super.random().nextInt(9999999)
);
}

public <T extends EntityId<String>> T randomEntityId(Function<String, T> 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) {

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -14,9 +15,6 @@
@Slf4j
@NullMarked
public abstract class ModifiableTestDataCreator<CREATOR extends ModifiableTestDataCreator<CREATOR, ITEM, PARAMETER>, ITEM, PARAMETER> extends TestDataCreator<ITEM> {
@SuppressWarnings("unused")
protected static final FakerExtended FAKER = new FakerExtended();

private boolean mutatorSet = false;
private boolean mutatorCalled = false;

Expand All @@ -25,8 +23,8 @@ public abstract class ModifiableTestDataCreator<CREATOR extends ModifiableTestDa
return parameter;
};

protected ObjIntConsumer<ITEM> resultMutator = (_, _) -> {
};
@Nullable
protected ObjIntConsumer<ITEM> resultMutator = null;

protected ModifiableTestDataCreator(int count) {
super(count);
Expand Down Expand Up @@ -71,11 +69,15 @@ protected List<ITEM> 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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
<T> Stream<T> values(Class<T> propertyClass, Object... args);
<T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -48,10 +49,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -26,10 +27,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -38,10 +39,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -43,10 +44,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
return Stream.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -49,10 +50,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou

@Override
@SuppressWarnings("unchecked")
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
var sourceFunction = TYPE_SOURCES.get(propertyClass);
if (sourceFunction != null) {
return (Stream<T>) sourceFunction.apply(args);
return (Stream<@Nullable T>) sourceFunction.apply(args);
}

throw new IllegalArgumentException("Property class not supported!");
Expand Down
Loading