Skip to content
Open
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
33 changes: 24 additions & 9 deletions app/src/main/java/com/example/app/config/AppConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
import com.example.common.db.UserRepository;
import com.example.common.db.UserStore;
import com.example.orderapi.client.DeliveryClient;
import com.example.orderapi.service.NoDiscountPolicy;
import com.example.orderapi.service.OrderService;
import com.example.orderapi.service.PriceService;
import com.example.loyalty.service.BatchRunner;
import com.example.loyalty.service.LoyaltyCalculator;
import com.example.loyalty.service.LoyaltyConfig;
import com.example.orderapi.client.TimeoutDeliveryClient;
import com.example.orderapi.service.OrderService;
import com.example.orderapi.service.PriceService;
import java.math.BigDecimal;
import java.time.Duration;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -37,12 +39,12 @@ public OrderStore orderStore(DataSource dataSource) {

@Bean
public DeliveryClient deliveryClient() {
return new StubDeliveryClient();
return new TimeoutDeliveryClient(new StubDeliveryClient(), Duration.ofMillis(500));
}

@Bean
public PriceService priceService(DeliveryClient deliveryClient) {
return new PriceService(deliveryClient, new NoDiscountPolicy(), "USD");
public PriceService priceService(DeliveryClient deliveryClient, DiscountStore discountStore) {
return new PriceService(deliveryClient, discountStore, "USD");
}

@Bean
Expand All @@ -52,11 +54,24 @@ public OrderService orderService(OrderStore orderStore, UserStore userStore, Dis

@Bean
public LoyaltyCalculator loyaltyCalculator() {
return new LoyaltyCalculator(new BigDecimal("0.05"));
return new LoyaltyCalculator(loyaltyConfig());
}

@Bean
public LoyaltyConfig loyaltyConfig() {
return new LoyaltyConfig(
new BigDecimal("0.05"),
new BigDecimal("0.02"),
new BigDecimal("100.00"),
new BigDecimal("50.00"),
new BigDecimal("1.00"),
new BigDecimal("0.01"),
30
);
}

@Bean
public BatchRunner batchRunner(LoyaltyCalculator calculator, DiscountStore discountStore) {
return new BatchRunner(calculator, discountStore);
public BatchRunner batchRunner(LoyaltyCalculator calculator, DiscountStore discountStore, LoyaltyConfig config) {
return new BatchRunner(calculator, config, discountStore);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public final class ErrorCodes {
public static final String DELIVERY_UNAVAILABLE = "DELIVERY_UNAVAILABLE";
public static final String INVALID_REQUEST = "INVALID_REQUEST";
public static final String ORDER_TOO_SMALL = "ORDER_TOO_SMALL";
public static final String INTERNAL_ERROR = "INTERNAL_ERROR";
public static final String LOYALTY_INVALID_INPUT = "LOYALTY_INVALID_INPUT";

Expand Down
4 changes: 3 additions & 1 deletion libs/common/src/main/java/com/example/common/model/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ public Item(String sku, int quantity, BigDecimal unitPrice) {
}
this.quantity = quantity;
this.unitPrice = Objects.requireNonNull(unitPrice, "unitPrice");
if (unitPrice.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException("unitPrice must be non-negative");
}
}

public String getSku() {
Expand All @@ -29,4 +32,3 @@ public BigDecimal getUnitPrice() {
return unitPrice;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ void itemValidatesQuantityAndNulls() {
assertThrows(NullPointerException.class, () -> new Item(null, 1, new BigDecimal("1.00")));
assertThrows(NullPointerException.class, () -> new Item("sku-1", 1, null));
assertThrows(IllegalArgumentException.class, () -> new Item("sku-1", 0, new BigDecimal("1.00")));
assertThrows(IllegalArgumentException.class, () -> new Item("sku-1", 1, new BigDecimal("-1.00")));

Item item = new Item("sku-1", 2, new BigDecimal("10.00"));
assertEquals("sku-1", item.getSku());
assertEquals(2, item.getQuantity());
assertEquals(new BigDecimal("10.00"), item.getUnitPrice());
}
}

Loading