Skip to content

Commit 68a1703

Browse files
committed
feat: add SubscriptionTiers to ensure encapsulation
1 parent 5e8898d commit 68a1703

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package tv.codely.checkout;
2+
3+
public final class InvalidSubscriptionTiers extends RuntimeException {
4+
5+
public InvalidSubscriptionTiers(String message) {
6+
super(message);
7+
}
8+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package tv.codely.checkout;
2+
3+
import java.util.List;
4+
5+
public final class SubscriptionTiers {
6+
7+
private final List<SubscriptionTier> tiers;
8+
9+
public SubscriptionTiers(List<SubscriptionTier> tiers) {
10+
validate(tiers);
11+
this.tiers = tiers;
12+
}
13+
14+
private static void validate(final List<SubscriptionTier> tiers) {
15+
if (tiers == null || tiers.isEmpty()) {
16+
throw new InvalidSubscriptionTiers("There must be at least one subscription tier");
17+
}
18+
19+
if (tiers.stream().noneMatch(SubscriptionTier::isLast)) {
20+
throw new IllegalArgumentException("There must be a last subscription tier");
21+
}
22+
}
23+
24+
public List<SubscriptionTier> tiers() {
25+
return tiers;
26+
}
27+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ public class TieredPricing {
66

77
private final List<SubscriptionTier> subscriptionTiers;
88

9+
public TieredPricing(final SubscriptionTiers subscriptionTiers) {
10+
this.subscriptionTiers = subscriptionTiers.tiers();
11+
}
12+
913
public TieredPricing(final List<SubscriptionTier> subscriptionTiers) {
10-
this.subscriptionTiers = subscriptionTiers;
14+
this(new SubscriptionTiers(subscriptionTiers));
1115
}
1216

1317
public double getTotalPrice(int subscriptions) {

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

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

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertNotNull;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
56
import static org.junit.jupiter.api.Assertions.assertTrue;
67

78
import java.util.List;
@@ -48,6 +49,23 @@ void return_total_price_based_on_number_of_subscriptions() {
4849
assertEquals(expectedPrice, totalPrice);
4950
}
5051

52+
@Test
53+
void should_throw_invalid_tiers_if_there_is_no_last_tier() {
54+
final var subscriptionTiers = SubscriptionTierMother.randoms();
55+
final var lastSubscriptionTier =
56+
subscriptionTiers.stream()
57+
.filter(SubscriptionTier::isLast)
58+
.findFirst()
59+
.orElse(null);
60+
61+
assertNotNull(lastSubscriptionTier);
62+
}
63+
64+
@Test
65+
void should_throw_invalid_tiers_if_there_is_no_tiers() {
66+
assertThrows(InvalidSubscriptionTiers.class, () -> new TieredPricing(List.of()));
67+
}
68+
5169
@Test
5270
void should_have_a_subscription_tier_range_with_no_upper_limit() {
5371
final var subscriptionTiers = SubscriptionTierMother.randoms();

0 commit comments

Comments
 (0)