diff --git a/src/main/java/yourssu/order/domain/Order.java b/src/main/java/yourssu/order/domain/Order.java index 2846d14..d1804ee 100644 --- a/src/main/java/yourssu/order/domain/Order.java +++ b/src/main/java/yourssu/order/domain/Order.java @@ -8,4 +8,8 @@ public class Order { public Order(List items) { this.items = items; } + + public List getItems() { + return items; + } } diff --git a/src/main/java/yourssu/order/domain/OrderItem.java b/src/main/java/yourssu/order/domain/OrderItem.java index e2bd709..2a65f7d 100644 --- a/src/main/java/yourssu/order/domain/OrderItem.java +++ b/src/main/java/yourssu/order/domain/OrderItem.java @@ -10,4 +10,12 @@ public OrderItem(String name, int price, int count) { this.price = price; this.count = count; } + + public int getPrice() { + return price; + } + + public int getCount() { + return count; + } } diff --git a/src/main/java/yourssu/order/service/OrderAnalyticsService.java b/src/main/java/yourssu/order/service/OrderAnalyticsService.java index 9566f39..7736c5a 100644 --- a/src/main/java/yourssu/order/service/OrderAnalyticsService.java +++ b/src/main/java/yourssu/order/service/OrderAnalyticsService.java @@ -1,4 +1,20 @@ package yourssu.order.service; +import yourssu.user.domain.User; + +import java.util.List; + public class OrderAnalyticsService { + + + public double getAvgPrice(List users) { + double avgPrice = users.stream() + .flatMap(user -> user.getOrders().stream()) + .flatMap(order -> order.getItems().stream()) + .mapToDouble(item -> item.getPrice() * item.getCount()) + .average() + .orElse(0.0); + + return avgPrice; + } } diff --git a/src/main/java/yourssu/user/domain/User.java b/src/main/java/yourssu/user/domain/User.java index ffbb384..7aadd4f 100644 --- a/src/main/java/yourssu/user/domain/User.java +++ b/src/main/java/yourssu/user/domain/User.java @@ -1,16 +1,22 @@ package yourssu.user.domain; import java.util.List; + +import yourssu.order.domain.Order; +import yourssu.order.domain.OrderItem; import yourssu.post.domain.Post; public class User { - private final Long id; - private final String name; - private final List posts; - - public User(Long id, String name, List posts) { - this.id = id; - this.name = name; - this.posts = posts; + + private final List orders; + + + + public User(List orders) { + this.orders = orders; + } + + public List getOrders() { + return orders; } } diff --git a/src/test/java/yourssu/OrderAnalyticsServiceTest.java b/src/test/java/yourssu/OrderAnalyticsServiceTest.java new file mode 100644 index 0000000..b68154e --- /dev/null +++ b/src/test/java/yourssu/OrderAnalyticsServiceTest.java @@ -0,0 +1,44 @@ +package yourssu; + +import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.Test; +import yourssu.order.domain.Order; +import yourssu.order.domain.OrderItem; +import yourssu.order.service.OrderAnalyticsService; +import yourssu.user.domain.User; + +import java.util.List; + +public class OrderAnalyticsServiceTest { + + private final OrderAnalyticsService orderAnalyticsService = new OrderAnalyticsService(); + + @Test + void 평균_주문_금액을_구한다() { + // given + List users = List.of( + new User(List.of( + new Order(List.of( + new OrderItem("A", 1000, 2), + new OrderItem("B", 1500, 1) + )), + new Order(List.of( + new OrderItem("C", 500, 3) + )) + )), + new User(List.of( + new Order(List.of( + new OrderItem("D", 2000, 1), + new OrderItem("E", 800, 2) + )) + )) + ); + + // when + double testAvg = orderAnalyticsService.getAvgPrice(users); + + // then + + assertThat(testAvg).isEqualTo(1720.0); + } +}