From b8aa4ace78e4b1976ddfdd2c916150dcbfd36ccf Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 17 Feb 2025 22:39:59 +0900 Subject: [PATCH 01/12] =?UTF-8?q?refactor(Product):=20=EC=83=81=ED=92=88?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ProductService.java | 14 ++++++------ .../{ => product}/domain/Product.java | 2 +- .../domain/ProductRepository.java | 2 +- .../persistence}/JpaProductRepository.java | 4 +++- .../ui/ProductRestController.java | 6 ++--- .../InMemoryProductRepository.java | 6 ++--- .../application/ProductServiceTest.java | 22 ++++++++++--------- 7 files changed, 30 insertions(+), 26 deletions(-) rename src/main/java/kitchenpos/{ => product}/application/ProductService.java (89%) rename src/main/java/kitchenpos/{ => product}/domain/Product.java (96%) rename src/main/java/kitchenpos/{ => product}/domain/ProductRepository.java (88%) rename src/main/java/kitchenpos/{domain => product/infra/persistence}/JpaProductRepository.java (57%) rename src/main/java/kitchenpos/{ => product}/ui/ProductRestController.java (92%) rename src/test/java/kitchenpos/{ => product}/application/InMemoryProductRepository.java (86%) rename src/test/java/kitchenpos/{ => product}/application/ProductServiceTest.java (89%) diff --git a/src/main/java/kitchenpos/application/ProductService.java b/src/main/java/kitchenpos/product/application/ProductService.java similarity index 89% rename from src/main/java/kitchenpos/application/ProductService.java rename to src/main/java/kitchenpos/product/application/ProductService.java index dc44b087b..dd868b9df 100644 --- a/src/main/java/kitchenpos/application/ProductService.java +++ b/src/main/java/kitchenpos/product/application/ProductService.java @@ -1,11 +1,11 @@ -package kitchenpos.application; +package kitchenpos.product.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuProduct; +import kitchenpos.menu.domain.MenuRepository; +import kitchenpos.product.domain.Product; +import kitchenpos.product.domain.ProductRepository; +import kitchenpos.common.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/domain/Product.java b/src/main/java/kitchenpos/product/domain/Product.java similarity index 96% rename from src/main/java/kitchenpos/domain/Product.java rename to src/main/java/kitchenpos/product/domain/Product.java index e45329e6f..5130d141e 100644 --- a/src/main/java/kitchenpos/domain/Product.java +++ b/src/main/java/kitchenpos/product/domain/Product.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.product.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/domain/ProductRepository.java b/src/main/java/kitchenpos/product/domain/ProductRepository.java similarity index 88% rename from src/main/java/kitchenpos/domain/ProductRepository.java rename to src/main/java/kitchenpos/product/domain/ProductRepository.java index 51f548fb5..745b4ab4e 100644 --- a/src/main/java/kitchenpos/domain/ProductRepository.java +++ b/src/main/java/kitchenpos/product/domain/ProductRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.product.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/JpaProductRepository.java b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java similarity index 57% rename from src/main/java/kitchenpos/domain/JpaProductRepository.java rename to src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java index 1f81d0d15..5f7d3a22e 100644 --- a/src/main/java/kitchenpos/domain/JpaProductRepository.java +++ b/src/main/java/kitchenpos/product/infra/persistence/JpaProductRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.domain; +package kitchenpos.product.infra.persistence; +import kitchenpos.product.domain.Product; +import kitchenpos.product.domain.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/ui/ProductRestController.java b/src/main/java/kitchenpos/product/ui/ProductRestController.java similarity index 92% rename from src/main/java/kitchenpos/ui/ProductRestController.java rename to src/main/java/kitchenpos/product/ui/ProductRestController.java index ec700fd38..bf1ccd51a 100644 --- a/src/main/java/kitchenpos/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/product/ui/ProductRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.product.ui; -import kitchenpos.application.ProductService; -import kitchenpos.domain.Product; +import kitchenpos.product.application.ProductService; +import kitchenpos.product.domain.Product; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/application/InMemoryProductRepository.java b/src/test/java/kitchenpos/product/application/InMemoryProductRepository.java similarity index 86% rename from src/test/java/kitchenpos/application/InMemoryProductRepository.java rename to src/test/java/kitchenpos/product/application/InMemoryProductRepository.java index c2d198f19..13307337f 100644 --- a/src/test/java/kitchenpos/application/InMemoryProductRepository.java +++ b/src/test/java/kitchenpos/product/application/InMemoryProductRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.product.application; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; +import kitchenpos.product.domain.Product; +import kitchenpos.product.domain.ProductRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/ProductServiceTest.java b/src/test/java/kitchenpos/product/application/ProductServiceTest.java similarity index 89% rename from src/test/java/kitchenpos/application/ProductServiceTest.java rename to src/test/java/kitchenpos/product/application/ProductServiceTest.java index ee2287b2d..cf8b81c46 100644 --- a/src/test/java/kitchenpos/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/product/application/ProductServiceTest.java @@ -1,10 +1,12 @@ -package kitchenpos.application; - -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; +package kitchenpos.product.application; + +import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.menu.application.InMemoryMenuRepository; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuRepository; +import kitchenpos.product.domain.Product; +import kitchenpos.product.domain.ProductRepository; +import kitchenpos.common.infra.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,9 +18,9 @@ import java.util.List; import java.util.UUID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.product; +import static kitchenpos.common.fixtures.Fixtures.menu; +import static kitchenpos.common.fixtures.Fixtures.menuProduct; +import static kitchenpos.common.fixtures.Fixtures.product; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; From 90ef030d0d192cc5753d14d36bef31ae7158972d Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 17 Feb 2025 22:42:43 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor(Menu):=20=EB=A9=94=EB=89=B4,=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EA=B7=B8=EB=A3=B9=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/MenuGroupService.java | 6 ++-- .../{ => menu}/application/MenuService.java | 18 ++++++------ .../kitchenpos/{ => menu}/domain/Menu.java | 2 +- .../{ => menu}/domain/MenuGroup.java | 2 +- .../domain/MenuGroupRepository.java | 2 +- .../{ => menu}/domain/MenuProduct.java | 3 +- .../{ => menu}/domain/MenuRepository.java | 2 +- .../persistence}/JpaMenuGroupRepository.java | 4 ++- .../infra/persistence}/JpaMenuRepository.java | 4 ++- .../ui/MenuGroupRestController.java | 6 ++-- .../{ => menu}/ui/MenuRestController.java | 6 ++-- .../InMemoryMenuGroupRepository.java | 6 ++-- .../application/InMemoryMenuRepository.java | 6 ++-- .../application/MenuGroupServiceTest.java | 8 +++--- .../application/MenuServiceTest.java | 28 ++++++++++--------- 15 files changed, 55 insertions(+), 48 deletions(-) rename src/main/java/kitchenpos/{ => menu}/application/MenuGroupService.java (88%) rename src/main/java/kitchenpos/{ => menu}/application/MenuService.java (92%) rename src/main/java/kitchenpos/{ => menu}/domain/Menu.java (98%) rename src/main/java/kitchenpos/{ => menu}/domain/MenuGroup.java (95%) rename src/main/java/kitchenpos/{ => menu}/domain/MenuGroupRepository.java (87%) rename src/main/java/kitchenpos/{ => menu}/domain/MenuProduct.java (95%) rename src/main/java/kitchenpos/{ => menu}/domain/MenuRepository.java (90%) rename src/main/java/kitchenpos/{domain => menu/infra/persistence}/JpaMenuGroupRepository.java (58%) rename src/main/java/kitchenpos/{domain => menu/infra/persistence}/JpaMenuRepository.java (79%) rename src/main/java/kitchenpos/{ => menu}/ui/MenuGroupRestController.java (90%) rename src/main/java/kitchenpos/{ => menu}/ui/MenuRestController.java (94%) rename src/test/java/kitchenpos/{ => menu}/application/InMemoryMenuGroupRepository.java (84%) rename src/test/java/kitchenpos/{ => menu}/application/InMemoryMenuRepository.java (90%) rename src/test/java/kitchenpos/{ => menu}/application/MenuGroupServiceTest.java (91%) rename src/test/java/kitchenpos/{ => menu}/application/MenuServiceTest.java (92%) diff --git a/src/main/java/kitchenpos/application/MenuGroupService.java b/src/main/java/kitchenpos/menu/application/MenuGroupService.java similarity index 88% rename from src/main/java/kitchenpos/application/MenuGroupService.java rename to src/main/java/kitchenpos/menu/application/MenuGroupService.java index 84add81f5..ce7c3ddab 100644 --- a/src/main/java/kitchenpos/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menu/application/MenuGroupService.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menu.application; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; +import kitchenpos.menu.domain.MenuGroup; +import kitchenpos.menu.domain.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/application/MenuService.java b/src/main/java/kitchenpos/menu/application/MenuService.java similarity index 92% rename from src/main/java/kitchenpos/application/MenuService.java rename to src/main/java/kitchenpos/menu/application/MenuService.java index 7bd0401ff..a53a22e39 100644 --- a/src/main/java/kitchenpos/application/MenuService.java +++ b/src/main/java/kitchenpos/menu/application/MenuService.java @@ -1,13 +1,13 @@ -package kitchenpos.application; +package kitchenpos.menu.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuGroup; +import kitchenpos.menu.domain.MenuGroupRepository; +import kitchenpos.menu.domain.MenuProduct; +import kitchenpos.menu.domain.MenuRepository; +import kitchenpos.product.domain.Product; +import kitchenpos.product.domain.ProductRepository; +import kitchenpos.common.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/domain/Menu.java b/src/main/java/kitchenpos/menu/domain/Menu.java similarity index 98% rename from src/main/java/kitchenpos/domain/Menu.java rename to src/main/java/kitchenpos/menu/domain/Menu.java index 7803bde26..d4044e54a 100644 --- a/src/main/java/kitchenpos/domain/Menu.java +++ b/src/main/java/kitchenpos/menu/domain/Menu.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menu.domain; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; diff --git a/src/main/java/kitchenpos/domain/MenuGroup.java b/src/main/java/kitchenpos/menu/domain/MenuGroup.java similarity index 95% rename from src/main/java/kitchenpos/domain/MenuGroup.java rename to src/main/java/kitchenpos/menu/domain/MenuGroup.java index c7cd3c83d..a18c9b10d 100644 --- a/src/main/java/kitchenpos/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menu/domain/MenuGroup.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menu.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menu/domain/MenuGroupRepository.java similarity index 87% rename from src/main/java/kitchenpos/domain/MenuGroupRepository.java rename to src/main/java/kitchenpos/menu/domain/MenuGroupRepository.java index b5acec2f2..02bdfce93 100644 --- a/src/main/java/kitchenpos/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/domain/MenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menu.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/MenuProduct.java b/src/main/java/kitchenpos/menu/domain/MenuProduct.java similarity index 95% rename from src/main/java/kitchenpos/domain/MenuProduct.java rename to src/main/java/kitchenpos/menu/domain/MenuProduct.java index 19026056a..1d96b3e9d 100644 --- a/src/main/java/kitchenpos/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menu/domain/MenuProduct.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menu.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,6 +10,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.Transient; +import kitchenpos.product.domain.Product; import java.util.UUID; diff --git a/src/main/java/kitchenpos/domain/MenuRepository.java b/src/main/java/kitchenpos/menu/domain/MenuRepository.java similarity index 90% rename from src/main/java/kitchenpos/domain/MenuRepository.java rename to src/main/java/kitchenpos/menu/domain/MenuRepository.java index 6bd825029..8c1277889 100644 --- a/src/main/java/kitchenpos/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menu/domain/MenuRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menu.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java similarity index 58% rename from src/main/java/kitchenpos/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java index 9ee56b2b3..f2d37c149 100644 --- a/src/main/java/kitchenpos/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuGroupRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.domain; +package kitchenpos.menu.infra.persistence; +import kitchenpos.menu.domain.MenuGroup; +import kitchenpos.menu.domain.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java similarity index 79% rename from src/main/java/kitchenpos/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java index 2a8fa4fd2..b363dc54e 100644 --- a/src/main/java/kitchenpos/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menu/infra/persistence/JpaMenuRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.domain; +package kitchenpos.menu.infra.persistence; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/kitchenpos/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java similarity index 90% rename from src/main/java/kitchenpos/ui/MenuGroupRestController.java rename to src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java index 532cdb625..404f15cb0 100644 --- a/src/main/java/kitchenpos/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuGroupRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.menu.ui; -import kitchenpos.application.MenuGroupService; -import kitchenpos.domain.MenuGroup; +import kitchenpos.menu.application.MenuGroupService; +import kitchenpos.menu.domain.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/kitchenpos/ui/MenuRestController.java b/src/main/java/kitchenpos/menu/ui/MenuRestController.java similarity index 94% rename from src/main/java/kitchenpos/ui/MenuRestController.java rename to src/main/java/kitchenpos/menu/ui/MenuRestController.java index 999bf13b3..62d0408b8 100644 --- a/src/main/java/kitchenpos/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menu/ui/MenuRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.menu.ui; -import kitchenpos.application.MenuService; -import kitchenpos.domain.Menu; +import kitchenpos.menu.application.MenuService; +import kitchenpos.menu.domain.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menu/application/InMemoryMenuGroupRepository.java similarity index 84% rename from src/test/java/kitchenpos/application/InMemoryMenuGroupRepository.java rename to src/test/java/kitchenpos/menu/application/InMemoryMenuGroupRepository.java index 7e566087f..1c5f75f77 100644 --- a/src/test/java/kitchenpos/application/InMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menu/application/InMemoryMenuGroupRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menu.application; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; +import kitchenpos.menu.domain.MenuGroup; +import kitchenpos.menu.domain.MenuGroupRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menu/application/InMemoryMenuRepository.java similarity index 90% rename from src/test/java/kitchenpos/application/InMemoryMenuRepository.java rename to src/test/java/kitchenpos/menu/application/InMemoryMenuRepository.java index deaab0bf5..755978429 100644 --- a/src/test/java/kitchenpos/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menu/application/InMemoryMenuRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menu.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuRepository; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java similarity index 91% rename from src/test/java/kitchenpos/application/MenuGroupServiceTest.java rename to src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java index 7a9770860..7dc69a104 100644 --- a/src/test/java/kitchenpos/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuGroupServiceTest.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menu.application; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; +import kitchenpos.menu.domain.MenuGroup; +import kitchenpos.menu.domain.MenuGroupRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,7 +10,7 @@ import java.util.List; -import static kitchenpos.Fixtures.menuGroup; +import static kitchenpos.common.fixtures.Fixtures.menuGroup; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; diff --git a/src/test/java/kitchenpos/application/MenuServiceTest.java b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java similarity index 92% rename from src/test/java/kitchenpos/application/MenuServiceTest.java rename to src/test/java/kitchenpos/menu/application/MenuServiceTest.java index 4a848e42b..3e471f20b 100644 --- a/src/test/java/kitchenpos/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menu/application/MenuServiceTest.java @@ -1,12 +1,14 @@ -package kitchenpos.application; +package kitchenpos.menu.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroupRepository; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; +import kitchenpos.common.infra.external.FakePurgomalumClient; +import kitchenpos.product.application.InMemoryProductRepository; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuGroupRepository; +import kitchenpos.menu.domain.MenuProduct; +import kitchenpos.menu.domain.MenuRepository; +import kitchenpos.product.domain.Product; +import kitchenpos.product.domain.ProductRepository; +import kitchenpos.common.infra.PurgomalumClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,11 +25,11 @@ import java.util.NoSuchElementException; import java.util.UUID; -import static kitchenpos.Fixtures.INVALID_ID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuGroup; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.product; +import static kitchenpos.common.fixtures.Fixtures.INVALID_ID; +import static kitchenpos.common.fixtures.Fixtures.menu; +import static kitchenpos.common.fixtures.Fixtures.menuGroup; +import static kitchenpos.common.fixtures.Fixtures.menuProduct; +import static kitchenpos.common.fixtures.Fixtures.product; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; From 283031885e38d14580ae89b32744f6b330929581 Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 17 Feb 2025 22:44:11 +0900 Subject: [PATCH 03/12] =?UTF-8?q?refactor(Order):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/DefaultKitchenridersClient.java | 13 -------- .../kitchenpos/infra/KitchenridersClient.java | 8 ----- .../{ => order}/application/OrderService.java | 22 ++++++------- .../kitchenpos/{ => order}/domain/Order.java | 3 +- .../{ => order}/domain/OrderLineItem.java | 3 +- .../{ => order}/domain/OrderRepository.java | 4 ++- .../{ => order}/domain/OrderStatus.java | 2 +- .../{ => order}/domain/OrderType.java | 2 +- .../persistence}/JpaOrderRepository.java | 4 ++- .../{ => order}/ui/OrderRestController.java | 6 ++-- .../application/InMemoryOrderRepository.java | 10 +++--- .../application/OrderServiceTest.java | 33 ++++++++++--------- .../external/FakeKitchenridersClient.java | 31 +++++++++++++++++ 13 files changed, 80 insertions(+), 61 deletions(-) delete mode 100644 src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java delete mode 100644 src/main/java/kitchenpos/infra/KitchenridersClient.java rename src/main/java/kitchenpos/{ => order}/application/OrderService.java (93%) rename src/main/java/kitchenpos/{ => order}/domain/Order.java (97%) rename src/main/java/kitchenpos/{ => order}/domain/OrderLineItem.java (96%) rename src/main/java/kitchenpos/{ => order}/domain/OrderRepository.java (78%) rename src/main/java/kitchenpos/{ => order}/domain/OrderStatus.java (73%) rename src/main/java/kitchenpos/{ => order}/domain/OrderType.java (63%) rename src/main/java/kitchenpos/{domain => order/infra/persistence}/JpaOrderRepository.java (58%) rename src/main/java/kitchenpos/{ => order}/ui/OrderRestController.java (94%) rename src/test/java/kitchenpos/{ => order}/application/InMemoryOrderRepository.java (81%) rename src/test/java/kitchenpos/{ => order}/application/OrderServiceTest.java (95%) create mode 100644 src/test/java/kitchenpos/order/infra/external/FakeKitchenridersClient.java diff --git a/src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java deleted file mode 100644 index 7ad5d36b9..000000000 --- a/src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java +++ /dev/null @@ -1,13 +0,0 @@ -package kitchenpos.infra; - -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.UUID; - -@Component -public class DefaultKitchenridersClient implements KitchenridersClient { - @Override - public void requestDelivery(final UUID orderId, final BigDecimal amount, final String deliveryAddress) { - } -} diff --git a/src/main/java/kitchenpos/infra/KitchenridersClient.java b/src/main/java/kitchenpos/infra/KitchenridersClient.java deleted file mode 100644 index 2a296dfb0..000000000 --- a/src/main/java/kitchenpos/infra/KitchenridersClient.java +++ /dev/null @@ -1,8 +0,0 @@ -package kitchenpos.infra; - -import java.math.BigDecimal; -import java.util.UUID; - -public interface KitchenridersClient { - void requestDelivery(UUID orderId, BigDecimal amount, String deliveryAddress); -} diff --git a/src/main/java/kitchenpos/application/OrderService.java b/src/main/java/kitchenpos/order/application/OrderService.java similarity index 93% rename from src/main/java/kitchenpos/application/OrderService.java rename to src/main/java/kitchenpos/order/application/OrderService.java index 6dbe53307..5a9767e00 100644 --- a/src/main/java/kitchenpos/application/OrderService.java +++ b/src/main/java/kitchenpos/order/application/OrderService.java @@ -1,15 +1,15 @@ -package kitchenpos.application; +package kitchenpos.order.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; -import kitchenpos.domain.OrderType; -import kitchenpos.infra.KitchenridersClient; +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuRepository; +import kitchenpos.order.domain.Order; +import kitchenpos.order.domain.OrderLineItem; +import kitchenpos.order.domain.OrderRepository; +import kitchenpos.order.domain.OrderStatus; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.ordertable.domain.OrderTableRepository; +import kitchenpos.order.domain.OrderType; +import kitchenpos.order.infra.external.KitchenridersClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/domain/Order.java b/src/main/java/kitchenpos/order/domain/Order.java similarity index 97% rename from src/main/java/kitchenpos/domain/Order.java rename to src/main/java/kitchenpos/order/domain/Order.java index b7d04ea95..f9a4686dc 100644 --- a/src/main/java/kitchenpos/domain/Order.java +++ b/src/main/java/kitchenpos/order/domain/Order.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.order.domain; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -12,6 +12,7 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.persistence.Transient; +import kitchenpos.ordertable.domain.OrderTable; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/kitchenpos/domain/OrderLineItem.java b/src/main/java/kitchenpos/order/domain/OrderLineItem.java similarity index 96% rename from src/main/java/kitchenpos/domain/OrderLineItem.java rename to src/main/java/kitchenpos/order/domain/OrderLineItem.java index 6a660b9c8..59eb3cb59 100644 --- a/src/main/java/kitchenpos/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/order/domain/OrderLineItem.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.order.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,6 +10,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.Transient; +import kitchenpos.menu.domain.Menu; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/main/java/kitchenpos/domain/OrderRepository.java b/src/main/java/kitchenpos/order/domain/OrderRepository.java similarity index 78% rename from src/main/java/kitchenpos/domain/OrderRepository.java rename to src/main/java/kitchenpos/order/domain/OrderRepository.java index 0e5780390..4a92c9923 100644 --- a/src/main/java/kitchenpos/domain/OrderRepository.java +++ b/src/main/java/kitchenpos/order/domain/OrderRepository.java @@ -1,4 +1,6 @@ -package kitchenpos.domain; +package kitchenpos.order.domain; + +import kitchenpos.ordertable.domain.OrderTable; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/OrderStatus.java b/src/main/java/kitchenpos/order/domain/OrderStatus.java similarity index 73% rename from src/main/java/kitchenpos/domain/OrderStatus.java rename to src/main/java/kitchenpos/order/domain/OrderStatus.java index c738c8e1e..311d18f55 100644 --- a/src/main/java/kitchenpos/domain/OrderStatus.java +++ b/src/main/java/kitchenpos/order/domain/OrderStatus.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.order.domain; public enum OrderStatus { WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED diff --git a/src/main/java/kitchenpos/domain/OrderType.java b/src/main/java/kitchenpos/order/domain/OrderType.java similarity index 63% rename from src/main/java/kitchenpos/domain/OrderType.java rename to src/main/java/kitchenpos/order/domain/OrderType.java index 9548224bb..653f4baeb 100644 --- a/src/main/java/kitchenpos/domain/OrderType.java +++ b/src/main/java/kitchenpos/order/domain/OrderType.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.order.domain; public enum OrderType { DELIVERY, TAKEOUT, EAT_IN diff --git a/src/main/java/kitchenpos/domain/JpaOrderRepository.java b/src/main/java/kitchenpos/order/infra/persistence/JpaOrderRepository.java similarity index 58% rename from src/main/java/kitchenpos/domain/JpaOrderRepository.java rename to src/main/java/kitchenpos/order/infra/persistence/JpaOrderRepository.java index be5e3e7de..c991d542e 100644 --- a/src/main/java/kitchenpos/domain/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/order/infra/persistence/JpaOrderRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.domain; +package kitchenpos.order.infra.persistence; +import kitchenpos.order.domain.Order; +import kitchenpos.order.domain.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/ui/OrderRestController.java b/src/main/java/kitchenpos/order/ui/OrderRestController.java similarity index 94% rename from src/main/java/kitchenpos/ui/OrderRestController.java rename to src/main/java/kitchenpos/order/ui/OrderRestController.java index b430f6a28..3a721fc94 100644 --- a/src/main/java/kitchenpos/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/order/ui/OrderRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.order.ui; -import kitchenpos.application.OrderService; -import kitchenpos.domain.Order; +import kitchenpos.order.application.OrderService; +import kitchenpos.order.domain.Order; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/application/InMemoryOrderRepository.java b/src/test/java/kitchenpos/order/application/InMemoryOrderRepository.java similarity index 81% rename from src/test/java/kitchenpos/application/InMemoryOrderRepository.java rename to src/test/java/kitchenpos/order/application/InMemoryOrderRepository.java index 434c9c872..b75fd34e5 100644 --- a/src/test/java/kitchenpos/application/InMemoryOrderRepository.java +++ b/src/test/java/kitchenpos/order/application/InMemoryOrderRepository.java @@ -1,9 +1,9 @@ -package kitchenpos.application; +package kitchenpos.order.application; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; +import kitchenpos.order.domain.Order; +import kitchenpos.order.domain.OrderRepository; +import kitchenpos.order.domain.OrderStatus; +import kitchenpos.ordertable.domain.OrderTable; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/OrderServiceTest.java b/src/test/java/kitchenpos/order/application/OrderServiceTest.java similarity index 95% rename from src/test/java/kitchenpos/application/OrderServiceTest.java rename to src/test/java/kitchenpos/order/application/OrderServiceTest.java index f386f3d93..7d3bf73a5 100644 --- a/src/test/java/kitchenpos/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/order/application/OrderServiceTest.java @@ -1,13 +1,16 @@ -package kitchenpos.application; - -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; -import kitchenpos.domain.OrderType; +package kitchenpos.order.application; + +import kitchenpos.order.infra.external.FakeKitchenridersClient; +import kitchenpos.ordertable.application.InMemoryOrderTableRepository; +import kitchenpos.menu.application.InMemoryMenuRepository; +import kitchenpos.menu.domain.MenuRepository; +import kitchenpos.order.domain.Order; +import kitchenpos.order.domain.OrderLineItem; +import kitchenpos.order.domain.OrderRepository; +import kitchenpos.order.domain.OrderStatus; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.ordertable.domain.OrderTableRepository; +import kitchenpos.order.domain.OrderType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,11 +29,11 @@ import java.util.Random; import java.util.UUID; -import static kitchenpos.Fixtures.INVALID_ID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; +import static kitchenpos.common.fixtures.Fixtures.INVALID_ID; +import static kitchenpos.common.fixtures.Fixtures.menu; +import static kitchenpos.common.fixtures.Fixtures.menuProduct; +import static kitchenpos.common.fixtures.Fixtures.order; +import static kitchenpos.common.fixtures.Fixtures.orderTable; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; diff --git a/src/test/java/kitchenpos/order/infra/external/FakeKitchenridersClient.java b/src/test/java/kitchenpos/order/infra/external/FakeKitchenridersClient.java new file mode 100644 index 000000000..bff290a3c --- /dev/null +++ b/src/test/java/kitchenpos/order/infra/external/FakeKitchenridersClient.java @@ -0,0 +1,31 @@ +package kitchenpos.order.infra.external; + +import kitchenpos.order.infra.external.KitchenridersClient; + +import java.math.BigDecimal; +import java.util.UUID; + +public class FakeKitchenridersClient implements KitchenridersClient { + private UUID orderId; + private BigDecimal amount; + private String deliveryAddress; + + @Override + public void requestDelivery(final UUID orderId, final BigDecimal amount, final String deliveryAddress) { + this.orderId = orderId; + this.amount = amount; + this.deliveryAddress = deliveryAddress; + } + + public UUID getOrderId() { + return orderId; + } + + public BigDecimal getAmount() { + return amount; + } + + public String getDeliveryAddress() { + return deliveryAddress; + } +} From 72560d83908c341cda29fc3661cd3cef351a58dd Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 17 Feb 2025 22:44:54 +0900 Subject: [PATCH 04/12] =?UTF-8?q?=08refactor(OrderTable):=20=EB=A7=A4?= =?UTF-8?q?=EC=9E=A5=20=EB=82=B4=20=EC=8B=9D=EC=82=AC=EC=9D=B8=20=EC=A3=BC?= =?UTF-8?q?=EB=AC=B8=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/OrderTableService.java | 10 +++++----- .../{ => ordertable}/domain/OrderTable.java | 2 +- .../domain/OrderTableRepository.java | 2 +- .../persistence}/JpaOrderTableRepository.java | 4 +++- .../ui/OrderTableRestController.java | 6 +++--- .../application/InMemoryOrderTableRepository.java | 6 +++--- .../application/OrderTableServiceTest.java | 15 ++++++++------- 7 files changed, 24 insertions(+), 21 deletions(-) rename src/main/java/kitchenpos/{ => ordertable}/application/OrderTableService.java (91%) rename src/main/java/kitchenpos/{ => ordertable}/domain/OrderTable.java (96%) rename src/main/java/kitchenpos/{ => ordertable}/domain/OrderTableRepository.java (86%) rename src/main/java/kitchenpos/{domain => ordertable/infra/persistence}/JpaOrderTableRepository.java (55%) rename src/main/java/kitchenpos/{ => ordertable}/ui/OrderTableRestController.java (93%) rename src/test/java/kitchenpos/{ => ordertable}/application/InMemoryOrderTableRepository.java (82%) rename src/test/java/kitchenpos/{ => ordertable}/application/OrderTableServiceTest.java (92%) diff --git a/src/main/java/kitchenpos/application/OrderTableService.java b/src/main/java/kitchenpos/ordertable/application/OrderTableService.java similarity index 91% rename from src/main/java/kitchenpos/application/OrderTableService.java rename to src/main/java/kitchenpos/ordertable/application/OrderTableService.java index 9f0541e06..6e2318284 100644 --- a/src/main/java/kitchenpos/application/OrderTableService.java +++ b/src/main/java/kitchenpos/ordertable/application/OrderTableService.java @@ -1,9 +1,9 @@ -package kitchenpos.application; +package kitchenpos.ordertable.application; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; +import kitchenpos.order.domain.OrderRepository; +import kitchenpos.order.domain.OrderStatus; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.ordertable.domain.OrderTableRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/domain/OrderTable.java b/src/main/java/kitchenpos/ordertable/domain/OrderTable.java similarity index 96% rename from src/main/java/kitchenpos/domain/OrderTable.java rename to src/main/java/kitchenpos/ordertable/domain/OrderTable.java index 444eca042..ec195fa10 100644 --- a/src/main/java/kitchenpos/domain/OrderTable.java +++ b/src/main/java/kitchenpos/ordertable/domain/OrderTable.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.ordertable.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/domain/OrderTableRepository.java b/src/main/java/kitchenpos/ordertable/domain/OrderTableRepository.java similarity index 86% rename from src/main/java/kitchenpos/domain/OrderTableRepository.java rename to src/main/java/kitchenpos/ordertable/domain/OrderTableRepository.java index 246852f95..667662037 100644 --- a/src/main/java/kitchenpos/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/ordertable/domain/OrderTableRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.ordertable.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/JpaOrderTableRepository.java b/src/main/java/kitchenpos/ordertable/infra/persistence/JpaOrderTableRepository.java similarity index 55% rename from src/main/java/kitchenpos/domain/JpaOrderTableRepository.java rename to src/main/java/kitchenpos/ordertable/infra/persistence/JpaOrderTableRepository.java index 4de7441cc..fea24dda8 100644 --- a/src/main/java/kitchenpos/domain/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/ordertable/infra/persistence/JpaOrderTableRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.domain; +package kitchenpos.ordertable.infra.persistence; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.ordertable.domain.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/ui/OrderTableRestController.java b/src/main/java/kitchenpos/ordertable/ui/OrderTableRestController.java similarity index 93% rename from src/main/java/kitchenpos/ui/OrderTableRestController.java rename to src/main/java/kitchenpos/ordertable/ui/OrderTableRestController.java index dcdbd7f5a..58d6ebba5 100644 --- a/src/main/java/kitchenpos/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/ordertable/ui/OrderTableRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.ordertable.ui; -import kitchenpos.application.OrderTableService; -import kitchenpos.domain.OrderTable; +import kitchenpos.ordertable.application.OrderTableService; +import kitchenpos.ordertable.domain.OrderTable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/application/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/ordertable/application/InMemoryOrderTableRepository.java similarity index 82% rename from src/test/java/kitchenpos/application/InMemoryOrderTableRepository.java rename to src/test/java/kitchenpos/ordertable/application/InMemoryOrderTableRepository.java index 13e7765c4..658c5d682 100644 --- a/src/test/java/kitchenpos/application/InMemoryOrderTableRepository.java +++ b/src/test/java/kitchenpos/ordertable/application/InMemoryOrderTableRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.ordertable.application; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.ordertable.domain.OrderTableRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/ordertable/application/OrderTableServiceTest.java similarity index 92% rename from src/test/java/kitchenpos/application/OrderTableServiceTest.java rename to src/test/java/kitchenpos/ordertable/application/OrderTableServiceTest.java index 75ff282e7..d26868ce1 100644 --- a/src/test/java/kitchenpos/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/ordertable/application/OrderTableServiceTest.java @@ -1,9 +1,10 @@ -package kitchenpos.application; +package kitchenpos.ordertable.application; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; +import kitchenpos.order.application.InMemoryOrderRepository; +import kitchenpos.order.domain.OrderRepository; +import kitchenpos.order.domain.OrderStatus; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.ordertable.domain.OrderTableRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,8 +15,8 @@ import java.util.List; import java.util.UUID; -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; +import static kitchenpos.common.fixtures.Fixtures.order; +import static kitchenpos.common.fixtures.Fixtures.orderTable; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; From 7d5450d747233234698e563589d3a770ddf233ea Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 17 Feb 2025 22:45:29 +0900 Subject: [PATCH 05/12] =?UTF-8?q?refactor:=20=EC=99=B8=EB=B6=80=20Client?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/DefaultPurgomalumClient.java | 2 +- .../{ => common}/infra/PurgomalumClient.java | 2 +- .../external/DefaultKitchenridersClient.java | 13 ++++++++ .../infra/external/KitchenridersClient.java | 8 +++++ .../application/FakeKitchenridersClient.java | 31 ------------------- .../infra/external}/FakePurgomalumClient.java | 4 +-- 6 files changed, 25 insertions(+), 35 deletions(-) rename src/main/java/kitchenpos/{ => common}/infra/DefaultPurgomalumClient.java (96%) rename src/main/java/kitchenpos/{ => common}/infra/PurgomalumClient.java (71%) create mode 100644 src/main/java/kitchenpos/order/infra/external/DefaultKitchenridersClient.java create mode 100644 src/main/java/kitchenpos/order/infra/external/KitchenridersClient.java delete mode 100644 src/test/java/kitchenpos/application/FakeKitchenridersClient.java rename src/test/java/kitchenpos/{application => common/infra/external}/FakePurgomalumClient.java (82%) diff --git a/src/main/java/kitchenpos/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/DefaultPurgomalumClient.java similarity index 96% rename from src/main/java/kitchenpos/infra/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/common/infra/DefaultPurgomalumClient.java index 4ad99bc6b..374c7b642 100644 --- a/src/main/java/kitchenpos/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/DefaultPurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.infra; +package kitchenpos.common.infra; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; diff --git a/src/main/java/kitchenpos/infra/PurgomalumClient.java b/src/main/java/kitchenpos/common/infra/PurgomalumClient.java similarity index 71% rename from src/main/java/kitchenpos/infra/PurgomalumClient.java rename to src/main/java/kitchenpos/common/infra/PurgomalumClient.java index e5c449b80..6f9cb9938 100644 --- a/src/main/java/kitchenpos/infra/PurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.infra; +package kitchenpos.common.infra; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/main/java/kitchenpos/order/infra/external/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/order/infra/external/DefaultKitchenridersClient.java new file mode 100644 index 000000000..1d374957c --- /dev/null +++ b/src/main/java/kitchenpos/order/infra/external/DefaultKitchenridersClient.java @@ -0,0 +1,13 @@ +package kitchenpos.order.infra.external; + +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.UUID; + +@Component +public class DefaultKitchenridersClient implements KitchenridersClient { + @Override + public void requestDelivery(final UUID orderId, final BigDecimal amount, final String deliveryAddress) { + } +} diff --git a/src/main/java/kitchenpos/order/infra/external/KitchenridersClient.java b/src/main/java/kitchenpos/order/infra/external/KitchenridersClient.java new file mode 100644 index 000000000..9cb949598 --- /dev/null +++ b/src/main/java/kitchenpos/order/infra/external/KitchenridersClient.java @@ -0,0 +1,8 @@ +package kitchenpos.order.infra.external; + +import java.math.BigDecimal; +import java.util.UUID; + +public interface KitchenridersClient { + void requestDelivery(UUID orderId, BigDecimal amount, String deliveryAddress); +} diff --git a/src/test/java/kitchenpos/application/FakeKitchenridersClient.java b/src/test/java/kitchenpos/application/FakeKitchenridersClient.java deleted file mode 100644 index 57747eaa9..000000000 --- a/src/test/java/kitchenpos/application/FakeKitchenridersClient.java +++ /dev/null @@ -1,31 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.infra.KitchenridersClient; - -import java.math.BigDecimal; -import java.util.UUID; - -public class FakeKitchenridersClient implements KitchenridersClient { - private UUID orderId; - private BigDecimal amount; - private String deliveryAddress; - - @Override - public void requestDelivery(final UUID orderId, final BigDecimal amount, final String deliveryAddress) { - this.orderId = orderId; - this.amount = amount; - this.deliveryAddress = deliveryAddress; - } - - public UUID getOrderId() { - return orderId; - } - - public BigDecimal getAmount() { - return amount; - } - - public String getDeliveryAddress() { - return deliveryAddress; - } -} diff --git a/src/test/java/kitchenpos/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java similarity index 82% rename from src/test/java/kitchenpos/application/FakePurgomalumClient.java rename to src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java index abe38ce35..0302fb698 100644 --- a/src/test/java/kitchenpos/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/common/infra/external/FakePurgomalumClient.java @@ -1,6 +1,6 @@ -package kitchenpos.application; +package kitchenpos.common.infra.external; -import kitchenpos.infra.PurgomalumClient; +import kitchenpos.common.infra.PurgomalumClient; import java.util.Arrays; import java.util.List; From 4fa6c0495e43ab1a69b87588713840da2c527c4d Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 17 Feb 2025 22:45:42 +0900 Subject: [PATCH 06/12] =?UTF-8?q?chore:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20fixtures=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => common/fixtures}/Fixtures.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) rename src/test/java/kitchenpos/{ => common/fixtures}/Fixtures.java (90%) diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/common/fixtures/Fixtures.java similarity index 90% rename from src/test/java/kitchenpos/Fixtures.java rename to src/test/java/kitchenpos/common/fixtures/Fixtures.java index f1cd5992e..e7dcad4e8 100644 --- a/src/test/java/kitchenpos/Fixtures.java +++ b/src/test/java/kitchenpos/common/fixtures/Fixtures.java @@ -1,14 +1,14 @@ -package kitchenpos; - -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderType; -import kitchenpos.domain.Product; +package kitchenpos.common.fixtures; + +import kitchenpos.menu.domain.Menu; +import kitchenpos.menu.domain.MenuGroup; +import kitchenpos.menu.domain.MenuProduct; +import kitchenpos.order.domain.Order; +import kitchenpos.order.domain.OrderLineItem; +import kitchenpos.order.domain.OrderStatus; +import kitchenpos.ordertable.domain.OrderTable; +import kitchenpos.order.domain.OrderType; +import kitchenpos.product.domain.Product; import java.math.BigDecimal; import java.time.LocalDateTime; From 4f0d0680dbcc33f15894afdaabd2fbdbe394155e Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 24 Feb 2025 21:15:33 +0900 Subject: [PATCH 07/12] =?UTF-8?q?refactor:=20=EC=83=81=ED=92=88(Product)?= =?UTF-8?q?=EC=9D=84=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ProductService.java | 28 +-- .../domain/JpaProductRepository.java | 2 +- .../{ => products}/domain/Product.java | 2 +- .../domain/ProductRepository.java | 2 +- .../infra/DefaultPurgomalumClient.java | 2 +- .../infra/PurgomalumClient.java | 2 +- .../ui/ProductRestController.java | 6 +- .../application/ProductServiceTest.java | 131 ------------- .../kitchenpos/fixtures/ProductFixtures.java | 59 ++++++ .../application/FakePurgomalumClient.java | 6 +- .../InMemoryProductRepository.java | 6 +- .../application/ProductServiceTest.java | 178 ++++++++++++++++++ 12 files changed, 265 insertions(+), 159 deletions(-) rename src/main/java/kitchenpos/{ => products}/application/ProductService.java (76%) rename src/main/java/kitchenpos/{ => products}/domain/JpaProductRepository.java (83%) rename src/main/java/kitchenpos/{ => products}/domain/Product.java (96%) rename src/main/java/kitchenpos/{ => products}/domain/ProductRepository.java (88%) rename src/main/java/kitchenpos/{ => products}/infra/DefaultPurgomalumClient.java (96%) rename src/main/java/kitchenpos/{ => products}/infra/PurgomalumClient.java (70%) rename src/main/java/kitchenpos/{ => products}/ui/ProductRestController.java (91%) delete mode 100644 src/test/java/kitchenpos/application/ProductServiceTest.java create mode 100644 src/test/java/kitchenpos/fixtures/ProductFixtures.java rename src/test/java/kitchenpos/{ => products}/application/FakePurgomalumClient.java (69%) rename src/test/java/kitchenpos/{ => products}/application/InMemoryProductRepository.java (86%) create mode 100644 src/test/java/kitchenpos/products/application/ProductServiceTest.java diff --git a/src/main/java/kitchenpos/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java similarity index 76% rename from src/main/java/kitchenpos/application/ProductService.java rename to src/main/java/kitchenpos/products/application/ProductService.java index dc44b087b..90cf836d9 100644 --- a/src/main/java/kitchenpos/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -1,11 +1,11 @@ -package kitchenpos.application; +package kitchenpos.products.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,9 +22,9 @@ public class ProductService { private final PurgomalumClient purgomalumClient; public ProductService( - final ProductRepository productRepository, - final MenuRepository menuRepository, - final PurgomalumClient purgomalumClient + final ProductRepository productRepository, + final MenuRepository menuRepository, + final PurgomalumClient purgomalumClient ) { this.productRepository = productRepository; this.menuRepository = menuRepository; @@ -55,16 +55,16 @@ public Product changePrice(final UUID productId, final Product request) { throw new IllegalArgumentException(); } final Product product = productRepository.findById(productId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); product.setPrice(price); final List menus = menuRepository.findAllByProductId(productId); for (final Menu menu : menus) { BigDecimal sum = BigDecimal.ZERO; for (final MenuProduct menuProduct : menu.getMenuProducts()) { sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + menuProduct.getProduct() + .getPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) ); } if (menu.getPrice().compareTo(sum) > 0) { diff --git a/src/main/java/kitchenpos/domain/JpaProductRepository.java b/src/main/java/kitchenpos/products/domain/JpaProductRepository.java similarity index 83% rename from src/main/java/kitchenpos/domain/JpaProductRepository.java rename to src/main/java/kitchenpos/products/domain/JpaProductRepository.java index 1f81d0d15..90b069779 100644 --- a/src/main/java/kitchenpos/domain/JpaProductRepository.java +++ b/src/main/java/kitchenpos/products/domain/JpaProductRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.products.domain; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/kitchenpos/domain/Product.java b/src/main/java/kitchenpos/products/domain/Product.java similarity index 96% rename from src/main/java/kitchenpos/domain/Product.java rename to src/main/java/kitchenpos/products/domain/Product.java index e45329e6f..ee2a7dfa9 100644 --- a/src/main/java/kitchenpos/domain/Product.java +++ b/src/main/java/kitchenpos/products/domain/Product.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.products.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/domain/ProductRepository.java b/src/main/java/kitchenpos/products/domain/ProductRepository.java similarity index 88% rename from src/main/java/kitchenpos/domain/ProductRepository.java rename to src/main/java/kitchenpos/products/domain/ProductRepository.java index 51f548fb5..3637e4232 100644 --- a/src/main/java/kitchenpos/domain/ProductRepository.java +++ b/src/main/java/kitchenpos/products/domain/ProductRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.products.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java similarity index 96% rename from src/main/java/kitchenpos/infra/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java index 4ad99bc6b..87dba885c 100644 --- a/src/main/java/kitchenpos/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.infra; +package kitchenpos.products.infra; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; diff --git a/src/main/java/kitchenpos/infra/PurgomalumClient.java b/src/main/java/kitchenpos/products/infra/PurgomalumClient.java similarity index 70% rename from src/main/java/kitchenpos/infra/PurgomalumClient.java rename to src/main/java/kitchenpos/products/infra/PurgomalumClient.java index e5c449b80..4002a2bb8 100644 --- a/src/main/java/kitchenpos/infra/PurgomalumClient.java +++ b/src/main/java/kitchenpos/products/infra/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.infra; +package kitchenpos.products.infra; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/main/java/kitchenpos/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java similarity index 91% rename from src/main/java/kitchenpos/ui/ProductRestController.java rename to src/main/java/kitchenpos/products/ui/ProductRestController.java index ec700fd38..c71c795a4 100644 --- a/src/main/java/kitchenpos/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.products.ui; -import kitchenpos.application.ProductService; -import kitchenpos.domain.Product; +import kitchenpos.products.application.ProductService; +import kitchenpos.products.domain.Product; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/test/java/kitchenpos/application/ProductServiceTest.java b/src/test/java/kitchenpos/application/ProductServiceTest.java deleted file mode 100644 index ee2287b2d..000000000 --- a/src/test/java/kitchenpos/application/ProductServiceTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; - -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.product; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -class ProductServiceTest { - private ProductRepository productRepository; - private MenuRepository menuRepository; - private PurgomalumClient purgomalumClient; - private ProductService productService; - - @BeforeEach - void setUp() { - productRepository = new InMemoryProductRepository(); - menuRepository = new InMemoryMenuRepository(); - purgomalumClient = new FakePurgomalumClient(); - productService = new ProductService(productRepository, menuRepository, purgomalumClient); - } - - @DisplayName("상품을 등록할 수 있다.") - @Test - void create() { - final Product expected = createProductRequest("후라이드", 16_000L); - final Product actual = productService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()) - ); - } - - @DisplayName("상품의 가격이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void create(final BigDecimal price) { - final Product expected = createProductRequest("후라이드", price); - assertThatThrownBy(() -> productService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("상품의 이름이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = {"비속어", "욕설이 포함된 이름"}) - @NullSource - @ParameterizedTest - void create(final String name) { - final Product expected = createProductRequest(name, 16_000L); - assertThatThrownBy(() -> productService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("상품의 가격을 변경할 수 있다.") - @Test - void changePrice() { - final UUID productId = productRepository.save(product("후라이드", 16_000L)).getId(); - final Product expected = changePriceRequest(15_000L); - final Product actual = productService.changePrice(productId, expected); - assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); - } - - @DisplayName("상품의 가격이 올바르지 않으면 변경할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void changePrice(final BigDecimal price) { - final UUID productId = productRepository.save(product("후라이드", 16_000L)).getId(); - final Product expected = changePriceRequest(price); - assertThatThrownBy(() -> productService.changePrice(productId, expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("상품의 가격이 변경될 때 메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 크면 메뉴가 숨겨진다.") - @Test - void changePriceInMenu() { - final Product product = productRepository.save(product("후라이드", 16_000L)); - final Menu menu = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); - productService.changePrice(product.getId(), changePriceRequest(8_000L)); - assertThat(menuRepository.findById(menu.getId()).get().isDisplayed()).isFalse(); - } - - @DisplayName("상품의 목록을 조회할 수 있다.") - @Test - void findAll() { - productRepository.save(product("후라이드", 16_000L)); - productRepository.save(product("양념치킨", 16_000L)); - final List actual = productService.findAll(); - assertThat(actual).hasSize(2); - } - - private Product createProductRequest(final String name, final long price) { - return createProductRequest(name, BigDecimal.valueOf(price)); - } - - private Product createProductRequest(final String name, final BigDecimal price) { - final Product product = new Product(); - product.setName(name); - product.setPrice(price); - return product; - } - - private Product changePriceRequest(final long price) { - return changePriceRequest(BigDecimal.valueOf(price)); - } - - private Product changePriceRequest(final BigDecimal price) { - final Product product = new Product(); - product.setPrice(price); - return product; - } -} diff --git a/src/test/java/kitchenpos/fixtures/ProductFixtures.java b/src/test/java/kitchenpos/fixtures/ProductFixtures.java new file mode 100644 index 000000000..a22b1efe1 --- /dev/null +++ b/src/test/java/kitchenpos/fixtures/ProductFixtures.java @@ -0,0 +1,59 @@ +package kitchenpos.fixtures; + +import static java.math.BigDecimal.valueOf; +import kitchenpos.products.domain.Product; + +import java.math.BigDecimal; +import java.util.UUID; + +public class ProductFixtures { + + public static final UUID 후라이드치킨_ID = UUID.randomUUID(); + public static final UUID 양념치킨_ID = UUID.randomUUID(); + + public static final String 후라이드치킨_이름 = "후라이드치킨"; + public static final String 양념치킨_이름 = "양념치킨"; + + public static final BigDecimal 후라이드치킨_가격 = valueOf(16000); + public static final BigDecimal 양념치킨_가격 = valueOf(17000); + + public static Product 후라이드치킨() { + Product product = new Product(); + product.setId(후라이드치킨_ID); + product.setName(후라이드치킨_이름); + product.setPrice(후라이드치킨_가격); + + return product; + } + + public static Product 양념치킨() { + Product product = new Product(); + product.setId(양념치킨_ID); + product.setName(양념치킨_이름); + product.setPrice(양념치킨_가격); + + return product; + } + public static Product createProduct(final String name, final BigDecimal price) { + Product product = new Product(); + product.setId(UUID.randomUUID()); + product.setName(name); + product.setPrice(price); + return product; + } + + /** + * OrderServiceTest + */ + public static Product product() { + return product("후라이드치킨", 16_000L); + } + + public static Product product(final String name, final long price) { + final Product product = new Product(); + product.setId(UUID.randomUUID()); + product.setName(name); + product.setPrice(BigDecimal.valueOf(price)); + return product; + } +} diff --git a/src/test/java/kitchenpos/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java similarity index 69% rename from src/test/java/kitchenpos/application/FakePurgomalumClient.java rename to src/test/java/kitchenpos/products/application/FakePurgomalumClient.java index abe38ce35..ee2787b22 100644 --- a/src/test/java/kitchenpos/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java @@ -1,6 +1,6 @@ -package kitchenpos.application; +package kitchenpos.products.application; -import kitchenpos.infra.PurgomalumClient; +import kitchenpos.products.infra.PurgomalumClient; import java.util.Arrays; import java.util.List; @@ -15,6 +15,6 @@ public class FakePurgomalumClient implements PurgomalumClient { @Override public boolean containsProfanity(final String text) { return profanities.stream() - .anyMatch(profanity -> text.contains(profanity)); + .anyMatch(profanity -> text.contains(profanity)); } } diff --git a/src/test/java/kitchenpos/application/InMemoryProductRepository.java b/src/test/java/kitchenpos/products/application/InMemoryProductRepository.java similarity index 86% rename from src/test/java/kitchenpos/application/InMemoryProductRepository.java rename to src/test/java/kitchenpos/products/application/InMemoryProductRepository.java index c2d198f19..b55c5ec5e 100644 --- a/src/test/java/kitchenpos/application/InMemoryProductRepository.java +++ b/src/test/java/kitchenpos/products/application/InMemoryProductRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.products.application; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java new file mode 100644 index 000000000..66dec975d --- /dev/null +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -0,0 +1,178 @@ +package kitchenpos.products.application; + +import static java.math.BigDecimal.valueOf; +import static kitchenpos.fixtures.ProductFixtures.양념치킨; +import static kitchenpos.fixtures.ProductFixtures.후라이드치킨; +import static kitchenpos.fixtures.ProductFixtures.후라이드치킨_가격; +import kitchenpos.menus.application.InMemoryMenuRepository; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.infra.PurgomalumClient; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + + +class ProductServiceTest { + + private ProductService productService; + private ProductRepository productRepository; + private MenuRepository menuRepository; + private PurgomalumClient purgomalumClient; + + @BeforeEach + void setUp() { + productRepository = new InMemoryProductRepository(); + menuRepository = new InMemoryMenuRepository(); + purgomalumClient = new FakePurgomalumClient(); + productService = new ProductService(productRepository, menuRepository, purgomalumClient); + } + + @Test + void 상품을_등록할_수_있다() { + // given + Product request = 후라이드치킨(); + + // when + Product savedProduct = productService.create(request); + + // then + assertThat(savedProduct).isNotNull(); + assertThat(savedProduct.getId()).isNotNull(); + assertThat(savedProduct.getName()).isEqualTo("후라이드치킨"); + assertThat(savedProduct.getPrice()).isEqualTo(valueOf(16000)); + } + + @Test + void 상품_가격을_입력하지_않으면_등록할_수_없다() { + // given + Product request = new Product(); + request.setName(후라이드치킨().getName()); + request.setPrice(null); + + // when & then + assertThatThrownBy(() -> productService.create(request)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 상품_가격이_0원_미만이면_등록할_수_없다() { + // given + Product request = new Product(); + request.setName(후라이드치킨().getName()); + request.setPrice(valueOf(-16000)); + + // when & then + assertThatThrownBy(() -> productService.create(request)) + .isInstanceOf(IllegalArgumentException.class); + } + + + @Test + void 상품_이름이_존재하지_않으면_등록할_수_없다() { + // given + Product request = new Product(); + request.setName(null); + request.setPrice(후라이드치킨_가격); + + // when & then + assertThatThrownBy(() -> productService.create(request)) + .isInstanceOf(IllegalArgumentException.class); + } + @Test + void 상품의_가격을_변경할_수_있다() { + // given + Product request = 후라이드치킨(); + productRepository.save(request); + + UUID productId = request.getId(); + BigDecimal 후라이드치킨_가격 = BigDecimal.valueOf(16000); + + // when + Product updateProduct = new Product(); + updateProduct.setPrice(후라이드치킨_가격); + productService.changePrice(productId, updateProduct); + + // then + Product updatedProduct = productRepository.findById(productId).orElseThrow(); + // 값만 비교 + assertThat(updatedProduct.getPrice().compareTo(후라이드치킨_가격)).isEqualTo(0); + + // scale 제거하고 비교 + assertThat(updatedProduct.getPrice().stripTrailingZeros()) + .isEqualTo(후라이드치킨_가격.stripTrailingZeros()); // stripTrailingZeros()를 사용하면 소수점이 필요 없는 경우 자동으로 정리함 + } + + @Test + void 상품_가격_변경시_가격이_null_이면_변경할_수_없다() { + // given + Product request = 후라이드치킨(); + productRepository.save(request); + + UUID productId = request.getId(); + + // when + Product updateProduct = new Product(); + updateProduct.setPrice(null); + + // then + assertThatThrownBy(() -> productService.changePrice(productId, updateProduct)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 상품_가격_변경시_가격이_0원_미만이면_변경할_수_없다() { + // given + Product request = 후라이드치킨(); + productRepository.save(request); + + UUID productId = request.getId(); + BigDecimal 후라이드치킨_가격 = BigDecimal.valueOf(-16000); + + // when + Product updateProduct = new Product(); + updateProduct.setPrice(후라이드치킨_가격); + + // then + assertThatThrownBy(() -> productService.changePrice(productId, updateProduct)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 존재하지_않은_상품_ID로_가격을_변경할_수_없다() { + // given + UUID nonExistentProductUd = UUID.randomUUID(); + BigDecimal changedPrice = BigDecimal.valueOf(16000); + + Product updateProduct = new Product(); + updateProduct.setPrice(changedPrice); + + // when & then + assertThatThrownBy(() -> productService.changePrice(nonExistentProductUd, updateProduct)) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void 등록된_상품을_전체_조회할_수_있다() { + // given + Product burger = 후라이드치킨(); + Product pizza = 양념치킨(); + + // when + productService.create(burger); + productService.create(pizza); + + // then + List products = productRepository.findAll(); + assertNotNull(products); + assertThat(products).hasSize(2); + } +} From f4c85a0381a5a437b60590fd97530ae2c8d0bdd2 Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 24 Feb 2025 21:16:26 +0900 Subject: [PATCH 08/12] =?UTF-8?q?refactor:=20=EB=A9=94=EB=89=B4(Menu)?= =?UTF-8?q?=EC=99=80=20=EB=A9=94=EB=89=B4=20=EA=B7=B8=EB=A3=B9(MenuGroup)?= =?UTF-8?q?=EB=A5=BC=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/DefaultKitchenridersClient.java | 2 +- .../infra/KitchenridersClient.java | 2 +- .../application/OrderService.java | 68 ++-- .../application/OrderTableService.java | 25 +- .../domain/JpaOrderRepository.java | 2 +- .../domain/JpaOrderTableRepository.java | 2 +- .../{ => eatinorders}/domain/Order.java | 2 +- .../domain/OrderLineItem.java | 3 +- .../domain/OrderRepository.java | 2 +- .../{ => eatinorders}/domain/OrderStatus.java | 2 +- .../{ => eatinorders}/domain/OrderTable.java | 2 +- .../domain/OrderTableRepository.java | 2 +- .../{ => eatinorders}/domain/OrderType.java | 2 +- .../eatinorders/ui/OrderRestController.java | 63 ++++ .../ui/OrderTableRestController.java | 56 +++ .../application/MenuGroupService.java | 8 +- .../{ => menus}/application/MenuService.java | 80 ++-- .../domain/JpaMenuGroupRepository.java | 2 +- .../{ => menus}/domain/JpaMenuRepository.java | 2 +- .../kitchenpos/{ => menus}/domain/Menu.java | 20 +- .../{ => menus}/domain/MenuGroup.java | 2 +- .../domain/MenuGroupRepository.java | 2 +- .../{ => menus}/domain/MenuProduct.java | 3 +- .../{ => menus}/domain/MenuRepository.java | 2 +- .../ui/MenuGroupRestController.java | 6 +- .../{ => menus}/ui/MenuRestController.java | 6 +- .../java/kitchenpos/takeoutorders/empty.txt | 0 .../application/MenuGroupServiceTest.java | 62 ---- .../application/MenuServiceTest.java | 268 -------------- .../kitchenpos/fixtures/MenuFixtures.java | 93 +++++ .../InMemoryMenuGroupRepository.java | 6 +- .../application/InMemoryMenuRepository.java | 18 +- .../application/MenuGroupServiceTest.java | 70 ++++ .../menus/application/MenuServiceTest.java | 344 ++++++++++++++++++ 34 files changed, 769 insertions(+), 460 deletions(-) rename src/main/java/kitchenpos/{ => deliveryorders}/infra/DefaultKitchenridersClient.java (88%) rename src/main/java/kitchenpos/{ => deliveryorders}/infra/KitchenridersClient.java (81%) rename src/main/java/kitchenpos/{ => eatinorders}/application/OrderService.java (73%) rename src/main/java/kitchenpos/{ => eatinorders}/application/OrderTableService.java (71%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/JpaOrderRepository.java (82%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/JpaOrderTableRepository.java (83%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/Order.java (98%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/OrderLineItem.java (95%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/OrderRepository.java (88%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/OrderStatus.java (70%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/OrderTable.java (96%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/OrderTableRepository.java (86%) rename src/main/java/kitchenpos/{ => eatinorders}/domain/OrderType.java (59%) create mode 100644 src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java create mode 100644 src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java rename src/main/java/kitchenpos/{ => menus}/application/MenuGroupService.java (79%) rename src/main/java/kitchenpos/{ => menus}/application/MenuService.java (60%) rename src/main/java/kitchenpos/{ => menus}/domain/JpaMenuGroupRepository.java (85%) rename src/main/java/kitchenpos/{ => menus}/domain/JpaMenuRepository.java (93%) rename src/main/java/kitchenpos/{ => menus}/domain/Menu.java (80%) rename src/main/java/kitchenpos/{ => menus}/domain/MenuGroup.java (95%) rename src/main/java/kitchenpos/{ => menus}/domain/MenuGroupRepository.java (87%) rename src/main/java/kitchenpos/{ => menus}/domain/MenuProduct.java (95%) rename src/main/java/kitchenpos/{ => menus}/domain/MenuRepository.java (90%) rename src/main/java/kitchenpos/{ => menus}/ui/MenuGroupRestController.java (89%) rename src/main/java/kitchenpos/{ => menus}/ui/MenuRestController.java (93%) create mode 100644 src/main/java/kitchenpos/takeoutorders/empty.txt delete mode 100644 src/test/java/kitchenpos/application/MenuGroupServiceTest.java delete mode 100644 src/test/java/kitchenpos/application/MenuServiceTest.java create mode 100644 src/test/java/kitchenpos/fixtures/MenuFixtures.java rename src/test/java/kitchenpos/{ => menus}/application/InMemoryMenuGroupRepository.java (84%) rename src/test/java/kitchenpos/{ => menus}/application/InMemoryMenuRepository.java (66%) create mode 100644 src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java create mode 100644 src/test/java/kitchenpos/menus/application/MenuServiceTest.java diff --git a/src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java b/src/main/java/kitchenpos/deliveryorders/infra/DefaultKitchenridersClient.java similarity index 88% rename from src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java rename to src/main/java/kitchenpos/deliveryorders/infra/DefaultKitchenridersClient.java index 7ad5d36b9..31d6d8cee 100644 --- a/src/main/java/kitchenpos/infra/DefaultKitchenridersClient.java +++ b/src/main/java/kitchenpos/deliveryorders/infra/DefaultKitchenridersClient.java @@ -1,4 +1,4 @@ -package kitchenpos.infra; +package kitchenpos.deliveryorders.infra; import org.springframework.stereotype.Component; diff --git a/src/main/java/kitchenpos/infra/KitchenridersClient.java b/src/main/java/kitchenpos/deliveryorders/infra/KitchenridersClient.java similarity index 81% rename from src/main/java/kitchenpos/infra/KitchenridersClient.java rename to src/main/java/kitchenpos/deliveryorders/infra/KitchenridersClient.java index 2a296dfb0..0c8278791 100644 --- a/src/main/java/kitchenpos/infra/KitchenridersClient.java +++ b/src/main/java/kitchenpos/deliveryorders/infra/KitchenridersClient.java @@ -1,4 +1,4 @@ -package kitchenpos.infra; +package kitchenpos.deliveryorders.infra; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/main/java/kitchenpos/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java similarity index 73% rename from src/main/java/kitchenpos/application/OrderService.java rename to src/main/java/kitchenpos/eatinorders/application/OrderService.java index 6dbe53307..06bdc7c4c 100644 --- a/src/main/java/kitchenpos/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -1,15 +1,15 @@ -package kitchenpos.application; +package kitchenpos.eatinorders.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; -import kitchenpos.domain.OrderType; -import kitchenpos.infra.KitchenridersClient; +import kitchenpos.deliveryorders.infra.KitchenridersClient; +import kitchenpos.eatinorders.domain.Order; +import kitchenpos.eatinorders.domain.OrderLineItem; +import kitchenpos.eatinorders.domain.OrderRepository; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.domain.OrderTableRepository; +import kitchenpos.eatinorders.domain.OrderType; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,10 +29,10 @@ public class OrderService { private final KitchenridersClient kitchenridersClient; public OrderService( - final OrderRepository orderRepository, - final MenuRepository menuRepository, - final OrderTableRepository orderTableRepository, - final KitchenridersClient kitchenridersClient + final OrderRepository orderRepository, + final MenuRepository menuRepository, + final OrderTableRepository orderTableRepository, + final KitchenridersClient kitchenridersClient ) { this.orderRepository = orderRepository; this.menuRepository = menuRepository; @@ -44,16 +44,16 @@ public OrderService( public Order create(final Order request) { final OrderType type = request.getType(); if (Objects.isNull(type)) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("주문 유형이 존재해야 합니다"); } final List orderLineItemRequests = request.getOrderLineItems(); if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("주문 항목이 존재해야 합니다."); } final List menus = menuRepository.findAllByIdIn( - orderLineItemRequests.stream() - .map(OrderLineItem::getMenuId) - .toList() + orderLineItemRequests.stream() + .map(OrderLineItem::getMenuId) + .toList() ); if (menus.size() != orderLineItemRequests.size()) { throw new IllegalArgumentException(); @@ -63,16 +63,16 @@ public Order create(final Order request) { final long quantity = orderLineItemRequest.getQuantity(); if (type != OrderType.EAT_IN) { if (quantity < 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("주문 유형이 `배달` 혹은 `테이크아웃`시 주문 수량이 0보다 커야 합니다"); } } final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { - throw new IllegalStateException(); + throw new IllegalStateException("메뉴가 표시되어야 주문이 가능합니다."); } if (menu.getPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("주문항목에 있는 가격이 메뉴에 있는 가격과 동일해야 합니다."); } final OrderLineItem orderLineItem = new OrderLineItem(); orderLineItem.setMenu(menu); @@ -88,15 +88,15 @@ public Order create(final Order request) { if (type == OrderType.DELIVERY) { final String deliveryAddress = request.getDeliveryAddress(); if (Objects.isNull(deliveryAddress) || deliveryAddress.isEmpty()) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("주문 유형이 `배달`이면 배달에 필요한 주소가 존재해야 한다."); } order.setDeliveryAddress(deliveryAddress); } if (type == OrderType.EAT_IN) { final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { - throw new IllegalStateException(); + throw new IllegalStateException("주문 유형이 `매장 내 식사`이면 가게 안에 자리가 꽉 차지 않아야 한다."); } order.setOrderTable(orderTable); } @@ -106,7 +106,7 @@ public Order create(final Order request) { @Transactional public Order accept(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.WAITING) { throw new IllegalStateException(); } @@ -114,8 +114,8 @@ public Order accept(final UUID orderId) { BigDecimal sum = BigDecimal.ZERO; for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { sum = orderLineItem.getMenu() - .getPrice() - .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); + .getPrice() + .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); } kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); } @@ -126,7 +126,7 @@ public Order accept(final UUID orderId) { @Transactional public Order serve(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.ACCEPTED) { throw new IllegalStateException(); } @@ -137,7 +137,7 @@ public Order serve(final UUID orderId) { @Transactional public Order startDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getType() != OrderType.DELIVERY) { throw new IllegalStateException(); } @@ -151,7 +151,7 @@ public Order startDelivery(final UUID orderId) { @Transactional public Order completeDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (order.getStatus() != OrderStatus.DELIVERING) { throw new IllegalStateException(); } @@ -162,7 +162,7 @@ public Order completeDelivery(final UUID orderId) { @Transactional public Order complete(final UUID orderId) { final Order order = orderRepository.findById(orderId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); final OrderType type = order.getType(); final OrderStatus status = order.getStatus(); if (type == OrderType.DELIVERY) { diff --git a/src/main/java/kitchenpos/application/OrderTableService.java b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java similarity index 71% rename from src/main/java/kitchenpos/application/OrderTableService.java rename to src/main/java/kitchenpos/eatinorders/application/OrderTableService.java index 9f0541e06..209c869d6 100644 --- a/src/main/java/kitchenpos/application/OrderTableService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java @@ -1,9 +1,10 @@ -package kitchenpos.application; +package kitchenpos.eatinorders.application; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; +import io.micrometer.common.util.StringUtils; +import kitchenpos.eatinorders.domain.OrderRepository; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.domain.OrderTableRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,8 +26,8 @@ public OrderTableService(final OrderTableRepository orderTableRepository, final @Transactional public OrderTable create(final OrderTable request) { final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); + if (StringUtils.isBlank(name)) { + throw new IllegalArgumentException("주문 테이블 이름이 존재해야 합니다."); } final OrderTable orderTable = new OrderTable(); orderTable.setId(UUID.randomUUID()); @@ -39,7 +40,7 @@ public OrderTable create(final OrderTable request) { @Transactional public OrderTable sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(() -> new NoSuchElementException("주문 테이블이 존재해야 한다.")); orderTable.setOccupied(true); return orderTable; } @@ -47,7 +48,7 @@ public OrderTable sit(final UUID orderTableId) { @Transactional public OrderTable clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(() -> new NoSuchElementException("주문 테이블이 존재해야 한다.")); if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { throw new IllegalStateException(); } @@ -60,12 +61,12 @@ public OrderTable clear(final UUID orderTableId) { public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable request) { final int numberOfGuests = request.getNumberOfGuests(); if (numberOfGuests < 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("손님 수가 0명 이상이어야 합니다."); } final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { - throw new IllegalStateException(); + throw new IllegalStateException("주문 테이블이 사용중이어야 합니다."); } orderTable.setNumberOfGuests(numberOfGuests); return orderTable; diff --git a/src/main/java/kitchenpos/domain/JpaOrderRepository.java b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java similarity index 82% rename from src/main/java/kitchenpos/domain/JpaOrderRepository.java rename to src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java index be5e3e7de..01c825c45 100644 --- a/src/main/java/kitchenpos/domain/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/kitchenpos/domain/JpaOrderTableRepository.java b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java similarity index 83% rename from src/main/java/kitchenpos/domain/JpaOrderTableRepository.java rename to src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java index 4de7441cc..84c0d3c6f 100644 --- a/src/main/java/kitchenpos/domain/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/kitchenpos/domain/Order.java b/src/main/java/kitchenpos/eatinorders/domain/Order.java similarity index 98% rename from src/main/java/kitchenpos/domain/Order.java rename to src/main/java/kitchenpos/eatinorders/domain/Order.java index b7d04ea95..4a5991301 100644 --- a/src/main/java/kitchenpos/domain/Order.java +++ b/src/main/java/kitchenpos/eatinorders/domain/Order.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; diff --git a/src/main/java/kitchenpos/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java similarity index 95% rename from src/main/java/kitchenpos/domain/OrderLineItem.java rename to src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index 6a660b9c8..a5fe38278 100644 --- a/src/main/java/kitchenpos/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,6 +10,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.Transient; +import kitchenpos.menus.domain.Menu; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/main/java/kitchenpos/domain/OrderRepository.java b/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java similarity index 88% rename from src/main/java/kitchenpos/domain/OrderRepository.java rename to src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java index 0e5780390..f98d45c15 100644 --- a/src/main/java/kitchenpos/domain/OrderRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/OrderStatus.java b/src/main/java/kitchenpos/eatinorders/domain/OrderStatus.java similarity index 70% rename from src/main/java/kitchenpos/domain/OrderStatus.java rename to src/main/java/kitchenpos/eatinorders/domain/OrderStatus.java index c738c8e1e..fe0f76c7d 100644 --- a/src/main/java/kitchenpos/domain/OrderStatus.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderStatus.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; public enum OrderStatus { WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED diff --git a/src/main/java/kitchenpos/domain/OrderTable.java b/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java similarity index 96% rename from src/main/java/kitchenpos/domain/OrderTable.java rename to src/main/java/kitchenpos/eatinorders/domain/OrderTable.java index 444eca042..bdd3dd23c 100644 --- a/src/main/java/kitchenpos/domain/OrderTable.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/domain/OrderTableRepository.java b/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java similarity index 86% rename from src/main/java/kitchenpos/domain/OrderTableRepository.java rename to src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java index 246852f95..1e9047d43 100644 --- a/src/main/java/kitchenpos/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/OrderType.java b/src/main/java/kitchenpos/eatinorders/domain/OrderType.java similarity index 59% rename from src/main/java/kitchenpos/domain/OrderType.java rename to src/main/java/kitchenpos/eatinorders/domain/OrderType.java index 9548224bb..0e3133e69 100644 --- a/src/main/java/kitchenpos/domain/OrderType.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderType.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.eatinorders.domain; public enum OrderType { DELIVERY, TAKEOUT, EAT_IN diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java new file mode 100644 index 000000000..dbb5568ad --- /dev/null +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java @@ -0,0 +1,63 @@ +package kitchenpos.eatinorders.ui; + +import kitchenpos.eatinorders.application.OrderService; +import kitchenpos.eatinorders.domain.Order; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.net.URI; +import java.util.List; +import java.util.UUID; + +@RequestMapping("/api/orders") +@RestController +public class OrderRestController { + private final OrderService orderService; + + public OrderRestController(final OrderService orderService) { + this.orderService = orderService; + } + + @PostMapping + public ResponseEntity create(@RequestBody final Order request) { + final Order response = orderService.create(request); + return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) + .body(response); + } + + @PutMapping("/{orderId}/accept") + public ResponseEntity accept(@PathVariable final UUID orderId) { + return ResponseEntity.ok(orderService.accept(orderId)); + } + + @PutMapping("/{orderId}/serve") + public ResponseEntity serve(@PathVariable final UUID orderId) { + return ResponseEntity.ok(orderService.serve(orderId)); + } + + @PutMapping("/{orderId}/start-delivery") + public ResponseEntity startDelivery(@PathVariable final UUID orderId) { + return ResponseEntity.ok(orderService.startDelivery(orderId)); + } + + @PutMapping("/{orderId}/complete-delivery") + public ResponseEntity completeDelivery(@PathVariable final UUID orderId) { + return ResponseEntity.ok(orderService.completeDelivery(orderId)); + } + + @PutMapping("/{orderId}/complete") + public ResponseEntity complete(@PathVariable final UUID orderId) { + return ResponseEntity.ok(orderService.complete(orderId)); + } + + @GetMapping + public ResponseEntity> findAll() { + return ResponseEntity.ok(orderService.findAll()); + } +} diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java new file mode 100644 index 000000000..1ceabe86f --- /dev/null +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java @@ -0,0 +1,56 @@ +package kitchenpos.eatinorders.ui; + +import kitchenpos.eatinorders.application.OrderTableService; +import kitchenpos.eatinorders.domain.OrderTable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.net.URI; +import java.util.List; +import java.util.UUID; + +@RequestMapping("/api/order-tables") +@RestController +public class OrderTableRestController { + private final OrderTableService orderTableService; + + public OrderTableRestController(final OrderTableService orderTableService) { + this.orderTableService = orderTableService; + } + + @PostMapping + public ResponseEntity create(@RequestBody final OrderTable request) { + final OrderTable response = orderTableService.create(request); + return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) + .body(response); + } + + @PutMapping("/{orderTableId}/sit") + public ResponseEntity sit(@PathVariable final UUID orderTableId) { + return ResponseEntity.ok(orderTableService.sit(orderTableId)); + } + + @PutMapping("/{orderTableId}/clear") + public ResponseEntity clear(@PathVariable final UUID orderTableId) { + return ResponseEntity.ok(orderTableService.clear(orderTableId)); + } + + @PutMapping("/{orderTableId}/number-of-guests") + public ResponseEntity changeNumberOfGuests( + @PathVariable final UUID orderTableId, + @RequestBody final OrderTable request + ) { + return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); + } + + @GetMapping + public ResponseEntity> findAll() { + return ResponseEntity.ok(orderTableService.findAll()); + } +} diff --git a/src/main/java/kitchenpos/application/MenuGroupService.java b/src/main/java/kitchenpos/menus/application/MenuGroupService.java similarity index 79% rename from src/main/java/kitchenpos/application/MenuGroupService.java rename to src/main/java/kitchenpos/menus/application/MenuGroupService.java index 84add81f5..c45f45059 100644 --- a/src/main/java/kitchenpos/application/MenuGroupService.java +++ b/src/main/java/kitchenpos/menus/application/MenuGroupService.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menus.application; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,7 +21,7 @@ public MenuGroupService(final MenuGroupRepository menuGroupRepository) { public MenuGroup create(final MenuGroup request) { final String name = request.getName(); if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("메뉴 그룹의 이름이 존재해야 합니다."); } final MenuGroup menuGroup = new MenuGroup(); menuGroup.setId(UUID.randomUUID()); diff --git a/src/main/java/kitchenpos/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java similarity index 60% rename from src/main/java/kitchenpos/application/MenuService.java rename to src/main/java/kitchenpos/menus/application/MenuService.java index 7bd0401ff..8906f386b 100644 --- a/src/main/java/kitchenpos/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -1,13 +1,14 @@ -package kitchenpos.application; +package kitchenpos.menus.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; +import io.micrometer.common.util.StringUtils; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,10 +27,10 @@ public class MenuService { private final PurgomalumClient purgomalumClient; public MenuService( - final MenuRepository menuRepository, - final MenuGroupRepository menuGroupRepository, - final ProductRepository productRepository, - final PurgomalumClient purgomalumClient + final MenuRepository menuRepository, + final MenuGroupRepository menuGroupRepository, + final ProductRepository productRepository, + final PurgomalumClient purgomalumClient ) { this.menuRepository = menuRepository; this.menuGroupRepository = menuGroupRepository; @@ -41,18 +42,18 @@ public MenuService( public Menu create(final Menu request) { final BigDecimal price = request.getPrice(); if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("가격이 존재하거나 0원 이상이어야 합니다."); } final MenuGroup menuGroup = menuGroupRepository.findById(request.getMenuGroupId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); final List menuProductRequests = request.getMenuProducts(); if (Objects.isNull(menuProductRequests) || menuProductRequests.isEmpty()) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("메뉴에 포함된 상품이 존재해야 합니다."); } final List products = productRepository.findAllByIdIn( - menuProductRequests.stream() - .map(MenuProduct::getProductId) - .toList() + menuProductRequests.stream() + .map(MenuProduct::getProductId) + .toList() ); if (products.size() != menuProductRequests.size()) { throw new IllegalArgumentException(); @@ -65,10 +66,10 @@ public Menu create(final Menu request) { throw new IllegalArgumentException(); } final Product product = productRepository.findById(menuProductRequest.getProductId()) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); sum = sum.add( - product.getPrice() - .multiply(BigDecimal.valueOf(quantity)) + product.getPrice() + .multiply(BigDecimal.valueOf(quantity)) ); final MenuProduct menuProduct = new MenuProduct(); menuProduct.setProduct(product); @@ -79,8 +80,8 @@ public Menu create(final Menu request) { throw new IllegalArgumentException(); } final String name = request.getName(); - if (Objects.isNull(name) || purgomalumClient.containsProfanity(name)) { - throw new IllegalArgumentException(); + if (StringUtils.isBlank(name) || purgomalumClient.containsProfanity(name)) { + throw new IllegalArgumentException("올바른 메뉴 이름을 입력해야 합니다."); } final Menu menu = new Menu(); menu.setId(UUID.randomUUID()); @@ -96,20 +97,25 @@ public Menu create(final Menu request) { public Menu changePrice(final UUID menuId, final Menu request) { final BigDecimal price = request.getPrice(); if (Objects.isNull(price) || price.compareTo(BigDecimal.ZERO) < 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("메뉴 변경시 가격이 0원 이상이어야 합니다."); } - final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); BigDecimal sum = BigDecimal.ZERO; + final Menu menu = menuRepository.findById(menuId) + .orElseThrow(NoSuchElementException::new); for (final MenuProduct menuProduct : menu.getMenuProducts()) { + Product product = menuProduct.getProduct(); + if (Objects.isNull(product) || Objects.isNull(product.getPrice())) { + throw new IllegalArgumentException("상품 가격이 존재해야만 합니다."); + } + sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + menuProduct.getProduct() + .getPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) ); } if (price.compareTo(sum) > 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("메뉴 가격은 포함된 상품 가격 합보다 클 수 없습니다."); } menu.setPrice(price); return menu; @@ -118,17 +124,17 @@ public Menu changePrice(final UUID menuId, final Menu request) { @Transactional public Menu display(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(() -> new NoSuchElementException("해당 ID의 메뉴가 존재하지 않습니다.")); BigDecimal sum = BigDecimal.ZERO; for (final MenuProduct menuProduct : menu.getMenuProducts()) { sum = sum.add( - menuProduct.getProduct() - .getPrice() - .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) + menuProduct.getProduct() + .getPrice() + .multiply(BigDecimal.valueOf(menuProduct.getQuantity())) ); } if (menu.getPrice().compareTo(sum) > 0) { - throw new IllegalStateException(); + throw new IllegalStateException("메뉴 가격이 포함된 상품 가격보다 높아 표시할 수 없습니다."); } menu.setDisplayed(true); return menu; @@ -137,7 +143,7 @@ public Menu display(final UUID menuId) { @Transactional public Menu hide(final UUID menuId) { final Menu menu = menuRepository.findById(menuId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); menu.setDisplayed(false); return menu; } diff --git a/src/main/java/kitchenpos/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java similarity index 85% rename from src/main/java/kitchenpos/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java index 9ee56b2b3..233488198 100644 --- a/src/main/java/kitchenpos/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/kitchenpos/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java similarity index 93% rename from src/main/java/kitchenpos/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java index 2a8fa4fd2..796499c30 100644 --- a/src/main/java/kitchenpos/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/kitchenpos/domain/Menu.java b/src/main/java/kitchenpos/menus/domain/Menu.java similarity index 80% rename from src/main/java/kitchenpos/domain/Menu.java rename to src/main/java/kitchenpos/menus/domain/Menu.java index 7803bde26..b0ce3fb5a 100644 --- a/src/main/java/kitchenpos/domain/Menu.java +++ b/src/main/java/kitchenpos/menus/domain/Menu.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -13,6 +13,7 @@ import java.math.BigDecimal; import java.util.List; +import java.util.NoSuchElementException; import java.util.UUID; @Table(name = "menu") @@ -30,9 +31,9 @@ public class Menu { @ManyToOne(optional = false) @JoinColumn( - name = "menu_group_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") + name = "menu_group_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_to_menu_group") ) private MenuGroup menuGroup; @@ -41,10 +42,10 @@ public class Menu { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "menu_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") + name = "menu_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_menu") ) private List menuProducts; @@ -103,6 +104,9 @@ public void setMenuProducts(final List menuProducts) { } public UUID getMenuGroupId() { + if (menuGroup == null) { + throw new NoSuchElementException("메뉴는 특정 메뉴 그룹에 속해야 한다."); + } return menuGroupId; } diff --git a/src/main/java/kitchenpos/domain/MenuGroup.java b/src/main/java/kitchenpos/menus/domain/MenuGroup.java similarity index 95% rename from src/main/java/kitchenpos/domain/MenuGroup.java rename to src/main/java/kitchenpos/menus/domain/MenuGroup.java index c7cd3c83d..70e0b8e23 100644 --- a/src/main/java/kitchenpos/domain/MenuGroup.java +++ b/src/main/java/kitchenpos/menus/domain/MenuGroup.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/kitchenpos/domain/MenuGroupRepository.java b/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java similarity index 87% rename from src/main/java/kitchenpos/domain/MenuGroupRepository.java rename to src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java index b5acec2f2..b25e6acbc 100644 --- a/src/main/java/kitchenpos/domain/MenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/domain/MenuGroupRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java similarity index 95% rename from src/main/java/kitchenpos/domain/MenuProduct.java rename to src/main/java/kitchenpos/menus/domain/MenuProduct.java index 19026056a..b47ca26cb 100644 --- a/src/main/java/kitchenpos/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,6 +10,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.Transient; +import kitchenpos.products.domain.Product; import java.util.UUID; diff --git a/src/main/java/kitchenpos/domain/MenuRepository.java b/src/main/java/kitchenpos/menus/domain/MenuRepository.java similarity index 90% rename from src/main/java/kitchenpos/domain/MenuRepository.java rename to src/main/java/kitchenpos/menus/domain/MenuRepository.java index 6bd825029..5fbaab864 100644 --- a/src/main/java/kitchenpos/domain/MenuRepository.java +++ b/src/main/java/kitchenpos/menus/domain/MenuRepository.java @@ -1,4 +1,4 @@ -package kitchenpos.domain; +package kitchenpos.menus.domain; import java.util.List; import java.util.Optional; diff --git a/src/main/java/kitchenpos/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java similarity index 89% rename from src/main/java/kitchenpos/ui/MenuGroupRestController.java rename to src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 532cdb625..30c38b4a1 100644 --- a/src/main/java/kitchenpos/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.menus.ui; -import kitchenpos.application.MenuGroupService; -import kitchenpos.domain.MenuGroup; +import kitchenpos.menus.application.MenuGroupService; +import kitchenpos.menus.domain.MenuGroup; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/kitchenpos/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java similarity index 93% rename from src/main/java/kitchenpos/ui/MenuRestController.java rename to src/main/java/kitchenpos/menus/ui/MenuRestController.java index 999bf13b3..626b214fc 100644 --- a/src/main/java/kitchenpos/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -1,7 +1,7 @@ -package kitchenpos.ui; +package kitchenpos.menus.ui; -import kitchenpos.application.MenuService; -import kitchenpos.domain.Menu; +import kitchenpos.menus.application.MenuService; +import kitchenpos.menus.domain.Menu; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/src/main/java/kitchenpos/takeoutorders/empty.txt b/src/main/java/kitchenpos/takeoutorders/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/java/kitchenpos/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/application/MenuGroupServiceTest.java deleted file mode 100644 index 7a9770860..000000000 --- a/src/test/java/kitchenpos/application/MenuGroupServiceTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; - -import java.util.List; - -import static kitchenpos.Fixtures.menuGroup; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -class MenuGroupServiceTest { - private MenuGroupRepository menuGroupRepository; - private MenuGroupService menuGroupService; - - @BeforeEach - void setUp() { - menuGroupRepository = new InMemoryMenuGroupRepository(); - menuGroupService = new MenuGroupService(menuGroupRepository); - } - - @DisplayName("메뉴 그룹을 등록할 수 있다.") - @Test - void create() { - final MenuGroup expected = createMenuGroupRequest("두마리메뉴"); - final MenuGroup actual = menuGroupService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()) - ); - } - - @DisplayName("메뉴 그룹의 이름이 올바르지 않으면 등록할 수 없다.") - @NullAndEmptySource - @ParameterizedTest - void create(final String name) { - final MenuGroup expected = createMenuGroupRequest(name); - assertThatThrownBy(() -> menuGroupService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴 그룹의 목록을 조회할 수 있다.") - @Test - void findAll() { - menuGroupRepository.save(menuGroup("두마리메뉴")); - final List actual = menuGroupService.findAll(); - assertThat(actual).hasSize(1); - } - - private MenuGroup createMenuGroupRequest(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setName(name); - return menuGroup; - } -} diff --git a/src/test/java/kitchenpos/application/MenuServiceTest.java b/src/test/java/kitchenpos/application/MenuServiceTest.java deleted file mode 100644 index 4a848e42b..000000000 --- a/src/test/java/kitchenpos/application/MenuServiceTest.java +++ /dev/null @@ -1,268 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroupRepository; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Product; -import kitchenpos.domain.ProductRepository; -import kitchenpos.infra.PurgomalumClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.UUID; - -import static kitchenpos.Fixtures.INVALID_ID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuGroup; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.product; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -class MenuServiceTest { - private MenuRepository menuRepository; - private MenuGroupRepository menuGroupRepository; - private ProductRepository productRepository; - private PurgomalumClient purgomalumClient; - private MenuService menuService; - private UUID menuGroupId; - private Product product; - - @BeforeEach - void setUp() { - menuRepository = new InMemoryMenuRepository(); - menuGroupRepository = new InMemoryMenuGroupRepository(); - productRepository = new InMemoryProductRepository(); - purgomalumClient = new FakePurgomalumClient(); - menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); - menuGroupId = menuGroupRepository.save(menuGroup()).getId(); - product = productRepository.save(product("후라이드", 16_000L)); - } - - @DisplayName("1개 이상의 등록된 상품으로 메뉴를 등록할 수 있다.") - @Test - void create() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - final Menu actual = menuService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), - () -> assertThat(actual.getMenuGroup().getId()).isEqualTo(expected.getMenuGroupId()), - () -> assertThat(actual.isDisplayed()).isEqualTo(expected.isDisplayed()), - () -> assertThat(actual.getMenuProducts()).hasSize(1) - ); - } - - @DisplayName("상품이 없으면 등록할 수 없다.") - @MethodSource("menuProducts") - @ParameterizedTest - void create(final List menuProducts) { - final Menu expected = createMenuRequest("후라이드+후라이드", 19_000L, menuGroupId, true, menuProducts); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - private static List menuProducts() { - return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createMenuProductRequest(INVALID_ID, 2L))) - ); - } - - @DisplayName("메뉴에 속한 상품의 수량은 0개 이상이어야 한다.") - @Test - void createNegativeQuantity() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), -1L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴의 가격이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void create(final BigDecimal price) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", price, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") - @Test - void createExpensiveMenu() { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 33_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴는 특정 메뉴 그룹에 속해야 한다.") - @NullSource - @ParameterizedTest - void create(final UUID menuGroupId) { - final Menu expected = createMenuRequest( - "후라이드+후라이드", 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(NoSuchElementException.class); - } - - @DisplayName("메뉴의 이름이 올바르지 않으면 등록할 수 없다.") - @ValueSource(strings = {"비속어", "욕설이 포함된 이름"}) - @NullSource - @ParameterizedTest - void create(final String name) { - final Menu expected = createMenuRequest( - name, 19_000L, menuGroupId, true, createMenuProductRequest(product.getId(), 2L) - ); - assertThatThrownBy(() -> menuService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴의 가격을 변경할 수 있다.") - @Test - void changePrice() { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(16_000L); - final Menu actual = menuService.changePrice(menuId, expected); - assertThat(actual.getPrice()).isEqualTo(expected.getPrice()); - } - - @DisplayName("메뉴의 가격이 올바르지 않으면 변경할 수 없다.") - @ValueSource(strings = "-1000") - @NullSource - @ParameterizedTest - void changePrice(final BigDecimal price) { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(price); - assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다.") - @Test - void changePriceToExpensive() { - final UUID menuId = menuRepository.save(menu(19_000L, menuProduct(product, 2L))).getId(); - final Menu expected = changePriceRequest(33_000L); - assertThatThrownBy(() -> menuService.changePrice(menuId, expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("메뉴를 노출할 수 있다.") - @Test - void display() { - final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.display(menuId); - assertThat(actual.isDisplayed()).isTrue(); - } - - @DisplayName("메뉴의 가격이 메뉴에 속한 상품 금액의 합보다 높을 경우 메뉴를 노출할 수 없다.") - @Test - void displayExpensiveMenu() { - final UUID menuId = menuRepository.save(menu(33_000L, false, menuProduct(product, 2L))).getId(); - assertThatThrownBy(() -> menuService.display(menuId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("메뉴를 숨길 수 있다.") - @Test - void hide() { - final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))).getId(); - final Menu actual = menuService.hide(menuId); - assertThat(actual.isDisplayed()).isFalse(); - } - - @DisplayName("메뉴의 목록을 조회할 수 있다.") - @Test - void findAll() { - menuRepository.save(menu(19_000L, true, menuProduct(product, 2L))); - final List actual = menuService.findAll(); - assertThat(actual).hasSize(1); - } - - private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts - ) { - return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); - } - - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final MenuProduct... menuProducts - ) { - return createMenuRequest(name, price, menuGroupId, displayed, Arrays.asList(menuProducts)); - } - - private Menu createMenuRequest( - final String name, - final long price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts - ) { - return createMenuRequest(name, BigDecimal.valueOf(price), menuGroupId, displayed, menuProducts); - } - - private Menu createMenuRequest( - final String name, - final BigDecimal price, - final UUID menuGroupId, - final boolean displayed, - final List menuProducts - ) { - final Menu menu = new Menu(); - menu.setName(name); - menu.setPrice(price); - menu.setMenuGroupId(menuGroupId); - menu.setDisplayed(displayed); - menu.setMenuProducts(menuProducts); - return menu; - } - - private static MenuProduct createMenuProductRequest(final UUID productId, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setProductId(productId); - menuProduct.setQuantity(quantity); - return menuProduct; - } - - private Menu changePriceRequest(final long price) { - return changePriceRequest(BigDecimal.valueOf(price)); - } - - private Menu changePriceRequest(final BigDecimal price) { - final Menu menu = new Menu(); - menu.setPrice(price); - return menu; - } -} diff --git a/src/test/java/kitchenpos/fixtures/MenuFixtures.java b/src/test/java/kitchenpos/fixtures/MenuFixtures.java new file mode 100644 index 000000000..6b5e88c39 --- /dev/null +++ b/src/test/java/kitchenpos/fixtures/MenuFixtures.java @@ -0,0 +1,93 @@ +package kitchenpos.fixtures; + +import static kitchenpos.fixtures.ProductFixtures.product; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuProduct; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +public class MenuFixtures { + + public static MenuProduct createMenuProduct(final UUID productId, final long quantity) { + MenuProduct menuProduct = new MenuProduct(); + menuProduct.setProductId(productId); + menuProduct.setQuantity(quantity); + return menuProduct; + } + + public static MenuGroup menuGroup() { + return createMenuGroup("메인메뉴"); + } + + public static MenuGroup createMenuGroup(final String name) { + MenuGroup menuGroup = new MenuGroup(); + menuGroup.setId(UUID.randomUUID()); + menuGroup.setName(name); + return menuGroup; + } + + + public static Menu createMenu( + final String name, + final BigDecimal price, + final boolean displayed, + final MenuGroup menuGroup, + final List menuProducts + ) { + Menu menu = new Menu(); + menu.setId(UUID.randomUUID()); + menu.setName(name); + menu.setPrice(price); + menu.setMenuGroup(menuGroup); + menu.setMenuGroupId(menuGroup.getId()); + menu.setDisplayed(displayed); + menu.setMenuProducts(menuProducts); + return menu; + } + + public static Menu createMenuWithoutMenuGroupId( + final String name, + final BigDecimal price, + final boolean displayed, + final List menuProducts + ) { + Menu menu = new Menu(); + menu.setId(UUID.randomUUID()); + menu.setName(name); + menu.setPrice(price); + menu.setMenuGroup(null); + menu.setDisplayed(displayed); + menu.setMenuProducts(menuProducts); + return menu; + } + + /** + * OrderServiceTest + */ + public static Menu menu() { + return menu(19_000L, true, menuProduct()); + } + public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { + final Menu menu = new Menu(); + menu.setId(UUID.randomUUID()); + menu.setName("후라이드치킨+양념치킨"); + menu.setPrice(BigDecimal.valueOf(price)); + menu.setMenuGroup(menuGroup()); + menu.setDisplayed(displayed); + menu.setMenuProducts(Arrays.asList(menuProducts)); + return menu; + } + + public static MenuProduct menuProduct() { + final MenuProduct menuProduct = new MenuProduct(); + menuProduct.setSeq(new Random().nextLong()); + menuProduct.setProduct(product()); + menuProduct.setQuantity(2L); + return menuProduct; + } +} diff --git a/src/test/java/kitchenpos/application/InMemoryMenuGroupRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java similarity index 84% rename from src/test/java/kitchenpos/application/InMemoryMenuGroupRepository.java rename to src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java index 7e566087f..85962e6dc 100644 --- a/src/test/java/kitchenpos/application/InMemoryMenuGroupRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuGroupRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menus.application; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuGroupRepository; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/InMemoryMenuRepository.java b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java similarity index 66% rename from src/test/java/kitchenpos/application/InMemoryMenuRepository.java rename to src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java index deaab0bf5..611fc9f6b 100644 --- a/src/test/java/kitchenpos/application/InMemoryMenuRepository.java +++ b/src/test/java/kitchenpos/menus/application/InMemoryMenuRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.menus.application; -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuRepository; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuRepository; import java.util.ArrayList; import java.util.HashMap; @@ -32,16 +32,16 @@ public List findAll() { @Override public List findAllByIdIn(final List ids) { return menus.values() - .stream() - .filter(menu -> ids.contains(menu.getId())) - .toList(); + .stream() + .filter(menu -> ids.contains(menu.getId())) + .toList(); } @Override public List findAllByProductId(final UUID productId) { return menus.values() - .stream() - .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) - .toList(); + .stream() + .filter(menu -> menu.getMenuProducts().stream().anyMatch(menuProduct -> menuProduct.getProduct().getId().equals(productId))) + .toList(); } } diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java new file mode 100644 index 000000000..f6ba64070 --- /dev/null +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -0,0 +1,70 @@ +package kitchenpos.menus.application; + +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +import java.util.List; + +class MenuGroupServiceTest { + + private MenuGroupService menuGroupService; + private MenuGroupRepository menuGroupRepository; + + @BeforeEach + void setUp() { + menuGroupRepository = new InMemoryMenuGroupRepository(); + menuGroupService = new MenuGroupService(menuGroupRepository); + } + + @Test + void 메뉴_그룹을_등록할_수_있다() { + // given + final MenuGroup expected = createMenuGroupRequest("메인 메뉴"); + final MenuGroup actual = menuGroupService.create(expected); + + // when & then + assertThat(actual.getId()).isNotNull(); + assertAll( + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getName()).isEqualTo(expected.getName()) + ); + } + + @NullAndEmptySource + @ParameterizedTest + void 메뉴_그룹의_이름이_존재하지_않으면_등록할_수_없다(final String name) { + // given & when & then + final MenuGroup expected = createMenuGroupRequest(name); + assertThatThrownBy(() -> menuGroupService.create(expected)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 그룹의 이름이 존재해야 합니다."); + } + + @Test + void 메뉴_그룹의_목록을_조회할_수_있다() { + // given + final MenuGroup expected1 = createMenuGroupRequest("메인 메뉴"); + final MenuGroup expected2 = createMenuGroupRequest("사이드 메뉴"); + + // when + menuGroupService.create(expected1); + menuGroupService.create(expected2); + final List response = menuGroupService.findAll(); + + // then + assertThat(response).hasSize(2); + } + + private MenuGroup createMenuGroupRequest(final String name) { + final MenuGroup menuGroup = new MenuGroup(); + menuGroup.setName(name); + return menuGroup; + } +} diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java new file mode 100644 index 000000000..4cda326db --- /dev/null +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -0,0 +1,344 @@ +package kitchenpos.menus.application; + +import static java.math.BigDecimal.valueOf; +import kitchenpos.fixtures.MenuFixtures; +import static kitchenpos.fixtures.MenuFixtures.createMenu; +import static kitchenpos.fixtures.MenuFixtures.createMenuGroup; +import static kitchenpos.fixtures.MenuFixtures.createMenuProduct; +import static kitchenpos.fixtures.MenuFixtures.createMenuWithoutMenuGroupId; +import static kitchenpos.fixtures.ProductFixtures.createProduct; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; +import kitchenpos.menus.domain.MenuProduct; +import kitchenpos.menus.domain.MenuRepository; +import kitchenpos.products.application.FakePurgomalumClient; +import kitchenpos.products.application.InMemoryProductRepository; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; +import kitchenpos.products.infra.PurgomalumClient; +import org.assertj.core.api.Assertions; +import org.assertj.core.api.AssertionsForClassTypes; +import org.assertj.core.api.AssertionsForInterfaceTypes; +import static org.junit.jupiter.api.Assertions.assertAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +class MenuServiceTest { + + private MenuService menuService; + private MenuRepository menuRepository; + private MenuGroupRepository menuGroupRepository; + private ProductRepository productRepository; + private PurgomalumClient purgomalumClient; + private Product product; + private UUID menuGroupId; + + @BeforeEach + void setUp() { + menuRepository = new InMemoryMenuRepository(); + menuGroupRepository = new InMemoryMenuGroupRepository(); + productRepository = new InMemoryProductRepository(); + purgomalumClient = new FakePurgomalumClient(); + menuService = new MenuService(menuRepository, menuGroupRepository, productRepository, purgomalumClient); + product = productRepository.save(createProduct("후라이드치킨", valueOf(16000))); + menuGroupId = menuGroupRepository.save(MenuFixtures.menuGroup()).getId(); + } + + @Test + void 메뉴를_등록할_수_있다() { + // given + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + MenuGroup menuGroup = menuGroupRepository.findById(menuGroupId).orElseThrow(); + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + + // when + Menu actual = menuService.create(expected); + + // then + AssertionsForClassTypes.assertThat(actual).isNotNull(); + assertAll( + () -> AssertionsForInterfaceTypes.assertThat(actual.getId()).isNotNull(), + () -> AssertionsForClassTypes.assertThat(actual.getName()).isEqualTo(expected.getName()), + () -> AssertionsForClassTypes.assertThat(actual.getPrice()).isEqualTo(expected.getPrice()), + () -> AssertionsForClassTypes.assertThat(actual.getMenuGroup()).isEqualTo(expected.getMenuGroup()), + () -> AssertionsForInterfaceTypes.assertThat(actual.getMenuProducts()).hasSize(expected.getMenuProducts().size()) + ); + } + + @DisplayName("메뉴에 가격이 0원 미만이면 등록할 수 없다.") + @Test + void 메뉴_가격이_0원_미만이면_등록할_수_없다() { + // given + Product negativePriceProduct = createProduct("후라이드치킨", valueOf(-16000)); + productRepository.save(negativePriceProduct); + + MenuProduct menuProduct = createMenuProduct(negativePriceProduct.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = menuGroupRepository.findById(menuGroupId).orElseThrow(); + Menu expected = createMenu("후라이드치킨", valueOf(-16000), true, menuGroup, menuProducts); + + // when & then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.create(expected)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("가격이 존재하거나 0원 이상이어야 합니다."); + } + + @Test + void 특정_메뉴_그룹이_존재하지_않으면_등록할_수_없다() { + // given + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + Menu expected = createMenuWithoutMenuGroupId("후라이드치킨", valueOf(16000), true, menuProducts); + + // when & then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.create(expected)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage("메뉴는 특정 메뉴 그룹에 속해야 한다."); + } + + @Test + void 메뉴에_포함된_상품이_없으면_등록할_수_없다() { + // given + MenuGroup menuGroup = createMenuGroup("후라이드치킨"); + menuGroupRepository.save(menuGroup); + + List emptyMenuProducts = List.of(); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, emptyMenuProducts); + + // when & then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.create(expected)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴에 포함된 상품이 존재해야 합니다."); + } + + @Test + void 메뉴에_등록된_상품의_수량이_0개_미만이면_등록할_수_없다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), -1L); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + + // when & then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.create(expected)) + .isInstanceOf(IllegalArgumentException.class); + } + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {" ", " "}) + void 메뉴_이름이_없으면_등록할_수_없다(String invalidMenuName) { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + // when + Menu expected = createMenu(invalidMenuName, valueOf(16000), true, menuGroup, menuProducts); + + // then + Assertions.assertThatThrownBy(() -> menuService.create(expected)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("올바른 메뉴 이름을 입력해야 합니다."); + } + + @Test + void 메뉴에_있는_가격을_상품들의_총_가격_이하로_변경할_수_있다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + Menu actual = menuService.create(expected); + + // when + actual.setPrice(valueOf(9999)); + Menu changePriceMenu = menuService.changePrice(actual.getId(), actual); + + // then + AssertionsForClassTypes.assertThat(changePriceMenu.getPrice()).isEqualTo(valueOf(9999)); + + } + + @Test + void 메뉴_가격이_0원_미만이면_변경할_수_없다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + Menu actual = menuService.create(expected); + + // when + actual.setPrice(valueOf(-1)); + + // then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.changePrice(actual.getId(), actual)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 변경시 가격이 0원 이상이어야 합니다."); + } + + @Test + void 메뉴_가격이_상품_가격_합보다_크면_변경할_수_없다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + Menu actual = menuService.create(expected); + + // when + actual.setPrice(valueOf(16001)); + + // then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.changePrice(actual.getId(), actual)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("메뉴 가격은 포함된 상품 가격 합보다 클 수 없습니다."); + } + + @Test + void 메뉴를_표시_상태로_변경할_수_있다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + Menu actual = menuService.create(expected); + + // when + Menu displayMenu = menuService.display(actual.getId()); + + // then + AssertionsForClassTypes.assertThat(displayMenu.isDisplayed()).isTrue(); + } + + @Test + void 존재하지_않는_메뉴를_표시할_수_없다() { + // given + UUID NonExistedMenuId = UUID.randomUUID(); + + // when & then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.display(NonExistedMenuId)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage("해당 ID의 메뉴가 존재하지 않습니다."); + } + + @Test + void 메뉴_가격이_상품_가격_합보다_높으면_메뉴를_표시할_수_없다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + // 상품 가격보다 높은 메뉴 가격 설정 + Menu expected = createMenu("후라이드치킨", valueOf(16000), false, menuGroup, menuProducts); + Menu actual = menuService.create(expected); + + // when + actual.setPrice(valueOf(16001)); + menuRepository.save(actual); + + // then + AssertionsForClassTypes.assertThatThrownBy(() -> menuService.display(actual.getId())) + .isInstanceOf(IllegalStateException.class) + .hasMessage("메뉴 가격이 포함된 상품 가격보다 높아 표시할 수 없습니다."); + } + + @Test + void 등록된_메뉴를_숨길_수_있다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("메인 메뉴"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + + // when + Menu actual = menuService.create(expected); + Menu hidMenu = menuService.hide(actual.getId()); + + // then + AssertionsForClassTypes.assertThat(hidMenu.isDisplayed()).isFalse(); + } + + @Test + void 등록된_메뉴를_모두_조회할_수_있다() { + // given + Product product = createProduct("후라이드치킨", valueOf(16000)); + productRepository.save(product); + + MenuProduct menuProduct = createMenuProduct(product.getId(), 1); + List menuProducts = List.of(menuProduct); + + MenuGroup menuGroup = createMenuGroup("한식"); + menuGroupRepository.save(menuGroup); + + Menu expected = createMenu("후라이드치킨", valueOf(16000), true, menuGroup, menuProducts); + menuService.create(expected); + + // when + List findAllMenu = menuService.findAll(); + + // then + AssertionsForInterfaceTypes.assertThat(findAllMenu).isNotEmpty(); + AssertionsForClassTypes.assertThat(findAllMenu.size()).isEqualTo(1); + } +} From 7c14a801204067212d1d6f83c768d6a371b602cc Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 24 Feb 2025 21:16:41 +0900 Subject: [PATCH 09/12] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=9E=A5=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8,=20=ED=8F=AC=EC=9E=A5=20=EC=A3=BC=EB=AC=B8,?= =?UTF-8?q?=20=EB=B0=B0=EB=8B=AC=20=EC=A3=BC=EB=AC=B8=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kitchenpos/ui/OrderRestController.java | 63 ----- .../ui/OrderTableRestController.java | 56 ----- src/test/java/kitchenpos/Fixtures.java | 131 ---------- .../application/OrderTableServiceTest.java | 134 ---------- .../application/FakeKitchenridersClient.java | 4 +- .../application/InMemoryOrderRepository.java | 14 +- .../InMemoryOrderTableRepository.java | 6 +- .../application/OrderServiceTest.java | 230 ++++++++---------- .../application/OrderTableServiceTest.java | 170 +++++++++++++ .../java/kitchenpos/fixtures/Fixtures.java | 8 + .../fixtures/OrderServiceFixture.java | 55 +++++ .../fixtures/OrderTableFixtures.java | 61 +++++ 12 files changed, 407 insertions(+), 525 deletions(-) delete mode 100644 src/main/java/kitchenpos/ui/OrderRestController.java delete mode 100644 src/main/java/kitchenpos/ui/OrderTableRestController.java delete mode 100644 src/test/java/kitchenpos/Fixtures.java delete mode 100644 src/test/java/kitchenpos/application/OrderTableServiceTest.java rename src/test/java/kitchenpos/{ => eatinorders}/application/FakeKitchenridersClient.java (86%) rename src/test/java/kitchenpos/{ => eatinorders}/application/InMemoryOrderRepository.java (68%) rename src/test/java/kitchenpos/{ => eatinorders}/application/InMemoryOrderTableRepository.java (82%) rename src/test/java/kitchenpos/{ => eatinorders}/application/OrderServiceTest.java (59%) create mode 100644 src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java create mode 100644 src/test/java/kitchenpos/fixtures/Fixtures.java create mode 100644 src/test/java/kitchenpos/fixtures/OrderServiceFixture.java create mode 100644 src/test/java/kitchenpos/fixtures/OrderTableFixtures.java diff --git a/src/main/java/kitchenpos/ui/OrderRestController.java b/src/main/java/kitchenpos/ui/OrderRestController.java deleted file mode 100644 index b430f6a28..000000000 --- a/src/main/java/kitchenpos/ui/OrderRestController.java +++ /dev/null @@ -1,63 +0,0 @@ -package kitchenpos.ui; - -import kitchenpos.application.OrderService; -import kitchenpos.domain.Order; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.net.URI; -import java.util.List; -import java.util.UUID; - -@RequestMapping("/api/orders") -@RestController -public class OrderRestController { - private final OrderService orderService; - - public OrderRestController(final OrderService orderService) { - this.orderService = orderService; - } - - @PostMapping - public ResponseEntity create(@RequestBody final Order request) { - final Order response = orderService.create(request); - return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) - .body(response); - } - - @PutMapping("/{orderId}/accept") - public ResponseEntity accept(@PathVariable final UUID orderId) { - return ResponseEntity.ok(orderService.accept(orderId)); - } - - @PutMapping("/{orderId}/serve") - public ResponseEntity serve(@PathVariable final UUID orderId) { - return ResponseEntity.ok(orderService.serve(orderId)); - } - - @PutMapping("/{orderId}/start-delivery") - public ResponseEntity startDelivery(@PathVariable final UUID orderId) { - return ResponseEntity.ok(orderService.startDelivery(orderId)); - } - - @PutMapping("/{orderId}/complete-delivery") - public ResponseEntity completeDelivery(@PathVariable final UUID orderId) { - return ResponseEntity.ok(orderService.completeDelivery(orderId)); - } - - @PutMapping("/{orderId}/complete") - public ResponseEntity complete(@PathVariable final UUID orderId) { - return ResponseEntity.ok(orderService.complete(orderId)); - } - - @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(orderService.findAll()); - } -} diff --git a/src/main/java/kitchenpos/ui/OrderTableRestController.java b/src/main/java/kitchenpos/ui/OrderTableRestController.java deleted file mode 100644 index dcdbd7f5a..000000000 --- a/src/main/java/kitchenpos/ui/OrderTableRestController.java +++ /dev/null @@ -1,56 +0,0 @@ -package kitchenpos.ui; - -import kitchenpos.application.OrderTableService; -import kitchenpos.domain.OrderTable; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.net.URI; -import java.util.List; -import java.util.UUID; - -@RequestMapping("/api/order-tables") -@RestController -public class OrderTableRestController { - private final OrderTableService orderTableService; - - public OrderTableRestController(final OrderTableService orderTableService) { - this.orderTableService = orderTableService; - } - - @PostMapping - public ResponseEntity create(@RequestBody final OrderTable request) { - final OrderTable response = orderTableService.create(request); - return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) - .body(response); - } - - @PutMapping("/{orderTableId}/sit") - public ResponseEntity sit(@PathVariable final UUID orderTableId) { - return ResponseEntity.ok(orderTableService.sit(orderTableId)); - } - - @PutMapping("/{orderTableId}/clear") - public ResponseEntity clear(@PathVariable final UUID orderTableId) { - return ResponseEntity.ok(orderTableService.clear(orderTableId)); - } - - @PutMapping("/{orderTableId}/number-of-guests") - public ResponseEntity changeNumberOfGuests( - @PathVariable final UUID orderTableId, - @RequestBody final OrderTable request - ) { - return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); - } - - @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok(orderTableService.findAll()); - } -} diff --git a/src/test/java/kitchenpos/Fixtures.java b/src/test/java/kitchenpos/Fixtures.java deleted file mode 100644 index f1cd5992e..000000000 --- a/src/test/java/kitchenpos/Fixtures.java +++ /dev/null @@ -1,131 +0,0 @@ -package kitchenpos; - -import kitchenpos.domain.Menu; -import kitchenpos.domain.MenuGroup; -import kitchenpos.domain.MenuProduct; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderType; -import kitchenpos.domain.Product; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Random; -import java.util.UUID; - -public class Fixtures { - public static final UUID INVALID_ID = new UUID(0L, 0L); - - public static Menu menu() { - return menu(19_000L, true, menuProduct()); - } - - public static Menu menu(final long price, final MenuProduct... menuProducts) { - return menu(price, false, menuProducts); - } - - public static Menu menu(final long price, final boolean displayed, final MenuProduct... menuProducts) { - final Menu menu = new Menu(); - menu.setId(UUID.randomUUID()); - menu.setName("후라이드+후라이드"); - menu.setPrice(BigDecimal.valueOf(price)); - menu.setMenuGroup(menuGroup()); - menu.setDisplayed(displayed); - menu.setMenuProducts(Arrays.asList(menuProducts)); - return menu; - } - - public static MenuGroup menuGroup() { - return menuGroup("두마리메뉴"); - } - - public static MenuGroup menuGroup(final String name) { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(UUID.randomUUID()); - menuGroup.setName(name); - return menuGroup; - } - - public static MenuProduct menuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product()); - menuProduct.setQuantity(2L); - return menuProduct; - } - - public static MenuProduct menuProduct(final Product product, final long quantity) { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(new Random().nextLong()); - menuProduct.setProduct(product); - menuProduct.setQuantity(quantity); - return menuProduct; - } - - public static Order order(final OrderStatus status, final String deliveryAddress) { - final Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.DELIVERY); - order.setStatus(status); - order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); - order.setOrderLineItems(Arrays.asList(orderLineItem())); - order.setDeliveryAddress(deliveryAddress); - return order; - } - - public static Order order(final OrderStatus status) { - final Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.TAKEOUT); - order.setStatus(status); - order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); - order.setOrderLineItems(Arrays.asList(orderLineItem())); - return order; - } - - public static Order order(final OrderStatus status, final OrderTable orderTable) { - final Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(OrderType.EAT_IN); - order.setStatus(status); - order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); - order.setOrderLineItems(Arrays.asList(orderLineItem())); - order.setOrderTable(orderTable); - return order; - } - - public static OrderLineItem orderLineItem() { - final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setSeq(new Random().nextLong()); - orderLineItem.setMenu(menu()); - return orderLineItem; - } - - public static OrderTable orderTable() { - return orderTable(false, 0); - } - - public static OrderTable orderTable(final boolean occupied, final int numberOfGuests) { - final OrderTable orderTable = new OrderTable(); - orderTable.setId(UUID.randomUUID()); - orderTable.setName("1번"); - orderTable.setNumberOfGuests(numberOfGuests); - orderTable.setOccupied(occupied); - return orderTable; - } - - public static Product product() { - return product("후라이드", 16_000L); - } - - public static Product product(final String name, final long price) { - final Product product = new Product(); - product.setId(UUID.randomUUID()); - product.setName(name); - product.setPrice(BigDecimal.valueOf(price)); - return product; - } -} diff --git a/src/test/java/kitchenpos/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/application/OrderTableServiceTest.java deleted file mode 100644 index 75ff282e7..000000000 --- a/src/test/java/kitchenpos/application/OrderTableServiceTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package kitchenpos.application; - -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.ValueSource; - -import java.util.List; -import java.util.UUID; - -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - -class OrderTableServiceTest { - private OrderTableRepository orderTableRepository; - private OrderRepository orderRepository; - private OrderTableService orderTableService; - - @BeforeEach - void setUp() { - orderTableRepository = new InMemoryOrderTableRepository(); - orderRepository = new InMemoryOrderRepository(); - orderTableService = new OrderTableService(orderTableRepository, orderRepository); - } - - @DisplayName("주문 테이블을 등록할 수 있다.") - @Test - void create() { - final OrderTable expected = createOrderTableRequest("1번"); - final OrderTable actual = orderTableService.create(expected); - assertThat(actual).isNotNull(); - assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse() - ); - } - - @DisplayName("주문 테이블의 이름이 올바르지 않으면 등록할 수 없다.") - @NullAndEmptySource - @ParameterizedTest - void create(final String name) { - final OrderTable expected = createOrderTableRequest(name); - assertThatThrownBy(() -> orderTableService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("빈 테이블을 해지할 수 있다.") - @Test - void sit() { - final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); - final OrderTable actual = orderTableService.sit(orderTableId); - assertThat(actual.isOccupied()).isTrue(); - } - - @DisplayName("빈 테이블로 설정할 수 있다.") - @Test - void clear() { - final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); - final OrderTable actual = orderTableService.clear(orderTableId); - assertAll( - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse() - ); - } - - @DisplayName("완료되지 않은 주문이 있는 주문 테이블은 빈 테이블로 설정할 수 없다.") - @Test - void clearWithUncompletedOrders() { - final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); - final UUID orderTableId = orderTable.getId(); - orderRepository.save(order(OrderStatus.ACCEPTED, orderTable)); - assertThatThrownBy(() -> orderTableService.clear(orderTableId)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("방문한 손님 수를 변경할 수 있다.") - @Test - void changeNumberOfGuests() { - final UUID orderTableId = orderTableRepository.save(orderTable(true, 0)).getId(); - final OrderTable expected = changeNumberOfGuestsRequest(4); - final OrderTable actual = orderTableService.changeNumberOfGuests(orderTableId, expected); - assertThat(actual.getNumberOfGuests()).isEqualTo(4); - } - - @DisplayName("방문한 손님 수가 올바르지 않으면 변경할 수 없다.") - @ValueSource(ints = -1) - @ParameterizedTest - void changeNumberOfGuests(final int numberOfGuests) { - final UUID orderTableId = orderTableRepository.save(orderTable(true, 0)).getId(); - final OrderTable expected = changeNumberOfGuestsRequest(numberOfGuests); - assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTableId, expected)) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("빈 테이블은 방문한 손님 수를 변경할 수 없다.") - @Test - void changeNumberOfGuestsInEmptyTable() { - final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); - final OrderTable expected = changeNumberOfGuestsRequest(4); - assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTableId, expected)) - .isInstanceOf(IllegalStateException.class); - } - - @DisplayName("주문 테이블의 목록을 조회할 수 있다.") - @Test - void findAll() { - orderTableRepository.save(orderTable()); - final List actual = orderTableService.findAll(); - assertThat(actual).hasSize(1); - } - - private OrderTable createOrderTableRequest(final String name) { - final OrderTable orderTable = new OrderTable(); - orderTable.setName(name); - return orderTable; - } - - private OrderTable changeNumberOfGuestsRequest(final int numberOfGuests) { - final OrderTable orderTable = new OrderTable(); - orderTable.setNumberOfGuests(numberOfGuests); - return orderTable; - } -} diff --git a/src/test/java/kitchenpos/application/FakeKitchenridersClient.java b/src/test/java/kitchenpos/eatinorders/application/FakeKitchenridersClient.java similarity index 86% rename from src/test/java/kitchenpos/application/FakeKitchenridersClient.java rename to src/test/java/kitchenpos/eatinorders/application/FakeKitchenridersClient.java index 57747eaa9..301e1377b 100644 --- a/src/test/java/kitchenpos/application/FakeKitchenridersClient.java +++ b/src/test/java/kitchenpos/eatinorders/application/FakeKitchenridersClient.java @@ -1,6 +1,6 @@ -package kitchenpos.application; +package kitchenpos.eatinorders.application; -import kitchenpos.infra.KitchenridersClient; +import kitchenpos.deliveryorders.infra.KitchenridersClient; import java.math.BigDecimal; import java.util.UUID; diff --git a/src/test/java/kitchenpos/application/InMemoryOrderRepository.java b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java similarity index 68% rename from src/test/java/kitchenpos/application/InMemoryOrderRepository.java rename to src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java index 434c9c872..9c0ecfdaf 100644 --- a/src/test/java/kitchenpos/application/InMemoryOrderRepository.java +++ b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java @@ -1,9 +1,9 @@ -package kitchenpos.application; +package kitchenpos.eatinorders.application; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; +import kitchenpos.eatinorders.domain.Order; +import kitchenpos.eatinorders.domain.OrderRepository; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderTable; import java.util.ArrayList; import java.util.HashMap; @@ -34,7 +34,7 @@ public List findAll() { @Override public boolean existsByOrderTableAndStatusNot(final OrderTable orderTable, final OrderStatus status) { return orders.values() - .stream() - .anyMatch(order -> order.getOrderTable().equals(orderTable) && order.getStatus() != status); + .stream() + .anyMatch(order -> order.getOrderTable().equals(orderTable) && order.getStatus() != status); } } diff --git a/src/test/java/kitchenpos/application/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java similarity index 82% rename from src/test/java/kitchenpos/application/InMemoryOrderTableRepository.java rename to src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java index 13e7765c4..663de6289 100644 --- a/src/test/java/kitchenpos/application/InMemoryOrderTableRepository.java +++ b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java @@ -1,7 +1,7 @@ -package kitchenpos.application; +package kitchenpos.eatinorders.application; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; +import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.domain.OrderTableRepository; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/test/java/kitchenpos/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java similarity index 59% rename from src/test/java/kitchenpos/application/OrderServiceTest.java rename to src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index f386f3d93..1b82aa64e 100644 --- a/src/test/java/kitchenpos/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -1,15 +1,24 @@ -package kitchenpos.application; - -import kitchenpos.domain.MenuRepository; -import kitchenpos.domain.Order; -import kitchenpos.domain.OrderLineItem; -import kitchenpos.domain.OrderRepository; -import kitchenpos.domain.OrderStatus; -import kitchenpos.domain.OrderTable; -import kitchenpos.domain.OrderTableRepository; -import kitchenpos.domain.OrderType; +package kitchenpos.eatinorders.application; + +import kitchenpos.eatinorders.domain.Order; +import kitchenpos.eatinorders.domain.OrderLineItem; +import kitchenpos.eatinorders.domain.OrderRepository; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.domain.OrderTableRepository; +import kitchenpos.eatinorders.domain.OrderType; +import static kitchenpos.fixtures.Fixtures.INVALID_ID; +import static kitchenpos.fixtures.MenuFixtures.menu; +import static kitchenpos.fixtures.MenuFixtures.menuProduct; +import static kitchenpos.fixtures.OrderServiceFixture.order; +import static kitchenpos.fixtures.OrderTableFixtures.orderTable; +import kitchenpos.menus.application.InMemoryMenuRepository; +import kitchenpos.menus.domain.MenuRepository; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -26,16 +35,6 @@ import java.util.Random; import java.util.UUID; -import static kitchenpos.Fixtures.INVALID_ID; -import static kitchenpos.Fixtures.menu; -import static kitchenpos.Fixtures.menuProduct; -import static kitchenpos.Fixtures.order; -import static kitchenpos.Fixtures.orderTable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - class OrderServiceTest { private OrderRepository orderRepository; private MenuRepository menuRepository; @@ -52,296 +51,269 @@ void setUp() { orderService = new OrderService(orderRepository, menuRepository, orderTableRepository, kitchenridersClient); } - @DisplayName("1개 이상의 등록된 메뉴로 배달 주문을 등록할 수 있다.") @Test - void createDeliveryOrder() { + void 하나_이상의_등록된_메뉴로_배달_주문을_등록할_수_있다() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest( - OrderType.DELIVERY, "서울시 송파구 위례성대로 2", createOrderLineItemRequest(menuId, 19_000L, 3L) + OrderType.DELIVERY, "서울시 송파구 위례성대로 2", createOrderLineItemRequest(menuId, 19_000L, 3L) ); final Order actual = orderService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1), - () -> assertThat(actual.getDeliveryAddress()).isEqualTo(expected.getDeliveryAddress()) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getType()).isEqualTo(expected.getType()), + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), + () -> assertThat(actual.getOrderDateTime()).isNotNull(), + () -> assertThat(actual.getOrderLineItems()).hasSize(1), + () -> assertThat(actual.getDeliveryAddress()).isEqualTo(expected.getDeliveryAddress()) ); } - @DisplayName("1개 이상의 등록된 메뉴로 포장 주문을 등록할 수 있다.") @Test - void createTakeoutOrder() { + void 하나_이상의_등록된_메뉴로_포장_주문을_등록할_수_있다() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, 3L)); final Order actual = orderService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getType()).isEqualTo(expected.getType()), + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), + () -> assertThat(actual.getOrderDateTime()).isNotNull(), + () -> assertThat(actual.getOrderLineItems()).hasSize(1) ); } - @DisplayName("1개 이상의 등록된 메뉴로 매장 주문을 등록할 수 있다.") @Test - void createEatInOrder() { + void 하나_이상의_등록된_메뉴로_매장_주문을_등록할_수_있다() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); final Order expected = createOrderRequest(OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L)); final Order actual = orderService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1), - () -> assertThat(actual.getOrderTable().getId()).isEqualTo(expected.getOrderTableId()) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getType()).isEqualTo(expected.getType()), + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), + () -> assertThat(actual.getOrderDateTime()).isNotNull(), + () -> assertThat(actual.getOrderLineItems()).hasSize(1), + () -> assertThat(actual.getOrderTable().getId()).isEqualTo(expected.getOrderTableId()) ); } - @DisplayName("주문 유형이 올바르지 않으면 등록할 수 없다.") @NullSource @ParameterizedTest - void create(final OrderType type) { + void 주문_유형이_올바르지_않으면_등록할_수_없다(final OrderType type) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest(type, createOrderLineItemRequest(menuId, 19_000L, 3L)); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("메뉴가 없으면 등록할 수 없다.") @MethodSource("orderLineItems") @ParameterizedTest - void create(final List orderLineItems) { + void 메뉴가_없으면_등록할_수_없다(final List orderLineItems) { final Order expected = createOrderRequest(OrderType.TAKEOUT, orderLineItems); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } private static List orderLineItems() { return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createOrderLineItemRequest(INVALID_ID, 19_000L, 3L))) + null, + Arguments.of(Collections.emptyList()), + Arguments.of(Arrays.asList(createOrderLineItemRequest(INVALID_ID, 19_000L, 3L))) ); } - @DisplayName("매장 주문은 주문 항목의 수량이 0 미만일 수 있다.") @ValueSource(longs = -1L) @ParameterizedTest - void createEatInOrder(final long quantity) { + void 매장_주문은_주문_항목의_수량이_0_미만일_수_있다(final long quantity) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); final Order expected = createOrderRequest( - OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, quantity) + OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, quantity) ); assertDoesNotThrow(() -> orderService.create(expected)); } - @DisplayName("매장 주문을 제외한 주문의 경우 주문 항목의 수량은 0 이상이어야 한다.") @ValueSource(longs = -1L) @ParameterizedTest - void createWithoutEatInOrder(final long quantity) { + void 매장_주문을_제외한_주문의_경우_주문_항목의_수량은_0_이상이어야_한다(final long quantity) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest( - OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, quantity) + OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, quantity) ); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("배달 주소가 올바르지 않으면 배달 주문을 등록할 수 없다.") @NullAndEmptySource @ParameterizedTest - void create(final String deliveryAddress) { + void 배달_주소가_올바르지_않으면_배달_주문을_등록할_수_없다(final String deliveryAddress) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest( - OrderType.DELIVERY, deliveryAddress, createOrderLineItemRequest(menuId, 19_000L, 3L) + OrderType.DELIVERY, deliveryAddress, createOrderLineItemRequest(menuId, 19_000L, 3L) ); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("빈 테이블에는 매장 주문을 등록할 수 없다.") @Test - void createEmptyTableEatInOrder() { + void 빈_테이블에는_매장_주문을_등록할_수_없다() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); final Order expected = createOrderRequest( - OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L) + OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L) ); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("숨겨진 메뉴는 주문할 수 없다.") @Test - void createNotDisplayedMenuOrder() { + void 숨겨진_메뉴는_주문할_수_없다() { final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct())).getId(); final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, 3L)); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다.") @Test - void createNotMatchedMenuPriceOrder() { + void 주문한_메뉴의_가격은_실제_메뉴_가격과_일치해야_한다() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 16_000L, 3L)); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("주문을 접수한다.") @Test - void accept() { + void 주문을_접수한다() { final UUID orderId = orderRepository.save(order(OrderStatus.WAITING, orderTable(true, 4))).getId(); final Order actual = orderService.accept(orderId); assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED); } - @DisplayName("접수 대기 중인 주문만 접수할 수 있다.") @EnumSource(value = OrderStatus.class, names = "WAITING", mode = EnumSource.Mode.EXCLUDE) @ParameterizedTest - void accept(final OrderStatus status) { + void 접수_대기_중인_주문만_접수할_수_있다(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, orderTable(true, 4))).getId(); assertThatThrownBy(() -> orderService.accept(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("배달 주문을 접수되면 배달 대행사를 호출한다.") @Test - void acceptDeliveryOrder() { + void 배달_주문이_접수되면_배달_대행사를_호출한다() { final UUID orderId = orderRepository.save(order(OrderStatus.WAITING, "서울시 송파구 위례성대로 2")).getId(); final Order actual = orderService.accept(orderId); assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED), - () -> assertThat(kitchenridersClient.getOrderId()).isEqualTo(orderId), - () -> assertThat(kitchenridersClient.getDeliveryAddress()).isEqualTo("서울시 송파구 위례성대로 2") + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED), + () -> assertThat(kitchenridersClient.getOrderId()).isEqualTo(orderId), + () -> assertThat(kitchenridersClient.getDeliveryAddress()).isEqualTo("서울시 송파구 위례성대로 2") ); } - @DisplayName("주문을 서빙한다.") @Test - void serve() { + void 주문을_서빙한다() { final UUID orderId = orderRepository.save(order(OrderStatus.ACCEPTED)).getId(); final Order actual = orderService.serve(orderId); assertThat(actual.getStatus()).isEqualTo(OrderStatus.SERVED); } - @DisplayName("접수된 주문만 서빙할 수 있다.") @EnumSource(value = OrderStatus.class, names = "ACCEPTED", mode = EnumSource.Mode.EXCLUDE) @ParameterizedTest - void serve(final OrderStatus status) { + void 접수된_주문만_서빙할_수_있다(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status)).getId(); assertThatThrownBy(() -> orderService.serve(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("주문을 배달한다.") @Test - void startDelivery() { + void 주문을_배달한다() { final UUID orderId = orderRepository.save(order(OrderStatus.SERVED, "서울시 송파구 위례성대로 2")).getId(); final Order actual = orderService.startDelivery(orderId); assertThat(actual.getStatus()).isEqualTo(OrderStatus.DELIVERING); } - @DisplayName("배달 주문만 배달할 수 있다.") @Test - void startDeliveryWithoutDeliveryOrder() { + void 배달_주문만_배달할_수_있다() { final UUID orderId = orderRepository.save(order(OrderStatus.SERVED)).getId(); assertThatThrownBy(() -> orderService.startDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("서빙된 주문만 배달할 수 있다.") @EnumSource(value = OrderStatus.class, names = "SERVED", mode = EnumSource.Mode.EXCLUDE) @ParameterizedTest - void startDelivery(final OrderStatus status) { + void 서빙된_주문만_배달할_수_있다(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); assertThatThrownBy(() -> orderService.startDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("주문을 배달 완료한다.") @Test - void completeDelivery() { + void 주문을_배달_완료한다() { final UUID orderId = orderRepository.save(order(OrderStatus.DELIVERING, "서울시 송파구 위례성대로 2")).getId(); final Order actual = orderService.completeDelivery(orderId); assertThat(actual.getStatus()).isEqualTo(OrderStatus.DELIVERED); } - @DisplayName("배달 중인 주문만 배달 완료할 수 있다.") @EnumSource(value = OrderStatus.class, names = "DELIVERING", mode = EnumSource.Mode.EXCLUDE) @ParameterizedTest - void completeDelivery(final OrderStatus status) { + void 배달_중인_주문만_배달_완료할_수_있다(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); assertThatThrownBy(() -> orderService.completeDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("주문을 완료한다.") @Test - void complete() { + void 주문을_완료한다() { final Order expected = orderRepository.save(order(OrderStatus.DELIVERED, "서울시 송파구 위례성대로 2")); final Order actual = orderService.complete(expected.getId()); assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED); } - @DisplayName("배달 주문의 경우 배달 완료된 주문만 완료할 수 있다.") @EnumSource(value = OrderStatus.class, names = "DELIVERED", mode = EnumSource.Mode.EXCLUDE) @ParameterizedTest - void completeDeliveryOrder(final OrderStatus status) { + void 배달_주문의_경우_배달_완료된_주문만_완료할_수_있다(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); assertThatThrownBy(() -> orderService.complete(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("포장 및 매장 주문의 경우 서빙된 주문만 완료할 수 있다.") @EnumSource(value = OrderStatus.class, names = "SERVED", mode = EnumSource.Mode.EXCLUDE) @ParameterizedTest - void completeTakeoutAndEatInOrder(final OrderStatus status) { + void 포장_및_매장_주문의_경우_서빙된_주문만_완료할_수_있다(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status)).getId(); assertThatThrownBy(() -> orderService.complete(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } - @DisplayName("주문 테이블의 모든 매장 주문이 완료되면 빈 테이블로 설정한다.") @Test - void completeEatInOrder() { + void 주문_테이블의_모든_매장_주문이_완료되면_빈_테이블로_설정한다() { final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); final Order expected = orderRepository.save(order(OrderStatus.SERVED, orderTable)); final Order actual = orderService.complete(expected.getId()); assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isFalse(), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(0) + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isFalse(), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(0) ); } - @DisplayName("완료되지 않은 매장 주문이 있는 주문 테이블은 빈 테이블로 설정하지 않는다.") @Test - void completeNotTable() { + void 완료되지_않은_매장_주문이_있는_주문_테이블은_빈_테이블로_설정하지_않는다() { final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); orderRepository.save(order(OrderStatus.ACCEPTED, orderTable)); final Order expected = orderRepository.save(order(OrderStatus.SERVED, orderTable)); final Order actual = orderService.complete(expected.getId()); assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isTrue(), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(4) + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isTrue(), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(4) ); } - @DisplayName("주문의 목록을 조회할 수 있다.") @Test - void findAll() { + void 주문의_목록을_조회할_수_있다() { final OrderTable orderTable = orderTableRepository.save(orderTable(true, 4)); orderRepository.save(order(OrderStatus.SERVED, orderTable)); orderRepository.save(order(OrderStatus.DELIVERED, "서울시 송파구 위례성대로 2")); @@ -350,9 +322,9 @@ void findAll() { } private Order createOrderRequest( - final OrderType type, - final String deliveryAddress, - final OrderLineItem... orderLineItems + final OrderType type, + final String deliveryAddress, + final OrderLineItem... orderLineItems ) { final Order order = new Order(); order.setType(type); @@ -373,9 +345,9 @@ private Order createOrderRequest(final OrderType orderType, final List assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getName()).isEqualTo(expected.getName()), + () -> assertThat(actual.getNumberOfGuests()).isEqualTo(0), + () -> assertThat(actual.isOccupied()).isFalse() + ); + } + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {" ", " "}) + void 주문_테이블의_이름이_없으면_등록할_수_없다(final String invalidName) { + // given + OrderTable expected = new OrderTable(); + expected.setName(invalidName); + + // when & then + assertThatThrownBy(() -> orderTableService.create(expected)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("주문 테이블 이름이 존재해야 합니다."); + } + + @Test + void 주문_테이블에_손님이_앉으면_사용중_상태로_변경된다() { + // given + OrderTable orderTable = sitOrderTable(UUID.randomUUID(), "1번 테이블", false, 0); + OrderTable expected = orderTableRepository.save(orderTable); + + // when + OrderTable actual = orderTableService.sit(expected.getId()); + + // then + assertThat(actual.isOccupied()).isTrue(); + } + + @Test + void 존재하지_않는_주문_테이블에_손님이_앉으려_하면_예외가_발생한다() { + // given + UUID nonExistentTableId = UUID.randomUUID(); + + // when & then + assertThatThrownBy(() -> orderTableService.sit(nonExistentTableId)) + .isInstanceOf(NoSuchElementException.class) + .hasMessage("주문 테이블이 존재해야 한다."); + } + + @Test + void 주문이_완료된_경우_주문_테이블을_정리할_수_있다() { + // given + OrderTable orderTable = clearOrderTable(UUID.randomUUID(), "1번 테이블", true, 4); + OrderTable expected = orderTableRepository.save(orderTable); + + // when + OrderTable actual = orderTableService.clear(expected.getId()); + + // then + assertAll( + () -> assertThat(actual.getNumberOfGuests()).isEqualTo(0), + () -> assertThat(actual.isOccupied()).isFalse() + ); + } + + @Test + void 주문_테이블의_손님_수를_변경할_수_있다() { + // given + OrderTable orderTable = changeOrderTable(UUID.randomUUID(), "1번 테이블", true, 4); + orderTableRepository.save(orderTable); + + // when + orderTable.setNumberOfGuests(5); + OrderTable updatedTable = orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable); + + // then + assertThat(updatedTable.getNumberOfGuests()).isEqualTo(5); + } + + @Test + void 손님_수가_0_미만이면_변경할_수_없다() { + // given + OrderTable orderTable = changeOrderTable(UUID.randomUUID(), "1번 테이블", true, 4); + orderTableRepository.save(orderTable); + + // when & then + orderTable.setNumberOfGuests(-1); + assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("손님 수가 0명 이상이어야 합니다."); + } + + @Test + void 주문_테이블이_사용중이_아니면_손님_수를_변경할_수_없다() { + // given + OrderTable orderTable = changeOrderTable(UUID.randomUUID(), "1번 테이블", false, 4); + orderTableRepository.save(orderTable); + + // when & then + orderTable.setNumberOfGuests(4); + assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTable.getId(), orderTable)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("주문 테이블이 사용중이어야 합니다."); + } + + @Test + void 등록된_주문_테이블을_모두_조회할_수_있다() { + // given + OrderTable orderTable1 = createOrderTable(UUID.randomUUID(),"1번 테이블"); + orderTableRepository.save(orderTable1); + OrderTable orderTable2 = createOrderTable(UUID.randomUUID(),"2번 테이블"); + orderTableRepository.save(orderTable2); + + // when + List orderTables = orderTableService.findAll(); + + // then + assertThat(orderTables).hasSize(2); + assertAll( + () -> assertThat(orderTable1).isNotNull(), + () -> assertThat(orderTable1.getName()).isEqualTo("1번 테이블") + ); + assertAll( + () -> assertThat(orderTable2).isNotNull(), + () -> assertThat(orderTable2.getName()).isEqualTo("2번 테이블") + ); + } +} diff --git a/src/test/java/kitchenpos/fixtures/Fixtures.java b/src/test/java/kitchenpos/fixtures/Fixtures.java new file mode 100644 index 000000000..6352db95d --- /dev/null +++ b/src/test/java/kitchenpos/fixtures/Fixtures.java @@ -0,0 +1,8 @@ +package kitchenpos.fixtures; + +import java.util.UUID; + +public class Fixtures { + public static final UUID INVALID_ID = new UUID(0L, 0L); + +} diff --git a/src/test/java/kitchenpos/fixtures/OrderServiceFixture.java b/src/test/java/kitchenpos/fixtures/OrderServiceFixture.java new file mode 100644 index 000000000..a1fc65e9f --- /dev/null +++ b/src/test/java/kitchenpos/fixtures/OrderServiceFixture.java @@ -0,0 +1,55 @@ +package kitchenpos.fixtures; + +import kitchenpos.eatinorders.domain.Order; +import kitchenpos.eatinorders.domain.OrderLineItem; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.domain.OrderType; +import static kitchenpos.fixtures.MenuFixtures.menu; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Random; +import java.util.UUID; + +public class OrderServiceFixture { + + public static Order order(final OrderStatus status, final String deliveryAddress) { + final Order order = new Order(); + order.setId(UUID.randomUUID()); + order.setType(OrderType.DELIVERY); + order.setStatus(status); + order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); + order.setOrderLineItems(Arrays.asList(orderLineItem())); + order.setDeliveryAddress(deliveryAddress); + return order; + } + + public static Order order(final OrderStatus status) { + final Order order = new Order(); + order.setId(UUID.randomUUID()); + order.setType(OrderType.TAKEOUT); + order.setStatus(status); + order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); + order.setOrderLineItems(Arrays.asList(orderLineItem())); + return order; + } + + public static Order order(final OrderStatus status, final OrderTable orderTable) { + final Order order = new Order(); + order.setId(UUID.randomUUID()); + order.setType(OrderType.EAT_IN); + order.setStatus(status); + order.setOrderDateTime(LocalDateTime.of(2020, 1, 1, 12, 0)); + order.setOrderLineItems(Arrays.asList(orderLineItem())); + order.setOrderTable(orderTable); + return order; + } + + public static OrderLineItem orderLineItem() { + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setSeq(new Random().nextLong()); + orderLineItem.setMenu(menu()); + return orderLineItem; + } +} diff --git a/src/test/java/kitchenpos/fixtures/OrderTableFixtures.java b/src/test/java/kitchenpos/fixtures/OrderTableFixtures.java new file mode 100644 index 000000000..6cdd3fd36 --- /dev/null +++ b/src/test/java/kitchenpos/fixtures/OrderTableFixtures.java @@ -0,0 +1,61 @@ +package kitchenpos.fixtures; + + +import kitchenpos.eatinorders.domain.OrderTable; + +import java.util.UUID; + +public class OrderTableFixtures { + + public static OrderTable createOrderTable(final String name) { + OrderTable orderTable = new OrderTable(); + orderTable.setName(name); + return orderTable; + } + + public static OrderTable createOrderTable(final UUID uuid, final String name) { + OrderTable orderTable = new OrderTable(); + orderTable.setId(uuid); + orderTable.setName(name); + return orderTable; + } + + public static OrderTable sitOrderTable(final UUID uuid, final String name, final boolean occupied, final int numberOfGuests) { + OrderTable orderTable = new OrderTable(); + orderTable.setId(uuid); + orderTable.setName(name); + orderTable.setOccupied(occupied); + orderTable.setNumberOfGuests(numberOfGuests); + return orderTable; + } + + public static OrderTable clearOrderTable(final UUID uuid, final String name, final boolean occupied, final int numberOfGuests) { + OrderTable orderTable = new OrderTable(); + orderTable.setId(uuid); + orderTable.setName(name); + orderTable.setOccupied(occupied); + orderTable.setNumberOfGuests(numberOfGuests); + return orderTable; + } + + public static OrderTable changeOrderTable(final UUID uuid, final String name, final boolean occupied, final int numberOfGuests) { + OrderTable orderTable = new OrderTable(); + orderTable.setId(uuid); + orderTable.setName(name); + orderTable.setOccupied(occupied); + orderTable.setNumberOfGuests(numberOfGuests); + return orderTable; + } + + /** + * OrderServiceTest + */ + public static OrderTable orderTable(final boolean occupied, final int numberOfGuests) { + final OrderTable orderTable = new OrderTable(); + orderTable.setId(UUID.randomUUID()); + orderTable.setName("1번"); + orderTable.setNumberOfGuests(numberOfGuests); + orderTable.setOccupied(occupied); + return orderTable; + } +} From 8c879dd7b093bdc6a3c670934e5a4ef9b211e24f Mon Sep 17 00:00:00 2001 From: devifancy Date: Mon, 24 Feb 2025 21:32:26 +0900 Subject: [PATCH 10/12] =?UTF-8?q?chore:=20import=EB=AC=B8=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eatinorders/application/OrderTableService.java | 1 - .../java/kitchenpos/eatinorders/domain/Order.java | 14 +++++++------- .../eatinorders/domain/OrderLineItem.java | 6 +++--- .../eatinorders/ui/OrderRestController.java | 2 +- .../eatinorders/ui/OrderTableRestController.java | 6 +++--- .../java/kitchenpos/menus/domain/MenuProduct.java | 6 +++--- .../menus/ui/MenuGroupRestController.java | 2 +- .../kitchenpos/menus/ui/MenuRestController.java | 2 +- .../products/infra/DefaultPurgomalumClient.java | 6 +++--- .../products/ui/ProductRestController.java | 2 +- .../eatinorders/application/OrderServiceTest.java | 9 ++++----- .../application/OrderTableServiceTest.java | 7 +++---- .../menus/application/MenuGroupServiceTest.java | 7 +++---- .../menus/application/MenuServiceTest.java | 3 +-- 14 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java index 209c869d6..990c82f9a 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; @Service diff --git a/src/main/java/kitchenpos/eatinorders/domain/Order.java b/src/main/java/kitchenpos/eatinorders/domain/Order.java index 4a5991301..6290076b0 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/Order.java +++ b/src/main/java/kitchenpos/eatinorders/domain/Order.java @@ -37,10 +37,10 @@ public class Order { @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn( - name = "order_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") + name = "order_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") ) private List orderLineItems; @@ -49,9 +49,9 @@ public class Order { @ManyToOne @JoinColumn( - name = "order_table_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_orders_to_order_table") + name = "order_table_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_orders_to_order_table") ) private OrderTable orderTable; diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index a5fe38278..d1b161f56 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -25,9 +25,9 @@ public class OrderLineItem { @ManyToOne(optional = false) @JoinColumn( - name = "menu_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") + name = "menu_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") ) private Menu menu; diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java index dbb5568ad..31688fcea 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java @@ -28,7 +28,7 @@ public OrderRestController(final OrderService orderService) { public ResponseEntity create(@RequestBody final Order request) { final Order response = orderService.create(request); return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderId}/accept") diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java index 1ceabe86f..f5610e5fd 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java @@ -28,7 +28,7 @@ public OrderTableRestController(final OrderTableService orderTableService) { public ResponseEntity create(@RequestBody final OrderTable request) { final OrderTable response = orderTableService.create(request); return ResponseEntity.created(URI.create("/api/order-tables/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderTableId}/sit") @@ -43,8 +43,8 @@ public ResponseEntity clear(@PathVariable final UUID orderTableId) { @PutMapping("/{orderTableId}/number-of-guests") public ResponseEntity changeNumberOfGuests( - @PathVariable final UUID orderTableId, - @RequestBody final OrderTable request + @PathVariable final UUID orderTableId, + @RequestBody final OrderTable request ) { return ResponseEntity.ok(orderTableService.changeNumberOfGuests(orderTableId, request)); } diff --git a/src/main/java/kitchenpos/menus/domain/MenuProduct.java b/src/main/java/kitchenpos/menus/domain/MenuProduct.java index b47ca26cb..a7372ff21 100644 --- a/src/main/java/kitchenpos/menus/domain/MenuProduct.java +++ b/src/main/java/kitchenpos/menus/domain/MenuProduct.java @@ -24,9 +24,9 @@ public class MenuProduct { @ManyToOne(optional = false) @JoinColumn( - name = "product_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_menu_product_to_product") + name = "product_id", + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_menu_product_to_product") ) private Product product; diff --git a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java index 30c38b4a1..3f7cd1583 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuGroupRestController.java @@ -25,7 +25,7 @@ public MenuGroupRestController(final MenuGroupService menuGroupService) { public ResponseEntity create(@RequestBody final MenuGroup request) { final MenuGroup response = menuGroupService.create(request); return ResponseEntity.created(URI.create("/api/menu-groups/" + response.getId())) - .body(response); + .body(response); } @GetMapping diff --git a/src/main/java/kitchenpos/menus/ui/MenuRestController.java b/src/main/java/kitchenpos/menus/ui/MenuRestController.java index 626b214fc..ab845b418 100644 --- a/src/main/java/kitchenpos/menus/ui/MenuRestController.java +++ b/src/main/java/kitchenpos/menus/ui/MenuRestController.java @@ -28,7 +28,7 @@ public MenuRestController(final MenuService menuService) { public ResponseEntity create(@RequestBody final Menu request) { final Menu response = menuService.create(request); return ResponseEntity.created(URI.create("/api/menus/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{menuId}/price") diff --git a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java index 87dba885c..3c2a5dce7 100644 --- a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java @@ -18,9 +18,9 @@ public DefaultPurgomalumClient(final RestTemplateBuilder restTemplateBuilder) { @Override public boolean containsProfanity(final String text) { final URI url = UriComponentsBuilder.fromUriString("https://www.purgomalum.com/service/containsprofanity") - .queryParam("text", text) - .build() - .toUri(); + .queryParam("text", text) + .build() + .toUri(); return Boolean.parseBoolean(restTemplate.getForObject(url, String.class)); } } diff --git a/src/main/java/kitchenpos/products/ui/ProductRestController.java b/src/main/java/kitchenpos/products/ui/ProductRestController.java index c71c795a4..29f2dda8f 100644 --- a/src/main/java/kitchenpos/products/ui/ProductRestController.java +++ b/src/main/java/kitchenpos/products/ui/ProductRestController.java @@ -28,7 +28,7 @@ public ProductRestController(final ProductService productService) { public ResponseEntity create(@RequestBody final Product request) { final Product response = productService.create(request); return ResponseEntity.created(URI.create("/api/products/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{productId}/price") diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 72e333f13..1b82aa64e 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -14,6 +14,10 @@ import static kitchenpos.fixtures.OrderTableFixtures.orderTable; import kitchenpos.menus.application.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -31,11 +35,6 @@ import java.util.Random; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - class OrderServiceTest { private OrderRepository orderRepository; private MenuRepository menuRepository; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java index 09985a09e..7c51bab22 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderTableServiceTest.java @@ -8,6 +8,9 @@ import static kitchenpos.fixtures.OrderTableFixtures.clearOrderTable; import static kitchenpos.fixtures.OrderTableFixtures.createOrderTable; import static kitchenpos.fixtures.OrderTableFixtures.sitOrderTable; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -18,10 +21,6 @@ import java.util.NoSuchElementException; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - class OrderTableServiceTest { private OrderTableService orderTableService; diff --git a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java index b6ada0915..f6ba64070 100644 --- a/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuGroupServiceTest.java @@ -2,6 +2,9 @@ import kitchenpos.menus.domain.MenuGroup; import kitchenpos.menus.domain.MenuGroupRepository; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -9,10 +12,6 @@ import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; - class MenuGroupServiceTest { private MenuGroupService menuGroupService; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index d5cc00b5f..4cda326db 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -20,6 +20,7 @@ import org.assertj.core.api.Assertions; import org.assertj.core.api.AssertionsForClassTypes; import org.assertj.core.api.AssertionsForInterfaceTypes; +import static org.junit.jupiter.api.Assertions.assertAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -31,8 +32,6 @@ import java.util.NoSuchElementException; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertAll; - class MenuServiceTest { private MenuService menuService; From dcda3d70ce74356b9bd4318b80eb6b66b0cffbaa Mon Sep 17 00:00:00 2001 From: devifancy Date: Wed, 26 Feb 2025 01:57:58 +0900 Subject: [PATCH 11/12] =?UTF-8?q?refactor:=20=EB=B9=84=EC=86=8D=EC=96=B4?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20?= =?UTF-8?q?common=20=EC=9D=98=20infra=20=EB=AA=A8=EB=93=88=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{products => common}/infra/DefaultPurgomalumClient.java | 2 +- .../kitchenpos/{products => common}/infra/PurgomalumClient.java | 2 +- src/main/java/kitchenpos/menus/application/MenuService.java | 2 +- .../java/kitchenpos/products/application/ProductService.java | 2 +- src/test/java/kitchenpos/menus/application/MenuServiceTest.java | 2 +- .../kitchenpos/products/application/FakePurgomalumClient.java | 2 +- .../kitchenpos/products/application/ProductServiceTest.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/kitchenpos/{products => common}/infra/DefaultPurgomalumClient.java (96%) rename src/main/java/kitchenpos/{products => common}/infra/PurgomalumClient.java (70%) diff --git a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java b/src/main/java/kitchenpos/common/infra/DefaultPurgomalumClient.java similarity index 96% rename from src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java rename to src/main/java/kitchenpos/common/infra/DefaultPurgomalumClient.java index 3c2a5dce7..f924c5de5 100644 --- a/src/main/java/kitchenpos/products/infra/DefaultPurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/DefaultPurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra; +package kitchenpos.common.infra; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; diff --git a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java b/src/main/java/kitchenpos/common/infra/PurgomalumClient.java similarity index 70% rename from src/main/java/kitchenpos/products/infra/PurgomalumClient.java rename to src/main/java/kitchenpos/common/infra/PurgomalumClient.java index 4002a2bb8..6f9cb9938 100644 --- a/src/main/java/kitchenpos/products/infra/PurgomalumClient.java +++ b/src/main/java/kitchenpos/common/infra/PurgomalumClient.java @@ -1,4 +1,4 @@ -package kitchenpos.products.infra; +package kitchenpos.common.infra; public interface PurgomalumClient { boolean containsProfanity(String text); diff --git a/src/main/java/kitchenpos/menus/application/MenuService.java b/src/main/java/kitchenpos/menus/application/MenuService.java index 8906f386b..8888c00b3 100644 --- a/src/main/java/kitchenpos/menus/application/MenuService.java +++ b/src/main/java/kitchenpos/menus/application/MenuService.java @@ -8,7 +8,7 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.common.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/kitchenpos/products/application/ProductService.java b/src/main/java/kitchenpos/products/application/ProductService.java index 90cf836d9..f0f847bf9 100644 --- a/src/main/java/kitchenpos/products/application/ProductService.java +++ b/src/main/java/kitchenpos/products/application/ProductService.java @@ -5,7 +5,7 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.common.infra.PurgomalumClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java index 4cda326db..648ee0b67 100644 --- a/src/test/java/kitchenpos/menus/application/MenuServiceTest.java +++ b/src/test/java/kitchenpos/menus/application/MenuServiceTest.java @@ -16,7 +16,7 @@ import kitchenpos.products.application.InMemoryProductRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.common.infra.PurgomalumClient; import org.assertj.core.api.Assertions; import org.assertj.core.api.AssertionsForClassTypes; import org.assertj.core.api.AssertionsForInterfaceTypes; diff --git a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java index ee2787b22..a7625f27e 100644 --- a/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java +++ b/src/test/java/kitchenpos/products/application/FakePurgomalumClient.java @@ -1,6 +1,6 @@ package kitchenpos.products.application; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.common.infra.PurgomalumClient; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/kitchenpos/products/application/ProductServiceTest.java b/src/test/java/kitchenpos/products/application/ProductServiceTest.java index 66dec975d..9f7294ffd 100644 --- a/src/test/java/kitchenpos/products/application/ProductServiceTest.java +++ b/src/test/java/kitchenpos/products/application/ProductServiceTest.java @@ -8,7 +8,7 @@ import kitchenpos.menus.domain.MenuRepository; import kitchenpos.products.domain.Product; import kitchenpos.products.domain.ProductRepository; -import kitchenpos.products.infra.PurgomalumClient; +import kitchenpos.common.infra.PurgomalumClient; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertNotNull; From 90017c93cc374668fea20fa634580c7d311c1d10 Mon Sep 17 00:00:00 2001 From: devifancy Date: Wed, 26 Feb 2025 02:02:42 +0900 Subject: [PATCH 12/12] =?UTF-8?q?refactor:=20JpaRepository=EB=A5=BC=20infr?= =?UTF-8?q?a=20-=20persistence=20=EB=AA=A8=EB=93=88=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{domain => infra/persistence}/JpaOrderRepository.java | 4 +++- .../persistence}/JpaOrderTableRepository.java | 4 +++- .../{domain => infra/persistence}/JpaMenuGroupRepository.java | 4 +++- .../{domain => infra/persistence}/JpaMenuRepository.java | 4 +++- .../{domain => infra/persistence}/JpaProductRepository.java | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) rename src/main/java/kitchenpos/eatinorders/{domain => infra/persistence}/JpaOrderRepository.java (54%) rename src/main/java/kitchenpos/eatinorders/{domain => infra/persistence}/JpaOrderTableRepository.java (55%) rename src/main/java/kitchenpos/menus/{domain => infra/persistence}/JpaMenuGroupRepository.java (58%) rename src/main/java/kitchenpos/menus/{domain => infra/persistence}/JpaMenuRepository.java (79%) rename src/main/java/kitchenpos/products/{domain => infra/persistence}/JpaProductRepository.java (56%) diff --git a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java b/src/main/java/kitchenpos/eatinorders/infra/persistence/JpaOrderRepository.java similarity index 54% rename from src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java rename to src/main/java/kitchenpos/eatinorders/infra/persistence/JpaOrderRepository.java index 01c825c45..3443ddc80 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/eatinorders/infra/persistence/JpaOrderRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.eatinorders.infra.persistence; +import kitchenpos.eatinorders.domain.Order; +import kitchenpos.eatinorders.domain.OrderRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java b/src/main/java/kitchenpos/eatinorders/infra/persistence/JpaOrderTableRepository.java similarity index 55% rename from src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java rename to src/main/java/kitchenpos/eatinorders/infra/persistence/JpaOrderTableRepository.java index 84c0d3c6f..39e540fbc 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/eatinorders/infra/persistence/JpaOrderTableRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.eatinorders.domain; +package kitchenpos.eatinorders.infra.persistence; +import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.domain.OrderTableRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java b/src/main/java/kitchenpos/menus/infra/persistence/JpaMenuGroupRepository.java similarity index 58% rename from src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java rename to src/main/java/kitchenpos/menus/infra/persistence/JpaMenuGroupRepository.java index 233488198..3e2c09464 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuGroupRepository.java +++ b/src/main/java/kitchenpos/menus/infra/persistence/JpaMenuGroupRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra.persistence; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.domain.MenuGroupRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java b/src/main/java/kitchenpos/menus/infra/persistence/JpaMenuRepository.java similarity index 79% rename from src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java rename to src/main/java/kitchenpos/menus/infra/persistence/JpaMenuRepository.java index 796499c30..79d9dda17 100644 --- a/src/main/java/kitchenpos/menus/domain/JpaMenuRepository.java +++ b/src/main/java/kitchenpos/menus/infra/persistence/JpaMenuRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.menus.domain; +package kitchenpos.menus.infra.persistence; +import kitchenpos.menus.domain.Menu; +import kitchenpos.menus.domain.MenuRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/kitchenpos/products/domain/JpaProductRepository.java b/src/main/java/kitchenpos/products/infra/persistence/JpaProductRepository.java similarity index 56% rename from src/main/java/kitchenpos/products/domain/JpaProductRepository.java rename to src/main/java/kitchenpos/products/infra/persistence/JpaProductRepository.java index 90b069779..ba116a2b4 100644 --- a/src/main/java/kitchenpos/products/domain/JpaProductRepository.java +++ b/src/main/java/kitchenpos/products/infra/persistence/JpaProductRepository.java @@ -1,5 +1,7 @@ -package kitchenpos.products.domain; +package kitchenpos.products.infra.persistence; +import kitchenpos.products.domain.Product; +import kitchenpos.products.domain.ProductRepository; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID;