Skip to content

Commit 6cde971

Browse files
authored
update & fixes (#33)
* update versions * add validation tools for new toolbox * remove redundant faker instance already present in superclass. prevent duplicate save call when no result mutator is set. * move faker * fix nullability
1 parent eacaafc commit 6cde971

19 files changed

Lines changed: 181 additions & 46 deletions

pom.xml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<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">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
34
<modelVersion>4.0.0</modelVersion>
45

56
<parent>
67
<groupId>org.springframework.boot</groupId>
78
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>4.0.2</version>
9+
<version>4.0.4</version>
910
<relativePath/> <!-- lookup parent from repository -->
1011
</parent>
1112

@@ -16,21 +17,21 @@
1617

1718
<properties>
1819
<java.version>25</java.version>
19-
<errorprone.version>2.46.0</errorprone.version>
20-
<nullaway.version>0.12.15</nullaway.version>
20+
<errorprone.version>2.48.0</errorprone.version>
21+
<nullaway.version>0.13.1</nullaway.version>
2122
</properties>
2223

2324
<dependencyManagement>
2425
<dependencies>
2526
<dependency>
2627
<groupId>it.aboutbits</groupId>
2728
<artifactId>spring-boot-toolbox</artifactId>
28-
<version>2.1.0</version>
29+
<version>2.4.1</version>
2930
</dependency>
3031
<dependency>
3132
<groupId>it.aboutbits</groupId>
3233
<artifactId>archunit-toolbox</artifactId>
33-
<version>1.0.0-RC1</version>
34+
<version>1.1.0</version>
3435
</dependency>
3536
</dependencies>
3637
</dependencyManagement>
@@ -77,7 +78,7 @@
7778
<dependency>
7879
<groupId>net.datafaker</groupId>
7980
<artifactId>datafaker</artifactId>
80-
<version>2.5.3</version>
81+
<version>2.5.4</version>
8182
</dependency>
8283

8384
<!-- https://mvnrepository.com/artifact/com.tngtech.archunit/archunit-junit5 -->
@@ -106,7 +107,7 @@
106107
<plugin>
107108
<groupId>org.apache.maven.plugins</groupId>
108109
<artifactId>maven-compiler-plugin</artifactId>
109-
<version>3.14.1</version>
110+
<version>3.15.0</version>
110111
<configuration>
111112
<source>${java.version}</source>
112113
<target>${java.version}</target>
@@ -173,7 +174,7 @@
173174
<dependency>
174175
<groupId>com.puppycrawl.tools</groupId>
175176
<artifactId>checkstyle</artifactId>
176-
<version>12.3.0</version>
177+
<version>13.4.0</version>
177178
</dependency>
178179
<dependency>
179180
<groupId>it.aboutbits</groupId>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package it.aboutbits.springboot.testing.testdata;
2+
3+
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
4+
import it.aboutbits.springboot.toolbox.type.identity.EntityId;
5+
import net.datafaker.Faker;
6+
import net.datafaker.service.FakeValuesService;
7+
import net.datafaker.service.FakerContext;
8+
import net.datafaker.service.RandomService;
9+
import org.jspecify.annotations.NullMarked;
10+
11+
import java.util.Locale;
12+
import java.util.Random;
13+
import java.util.function.Function;
14+
import java.util.function.LongFunction;
15+
16+
@NullMarked
17+
public class FakerExtended extends Faker {
18+
public FakerExtended() {
19+
super();
20+
}
21+
22+
public FakerExtended(Locale locale) {
23+
super(locale);
24+
}
25+
26+
public FakerExtended(Random random) {
27+
super(random);
28+
}
29+
30+
public FakerExtended(Locale locale, Random random) {
31+
super(locale, random);
32+
}
33+
34+
public FakerExtended(Locale locale, RandomService randomService) {
35+
super(locale, randomService);
36+
}
37+
38+
public FakerExtended(FakeValuesService fakeValuesService, FakerContext context) {
39+
super(fakeValuesService, context);
40+
}
41+
42+
public <T extends Enum<?>> T randomEnumValue(Class<T> enumClass) {
43+
var values = enumClass.getEnumConstants();
44+
if (values.length == 0) {
45+
throw new IllegalArgumentException("Enum class must have at least one value");
46+
}
47+
return values[this.random().nextInt(values.length)];
48+
}
49+
50+
public <T extends EntityId<Long>> T randomEntityId(LongFunction<T> constructor) {
51+
return constructor.apply(
52+
super.random().nextInt(9999999)
53+
);
54+
}
55+
56+
public <T extends EntityId<String>> T randomEntityId(Function<String, T> constructor) {
57+
return constructor.apply(
58+
super.internet().uuid()
59+
);
60+
}
61+
62+
public String unique(String value) {
63+
return value + "_" + super.random().nextInt(9999999);
64+
}
65+
66+
public RandomNumericRange numericRange() {
67+
return new RandomNumericRange(
68+
super.getFaker()
69+
);
70+
}
71+
72+
public static final class RandomNumericRange {
73+
private final Faker parent;
74+
75+
private RandomNumericRange(Faker parent) {
76+
this.parent = parent;
77+
}
78+
79+
public NumericRange random() {
80+
return random(-999999999, 999999999);
81+
}
82+
83+
public NumericRange positive() {
84+
return random(1, 999999999);
85+
}
86+
87+
public NumericRange positiveOrZero() {
88+
return random(0, 999999999);
89+
}
90+
91+
public NumericRange negative() {
92+
return random(-999999999, -1);
93+
}
94+
95+
public NumericRange negativeOrZero() {
96+
return random(-999999999, 0);
97+
}
98+
99+
public NumericRange random(double min, double max) {
100+
var lower = parent.random().nextDouble(min, max - 1);
101+
var upper = parent.random().nextDouble(lower, max);
102+
103+
return new NumericRange(
104+
ScaledBigDecimal.valueOf(lower),
105+
ScaledBigDecimal.valueOf(upper)
106+
);
107+
}
108+
109+
public record NumericRange(ScaledBigDecimal lower, ScaledBigDecimal upper) {
110+
111+
}
112+
}
113+
}

src/main/java/it/aboutbits/springboot/testing/testdata/base/FakerExtended.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
import java.util.function.Function;
1414
import java.util.function.LongFunction;
1515

16+
/**
17+
* @deprecated Moved. Use {@link it.aboutbits.springboot.testing.testdata.FakerExtended} instead. This class will be removed in a future release.
18+
*/
19+
@Deprecated(forRemoval = true)
1620
@NullMarked
1721
public class FakerExtended extends Faker {
1822
public FakerExtended() {

src/main/java/it/aboutbits/springboot/testing/testdata/base/ModifiableTestDataCreator.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.extern.slf4j.Slf4j;
44
import org.jspecify.annotations.NullMarked;
5+
import org.jspecify.annotations.Nullable;
56

67
import java.util.ArrayList;
78
import java.util.List;
@@ -14,9 +15,6 @@
1415
@Slf4j
1516
@NullMarked
1617
public abstract class ModifiableTestDataCreator<CREATOR extends ModifiableTestDataCreator<CREATOR, ITEM, PARAMETER>, ITEM, PARAMETER> extends TestDataCreator<ITEM> {
17-
@SuppressWarnings("unused")
18-
protected static final FakerExtended FAKER = new FakerExtended();
19-
2018
private boolean mutatorSet = false;
2119
private boolean mutatorCalled = false;
2220

@@ -25,8 +23,8 @@ public abstract class ModifiableTestDataCreator<CREATOR extends ModifiableTestDa
2523
return parameter;
2624
};
2725

28-
protected ObjIntConsumer<ITEM> resultMutator = (_, _) -> {
29-
};
26+
@Nullable
27+
protected ObjIntConsumer<ITEM> resultMutator = null;
3028

3129
protected ModifiableTestDataCreator(int count) {
3230
super(count);
@@ -71,11 +69,15 @@ protected List<ITEM> create() {
7169
for (var index = 0; index < numberOfItems; index++) {
7270
var item = create(index);
7371

74-
resultMutator.accept(item, index);
72+
if (resultMutator != null) {
73+
resultMutator.accept(item, index);
7574

76-
result.add(
77-
saveMutation(item)
78-
);
75+
result.add(
76+
saveMutation(item)
77+
);
78+
} else {
79+
result.add(item);
80+
}
7981
}
8082

8183
if (mutatorSet && !mutatorCalled) {

src/main/java/it/aboutbits/springboot/testing/testdata/base/TestDataCreator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package it.aboutbits.springboot.testing.testdata.base;
22

3+
import it.aboutbits.springboot.testing.testdata.FakerExtended;
34
import org.jspecify.annotations.NullMarked;
45

56
import java.util.ArrayList;
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package it.aboutbits.springboot.testing.validation.core;
22

33
import org.jspecify.annotations.NullMarked;
4+
import org.jspecify.annotations.Nullable;
45

56
import java.util.stream.Stream;
67

78
@NullMarked
89
public interface ValueSource {
9-
<T> Stream<T> values(Class<T> propertyClass, Object... args);
10+
<T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args);
1011
}

src/main/java/it/aboutbits/springboot/testing/validation/source/BiggerThanValueSource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import it.aboutbits.springboot.testing.validation.core.ValueSource;
44
import it.aboutbits.springboot.toolbox.type.ScaledBigDecimal;
55
import org.jspecify.annotations.NullMarked;
6+
import org.jspecify.annotations.Nullable;
67

78
import java.math.BigDecimal;
89
import java.math.BigInteger;
@@ -48,10 +49,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou
4849

4950
@Override
5051
@SuppressWarnings("unchecked")
51-
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
52+
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
5253
var sourceFunction = TYPE_SOURCES.get(propertyClass);
5354
if (sourceFunction != null) {
54-
return (Stream<T>) sourceFunction.apply(args);
55+
return (Stream<@Nullable T>) sourceFunction.apply(args);
5556
}
5657

5758
throw new IllegalArgumentException("Property class not supported!");

src/main/java/it/aboutbits/springboot/testing/validation/source/BlankValueSource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import it.aboutbits.springboot.testing.validation.core.ValueSource;
44
import org.jspecify.annotations.NullMarked;
5+
import org.jspecify.annotations.Nullable;
56

67
import java.util.HashMap;
78
import java.util.Map;
@@ -26,10 +27,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou
2627

2728
@Override
2829
@SuppressWarnings("unchecked")
29-
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
30+
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
3031
var sourceFunction = TYPE_SOURCES.get(propertyClass);
3132
if (sourceFunction != null) {
32-
return (Stream<T>) sourceFunction.apply(args);
33+
return (Stream<@Nullable T>) sourceFunction.apply(args);
3334
}
3435

3536
throw new IllegalArgumentException("Property class not supported!");

src/main/java/it/aboutbits/springboot/testing/validation/source/EmptyValueSource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import it.aboutbits.springboot.testing.validation.core.ValueSource;
44
import org.jspecify.annotations.NullMarked;
5+
import org.jspecify.annotations.Nullable;
56

67
import java.util.ArrayList;
78
import java.util.HashMap;
@@ -38,10 +39,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou
3839

3940
@Override
4041
@SuppressWarnings("unchecked")
41-
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
42+
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
4243
var sourceFunction = TYPE_SOURCES.get(propertyClass);
4344
if (sourceFunction != null) {
44-
return (Stream<T>) sourceFunction.apply(args);
45+
return (Stream<@Nullable T>) sourceFunction.apply(args);
4546
}
4647

4748
throw new IllegalArgumentException("Property class not supported!");

src/main/java/it/aboutbits/springboot/testing/validation/source/FutureValueSource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import it.aboutbits.springboot.testing.validation.core.ValueSource;
44
import org.jspecify.annotations.NullMarked;
5+
import org.jspecify.annotations.Nullable;
56

67
import java.time.Instant;
78
import java.time.LocalDate;
@@ -43,10 +44,10 @@ public static void registerType(Class<?> type, Function<Object[], Stream<?>> sou
4344

4445
@Override
4546
@SuppressWarnings("unchecked")
46-
public <T> Stream<T> values(Class<T> propertyClass, Object... args) {
47+
public <T> Stream<@Nullable T> values(Class<T> propertyClass, Object... args) {
4748
var sourceFunction = TYPE_SOURCES.get(propertyClass);
4849
if (sourceFunction != null) {
49-
return (Stream<T>) sourceFunction.apply(args);
50+
return (Stream<@Nullable T>) sourceFunction.apply(args);
5051
}
5152

5253
throw new IllegalArgumentException("Property class not supported!");

0 commit comments

Comments
 (0)