Skip to content

Commit 81dbc37

Browse files
committed
feat: add object mothers in TieredPricingShould
1 parent 8bb2feb commit 81dbc37

File tree

9 files changed

+136
-21
lines changed

9 files changed

+136
-21
lines changed

exercises/tiered_pricing/solutions/adrianliz/java/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dependencies {
2424

2525
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
2626
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.6.4'
27+
testImplementation 'com.github.javafaker:javafaker:1.0.2'
2728
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
2829
}
2930

exercises/tiered_pricing/solutions/adrianliz/java/src/main/java/tv/codely/checkout/TieredPricing.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,12 @@ public double getTotalPrice(int subscriptions) {
3636
.map(subscriptionTier -> subscriptionTier.getTotalPrice(subscriptions))
3737
.orElse(0D);
3838
}
39+
40+
public double getBasePrice(int subscriptions) {
41+
return subscriptionTiers.stream()
42+
.filter(subscriptionTier -> subscriptionTier.isInRange(subscriptions))
43+
.findFirst()
44+
.map(SubscriptionTier::unitPrice)
45+
.orElse(0D);
46+
}
3947
}

exercises/tiered_pricing/solutions/adrianliz/java/src/test/java/tv/codely/checkout/TieredPricingShould.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertTrue;
55

6-
import java.util.List;
76
import org.junit.jupiter.api.Test;
7+
import tv.codely.checkout.mother.IntegerMother;
8+
import tv.codely.checkout.mother.SubscriptionTierMother;
89

910
public class TieredPricingShould {
1011

@@ -15,27 +16,14 @@ void unit_test_example() {
1516

1617
@Test
1718
void return_total_price_based_on_number_of_subscriptions() {
18-
final var priceRanges =
19-
List.of(
20-
new SubscriptionTier(
21-
new SubscriptionTierRange(1, 2),
22-
new SubscriptionTierPrice(299)),
23-
new SubscriptionTier(
24-
new SubscriptionTierRange(3, 10),
25-
new SubscriptionTierPrice(239)),
26-
new SubscriptionTier(
27-
new SubscriptionTierRange(11, 25),
28-
new SubscriptionTierPrice(219)),
29-
new SubscriptionTier(
30-
new SubscriptionTierRange(26, 50),
31-
new SubscriptionTierPrice(199)),
32-
new SubscriptionTier(
33-
new SubscriptionTierRange(51, 100),
34-
new SubscriptionTierPrice(149)));
35-
final var tieredPricing = new TieredPricing(priceRanges);
36-
final var expectedPrice = priceRanges.get(1).unitPrice() * 3;
19+
final var subscriptionTiers = SubscriptionTierMother.randoms();
20+
final var tieredPricing = new TieredPricing(subscriptionTiers);
21+
final var numberOfSubscriptions = IntegerMother.random();
22+
final var expectedPrice =
23+
tieredPricing.getBasePrice(numberOfSubscriptions) * numberOfSubscriptions;
24+
25+
final var totalPrice = tieredPricing.getTotalPrice(numberOfSubscriptions);
3726

38-
final var totalPrice = tieredPricing.getTotalPrice(3);
3927
assertEquals(expectedPrice, totalPrice);
4028
}
4129

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package tv.codely.checkout.mother;
2+
3+
public final class DoubleMother {
4+
5+
public static double randomBetween(final int min, final int max) {
6+
return MotherCreator.random().number().randomDouble(2, min, max);
7+
}
8+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package tv.codely.checkout.mother;
2+
3+
public final class IntegerMother {
4+
5+
public static int random() {
6+
return MotherCreator.random().number().randomDigitNotZero();
7+
}
8+
9+
public static int randomBetween(final int min, final int max) {
10+
return MotherCreator.random().number().numberBetween(min, max);
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package tv.codely.checkout.mother;
2+
3+
import com.github.javafaker.Faker;
4+
5+
public final class MotherCreator {
6+
7+
private static final Faker faker = new Faker();
8+
9+
public static Faker random() {
10+
return faker;
11+
}
12+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package tv.codely.checkout.mother;
2+
3+
import java.util.List;
4+
import java.util.concurrent.atomic.AtomicReference;
5+
import tv.codely.checkout.SubscriptionTier;
6+
import tv.codely.checkout.SubscriptionTierPrice;
7+
import tv.codely.checkout.SubscriptionTierRange;
8+
9+
public final class SubscriptionTierMother {
10+
11+
public static SubscriptionTier create(
12+
final SubscriptionTierRange range,
13+
final SubscriptionTierPrice price) {
14+
15+
return new SubscriptionTier(range, price);
16+
}
17+
18+
public static List<SubscriptionTier> randoms() {
19+
final var subscriptionTierRanges = SubscriptionTierRangeMother.randoms();
20+
final var previousSubscriptionTierPrice = new AtomicReference<>(299D);
21+
22+
return subscriptionTierRanges.stream()
23+
.map(range -> {
24+
final var subscriptionTierPrice =
25+
DoubleMother.randomBetween(
26+
previousSubscriptionTierPrice.get().intValue() - 60,
27+
previousSubscriptionTierPrice.get().intValue() - 20);
28+
previousSubscriptionTierPrice.set(subscriptionTierPrice);
29+
return create(range, new SubscriptionTierPrice(subscriptionTierPrice));
30+
})
31+
.toList();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package tv.codely.checkout.mother;
2+
3+
import tv.codely.checkout.SubscriptionTierPrice;
4+
5+
public final class SubscriptionTierPriceMother {
6+
7+
public static SubscriptionTierPrice create(final double value) {
8+
return new SubscriptionTierPrice(value);
9+
}
10+
11+
public static SubscriptionTierPrice randomBetween(final int min, final int max) {
12+
return create(DoubleMother.randomBetween(min, max));
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package tv.codely.checkout.mother;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import tv.codely.checkout.SubscriptionTierRange;
6+
7+
public final class SubscriptionTierRangeMother {
8+
9+
public static SubscriptionTierRange create(
10+
final int numberOfSubscriptionsFrom,
11+
final int numberOfSubscriptionsTo) {
12+
13+
return new SubscriptionTierRange(numberOfSubscriptionsFrom, numberOfSubscriptionsTo);
14+
}
15+
16+
public static List<SubscriptionTierRange> randoms() {
17+
final var subscriptionTiers = new ArrayList<SubscriptionTierRange>();
18+
final var numberOfTiers = IntegerMother.randomBetween(1, 6);
19+
final var minSubscriptionsInTier = 3;
20+
final var maxSubscriptionsInTier =
21+
IntegerMother.randomBetween(minSubscriptionsInTier + 1, 20);
22+
23+
var lastNumberOfSubscriptionsTo = 0;
24+
25+
for (int i = 0; i < numberOfTiers; i++) {
26+
final var numberOfSubscriptionsFrom = lastNumberOfSubscriptionsTo + 1;
27+
final var numberOfSubscriptionsTo =
28+
IntegerMother.randomBetween(
29+
numberOfSubscriptionsFrom + 1,
30+
maxSubscriptionsInTier * (i + 1));
31+
32+
lastNumberOfSubscriptionsTo = numberOfSubscriptionsTo;
33+
34+
subscriptionTiers.add(create(numberOfSubscriptionsFrom, numberOfSubscriptionsTo));
35+
}
36+
37+
return subscriptionTiers;
38+
}
39+
}

0 commit comments

Comments
 (0)