From d6ed4da50f198e55cf0dcb81637d0b27b1715c0c Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 13 Feb 2020 10:33:50 +0900 Subject: [PATCH 01/20] =?UTF-8?q?refactor=20(Number):=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Number.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/calculator/Number.java b/src/main/java/calculator/Number.java index aeb257724..1f2b8371d 100644 --- a/src/main/java/calculator/Number.java +++ b/src/main/java/calculator/Number.java @@ -1,5 +1,7 @@ package calculator; +import java.util.Objects; + /** * @author Geonguk Han * @since 2020-02-12 @@ -8,11 +10,12 @@ public class Number { private final int value; - public Number(String value) { + public Number(final String value) { this(Integer.parseInt(value)); } - public Number(int value) { + public Number(final int value) { + Objects.requireNonNull(value, "can not be null"); this.value = value; validateNumber(); } From e9936901b48ce9bda08c960b327a38ba9ef73358 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 13 Feb 2020 10:34:38 +0900 Subject: [PATCH 02/20] =?UTF-8?q?refactor=20(StringCalculator):=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=A0=88=ED=8D=BC=EB=9F=B0?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/StringCalculator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/calculator/StringCalculator.java b/src/main/java/calculator/StringCalculator.java index a0757c2a0..e4f20fe2b 100644 --- a/src/main/java/calculator/StringCalculator.java +++ b/src/main/java/calculator/StringCalculator.java @@ -26,19 +26,19 @@ public int add(final String input) { if (matcher.find()) { final String delimiter = matcher.group(1); final String[] split = matcher.group(2).split(delimiter); - Numbers numbers = parseToNumbers(split); + final Numbers numbers = parseToNumbers(split); return numbers.sum(); } final String[] split = input.split(DEFAULT_DELIMITER); - Numbers numbers = parseToNumbers(split); + final Numbers numbers = parseToNumbers(split); return numbers.sum(); } private Numbers parseToNumbers(final String[] numbers) { - List collect = Arrays.asList(numbers) + final List collect = Arrays.asList(numbers) .stream() - .map(s -> new Number(s)) + .map(Number::new) .collect(Collectors.toList()); return new Numbers(collect); From c85780eeb538d7a547651876e7362c3d1daf47cc Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 13 Feb 2020 10:40:31 +0900 Subject: [PATCH 03/20] =?UTF-8?q?test=20(ProductBoTest):=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=93=B1=EB=A1=9D,=EC=A1=B0=ED=9A=8C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/bo/ProductBoTest.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/test/java/kitchenpos/bo/ProductBoTest.java diff --git a/src/test/java/kitchenpos/bo/ProductBoTest.java b/src/test/java/kitchenpos/bo/ProductBoTest.java new file mode 100644 index 000000000..dfb8b0a84 --- /dev/null +++ b/src/test/java/kitchenpos/bo/ProductBoTest.java @@ -0,0 +1,91 @@ +package kitchenpos.bo; + +import kitchenpos.dao.ProductDao; +import kitchenpos.model.Product; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.BDDMockito.given; + +/** + * @author Geonguk Han + * @since 2020-02-13 + */ +@ExtendWith(MockitoExtension.class) +class ProductBoTest { + + @InjectMocks + private ProductBo productBo; + + @Mock + private ProductDao productDao; + + @BeforeEach + void init() { + } + + @Test + @DisplayName("상품을 등록한다.") + void productBo_create() { + final Product product = new Product(); + product.setId(1l); + product.setName("짜장면"); + product.setPrice(BigDecimal.valueOf(6000)); + + // given + given(productDao.save(product)).willReturn(product); + + // when + final Product result = productBo.create(product); + + // then + Assertions.assertThat(result.getId()).isEqualTo(product.getId()); + } + + @Test + @DisplayName("상품을 등록 경계값 검증") + void productBo_create_validation() { + final Product product = new Product(); + product.setPrice(BigDecimal.valueOf(-1l)); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> productBo.create(product)); + } + + @Test + @DisplayName("상품 목록 조회") + public void productBo_list() { + // todo: fixture refactoring 대상 + final Product product = new Product(); + product.setId(1l); + product.setName("짜장면"); + product.setPrice(BigDecimal.valueOf(6000)); + + final Product product1 = new Product(); + product1.setId(2l); + product1.setName("짬봉"); + product1.setPrice(BigDecimal.valueOf(7000)); + + final List products = Arrays.asList(product, product1); + + // given + given(productBo.list()).willReturn(products); + + // when + final List result = productBo.list(); + + // then + Assertions.assertThat(result.size()).isEqualTo(products.size()); + } +} \ No newline at end of file From d90d43b90270fc8fc03c5dfcd3c42ba082b0fce8 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 13 Feb 2020 14:22:04 +0900 Subject: [PATCH 04/20] =?UTF-8?q?=20refactor=20(README):=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A4=91=EC=8B=AC=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 +++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 0653d7316..4eddf3aa5 100644 --- a/README.md +++ b/README.md @@ -4,51 +4,50 @@ - 오프라인 매장인 키친 포스를 구현한다. - 상품 (Products) - - [ ] 상품을 등록 한다. - - [ ] 상품은 이름(name)과 가격(price)를 가진다. + - [ ] 상품을 등록 할 수 있다. + - [ ] 상품은 이름과 가격으로 구성 된다. - [ ] 상품의 가격이 올바르지 않으면 등록할 수 없다. - - [ ] 상품을 조회 한다. + - [ ] 상품 목록을 조회 할 수 있다. - 메뉴 그룹 (MenuGroups) - - [ ] 메뉴 그룹을 등록 한다. - - [ ] 메뉴 그룹은 이름(name)를 가진다. - - [ ] 메뉴 그룹들을 조회 한다. + - [ ] 메뉴 그룹을 등록 할 수 있다. + - [ ] 메뉴 그룹은 이름으로 구성 된다. + - [ ] 메뉴 그룹 목록을 조회 할 수 있다. - 메뉴 (Menu) - - [ ] 메뉴를 등록 한다. - - [ ] 메뉴는 이름, 가격, 메뉴그룹Id, 메뉴상품들로 구성된다. + - [ ] 메뉴를 등록 할 수 있다. - [ ] 메뉴의 가격이 올바르지 않으면 등록할 수 없다. - - [ ] 메뉴에 속한 상품 금액의 합은 메뉴의 가격보다 크거나 같아야 한다 - - [ ] 메뉴 상품은 상품Id, 수량으로 배열 형태로 구성된다. - - [ ] 메뉴를 조회 한다. + - [ ] 메뉴 그룹이 존재 하지 않으면 등록할 수 없다. + - [ ] 메뉴의 가격이, 메뉴에 속한 상품 금액의 합 보다 크면 안된다. + - [ ] 메뉴를 조회 할 수 있다. - 테이블 (Table) - - [ ] 전체 테이블들을 조회한다. - - [ ] 특정 테이블을 비움(empty)로 업데이트 할 수 있다. - - [ ] 비움(empty)로 업데이트할 때는 반드시 주문 상태(OrderStatus)가 COMPLETION 인 경우에 가능하다. + - [ ] 주문 테이블을 등록할 수 있다. + - [ ] 주문 테이블 목록을 조회 할 수 있다. + - [ ] 주문 테이블의 상태를 비움으로 업데이트 할 수 있다. + - [ ] 반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다. - [ ] 특정 테이블의 인원수를 업데이트 한다. - - [ ] 인원수를 업데이트 가능한 조건은 GUEST 숫자값이 정상(0보다 큰)값 이어야 한다. - - [ ] 인원수를 업데이트 가능한 조건은 주문테이블이 빈 상태(empty)가 아니어야 한다. - - + - [ ] 인원수는 정상값만 입력 받는다. + - [ ] 주문 테이블이 반드시 존재해야 인원수 없데이트가 가능하다. + - 테이블 그룹 (Table Groups) - - [ ] 주문한 테이블을 등록한다. - - [ ] 테이블 등록이 안되는 경우: 주문 테이블이 비어있거나, 2보다 작은 경우 - - [ ] 테이블 등록이 안되는 경우: 파라미터로 넘기는 주문테이블의 사이즈와 DB에서 찾은 사이즈와 같지 않은 경우 - - [ ] 테이블 그룹을 삭제한다. - - [ ] 테이블 그룹을 삭제할때는 반드시 OrderStatus가 COMPLETION 이어야 한다. + - [ ] 테이블 그룹을 만들 수 있다. + - [ ] 주문테이블이 1개 이상인 경우에 만들 수 있다. + - [ ] 주문테이블의 사이즈와 동일해야 만들 수 있다. + - [ ] 테이블 그룹을 삭제 할 수 있다. + - [ ] 주문 상태가 요리중이거나 먹고있으면 삭제 할 수 없다. - 주문 (Order) - - [ ] 주문을 등록할 수 있다. - - [ ] 등록할 수 없는 경우: orderLineItems 비어있는 경우 - - [ ] 등록할 수 없는 경우: orderLineItems의 size와 menu의 개수가 일치하지 않는 경우 - - [ ] 등록할 수 없는 경우: 주문테이블 id로 조회했을 때 값이 존재하지 않는 경우 - - [ ] 등록할 수 없는 경우: OrderStatus 값이 COMPLETION 인 경우 - - [ ] 주문은 주문테이블Id, 주문Item들로 구성 된다. - - [ ] 주문Item은 메뉴Id, 수량으로 배열 형태로 구성 된다. - - [ ] 전체 주문을 조회 한다. - - [ ] 주문 상태를 업데이트 한다. + - [ ] 주문을 할 수 있다. + - [ ] 아이템이 존재해야 주문을 할 수 있다. + - [ ] 주문한 아이템의 메뉴 개수와 메뉴DB에서 개수와 동일해야 한다. + - [ ] 주문 테이블이 존재해야 한다. + - [ ] 주문을 할때는 주문상태를 COOKING 으로 설정한다. + - [ ] 전체 주문 목록을 조회 할 수 있다. + - [ ] 주문 상태를 업데이트 할 수 있다. - [ ] 주문 상태는 MEAL, COOKING, COMPLETION 으로 구성된다. + - [ ] 주문 번호가 반드시 존재해야지 업데이트 가능하다. + - [ ] 주문의 상태가 완료되면 업데이트 할 수 없다. ## 용어 사전 From 3b4ab4fd8a482e0fe1fb8e1255684d861d1ee248 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 13 Feb 2020 14:31:11 +0900 Subject: [PATCH 05/20] =?UTF-8?q?refactor=20(Numbers):=20pass=20by=20refer?= =?UTF-8?q?ence=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Number.java | 4 ++++ src/main/java/calculator/Numbers.java | 15 ++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/calculator/Number.java b/src/main/java/calculator/Number.java index 1f2b8371d..52a068c84 100644 --- a/src/main/java/calculator/Number.java +++ b/src/main/java/calculator/Number.java @@ -33,4 +33,8 @@ private void validateNumber() { private boolean isNegative() { return value < 0; } + + public Number sum(final Number number) { + return new Number(value + number.getValue()); + } } diff --git a/src/main/java/calculator/Numbers.java b/src/main/java/calculator/Numbers.java index 70382baf4..23a9affd8 100644 --- a/src/main/java/calculator/Numbers.java +++ b/src/main/java/calculator/Numbers.java @@ -1,10 +1,7 @@ package calculator; -import java.util.Arrays; -import java.util.Collection; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; /** * @author Geonguk Han @@ -12,15 +9,15 @@ */ public class Numbers { - private List numbers; + private final List numbers; - public Numbers(List numbers) { - this.numbers = numbers; + public Numbers(final List numbers) { + this.numbers = new ArrayList<>(numbers); } public int sum() { return numbers.stream() - .map(number -> number.getValue()) - .reduce(0, Integer::sum); + .reduce(new Number(0), Number::sum) + .getValue(); } } From 7a401cb6e1289b05b6ccd9a782d08a876d921283 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 10:37:41 +0900 Subject: [PATCH 06/20] =?UTF-8?q?test=20(MenuGroupBoTest):=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/bo/MenuGroupBoTest.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/test/java/kitchenpos/bo/MenuGroupBoTest.java diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java new file mode 100644 index 000000000..9b889df48 --- /dev/null +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -0,0 +1,74 @@ +package kitchenpos.bo; + +import kitchenpos.dao.MenuGroupDao; +import kitchenpos.model.MenuGroup; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; + +/** + * @author Geonguk Han + * @since 2020-02-15 + */ +@ExtendWith(MockitoExtension.class) +class MenuGroupBoTest { + + @Mock + private MenuGroupDao menuGroupDao; + + @InjectMocks + private MenuGroupBo menuGroupBo; + + + @Test + @DisplayName("메뉴 그룹을 등록 할 수 있다.") + void create() { + final MenuGroup menuGroup = getMenuGroup(); + + given(menuGroupDao.save(menuGroup)).willReturn(menuGroup); + + final MenuGroup savedMenuGroup = menuGroupBo.create(menuGroup); + + assertThat(savedMenuGroup).isNotNull(); + assertThat(savedMenuGroup.getId()).isEqualTo(menuGroup.getId()); + + } + + private MenuGroup getMenuGroup() { + final MenuGroup menuGroup = new MenuGroup(); + menuGroup.setId(1l); + menuGroup.setName("짬짜면 세트"); + return menuGroup; + } + + private MenuGroup getMenuGroup2() { + final MenuGroup menuGroup = new MenuGroup(); + menuGroup.setId(2l); + menuGroup.setName("점심 특선 세트"); + return menuGroup; + } + + @Test + @DisplayName("메뉴 그룹 목록을 조회 할 수 있다.") + void list() { + + final List menuGroupList = Arrays.asList(getMenuGroup(), getMenuGroup2()); + given(menuGroupDao.findAll()).willReturn(menuGroupList); + + final List result = menuGroupBo.list(); + + assertThat(menuGroupList).isNotEmpty(); + assertThat(menuGroupList.size()).isEqualTo(result.size()); + + } + +} \ No newline at end of file From a76c968b045928c5ae31748361d09fae2c21406d Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 11:31:26 +0900 Subject: [PATCH 07/20] =?UTF-8?q?test=20(MenuTest):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++++++--------- .../java/kitchenpos/bo/MenuGroupBoTest.java | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 4eddf3aa5..b9298dfae 100644 --- a/README.md +++ b/README.md @@ -5,30 +5,30 @@ - 상품 (Products) - [ ] 상품을 등록 할 수 있다. - - [ ] 상품은 이름과 가격으로 구성 된다. - - [ ] 상품의 가격이 올바르지 않으면 등록할 수 없다. + - [ ] 상품은 이름과 가격으로 구성 된다. + - [ ] 상품의 가격이 올바르지 않으면 등록할 수 없다. - [ ] 상품 목록을 조회 할 수 있다. - 메뉴 그룹 (MenuGroups) - [ ] 메뉴 그룹을 등록 할 수 있다. - - [ ] 메뉴 그룹은 이름으로 구성 된다. + - [ ] 메뉴 그룹은 이름으로 구성 된다. - [ ] 메뉴 그룹 목록을 조회 할 수 있다. - 메뉴 (Menu) - [ ] 메뉴를 등록 할 수 있다. - - [ ] 메뉴의 가격이 올바르지 않으면 등록할 수 없다. - - [ ] 메뉴 그룹이 존재 하지 않으면 등록할 수 없다. - - [ ] 메뉴의 가격이, 메뉴에 속한 상품 금액의 합 보다 크면 안된다. + - [ ] 메뉴의 가격이 올바르지 않으면 등록할 수 없다. + - [ ] 메뉴 그룹이 존재 하지 않으면 등록할 수 없다. + - [ ] 메뉴의 가격이, 메뉴에 속한 상품 금액의 합 보다 크면 안된다. - [ ] 메뉴를 조회 할 수 있다. - 테이블 (Table) - [ ] 주문 테이블을 등록할 수 있다. - [ ] 주문 테이블 목록을 조회 할 수 있다. - [ ] 주문 테이블의 상태를 비움으로 업데이트 할 수 있다. - - [ ] 반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다. + - [ ] 반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다. - [ ] 특정 테이블의 인원수를 업데이트 한다. - - [ ] 인원수는 정상값만 입력 받는다. - - [ ] 주문 테이블이 반드시 존재해야 인원수 없데이트가 가능하다. + - [ ] 인원수는 정상값만 입력 받는다. + - [ ] 주문 테이블이 반드시 존재해야 인원수 없데이트가 가능하다. - 테이블 그룹 (Table Groups) - [ ] 테이블 그룹을 만들 수 있다. diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index 9b889df48..9309574bf 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -46,14 +46,14 @@ void create() { private MenuGroup getMenuGroup() { final MenuGroup menuGroup = new MenuGroup(); menuGroup.setId(1l); - menuGroup.setName("짬짜면 세트"); + menuGroup.setName("면 요리 세트"); return menuGroup; } private MenuGroup getMenuGroup2() { final MenuGroup menuGroup = new MenuGroup(); menuGroup.setId(2l); - menuGroup.setName("점심 특선 세트"); + menuGroup.setName("밥 요리 세트"); return menuGroup; } From f641567723efd2148f22372eeadbf358fe618a7a Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 11:34:21 +0900 Subject: [PATCH 08/20] =?UTF-8?q?test=20(MenuTest):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/main/application.properties | 5 + .../V1__Initialize_project_tables.sql | 86 +++++++++++ .../db/migration/V2__Insert_default_data.sql | 34 +++++ bin/main/static/empty.txt | 0 bin/main/templates/empty.txt | 0 src/test/java/kitchenpos/bo/Fixtures.java | 47 ++++++ src/test/java/kitchenpos/bo/MenuBoTest.java | 142 ++++++++++++++++++ 7 files changed, 314 insertions(+) create mode 100644 bin/main/application.properties create mode 100644 bin/main/db/migration/V1__Initialize_project_tables.sql create mode 100644 bin/main/db/migration/V2__Insert_default_data.sql create mode 100644 bin/main/static/empty.txt create mode 100644 bin/main/templates/empty.txt create mode 100644 src/test/java/kitchenpos/bo/Fixtures.java create mode 100644 src/test/java/kitchenpos/bo/MenuBoTest.java diff --git a/bin/main/application.properties b/bin/main/application.properties new file mode 100644 index 000000000..f02ce7bd2 --- /dev/null +++ b/bin/main/application.properties @@ -0,0 +1,5 @@ +logging.level.org.springframework.jdbc=TRACE +spring.datasource.data=classpath*:db/data.sql +spring.datasource.schema=classpath*:db/schema.sql +spring.h2.console.enabled=true +spring.http.encoding.force=true diff --git a/bin/main/db/migration/V1__Initialize_project_tables.sql b/bin/main/db/migration/V1__Initialize_project_tables.sql new file mode 100644 index 000000000..8425ba344 --- /dev/null +++ b/bin/main/db/migration/V1__Initialize_project_tables.sql @@ -0,0 +1,86 @@ +CREATE TABLE orders ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + order_table_id BIGINT(20) NOT NULL, + order_status VARCHAR(255) NOT NULL, + ordered_time DATETIME NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE order_line_item ( + seq BIGINT(20) NOT NULL AUTO_INCREMENT, + order_id BIGINT(20) NOT NULL, + menu_id BIGINT(20) NOT NULL, + quantity BIGINT(20) NOT NULL, + PRIMARY KEY (seq) +); + +CREATE TABLE menu ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + price DECIMAL(19, 2) NOT NULL, + menu_group_id BIGINT(20) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE menu_group ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE menu_product ( + seq BIGINT(20) NOT NULL AUTO_INCREMENT, + menu_id BIGINT(20) NOT NULL, + product_id BIGINT(20) NOT NULL, + quantity BIGINT(20) NOT NULL, + PRIMARY KEY (seq) +); + +CREATE TABLE order_table ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + table_group_id BIGINT(20), + number_of_guests INT(11) NOT NULL, + empty BIT(1) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE table_group ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + created_date DATETIME NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE product ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + price DECIMAL(19, 2) NOT NULL, + PRIMARY KEY (id) +); + +ALTER TABLE orders + ADD CONSTRAINT fk_orders_order_table + FOREIGN KEY (order_table_id) REFERENCES order_table (id); + +ALTER TABLE order_line_item + ADD CONSTRAINT fk_order_line_item_orders + FOREIGN KEY (order_id) REFERENCES orders (id); + +ALTER TABLE order_line_item + ADD CONSTRAINT fk_order_line_item_menu + FOREIGN KEY (menu_id) REFERENCES menu (id); + +ALTER TABLE menu + ADD CONSTRAINT fk_menu_menu_group + FOREIGN KEY (menu_group_id) REFERENCES menu_group (id); + +ALTER TABLE menu_product + ADD CONSTRAINT fk_menu_product_menu + FOREIGN KEY (menu_id) REFERENCES menu (id); + +ALTER TABLE menu_product + ADD CONSTRAINT fk_menu_product_product + FOREIGN KEY (product_id) REFERENCES product (id); + +ALTER TABLE order_table + ADD CONSTRAINT fk_order_table_table_group + FOREIGN KEY (table_group_id) REFERENCES table_group (id); diff --git a/bin/main/db/migration/V2__Insert_default_data.sql b/bin/main/db/migration/V2__Insert_default_data.sql new file mode 100644 index 000000000..92951b266 --- /dev/null +++ b/bin/main/db/migration/V2__Insert_default_data.sql @@ -0,0 +1,34 @@ +INSERT INTO menu_group (id, name) VALUES (1, '두마리메뉴'); +INSERT INTO menu_group (id, name) VALUES (2, '한마리메뉴'); +INSERT INTO menu_group (id, name) VALUES (3, '순살파닭두마리메뉴'); +INSERT INTO menu_group (id, name) VALUES (4, '신메뉴'); + +INSERT INTO product (id, name, price) VALUES (1, '후라이드', 16000); +INSERT INTO product (id, name, price) VALUES (2, '양념치킨', 16000); +INSERT INTO product (id, name, price) VALUES (3, '반반치킨', 16000); +INSERT INTO product (id, name, price) VALUES (4, '통구이', 16000); +INSERT INTO product (id, name, price) VALUES (5, '간장치킨', 17000); +INSERT INTO product (id, name, price) VALUES (6, '순살치킨', 17000); + +INSERT INTO menu (id, name, price, menu_group_id) VALUES (1, '후라이드치킨', 16000, 2); +INSERT INTO menu (id, name, price, menu_group_id) VALUES (2, '양념치킨', 16000, 2); +INSERT INTO menu (id, name, price, menu_group_id) VALUES (3, '반반치킨', 16000, 2); +INSERT INTO menu (id, name, price, menu_group_id) VALUES (4, '통구이', 16000, 2); +INSERT INTO menu (id, name, price, menu_group_id) VALUES (5, '간장치킨', 17000, 2); +INSERT INTO menu (id, name, price, menu_group_id) VALUES (6, '순살치킨', 17000, 2); + +INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (1, 1, 1); +INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (2, 2, 1); +INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (3, 3, 1); +INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (4, 4, 1); +INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (5, 5, 1); +INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (6, 6, 1); + +INSERT INTO order_table (id, number_of_guests, empty) VALUES (1, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (2, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (3, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (4, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (5, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (6, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (7, 0, true); +INSERT INTO order_table (id, number_of_guests, empty) VALUES (8, 0, true); diff --git a/bin/main/static/empty.txt b/bin/main/static/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/bin/main/templates/empty.txt b/bin/main/templates/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java new file mode 100644 index 000000000..a07845d32 --- /dev/null +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -0,0 +1,47 @@ +package kitchenpos.bo; + +import kitchenpos.model.MenuGroup; +import kitchenpos.model.Product; +import org.junit.jupiter.api.BeforeAll; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * @author Geonguk Han + * @since 2020-02-15 + */ +public class Fixtures { + + public static List products = Collections.emptyList(); + public static List menuGroups = Collections.emptyList(); + + @BeforeAll + public static void setUp() { + final Product product = new Product(); + product.setId(1l); + product.setName("짜장면"); + product.setPrice(BigDecimal.valueOf(6000)); + + final Product product1 = new Product(); + product1.setId(2l); + product1.setName("짬봉"); + product1.setPrice(BigDecimal.valueOf(7000)); + + products = Arrays.asList(product, product1); + + + final MenuGroup menuGroup = new MenuGroup(); + menuGroup.setId(1l); + menuGroup.setName("면 요리 세트"); + + + final MenuGroup menuGroup1 = new MenuGroup(); + menuGroup1.setId(2l); + menuGroup1.setName("밥 요리 세트"); + + menuGroups = Arrays.asList(menuGroup, menuGroup1); + } +} diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java new file mode 100644 index 000000000..9a14263c4 --- /dev/null +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -0,0 +1,142 @@ +package kitchenpos.bo; + +import kitchenpos.dao.MenuDao; +import kitchenpos.dao.MenuGroupDao; +import kitchenpos.dao.MenuProductDao; +import kitchenpos.dao.ProductDao; +import kitchenpos.model.Menu; +import kitchenpos.model.MenuProduct; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.BDDMockito.given; + +/** + * @author Geonguk Han + * @since 2020-02-15 + */ +@ExtendWith(MockitoExtension.class) +class MenuBoTest extends Fixtures { + + @InjectMocks + private MenuBo menuBo; + + @Mock + private MenuDao menuDao; + + @Mock + private MenuGroupDao menuGroupDao; + + @Mock + private MenuProductDao menuProductDao; + + @Mock + private ProductDao productDao; + + + @Test + @DisplayName("메뉴를 등록 할 수 있다.") + void create() { + final Menu menu = new Menu(); + menu.setId(1l); + menu.setName("주문1"); + menu.setPrice(BigDecimal.valueOf(13_000l)); + menu.setMenuGroupId(menuGroups.get(0).getId()); + + final MenuProduct menuProduct = new MenuProduct(); + menuProduct.setSeq(1l); + menuProduct.setMenuId(1l); + menuProduct.setProductId(1l); + menuProduct.setQuantity(1); + + final MenuProduct menuProduct1 = new MenuProduct(); + menuProduct1.setSeq(2l); + menuProduct1.setMenuId(1l); + menuProduct1.setProductId(2l); + menuProduct1.setQuantity(1); + + menu.setMenuProducts(Arrays.asList(menuProduct, menuProduct1)); + + given(menuDao.save(menu)).willReturn(menu); + given(menuGroupDao.existsById(menu.getMenuGroupId())).willReturn(true); + given(productDao.findById(menuProduct.getProductId())).willReturn(Optional.of(products.get(0))); + given(productDao.findById(menuProduct1.getProductId())).willReturn(Optional.of(products.get(1))); + + final Menu savedMenu = menuBo.create(menu); + + assertThat(savedMenu).isNotNull(); + assertThat(savedMenu.getId()).isEqualTo(menu.getId()); + } + + @ParameterizedTest + @NullSource + @ValueSource(strings = {"-1", "-16000"}) + @DisplayName("메뉴의 가격이 바르지 않으면 등록할 수 없다.") + void create_price_validation(final BigDecimal price) { + final Menu menu = new Menu(); + menu.setId(1l); + menu.setName("주문1"); + menu.setPrice(price); + menu.setMenuGroupId(menuGroups.get(0).getId()); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> menuBo.create(menu)); + } + + + @Test + @DisplayName("메뉴 그룹이 존재 하지 않으면 등록할 수 없다.") + void create_not_exist_groupId() { + final Menu menu = new Menu(); + menu.setId(1l); + menu.setName("주문1"); + menu.setPrice(BigDecimal.valueOf(6000l)); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> menuBo.create(menu)); + } + + @Test + @DisplayName("메뉴의 가격이, 메뉴에 속한 상품 금액의 합 보다 크면 안된다.") + void create_price_isEqualTo_product_sum() { + final Menu menu = new Menu(); + menu.setId(1l); + menu.setName("주문1"); + menu.setPrice(BigDecimal.valueOf(15_000l)); + menu.setMenuGroupId(menuGroups.get(0).getId()); + + final MenuProduct menuProduct = new MenuProduct(); + menuProduct.setSeq(1l); + menuProduct.setMenuId(1l); + menuProduct.setProductId(1l); + menuProduct.setQuantity(1); + + final MenuProduct menuProduct1 = new MenuProduct(); + menuProduct1.setSeq(2l); + menuProduct1.setMenuId(1l); + menuProduct1.setProductId(2l); + menuProduct1.setQuantity(1); + + menu.setMenuProducts(Arrays.asList(menuProduct, menuProduct1)); + + given(menuGroupDao.existsById(menu.getMenuGroupId())).willReturn(true); + given(productDao.findById(menuProduct.getProductId())).willReturn(Optional.of(products.get(0))); + given(productDao.findById(menuProduct1.getProductId())).willReturn(Optional.of(products.get(1))); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> menuBo.create(menu)); + } +} \ No newline at end of file From b650506b9ece37cd3d47d7e618c448cae1599e3c Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 12:03:54 +0900 Subject: [PATCH 09/20] =?UTF-8?q?refactor=20(Fixtures):=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=EC=98=81=EC=97=AD=20Fixture=EB=A1=9C=20=EB=B9=BC?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/bo/Fixtures.java | 44 +++++++++-- src/test/java/kitchenpos/bo/MenuBoTest.java | 75 +++++-------------- .../java/kitchenpos/bo/MenuGroupBoTest.java | 21 +----- .../java/kitchenpos/bo/ProductBoTest.java | 37 +++------ 4 files changed, 68 insertions(+), 109 deletions(-) diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java index a07845d32..c9233948a 100644 --- a/src/test/java/kitchenpos/bo/Fixtures.java +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -1,6 +1,8 @@ package kitchenpos.bo; +import kitchenpos.model.Menu; import kitchenpos.model.MenuGroup; +import kitchenpos.model.MenuProduct; import kitchenpos.model.Product; import org.junit.jupiter.api.BeforeAll; @@ -15,33 +17,63 @@ */ public class Fixtures { + public static final long FIRST_ID = 1l; + public static final long SECOND_ID = 2l; + public static final int QUANTITY_ONE = 1; + public static List products = Collections.emptyList(); public static List menuGroups = Collections.emptyList(); + public static Menu menu; + public static List menuProducts = Collections.emptyList(); @BeforeAll public static void setUp() { + /* 상품 등록 */ final Product product = new Product(); - product.setId(1l); + product.setId(FIRST_ID); product.setName("짜장면"); product.setPrice(BigDecimal.valueOf(6000)); final Product product1 = new Product(); - product1.setId(2l); + product1.setId(FIRST_ID); product1.setName("짬봉"); product1.setPrice(BigDecimal.valueOf(7000)); products = Arrays.asList(product, product1); - + /* 메뉴 그룹 등록 */ final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(1l); + menuGroup.setId(FIRST_ID); menuGroup.setName("면 요리 세트"); - final MenuGroup menuGroup1 = new MenuGroup(); - menuGroup1.setId(2l); + menuGroup1.setId(SECOND_ID); menuGroup1.setName("밥 요리 세트"); menuGroups = Arrays.asList(menuGroup, menuGroup1); + + /* 메뉴 등록 */ + final Menu newMenu = new Menu(); + newMenu.setId(FIRST_ID); + newMenu.setName("메뉴"); + newMenu.setPrice(product.getPrice().add(product1.getPrice())); + newMenu.setMenuGroupId(menuGroups.get(0).getId()); + + menu = newMenu; + + /* 메뉴 상품 등록 */ + final MenuProduct menuProduct = new MenuProduct(); + menuProduct.setSeq(FIRST_ID); + menuProduct.setMenuId(FIRST_ID); + menuProduct.setProductId(FIRST_ID); + menuProduct.setQuantity(QUANTITY_ONE); + + final MenuProduct menuProduct1 = new MenuProduct(); + menuProduct1.setSeq(SECOND_ID); + menuProduct1.setMenuId(FIRST_ID); + menuProduct1.setProductId(SECOND_ID); + menuProduct1.setQuantity(QUANTITY_ONE); + + menuProducts = Arrays.asList(menuProduct, menuProduct1); } } diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java index 9a14263c4..4898359fb 100644 --- a/src/test/java/kitchenpos/bo/MenuBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -5,7 +5,6 @@ import kitchenpos.dao.MenuProductDao; import kitchenpos.dao.ProductDao; import kitchenpos.model.Menu; -import kitchenpos.model.MenuProduct; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,7 +16,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigDecimal; -import java.util.Arrays; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @@ -40,40 +38,21 @@ class MenuBoTest extends Fixtures { @Mock private MenuGroupDao menuGroupDao; - @Mock - private MenuProductDao menuProductDao; - @Mock private ProductDao productDao; + @Mock + private MenuProductDao menuProductDao; @Test @DisplayName("메뉴를 등록 할 수 있다.") void create() { - final Menu menu = new Menu(); - menu.setId(1l); - menu.setName("주문1"); - menu.setPrice(BigDecimal.valueOf(13_000l)); - menu.setMenuGroupId(menuGroups.get(0).getId()); - - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(1l); - menuProduct.setMenuId(1l); - menuProduct.setProductId(1l); - menuProduct.setQuantity(1); - - final MenuProduct menuProduct1 = new MenuProduct(); - menuProduct1.setSeq(2l); - menuProduct1.setMenuId(1l); - menuProduct1.setProductId(2l); - menuProduct1.setQuantity(1); - - menu.setMenuProducts(Arrays.asList(menuProduct, menuProduct1)); + menu.setMenuProducts(menuProducts); given(menuDao.save(menu)).willReturn(menu); given(menuGroupDao.existsById(menu.getMenuGroupId())).willReturn(true); - given(productDao.findById(menuProduct.getProductId())).willReturn(Optional.of(products.get(0))); - given(productDao.findById(menuProduct1.getProductId())).willReturn(Optional.of(products.get(1))); + given(productDao.findById(menuProducts.get(0).getProductId())).willReturn(Optional.of(products.get(0))); + given(productDao.findById(menuProducts.get(1).getProductId())).willReturn(Optional.of(products.get(1))); final Menu savedMenu = menuBo.create(menu); @@ -86,24 +65,19 @@ void create() { @ValueSource(strings = {"-1", "-16000"}) @DisplayName("메뉴의 가격이 바르지 않으면 등록할 수 없다.") void create_price_validation(final BigDecimal price) { - final Menu menu = new Menu(); - menu.setId(1l); - menu.setName("주문1"); - menu.setPrice(price); - menu.setMenuGroupId(menuGroups.get(0).getId()); + final Menu resolvedMenu = menu; + resolvedMenu.setPrice(price); assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> menuBo.create(menu)); + .isThrownBy(() -> menuBo.create(resolvedMenu)); } @Test @DisplayName("메뉴 그룹이 존재 하지 않으면 등록할 수 없다.") void create_not_exist_groupId() { - final Menu menu = new Menu(); - menu.setId(1l); - menu.setName("주문1"); - menu.setPrice(BigDecimal.valueOf(6000l)); + final Menu resolvedMenu = menu; + resolvedMenu.setMenuGroupId(null); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> menuBo.create(menu)); @@ -112,29 +86,16 @@ void create_not_exist_groupId() { @Test @DisplayName("메뉴의 가격이, 메뉴에 속한 상품 금액의 합 보다 크면 안된다.") void create_price_isEqualTo_product_sum() { - final Menu menu = new Menu(); - menu.setId(1l); - menu.setName("주문1"); - menu.setPrice(BigDecimal.valueOf(15_000l)); - menu.setMenuGroupId(menuGroups.get(0).getId()); - - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(1l); - menuProduct.setMenuId(1l); - menuProduct.setProductId(1l); - menuProduct.setQuantity(1); - - final MenuProduct menuProduct1 = new MenuProduct(); - menuProduct1.setSeq(2l); - menuProduct1.setMenuId(1l); - menuProduct1.setProductId(2l); - menuProduct1.setQuantity(1); - - menu.setMenuProducts(Arrays.asList(menuProduct, menuProduct1)); + final Menu resolvedMenu = menu; + resolvedMenu.setPrice(BigDecimal.valueOf(15_000)); + + menu.setMenuProducts(menuProducts); given(menuGroupDao.existsById(menu.getMenuGroupId())).willReturn(true); - given(productDao.findById(menuProduct.getProductId())).willReturn(Optional.of(products.get(0))); - given(productDao.findById(menuProduct1.getProductId())).willReturn(Optional.of(products.get(1))); + given(productDao.findById(menuProducts.get(0).getProductId())) + .willReturn(Optional.of(products.get(0))); + given(productDao.findById(menuProducts.get(1).getProductId())) + .willReturn(Optional.of(products.get(1))); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> menuBo.create(menu)); diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index 9309574bf..6c00fe4d2 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -9,7 +9,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -20,7 +19,7 @@ * @since 2020-02-15 */ @ExtendWith(MockitoExtension.class) -class MenuGroupBoTest { +class MenuGroupBoTest extends Fixtures { @Mock private MenuGroupDao menuGroupDao; @@ -32,7 +31,7 @@ class MenuGroupBoTest { @Test @DisplayName("메뉴 그룹을 등록 할 수 있다.") void create() { - final MenuGroup menuGroup = getMenuGroup(); + final MenuGroup menuGroup = menuGroups.get(0); given(menuGroupDao.save(menuGroup)).willReturn(menuGroup); @@ -43,25 +42,11 @@ void create() { } - private MenuGroup getMenuGroup() { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(1l); - menuGroup.setName("면 요리 세트"); - return menuGroup; - } - - private MenuGroup getMenuGroup2() { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(2l); - menuGroup.setName("밥 요리 세트"); - return menuGroup; - } - @Test @DisplayName("메뉴 그룹 목록을 조회 할 수 있다.") void list() { - final List menuGroupList = Arrays.asList(getMenuGroup(), getMenuGroup2()); + final List menuGroupList = menuGroups; given(menuGroupDao.findAll()).willReturn(menuGroupList); final List result = menuGroupBo.list(); diff --git a/src/test/java/kitchenpos/bo/ProductBoTest.java b/src/test/java/kitchenpos/bo/ProductBoTest.java index dfb8b0a84..5c9924291 100644 --- a/src/test/java/kitchenpos/bo/ProductBoTest.java +++ b/src/test/java/kitchenpos/bo/ProductBoTest.java @@ -7,12 +7,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigDecimal; -import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -23,7 +24,7 @@ * @since 2020-02-13 */ @ExtendWith(MockitoExtension.class) -class ProductBoTest { +class ProductBoTest extends Fixtures { @InjectMocks private ProductBo productBo; @@ -38,26 +39,22 @@ void init() { @Test @DisplayName("상품을 등록한다.") void productBo_create() { - final Product product = new Product(); - product.setId(1l); - product.setName("짜장면"); - product.setPrice(BigDecimal.valueOf(6000)); - // given + final Product product = products.get(0); + given(productDao.save(product)).willReturn(product); - // when final Product result = productBo.create(product); - // then Assertions.assertThat(result.getId()).isEqualTo(product.getId()); } - @Test + @ParameterizedTest + @ValueSource(strings = {"-1", "-8000"}) @DisplayName("상품을 등록 경계값 검증") - void productBo_create_validation() { + void productBo_create_validation(final BigDecimal price) { final Product product = new Product(); - product.setPrice(BigDecimal.valueOf(-1l)); + product.setPrice(price); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> productBo.create(product)); @@ -66,26 +63,10 @@ void productBo_create_validation() { @Test @DisplayName("상품 목록 조회") public void productBo_list() { - // todo: fixture refactoring 대상 - final Product product = new Product(); - product.setId(1l); - product.setName("짜장면"); - product.setPrice(BigDecimal.valueOf(6000)); - - final Product product1 = new Product(); - product1.setId(2l); - product1.setName("짬봉"); - product1.setPrice(BigDecimal.valueOf(7000)); - - final List products = Arrays.asList(product, product1); - - // given given(productBo.list()).willReturn(products); - // when final List result = productBo.list(); - // then Assertions.assertThat(result.size()).isEqualTo(products.size()); } } \ No newline at end of file From e5bb6a9618475de93f5dc66370c7ef767f7f1ff4 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 12:52:35 +0900 Subject: [PATCH 10/20] =?UTF-8?q?test=20(TableBoTest):=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/test/java/kitchenpos/bo/TableBoTest.java | 136 +++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 src/test/java/kitchenpos/bo/TableBoTest.java diff --git a/README.md b/README.md index b9298dfae..fe40597b0 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ - [ ] 주문 테이블을 등록할 수 있다. - [ ] 주문 테이블 목록을 조회 할 수 있다. - [ ] 주문 테이블의 상태를 비움으로 업데이트 할 수 있다. + - [ ] 주문 테이블이 정상값 이어야 한다. - [ ] 반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다. - [ ] 특정 테이블의 인원수를 업데이트 한다. - [ ] 인원수는 정상값만 입력 받는다. diff --git a/src/test/java/kitchenpos/bo/TableBoTest.java b/src/test/java/kitchenpos/bo/TableBoTest.java new file mode 100644 index 000000000..52dee9cbc --- /dev/null +++ b/src/test/java/kitchenpos/bo/TableBoTest.java @@ -0,0 +1,136 @@ +package kitchenpos.bo; + +import kitchenpos.dao.OrderDao; +import kitchenpos.dao.OrderTableDao; +import kitchenpos.model.OrderStatus; +import kitchenpos.model.OrderTable; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.BDDMockito.given; + +/** + * @author Geonguk Han + * @since 2020-02-15 + */ +@ExtendWith(MockitoExtension.class) +class TableBoTest extends Fixtures { + + @InjectMocks + private TableBo tableBo; + + @Mock + private OrderDao orderDao; + + @Mock + private OrderTableDao orderTableDao; + + @Test + @DisplayName("주문 테이블을 등록할 수 있다.") + void create() { + final OrderTable orderTable = getOrderTable(); + + given(orderTableDao.save(orderTable)).willReturn(orderTable); + + final OrderTable savedOrderTable = tableBo.create(orderTable); + + assertThat(savedOrderTable).isNotNull(); + assertThat(savedOrderTable.getNumberOfGuests()).isEqualTo(orderTable.getNumberOfGuests()); + } + + private OrderTable getOrderTable() { + final OrderTable orderTable = new OrderTable(); + orderTable.setId(FIRST_ID); + orderTable.setTableGroupId(FIRST_ID); + orderTable.setNumberOfGuests(2); + orderTable.setEmpty(false); + return orderTable; + } + + private OrderTable getOrderTableWithNullTableGroup() { + final OrderTable orderTable = getOrderTable(); + orderTable.setTableGroupId(null); + return orderTable; + } + + @Test + @DisplayName("주문 테이블 목록을 조회 할 수 있다.") + void list() { + final OrderTable orderTable = getOrderTable(); + final List orderTables = Arrays.asList(orderTable); + + given(orderTableDao.findAll()).willReturn(orderTables); + + final List list = tableBo.list(); + + assertThat(list).isNotEmpty(); + assertThat(list.size()).isEqualTo(orderTables.size()); + } + + @Test + @DisplayName("주문 테이블의 상태를 비움으로 업데이트 할 수 있다.") + void changeEmpty() { + final OrderTable orderTable = getOrderTableWithNullTableGroup(); + final OrderTable newOrderTable = getOrderTable(); + + given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); + given(orderDao.existsByOrderTableIdAndOrderStatusIn(orderTable.getId(), + Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willReturn(false); + given(orderTableDao.save(orderTable)).willReturn(newOrderTable); + + final OrderTable result = tableBo.changeEmpty(orderTable.getId(), newOrderTable); + + assertThat(result.isEmpty()).isEqualTo(newOrderTable.isEmpty()); + } + + @ParameterizedTest + @ValueSource(strings = {"-1"}) + @DisplayName("주문 테이블이 정상 값이 아닌 경우") + void changeEmpty_exist_tableGroupId(final Long orderTableId) { + final OrderTable orderTable = getOrderTable(); + orderTable.setId(orderTableId); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> tableBo.changeEmpty(orderTableId, orderTable)); + } + + @Test + @DisplayName("반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다.") + void changeEmpty_check_orderStatus() { + final OrderTable orderTable = getOrderTableWithNullTableGroup(); + + given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); + given(orderDao.existsByOrderTableIdAndOrderStatusIn(orderTable.getId(), + Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willThrow(IllegalArgumentException.class); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> tableBo.changeEmpty(FIRST_ID, orderTable)); + } + + @Test + @DisplayName("특정 테이블의 인원수를 업데이트 한다.") + void changeNumberOfGuests() { + final OrderTable orderTable = getOrderTable(); + final OrderTable newOrderTable = getOrderTable(); + newOrderTable.setNumberOfGuests(4); + + given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); + given(orderTableDao.save(orderTable)).willReturn(orderTable); + + final OrderTable result = tableBo.changeNumberOfGuests(orderTable.getId(), newOrderTable); + + assertThat(result.getNumberOfGuests()).isEqualTo(newOrderTable.getNumberOfGuests()); + } +} \ No newline at end of file From 1b1887367ecef9071004ccf6833df8c74e2120db Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 19:54:28 +0900 Subject: [PATCH 11/20] =?UTF-8?q?test=20(TableGroupBoTest):=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +- src/test/java/kitchenpos/bo/Fixtures.java | 32 +++- src/test/java/kitchenpos/bo/TableBoTest.java | 34 +--- .../java/kitchenpos/bo/TableGroupBoTest.java | 159 ++++++++++++++++++ 4 files changed, 202 insertions(+), 37 deletions(-) create mode 100644 src/test/java/kitchenpos/bo/TableGroupBoTest.java diff --git a/README.md b/README.md index fe40597b0..f84f5b262 100644 --- a/README.md +++ b/README.md @@ -33,17 +33,17 @@ - 테이블 그룹 (Table Groups) - [ ] 테이블 그룹을 만들 수 있다. - - [ ] 주문테이블이 1개 이상인 경우에 만들 수 있다. - - [ ] 주문테이블의 사이즈와 동일해야 만들 수 있다. + - [ ] 주문테이블이 1개 이상인 경우에 만들 수 있다. + - [ ] 주문테이블의 사이즈와 동일해야 만들 수 있다. - [ ] 테이블 그룹을 삭제 할 수 있다. - - [ ] 주문 상태가 요리중이거나 먹고있으면 삭제 할 수 없다. + - [ ] 주문 상태가 요리중이거나 먹고있으면 삭제 할 수 없다. - 주문 (Order) - [ ] 주문을 할 수 있다. - - [ ] 아이템이 존재해야 주문을 할 수 있다. - - [ ] 주문한 아이템의 메뉴 개수와 메뉴DB에서 개수와 동일해야 한다. - - [ ] 주문 테이블이 존재해야 한다. - - [ ] 주문을 할때는 주문상태를 COOKING 으로 설정한다. + - [ ] 아이템이 존재해야 주문을 할 수 있다. + - [ ] 주문한 아이템의 메뉴 개수와 메뉴DB에서 개수와 동일해야 한다. + - [ ] 주문 테이블이 존재해야 한다. + - [ ] 주문을 할때는 주문상태를 COOKING 으로 설정한다. - [ ] 전체 주문 목록을 조회 할 수 있다. - [ ] 주문 상태를 업데이트 할 수 있다. - [ ] 주문 상태는 MEAL, COOKING, COMPLETION 으로 구성된다. diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java index c9233948a..1a0198688 100644 --- a/src/test/java/kitchenpos/bo/Fixtures.java +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -1,9 +1,6 @@ package kitchenpos.bo; -import kitchenpos.model.Menu; -import kitchenpos.model.MenuGroup; -import kitchenpos.model.MenuProduct; -import kitchenpos.model.Product; +import kitchenpos.model.*; import org.junit.jupiter.api.BeforeAll; import java.math.BigDecimal; @@ -25,6 +22,9 @@ public class Fixtures { public static List menuGroups = Collections.emptyList(); public static Menu menu; public static List menuProducts = Collections.emptyList(); + public static List orderTables = Collections.emptyList(); + public static OrderTable orderTable; + @BeforeAll public static void setUp() { @@ -75,5 +75,29 @@ public static void setUp() { menuProduct1.setQuantity(QUANTITY_ONE); menuProducts = Arrays.asList(menuProduct, menuProduct1); + + /* 주문 테이블 등록 */ + final OrderTable newOrderTable = new OrderTable(); + newOrderTable.setId(FIRST_ID); + newOrderTable.setTableGroupId(FIRST_ID); + newOrderTable.setNumberOfGuests(2); + newOrderTable.setEmpty(false); + + orderTable = newOrderTable; + + final OrderTable newOrderTable1 = new OrderTable(); + newOrderTable1.setId(SECOND_ID); + newOrderTable1.setTableGroupId(FIRST_ID); + newOrderTable1.setNumberOfGuests(4); + newOrderTable1.setEmpty(false); + + final OrderTable newOrderTable2 = new OrderTable(); + newOrderTable2.setId(3l); + newOrderTable2.setTableGroupId(FIRST_ID); + newOrderTable2.setNumberOfGuests(4); + newOrderTable2.setEmpty(false); + + orderTables = Arrays.asList(newOrderTable, newOrderTable1, newOrderTable2); + } } diff --git a/src/test/java/kitchenpos/bo/TableBoTest.java b/src/test/java/kitchenpos/bo/TableBoTest.java index 52dee9cbc..2bf2738e0 100644 --- a/src/test/java/kitchenpos/bo/TableBoTest.java +++ b/src/test/java/kitchenpos/bo/TableBoTest.java @@ -40,8 +40,6 @@ class TableBoTest extends Fixtures { @Test @DisplayName("주문 테이블을 등록할 수 있다.") void create() { - final OrderTable orderTable = getOrderTable(); - given(orderTableDao.save(orderTable)).willReturn(orderTable); final OrderTable savedOrderTable = tableBo.create(orderTable); @@ -50,25 +48,9 @@ void create() { assertThat(savedOrderTable.getNumberOfGuests()).isEqualTo(orderTable.getNumberOfGuests()); } - private OrderTable getOrderTable() { - final OrderTable orderTable = new OrderTable(); - orderTable.setId(FIRST_ID); - orderTable.setTableGroupId(FIRST_ID); - orderTable.setNumberOfGuests(2); - orderTable.setEmpty(false); - return orderTable; - } - - private OrderTable getOrderTableWithNullTableGroup() { - final OrderTable orderTable = getOrderTable(); - orderTable.setTableGroupId(null); - return orderTable; - } - @Test @DisplayName("주문 테이블 목록을 조회 할 수 있다.") void list() { - final OrderTable orderTable = getOrderTable(); final List orderTables = Arrays.asList(orderTable); given(orderTableDao.findAll()).willReturn(orderTables); @@ -82,8 +64,9 @@ void list() { @Test @DisplayName("주문 테이블의 상태를 비움으로 업데이트 할 수 있다.") void changeEmpty() { - final OrderTable orderTable = getOrderTableWithNullTableGroup(); - final OrderTable newOrderTable = getOrderTable(); + + final OrderTable newOrderTable = orderTable; + newOrderTable.setTableGroupId(null); given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); given(orderDao.existsByOrderTableIdAndOrderStatusIn(orderTable.getId(), @@ -99,7 +82,6 @@ void changeEmpty() { @ValueSource(strings = {"-1"}) @DisplayName("주문 테이블이 정상 값이 아닌 경우") void changeEmpty_exist_tableGroupId(final Long orderTableId) { - final OrderTable orderTable = getOrderTable(); orderTable.setId(orderTableId); assertThatExceptionOfType(IllegalArgumentException.class) @@ -109,21 +91,21 @@ void changeEmpty_exist_tableGroupId(final Long orderTableId) { @Test @DisplayName("반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다.") void changeEmpty_check_orderStatus() { - final OrderTable orderTable = getOrderTableWithNullTableGroup(); + final OrderTable resolvedOrderTable = orderTable; + resolvedOrderTable.setTableGroupId(null); given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); - given(orderDao.existsByOrderTableIdAndOrderStatusIn(orderTable.getId(), + given(orderDao.existsByOrderTableIdAndOrderStatusIn(resolvedOrderTable.getId(), Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willThrow(IllegalArgumentException.class); assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> tableBo.changeEmpty(FIRST_ID, orderTable)); + .isThrownBy(() -> tableBo.changeEmpty(orderTable.getId(), orderTable)); } @Test @DisplayName("특정 테이블의 인원수를 업데이트 한다.") void changeNumberOfGuests() { - final OrderTable orderTable = getOrderTable(); - final OrderTable newOrderTable = getOrderTable(); + final OrderTable newOrderTable = orderTable; newOrderTable.setNumberOfGuests(4); given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); diff --git a/src/test/java/kitchenpos/bo/TableGroupBoTest.java b/src/test/java/kitchenpos/bo/TableGroupBoTest.java new file mode 100644 index 000000000..72a575f22 --- /dev/null +++ b/src/test/java/kitchenpos/bo/TableGroupBoTest.java @@ -0,0 +1,159 @@ +package kitchenpos.bo; + +import kitchenpos.dao.OrderDao; +import kitchenpos.dao.OrderTableDao; +import kitchenpos.dao.TableGroupDao; +import kitchenpos.model.OrderStatus; +import kitchenpos.model.OrderTable; +import kitchenpos.model.TableGroup; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.BDDMockito.given; + +/** + * @author Geonguk Han + * @since 2020-02-15 + */ +@ExtendWith(MockitoExtension.class) +class TableGroupBoTest extends Fixtures { + + @InjectMocks + private TableGroupBo tableGroupBo; + + @Mock + private OrderDao orderDao; + + @Mock + private OrderTableDao orderTableDao; + + @Mock + private TableGroupDao tableGroupDao; + + @Test + @DisplayName("테이블 그룹을 만들 수 있다.") + void create() { + final TableGroup tableGroup = new TableGroup(); + tableGroup.setId(1l); + + final OrderTable orderTable = new OrderTable(); + orderTable.setId(1l); + orderTable.setEmpty(true); + + final OrderTable orderTable1 = new OrderTable(); + orderTable1.setId(2l); + orderTable1.setEmpty(true); + + final List orderTables = Arrays.asList(orderTable, orderTable1); + tableGroup.setOrderTables(orderTables); + + final List orderTableIds = orderTables.stream().map(OrderTable::getId).collect(Collectors.toList()); + + given(orderTableDao.findAllByIdIn(orderTableIds)).willReturn(orderTables); + given(tableGroupDao.save(tableGroup)).willReturn(tableGroup); + + final TableGroup result = tableGroupBo.create(tableGroup); + + assertThat(result).isNotNull(); + assertThat(result.getOrderTables().size()).isEqualTo(orderTables.size()); + } + + @Test + @DisplayName("주문테이블이 1개 이상인 경우에 만들 수 있다.") + void create_orderTable_validation() { + final TableGroup tableGroup = new TableGroup(); + tableGroup.setId(1l); + + final OrderTable orderTable = new OrderTable(); + orderTable.setId(1l); + orderTable.setEmpty(true); + + final List orderTables = Arrays.asList(orderTable); + tableGroup.setOrderTables(orderTables); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> tableGroupBo.create(tableGroup)); + } + + @Test + @DisplayName("주문테이블의 사이즈와 동일해야 만들 수 있다.") + void create_orderTable_size() { + final TableGroup tableGroup = new TableGroup(); + tableGroup.setId(1l); + + final OrderTable orderTable = new OrderTable(); + orderTable.setId(1l); + orderTable.setEmpty(true); + + + final OrderTable orderTable1 = new OrderTable(); + orderTable1.setId(2l); + orderTable1.setEmpty(true); + + final List orderTables = Arrays.asList(orderTable, orderTable1); + tableGroup.setOrderTables(orderTables); + + final List orderTableIds = orderTables.stream().map(OrderTable::getId).collect(Collectors.toList()); + + given(orderTableDao.findAllByIdIn(orderTableIds)).willReturn(Arrays.asList(orderTable)); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> tableGroupBo.create(tableGroup)); + } + + @Test + @DisplayName("테이블 그룹을 삭제 할 수 있다.") + void delete() { + final TableGroup tableGroup = new TableGroup(); + tableGroup.setId(1l); + tableGroup.setOrderTables(orderTables); + + final List orderTableIds = orderTables.stream().map(OrderTable::getId).collect(Collectors.toList()); + + final List result = Fixtures.orderTables; + result.forEach(res -> res.setTableGroupId(null)); + + given(orderTableDao.findAllByTableGroupId(tableGroup.getId())).willReturn(Fixtures.orderTables); + given(orderDao.existsByOrderTableIdInAndOrderStatusIn(orderTableIds, + Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willReturn(false); + given(orderTableDao.save(Fixtures.orderTables.get(0))).willReturn(result.get(0)); + given(orderTableDao.save(Fixtures.orderTables.get(1))).willReturn(result.get(1)); + given(orderTableDao.save(Fixtures.orderTables.get(2))).willReturn(result.get(2)); + + tableGroupBo.delete(tableGroup.getId()); + + assertThat(result.get(0).getTableGroupId()).isNull(); + assertThat(result.get(1).getTableGroupId()).isNull(); + assertThat(result.get(2).getTableGroupId()).isNull(); + } + + @Test + @DisplayName("주문 상태가 요리중이거나 먹고있으면 삭제 할 수 없다.") + void delete_OrderStatus_cooking_or_meal() { + final TableGroup tableGroup = new TableGroup(); + tableGroup.setId(1l); + tableGroup.setOrderTables(orderTables); + + final List orderTableIds = orderTables.stream().map(OrderTable::getId).collect(Collectors.toList()); + + final List result = Fixtures.orderTables; + result.forEach(res -> res.setTableGroupId(null)); + + given(orderTableDao.findAllByTableGroupId(tableGroup.getId())).willReturn(Fixtures.orderTables); + given(orderDao.existsByOrderTableIdInAndOrderStatusIn(orderTableIds, + Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willThrow(IllegalArgumentException.class); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> tableGroupBo.delete(tableGroup.getId())); + } +} \ No newline at end of file From ba515e2427a5d3ef9b46a770dc29ee91a26f23e1 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 20:35:31 +0900 Subject: [PATCH 12/20] =?UTF-8?q?test=20(OrderBoTest):=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- src/test/java/kitchenpos/bo/OrderBoTest.java | 221 +++++++++++++++++++ 2 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 src/test/java/kitchenpos/bo/OrderBoTest.java diff --git a/README.md b/README.md index f84f5b262..bf81353b3 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ - [ ] 주문을 할때는 주문상태를 COOKING 으로 설정한다. - [ ] 전체 주문 목록을 조회 할 수 있다. - [ ] 주문 상태를 업데이트 할 수 있다. - - [ ] 주문 상태는 MEAL, COOKING, COMPLETION 으로 구성된다. - - [ ] 주문 번호가 반드시 존재해야지 업데이트 가능하다. - - [ ] 주문의 상태가 완료되면 업데이트 할 수 없다. + - [ ] 주문 상태는 MEAL, COOKING, COMPLETION 으로 구성된다. + - [ ] 주문 번호가 반드시 존재해야지 업데이트 가능하다. + - [ ] 주문의 상태가 완료되면 업데이트 할 수 없다. ## 용어 사전 diff --git a/src/test/java/kitchenpos/bo/OrderBoTest.java b/src/test/java/kitchenpos/bo/OrderBoTest.java new file mode 100644 index 000000000..b9096dd48 --- /dev/null +++ b/src/test/java/kitchenpos/bo/OrderBoTest.java @@ -0,0 +1,221 @@ +package kitchenpos.bo; + +import kitchenpos.dao.MenuDao; +import kitchenpos.dao.OrderDao; +import kitchenpos.dao.OrderLineItemDao; +import kitchenpos.dao.OrderTableDao; +import kitchenpos.model.Order; +import kitchenpos.model.OrderLineItem; +import kitchenpos.model.OrderStatus; +import kitchenpos.model.OrderTable; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.BDDMockito.given; + +/** + * @author Geonguk Han + * @since 2020-02-15 + */ +@ExtendWith(MockitoExtension.class) +class OrderBoTest extends Fixtures { + + @InjectMocks + private OrderBo orderBo; + + @Mock + private MenuDao menuDao; + + @Mock + private OrderDao orderDao; + + @Mock + private OrderLineItemDao orderLineItemDao; + + @Mock + private OrderTableDao orderTableDao; + + @Test + @DisplayName("주문의 아이템이 없는 경우") + void create_empty_orderLineItem() { + final Order order = new Order(); + order.setOrderLineItems(Collections.emptyList()); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> orderBo.create(order)); + } + + @Test + @DisplayName("주문의 아이템과 메뉴의 숫자가 일치하지 않는 경우") + void create_notEqual_menuItem_size() { + final Order order = new Order(); + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setMenuId(1l); + + final OrderLineItem orderLineItem1 = new OrderLineItem(); + orderLineItem1.setMenuId(2l); + order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); + + given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), + orderLineItem1.getMenuId()))).willReturn(3l); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> orderBo.create(order)); + } + + @Test + @DisplayName("주문 테이블이 존재하지 않는 경우") + void create_notExist_orderTable() { + final Order order = new Order(); + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setMenuId(1l); + + final OrderLineItem orderLineItem1 = new OrderLineItem(); + orderLineItem1.setMenuId(2l); + order.setOrderTableId(1l); + order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); + + given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), + orderLineItem1.getMenuId()))).willReturn(2l); + given(orderTableDao.findById(order.getOrderTableId())).willThrow(IllegalArgumentException.class); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> orderBo.create(order)); + } + + @Test + @DisplayName("주문 테이블이 빈 테이블인 경우") + void create_empty_orderTable() { + final Order order = new Order(); + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setMenuId(1l); + + final OrderLineItem orderLineItem1 = new OrderLineItem(); + orderLineItem1.setMenuId(2l); + order.setOrderTableId(1l); + order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); + + final OrderTable orderTable = Fixtures.orderTable; + orderTable.setEmpty(true); + + given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), + orderLineItem1.getMenuId()))).willReturn(2l); + given(orderTableDao.findById(order.getOrderTableId())).willReturn(Optional.of(orderTable)); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> orderBo.create(order)); + } + + @Test + @DisplayName("주문 테이블이 정상 등록") + void create_success() { + final Order order = new Order(); + order.setOrderTableId(1l); + + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setMenuId(1l); + + final OrderLineItem orderLineItem1 = new OrderLineItem(); + orderLineItem1.setMenuId(2l); + + order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); + + final OrderTable orderTable = Fixtures.orderTable; + orderTable.setEmpty(false); + + given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), + orderLineItem1.getMenuId()))).willReturn(2l); + given(orderTableDao.findById(order.getOrderTableId())).willReturn(Optional.of(orderTable)); + given(orderDao.save(order)).willReturn(order); + given(orderLineItemDao.save(orderLineItem)).willReturn(orderLineItem); + given(orderLineItemDao.save(orderLineItem1)).willReturn(orderLineItem1); + + final Order result = orderBo.create(order); + + assertThat(result).isNotNull(); + } + + @Test + @DisplayName("주문 목록을 조회 할 수 있다.") + void list() { + final Order order = new Order(); + order.setId(1l); + + final OrderLineItem orderLineItem = new OrderLineItem(); + orderLineItem.setOrderId(1l); + + final OrderLineItem orderLineItem1 = new OrderLineItem(); + orderLineItem1.setOrderId(1l); + + final List orderLineItems = Arrays.asList(orderLineItem, orderLineItem1); + order.setOrderLineItems(orderLineItems); + + given(orderDao.findAll()).willReturn(Arrays.asList(order)); + + given(orderLineItemDao.findAllByOrderId(order.getId())).willReturn(orderLineItems); + + final List list = orderBo.list(); + + assertThat(list).isNotEmpty(); + assertThat(list.get(0).getOrderLineItems().size()).isEqualTo(orderLineItems.size()); + } + + @Test + @DisplayName("주문이 존재 하지 않는 경우") + void changeOrderStatus_notExist_order() { + final Order order = new Order(); + order.setId(1l); + + given(orderDao.findById(order.getId())).willThrow(IllegalArgumentException.class); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> orderBo.changeOrderStatus(order.getId(), order)); + } + + @Test + @DisplayName("주문이 완료된 경우") + void changeOrderStatus_completed_order() { + final Order order = new Order(); + order.setId(1l); + order.setOrderStatus(OrderStatus.COMPLETION.name()); + + given(orderDao.findById(order.getId())).willReturn(Optional.of(order)); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> orderBo.changeOrderStatus(order.getId(), order)); + } + + @Test + @DisplayName("주문 상태를 변경 하는 경우") + void changeOrderStatus_success() { + final Order order = new Order(); + order.setId(1l); + order.setOrderStatus(OrderStatus.COOKING.name()); + + final Order updatedOrder = new Order(); + updatedOrder.setId(1l); + updatedOrder.setOrderStatus(OrderStatus.MEAL.name()); + + given(orderDao.findById(order.getId())).willReturn(Optional.of(order)); + given(orderDao.save(order)).willReturn(updatedOrder); + given(orderLineItemDao.findAllByOrderId(order.getId())).willReturn(Arrays.asList(new OrderLineItem())); + + final Order result = orderBo.changeOrderStatus(order.getId(), updatedOrder); + + assertThat(result).isNotNull(); + assertThat(result.getOrderStatus()).isEqualTo(updatedOrder.getOrderStatus()); + } + + +} \ No newline at end of file From c427f246b5d4edc278975a37866e4545895adbe9 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sat, 15 Feb 2020 20:43:36 +0900 Subject: [PATCH 13/20] style (TestPackage): formatting & indent --- src/test/java/kitchenpos/bo/Fixtures.java | 2 -- src/test/java/kitchenpos/bo/MenuBoTest.java | 1 - src/test/java/kitchenpos/bo/MenuGroupBoTest.java | 2 -- src/test/java/kitchenpos/bo/OrderBoTest.java | 2 -- src/test/java/kitchenpos/bo/ProductBoTest.java | 5 ----- src/test/java/kitchenpos/bo/TableBoTest.java | 1 - 6 files changed, 13 deletions(-) diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java index 1a0198688..1369869ef 100644 --- a/src/test/java/kitchenpos/bo/Fixtures.java +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -25,7 +25,6 @@ public class Fixtures { public static List orderTables = Collections.emptyList(); public static OrderTable orderTable; - @BeforeAll public static void setUp() { /* 상품 등록 */ @@ -98,6 +97,5 @@ public static void setUp() { newOrderTable2.setEmpty(false); orderTables = Arrays.asList(newOrderTable, newOrderTable1, newOrderTable2); - } } diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java index 4898359fb..79bd0b138 100644 --- a/src/test/java/kitchenpos/bo/MenuBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -72,7 +72,6 @@ void create_price_validation(final BigDecimal price) { .isThrownBy(() -> menuBo.create(resolvedMenu)); } - @Test @DisplayName("메뉴 그룹이 존재 하지 않으면 등록할 수 없다.") void create_not_exist_groupId() { diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index 6c00fe4d2..a2b478ccb 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -39,7 +39,6 @@ void create() { assertThat(savedMenuGroup).isNotNull(); assertThat(savedMenuGroup.getId()).isEqualTo(menuGroup.getId()); - } @Test @@ -53,7 +52,6 @@ void list() { assertThat(menuGroupList).isNotEmpty(); assertThat(menuGroupList.size()).isEqualTo(result.size()); - } } \ No newline at end of file diff --git a/src/test/java/kitchenpos/bo/OrderBoTest.java b/src/test/java/kitchenpos/bo/OrderBoTest.java index b9096dd48..cb4ea3623 100644 --- a/src/test/java/kitchenpos/bo/OrderBoTest.java +++ b/src/test/java/kitchenpos/bo/OrderBoTest.java @@ -216,6 +216,4 @@ void changeOrderStatus_success() { assertThat(result).isNotNull(); assertThat(result.getOrderStatus()).isEqualTo(updatedOrder.getOrderStatus()); } - - } \ No newline at end of file diff --git a/src/test/java/kitchenpos/bo/ProductBoTest.java b/src/test/java/kitchenpos/bo/ProductBoTest.java index 5c9924291..30473fb3c 100644 --- a/src/test/java/kitchenpos/bo/ProductBoTest.java +++ b/src/test/java/kitchenpos/bo/ProductBoTest.java @@ -3,7 +3,6 @@ import kitchenpos.dao.ProductDao; import kitchenpos.model.Product; import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -32,10 +31,6 @@ class ProductBoTest extends Fixtures { @Mock private ProductDao productDao; - @BeforeEach - void init() { - } - @Test @DisplayName("상품을 등록한다.") void productBo_create() { diff --git a/src/test/java/kitchenpos/bo/TableBoTest.java b/src/test/java/kitchenpos/bo/TableBoTest.java index 2bf2738e0..6dfed5edc 100644 --- a/src/test/java/kitchenpos/bo/TableBoTest.java +++ b/src/test/java/kitchenpos/bo/TableBoTest.java @@ -64,7 +64,6 @@ void list() { @Test @DisplayName("주문 테이블의 상태를 비움으로 업데이트 할 수 있다.") void changeEmpty() { - final OrderTable newOrderTable = orderTable; newOrderTable.setTableGroupId(null); From d4305735f76b82ba3519492635868c2a958303ea Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Mon, 17 Feb 2020 18:34:40 +0900 Subject: [PATCH 14/20] delete bin directory --- .gitignore | 2 + bin/main/application.properties | 5 -- .../V1__Initialize_project_tables.sql | 86 ------------------- .../db/migration/V2__Insert_default_data.sql | 34 -------- bin/main/static/empty.txt | 0 bin/main/templates/empty.txt | 0 6 files changed, 2 insertions(+), 125 deletions(-) delete mode 100644 bin/main/application.properties delete mode 100644 bin/main/db/migration/V1__Initialize_project_tables.sql delete mode 100644 bin/main/db/migration/V2__Insert_default_data.sql delete mode 100644 bin/main/static/empty.txt delete mode 100644 bin/main/templates/empty.txt diff --git a/.gitignore b/.gitignore index 6c0187813..c62ae6bad 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ build/ *.iml *.ipr out/ +bin/ + ### NetBeans ### /nbproject/private/ diff --git a/bin/main/application.properties b/bin/main/application.properties deleted file mode 100644 index f02ce7bd2..000000000 --- a/bin/main/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -logging.level.org.springframework.jdbc=TRACE -spring.datasource.data=classpath*:db/data.sql -spring.datasource.schema=classpath*:db/schema.sql -spring.h2.console.enabled=true -spring.http.encoding.force=true diff --git a/bin/main/db/migration/V1__Initialize_project_tables.sql b/bin/main/db/migration/V1__Initialize_project_tables.sql deleted file mode 100644 index 8425ba344..000000000 --- a/bin/main/db/migration/V1__Initialize_project_tables.sql +++ /dev/null @@ -1,86 +0,0 @@ -CREATE TABLE orders ( - id BIGINT(20) NOT NULL AUTO_INCREMENT, - order_table_id BIGINT(20) NOT NULL, - order_status VARCHAR(255) NOT NULL, - ordered_time DATETIME NOT NULL, - PRIMARY KEY (id) -); - -CREATE TABLE order_line_item ( - seq BIGINT(20) NOT NULL AUTO_INCREMENT, - order_id BIGINT(20) NOT NULL, - menu_id BIGINT(20) NOT NULL, - quantity BIGINT(20) NOT NULL, - PRIMARY KEY (seq) -); - -CREATE TABLE menu ( - id BIGINT(20) NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - price DECIMAL(19, 2) NOT NULL, - menu_group_id BIGINT(20) NOT NULL, - PRIMARY KEY (id) -); - -CREATE TABLE menu_group ( - id BIGINT(20) NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - PRIMARY KEY (id) -); - -CREATE TABLE menu_product ( - seq BIGINT(20) NOT NULL AUTO_INCREMENT, - menu_id BIGINT(20) NOT NULL, - product_id BIGINT(20) NOT NULL, - quantity BIGINT(20) NOT NULL, - PRIMARY KEY (seq) -); - -CREATE TABLE order_table ( - id BIGINT(20) NOT NULL AUTO_INCREMENT, - table_group_id BIGINT(20), - number_of_guests INT(11) NOT NULL, - empty BIT(1) NOT NULL, - PRIMARY KEY (id) -); - -CREATE TABLE table_group ( - id BIGINT(20) NOT NULL AUTO_INCREMENT, - created_date DATETIME NOT NULL, - PRIMARY KEY (id) -); - -CREATE TABLE product ( - id BIGINT(20) NOT NULL AUTO_INCREMENT, - name VARCHAR(255) NOT NULL, - price DECIMAL(19, 2) NOT NULL, - PRIMARY KEY (id) -); - -ALTER TABLE orders - ADD CONSTRAINT fk_orders_order_table - FOREIGN KEY (order_table_id) REFERENCES order_table (id); - -ALTER TABLE order_line_item - ADD CONSTRAINT fk_order_line_item_orders - FOREIGN KEY (order_id) REFERENCES orders (id); - -ALTER TABLE order_line_item - ADD CONSTRAINT fk_order_line_item_menu - FOREIGN KEY (menu_id) REFERENCES menu (id); - -ALTER TABLE menu - ADD CONSTRAINT fk_menu_menu_group - FOREIGN KEY (menu_group_id) REFERENCES menu_group (id); - -ALTER TABLE menu_product - ADD CONSTRAINT fk_menu_product_menu - FOREIGN KEY (menu_id) REFERENCES menu (id); - -ALTER TABLE menu_product - ADD CONSTRAINT fk_menu_product_product - FOREIGN KEY (product_id) REFERENCES product (id); - -ALTER TABLE order_table - ADD CONSTRAINT fk_order_table_table_group - FOREIGN KEY (table_group_id) REFERENCES table_group (id); diff --git a/bin/main/db/migration/V2__Insert_default_data.sql b/bin/main/db/migration/V2__Insert_default_data.sql deleted file mode 100644 index 92951b266..000000000 --- a/bin/main/db/migration/V2__Insert_default_data.sql +++ /dev/null @@ -1,34 +0,0 @@ -INSERT INTO menu_group (id, name) VALUES (1, '두마리메뉴'); -INSERT INTO menu_group (id, name) VALUES (2, '한마리메뉴'); -INSERT INTO menu_group (id, name) VALUES (3, '순살파닭두마리메뉴'); -INSERT INTO menu_group (id, name) VALUES (4, '신메뉴'); - -INSERT INTO product (id, name, price) VALUES (1, '후라이드', 16000); -INSERT INTO product (id, name, price) VALUES (2, '양념치킨', 16000); -INSERT INTO product (id, name, price) VALUES (3, '반반치킨', 16000); -INSERT INTO product (id, name, price) VALUES (4, '통구이', 16000); -INSERT INTO product (id, name, price) VALUES (5, '간장치킨', 17000); -INSERT INTO product (id, name, price) VALUES (6, '순살치킨', 17000); - -INSERT INTO menu (id, name, price, menu_group_id) VALUES (1, '후라이드치킨', 16000, 2); -INSERT INTO menu (id, name, price, menu_group_id) VALUES (2, '양념치킨', 16000, 2); -INSERT INTO menu (id, name, price, menu_group_id) VALUES (3, '반반치킨', 16000, 2); -INSERT INTO menu (id, name, price, menu_group_id) VALUES (4, '통구이', 16000, 2); -INSERT INTO menu (id, name, price, menu_group_id) VALUES (5, '간장치킨', 17000, 2); -INSERT INTO menu (id, name, price, menu_group_id) VALUES (6, '순살치킨', 17000, 2); - -INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (1, 1, 1); -INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (2, 2, 1); -INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (3, 3, 1); -INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (4, 4, 1); -INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (5, 5, 1); -INSERT INTO menu_product (menu_id, product_id, quantity) VALUES (6, 6, 1); - -INSERT INTO order_table (id, number_of_guests, empty) VALUES (1, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (2, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (3, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (4, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (5, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (6, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (7, 0, true); -INSERT INTO order_table (id, number_of_guests, empty) VALUES (8, 0, true); diff --git a/bin/main/static/empty.txt b/bin/main/static/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/bin/main/templates/empty.txt b/bin/main/templates/empty.txt deleted file mode 100644 index e69de29bb..000000000 From f0802f7b50c36e66cec772e9e2ef2d08684cd565 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 20 Feb 2020 14:51:57 +0900 Subject: [PATCH 15/20] =?UTF-8?q?refactoring:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=9A=94=EC=B2=AD=20=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++--- src/main/java/calculator/Number.java | 4 +-- src/test/java/kitchenpos/bo/Fixtures.java | 27 +++++++++++++------ src/test/java/kitchenpos/bo/MenuBoTest.java | 19 ++++++++----- .../java/kitchenpos/bo/MenuGroupBoTest.java | 2 -- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index bf81353b3..be2cce83e 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,12 @@ - [ ] 반드시 식사가 끝난 경우에 상태를 비움으로 업데이트 할 수 있다. - [ ] 특정 테이블의 인원수를 업데이트 한다. - [ ] 인원수는 정상값만 입력 받는다. - - [ ] 주문 테이블이 반드시 존재해야 인원수 없데이트가 가능하다. + - [ ] 주문 테이블이 반드시 존재해야 인원수 업데이트가 가능하다. + - [ ] 주문 테이블이 비어있는 상태에서는 인원수 업데이트가 불가능 하다. - 테이블 그룹 (Table Groups) - [ ] 테이블 그룹을 만들 수 있다. - - [ ] 주문테이블이 1개 이상인 경우에 만들 수 있다. + - [ ] 주문테이블이 2개 이상인 경우에 만들 수 있다. - [ ] 주문테이블의 사이즈와 동일해야 만들 수 있다. - [ ] 테이블 그룹을 삭제 할 수 있다. - [ ] 주문 상태가 요리중이거나 먹고있으면 삭제 할 수 없다. @@ -46,7 +47,7 @@ - [ ] 주문을 할때는 주문상태를 COOKING 으로 설정한다. - [ ] 전체 주문 목록을 조회 할 수 있다. - [ ] 주문 상태를 업데이트 할 수 있다. - - [ ] 주문 상태는 MEAL, COOKING, COMPLETION 으로 구성된다. + - [ ] 주문 상태는 식사중, 요리중, 식사 완료로 구성 된다. - [ ] 주문 번호가 반드시 존재해야지 업데이트 가능하다. - [ ] 주문의 상태가 완료되면 업데이트 할 수 없다. diff --git a/src/main/java/calculator/Number.java b/src/main/java/calculator/Number.java index 52a068c84..0df21c535 100644 --- a/src/main/java/calculator/Number.java +++ b/src/main/java/calculator/Number.java @@ -16,8 +16,8 @@ public Number(final String value) { public Number(final int value) { Objects.requireNonNull(value, "can not be null"); - this.value = value; validateNumber(); + this.value = value; } public int getValue() { @@ -35,6 +35,6 @@ private boolean isNegative() { } public Number sum(final Number number) { - return new Number(value + number.getValue()); + return new Number(value + number.value); } } diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java index 1369869ef..02b7ccd71 100644 --- a/src/test/java/kitchenpos/bo/Fixtures.java +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -14,8 +14,8 @@ */ public class Fixtures { - public static final long FIRST_ID = 1l; - public static final long SECOND_ID = 2l; + public static final long FIRST_ID = 1L; + public static final long SECOND_ID = 2L; public static final int QUANTITY_ONE = 1; public static List products = Collections.emptyList(); @@ -27,7 +27,14 @@ public class Fixtures { @BeforeAll public static void setUp() { - /* 상품 등록 */ + makeProduct(); + makeMenuGroup(); + makeMenu(); + makeMenuProduct(); + makeOrderTable(); + } + + private static void makeProduct() { final Product product = new Product(); product.setId(FIRST_ID); product.setName("짜장면"); @@ -39,8 +46,9 @@ public static void setUp() { product1.setPrice(BigDecimal.valueOf(7000)); products = Arrays.asList(product, product1); + } - /* 메뉴 그룹 등록 */ + private static void makeMenuGroup() { final MenuGroup menuGroup = new MenuGroup(); menuGroup.setId(FIRST_ID); menuGroup.setName("면 요리 세트"); @@ -50,17 +58,19 @@ public static void setUp() { menuGroup1.setName("밥 요리 세트"); menuGroups = Arrays.asList(menuGroup, menuGroup1); + } - /* 메뉴 등록 */ + private static void makeMenu() { final Menu newMenu = new Menu(); newMenu.setId(FIRST_ID); newMenu.setName("메뉴"); - newMenu.setPrice(product.getPrice().add(product1.getPrice())); + newMenu.setPrice(products.get(0).getPrice().add(products.get(1).getPrice())); newMenu.setMenuGroupId(menuGroups.get(0).getId()); menu = newMenu; + } - /* 메뉴 상품 등록 */ + private static void makeMenuProduct() { final MenuProduct menuProduct = new MenuProduct(); menuProduct.setSeq(FIRST_ID); menuProduct.setMenuId(FIRST_ID); @@ -74,8 +84,9 @@ public static void setUp() { menuProduct1.setQuantity(QUANTITY_ONE); menuProducts = Arrays.asList(menuProduct, menuProduct1); + } - /* 주문 테이블 등록 */ + private static void makeOrderTable() { final OrderTable newOrderTable = new OrderTable(); newOrderTable.setId(FIRST_ID); newOrderTable.setTableGroupId(FIRST_ID); diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java index 79bd0b138..f5ae8176c 100644 --- a/src/test/java/kitchenpos/bo/MenuBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -53,11 +53,21 @@ void create() { given(menuGroupDao.existsById(menu.getMenuGroupId())).willReturn(true); given(productDao.findById(menuProducts.get(0).getProductId())).willReturn(Optional.of(products.get(0))); given(productDao.findById(menuProducts.get(1).getProductId())).willReturn(Optional.of(products.get(1))); + given(menuProductDao.save(menuProducts.get(0))).willReturn(menuProducts.get(0)); + given(menuProductDao.save(menuProducts.get(1))).willReturn(menuProducts.get(1)); final Menu savedMenu = menuBo.create(menu); assertThat(savedMenu).isNotNull(); assertThat(savedMenu.getId()).isEqualTo(menu.getId()); + assertThat(savedMenu.getName()).isEqualTo(menu.getName()); + assertThat(savedMenu.getPrice()).isEqualTo(menu.getPrice()); + assertThat(savedMenu.getMenuGroupId()).isEqualTo(menu.getMenuGroupId()); + assertThat(savedMenu.getMenuProducts().size()).isEqualTo(menu.getMenuProducts().size()); + assertThat(savedMenu.getMenuProducts().get(0).getProductId()).isEqualTo(menu.getMenuProducts().get(0).getProductId()); + assertThat(savedMenu.getMenuProducts().get(0).getQuantity()).isEqualTo(menu.getMenuProducts().get(0).getQuantity()); + assertThat(savedMenu.getMenuProducts().get(0).getMenuId()).isEqualTo(menu.getMenuProducts().get(0).getMenuId()); + assertThat(savedMenu.getMenuProducts().get(0).getSeq()).isEqualTo(menu.getMenuProducts().get(0).getSeq()); } @ParameterizedTest @@ -68,8 +78,7 @@ void create_price_validation(final BigDecimal price) { final Menu resolvedMenu = menu; resolvedMenu.setPrice(price); - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> menuBo.create(resolvedMenu)); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> menuBo.create(resolvedMenu)); } @Test @@ -78,8 +87,7 @@ void create_not_exist_groupId() { final Menu resolvedMenu = menu; resolvedMenu.setMenuGroupId(null); - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> menuBo.create(menu)); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> menuBo.create(menu)); } @Test @@ -96,7 +104,6 @@ void create_price_isEqualTo_product_sum() { given(productDao.findById(menuProducts.get(1).getProductId())) .willReturn(Optional.of(products.get(1))); - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> menuBo.create(menu)); + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> menuBo.create(menu)); } } \ No newline at end of file diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index a2b478ccb..33ed4b9fd 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -27,7 +27,6 @@ class MenuGroupBoTest extends Fixtures { @InjectMocks private MenuGroupBo menuGroupBo; - @Test @DisplayName("메뉴 그룹을 등록 할 수 있다.") void create() { @@ -53,5 +52,4 @@ void list() { assertThat(menuGroupList).isNotEmpty(); assertThat(menuGroupList.size()).isEqualTo(result.size()); } - } \ No newline at end of file From 0d5f61ae74a7a011b113e9fb1c5980874893d75f Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Sun, 23 Feb 2020 13:07:15 +0900 Subject: [PATCH 16/20] =?UTF-8?q?refactoring:=20ID=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=B3=84=20=EA=B0=9C=ED=96=89=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/bo/Fixtures.java | 95 ++++++++++--------- src/test/java/kitchenpos/bo/MenuBoTest.java | 23 +++-- .../java/kitchenpos/bo/MenuGroupBoTest.java | 2 +- src/test/java/kitchenpos/bo/OrderBoTest.java | 2 +- .../java/kitchenpos/bo/ProductBoTest.java | 2 +- src/test/java/kitchenpos/bo/TableBoTest.java | 2 +- .../java/kitchenpos/bo/TableGroupBoTest.java | 2 +- src/test/java/racingcar/CarTest.java | 3 +- 8 files changed, 73 insertions(+), 58 deletions(-) diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java index 02b7ccd71..331368e4c 100644 --- a/src/test/java/kitchenpos/bo/Fixtures.java +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -14,9 +14,18 @@ */ public class Fixtures { - public static final long FIRST_ID = 1L; - public static final long SECOND_ID = 2L; public static final int QUANTITY_ONE = 1; + private static final long PRODUCT_ID = 1L; + private static final long PRODUCT_ID2 = 2L; + private static final long MENU_ID = 1L; + private static final long MENU_GROUP_ID = 1L; + private static final long MENU_GROUP_ID2 = 2L; + private static final long TABLE_GROUP_ID = 1L; + private static final long ORDER_TABLE_ID = 1L; + private static final long ORDER_TABLE_ID2 = 2L; + private static final long ORDER_TABLE_ID3 = 3L; + private static final long SEQ_ID = 1L; + private static final long SEQ_ID2 = 2L; public static List products = Collections.emptyList(); public static List menuGroups = Collections.emptyList(); @@ -35,34 +44,34 @@ public static void setUp() { } private static void makeProduct() { - final Product product = new Product(); - product.setId(FIRST_ID); - product.setName("짜장면"); - product.setPrice(BigDecimal.valueOf(6000)); - final Product product1 = new Product(); - product1.setId(FIRST_ID); - product1.setName("짬봉"); - product1.setPrice(BigDecimal.valueOf(7000)); + product1.setId(PRODUCT_ID); + product1.setName("짜장면"); + product1.setPrice(BigDecimal.valueOf(6000)); + + final Product product2 = new Product(); + product2.setId(PRODUCT_ID2); + product2.setName("짬봉"); + product2.setPrice(BigDecimal.valueOf(7000)); - products = Arrays.asList(product, product1); + products = Arrays.asList(product1, product2); } private static void makeMenuGroup() { - final MenuGroup menuGroup = new MenuGroup(); - menuGroup.setId(FIRST_ID); - menuGroup.setName("면 요리 세트"); - final MenuGroup menuGroup1 = new MenuGroup(); - menuGroup1.setId(SECOND_ID); - menuGroup1.setName("밥 요리 세트"); + menuGroup1.setId(MENU_GROUP_ID); + menuGroup1.setName("면 요리 세트"); - menuGroups = Arrays.asList(menuGroup, menuGroup1); + final MenuGroup menuGroup2 = new MenuGroup(); + menuGroup2.setId(MENU_GROUP_ID2); + menuGroup2.setName("밥 요리 세트"); + + menuGroups = Arrays.asList(menuGroup1, menuGroup2); } private static void makeMenu() { final Menu newMenu = new Menu(); - newMenu.setId(FIRST_ID); + newMenu.setId(MENU_ID); newMenu.setName("메뉴"); newMenu.setPrice(products.get(0).getPrice().add(products.get(1).getPrice())); newMenu.setMenuGroupId(menuGroups.get(0).getId()); @@ -71,42 +80,42 @@ private static void makeMenu() { } private static void makeMenuProduct() { - final MenuProduct menuProduct = new MenuProduct(); - menuProduct.setSeq(FIRST_ID); - menuProduct.setMenuId(FIRST_ID); - menuProduct.setProductId(FIRST_ID); - menuProduct.setQuantity(QUANTITY_ONE); - final MenuProduct menuProduct1 = new MenuProduct(); - menuProduct1.setSeq(SECOND_ID); - menuProduct1.setMenuId(FIRST_ID); - menuProduct1.setProductId(SECOND_ID); + menuProduct1.setSeq(SEQ_ID); + menuProduct1.setMenuId(MENU_ID); + menuProduct1.setProductId(PRODUCT_ID); menuProduct1.setQuantity(QUANTITY_ONE); - menuProducts = Arrays.asList(menuProduct, menuProduct1); + final MenuProduct menuProduct2 = new MenuProduct(); + menuProduct2.setSeq(SEQ_ID2); + menuProduct2.setMenuId(MENU_ID); + menuProduct2.setProductId(PRODUCT_ID2); + menuProduct2.setQuantity(QUANTITY_ONE); + + menuProducts = Arrays.asList(menuProduct1, menuProduct2); } private static void makeOrderTable() { - final OrderTable newOrderTable = new OrderTable(); - newOrderTable.setId(FIRST_ID); - newOrderTable.setTableGroupId(FIRST_ID); - newOrderTable.setNumberOfGuests(2); - newOrderTable.setEmpty(false); - - orderTable = newOrderTable; - final OrderTable newOrderTable1 = new OrderTable(); - newOrderTable1.setId(SECOND_ID); - newOrderTable1.setTableGroupId(FIRST_ID); - newOrderTable1.setNumberOfGuests(4); + newOrderTable1.setId(ORDER_TABLE_ID); + newOrderTable1.setTableGroupId(TABLE_GROUP_ID); + newOrderTable1.setNumberOfGuests(2); newOrderTable1.setEmpty(false); + orderTable = newOrderTable1; + final OrderTable newOrderTable2 = new OrderTable(); - newOrderTable2.setId(3l); - newOrderTable2.setTableGroupId(FIRST_ID); + newOrderTable2.setId(ORDER_TABLE_ID2); + newOrderTable2.setTableGroupId(TABLE_GROUP_ID); newOrderTable2.setNumberOfGuests(4); newOrderTable2.setEmpty(false); - orderTables = Arrays.asList(newOrderTable, newOrderTable1, newOrderTable2); + final OrderTable newOrderTable3 = new OrderTable(); + newOrderTable3.setId(ORDER_TABLE_ID3); + newOrderTable3.setTableGroupId(TABLE_GROUP_ID); + newOrderTable3.setNumberOfGuests(4); + newOrderTable3.setEmpty(false); + + orderTables = Arrays.asList(newOrderTable1, newOrderTable2, newOrderTable3); } } diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java index f5ae8176c..669ba7219 100644 --- a/src/test/java/kitchenpos/bo/MenuBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -64,10 +64,14 @@ void create() { assertThat(savedMenu.getPrice()).isEqualTo(menu.getPrice()); assertThat(savedMenu.getMenuGroupId()).isEqualTo(menu.getMenuGroupId()); assertThat(savedMenu.getMenuProducts().size()).isEqualTo(menu.getMenuProducts().size()); - assertThat(savedMenu.getMenuProducts().get(0).getProductId()).isEqualTo(menu.getMenuProducts().get(0).getProductId()); - assertThat(savedMenu.getMenuProducts().get(0).getQuantity()).isEqualTo(menu.getMenuProducts().get(0).getQuantity()); - assertThat(savedMenu.getMenuProducts().get(0).getMenuId()).isEqualTo(menu.getMenuProducts().get(0).getMenuId()); - assertThat(savedMenu.getMenuProducts().get(0).getSeq()).isEqualTo(menu.getMenuProducts().get(0).getSeq()); + assertThat(savedMenu.getMenuProducts().get(0).getProductId()) + .isEqualTo(menu.getMenuProducts().get(0).getProductId()); + assertThat(savedMenu.getMenuProducts().get(0).getQuantity()) + .isEqualTo(menu.getMenuProducts().get(0).getQuantity()); + assertThat(savedMenu.getMenuProducts().get(0).getMenuId()) + .isEqualTo(menu.getMenuProducts().get(0).getMenuId()); + assertThat(savedMenu.getMenuProducts().get(0).getSeq()) + .isEqualTo(menu.getMenuProducts().get(0).getSeq()); } @ParameterizedTest @@ -78,7 +82,8 @@ void create_price_validation(final BigDecimal price) { final Menu resolvedMenu = menu; resolvedMenu.setPrice(price); - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> menuBo.create(resolvedMenu)); + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> menuBo.create(resolvedMenu)); } @Test @@ -87,7 +92,8 @@ void create_not_exist_groupId() { final Menu resolvedMenu = menu; resolvedMenu.setMenuGroupId(null); - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> menuBo.create(menu)); + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> menuBo.create(menu)); } @Test @@ -104,6 +110,7 @@ void create_price_isEqualTo_product_sum() { given(productDao.findById(menuProducts.get(1).getProductId())) .willReturn(Optional.of(products.get(1))); - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> menuBo.create(menu)); + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> menuBo.create(menu)); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index 33ed4b9fd..40c3bed3f 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -52,4 +52,4 @@ void list() { assertThat(menuGroupList).isNotEmpty(); assertThat(menuGroupList.size()).isEqualTo(result.size()); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/bo/OrderBoTest.java b/src/test/java/kitchenpos/bo/OrderBoTest.java index cb4ea3623..a56d64305 100644 --- a/src/test/java/kitchenpos/bo/OrderBoTest.java +++ b/src/test/java/kitchenpos/bo/OrderBoTest.java @@ -216,4 +216,4 @@ void changeOrderStatus_success() { assertThat(result).isNotNull(); assertThat(result.getOrderStatus()).isEqualTo(updatedOrder.getOrderStatus()); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/bo/ProductBoTest.java b/src/test/java/kitchenpos/bo/ProductBoTest.java index 30473fb3c..855d8fa30 100644 --- a/src/test/java/kitchenpos/bo/ProductBoTest.java +++ b/src/test/java/kitchenpos/bo/ProductBoTest.java @@ -64,4 +64,4 @@ public void productBo_list() { Assertions.assertThat(result.size()).isEqualTo(products.size()); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/bo/TableBoTest.java b/src/test/java/kitchenpos/bo/TableBoTest.java index 6dfed5edc..3b564f251 100644 --- a/src/test/java/kitchenpos/bo/TableBoTest.java +++ b/src/test/java/kitchenpos/bo/TableBoTest.java @@ -114,4 +114,4 @@ void changeNumberOfGuests() { assertThat(result.getNumberOfGuests()).isEqualTo(newOrderTable.getNumberOfGuests()); } -} \ No newline at end of file +} diff --git a/src/test/java/kitchenpos/bo/TableGroupBoTest.java b/src/test/java/kitchenpos/bo/TableGroupBoTest.java index 72a575f22..f05264ba0 100644 --- a/src/test/java/kitchenpos/bo/TableGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/TableGroupBoTest.java @@ -156,4 +156,4 @@ void delete_OrderStatus_cooking_or_meal() { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> tableGroupBo.delete(tableGroup.getId())); } -} \ No newline at end of file +} diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java index 9a77aa7b5..6426b3a88 100644 --- a/src/test/java/racingcar/CarTest.java +++ b/src/test/java/racingcar/CarTest.java @@ -7,7 +7,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.jupiter.api.Assertions.*; /** * @author Geonguk Han @@ -40,4 +39,4 @@ void move() { car.move(() -> true); assertThat(car.getPosition()).isEqualTo(1); } -} \ No newline at end of file +} From 1066496f3c4811b52f65d05b5591bd1d443181a4 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 27 Feb 2020 14:24:02 +0900 Subject: [PATCH 17/20] =?UTF-8?q?refactor(Fixtures):=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calculator/Number.java | 10 +++------- src/test/java/kitchenpos/bo/Fixtures.java | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/calculator/Number.java b/src/main/java/calculator/Number.java index 0df21c535..a14a73f5c 100644 --- a/src/main/java/calculator/Number.java +++ b/src/main/java/calculator/Number.java @@ -16,7 +16,7 @@ public Number(final String value) { public Number(final int value) { Objects.requireNonNull(value, "can not be null"); - validateNumber(); + validateNumber(value); this.value = value; } @@ -24,16 +24,12 @@ public int getValue() { return value; } - private void validateNumber() { - if (isNegative()) { + private void validateNumber(final int value) { + if (value < 0) { throw new RuntimeException(); } } - private boolean isNegative() { - return value < 0; - } - public Number sum(final Number number) { return new Number(value + number.value); } diff --git a/src/test/java/kitchenpos/bo/Fixtures.java b/src/test/java/kitchenpos/bo/Fixtures.java index 331368e4c..26088b922 100644 --- a/src/test/java/kitchenpos/bo/Fixtures.java +++ b/src/test/java/kitchenpos/bo/Fixtures.java @@ -14,7 +14,7 @@ */ public class Fixtures { - public static final int QUANTITY_ONE = 1; + private static final int QUANTITY_ONE = 1; private static final long PRODUCT_ID = 1L; private static final long PRODUCT_ID2 = 2L; private static final long MENU_ID = 1L; From dddfc08563c2e49bc7c0ff52ddd59ce17cc50a2e Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 27 Feb 2020 14:34:47 +0900 Subject: [PATCH 18/20] =?UTF-8?q?refactor(MenuBoTest):=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EB=A5=BC=20=EC=A1=B0=ED=9A=8C=ED=95=A0=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4.=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/bo/MenuBoTest.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java index 669ba7219..8523d81c5 100644 --- a/src/test/java/kitchenpos/bo/MenuBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -16,6 +16,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @@ -113,4 +115,22 @@ void create_price_isEqualTo_product_sum() { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> menuBo.create(menu)); } + + @Test + @DisplayName("메뉴를 조회할 수 있다.") + void list() { + + final List menus = Arrays.asList(menu); + given(menuDao.findAll()).willReturn(menus); + given(menuProductDao.findAllByMenuId(menu.getId())).willReturn(menuProducts); + + final List list = menuBo.list(); + + assertThat(list).isNotEmpty(); + assertThat(list.size()).isEqualTo(menus.size()); + assertThat(list.get(0).getMenuProducts().get(0).getSeq()).isEqualTo(menuProducts.get(0).getSeq()); + assertThat(list.get(0).getMenuProducts().get(0).getMenuId()).isEqualTo(menuProducts.get(0).getMenuId()); + assertThat(list.get(0).getMenuProducts().get(0).getQuantity()).isEqualTo(menuProducts.get(0).getQuantity()); + assertThat(list.get(0).getMenuProducts().get(0).getProductId()).isEqualTo(menuProducts.get(0).getProductId()); + } } From cee64c3f50db03bce4424c750486748b03a033d0 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 27 Feb 2020 14:57:22 +0900 Subject: [PATCH 19/20] =?UTF-8?q?refactor(MenuBoTest):=20assertAll=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kitchenpos/bo/MenuBoTest.java | 53 ++++++++++++------- .../java/kitchenpos/bo/MenuGroupBoTest.java | 4 +- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/test/java/kitchenpos/bo/MenuBoTest.java b/src/test/java/kitchenpos/bo/MenuBoTest.java index 8523d81c5..9c2d28c8f 100644 --- a/src/test/java/kitchenpos/bo/MenuBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuBoTest.java @@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.BDDMockito.given; /** @@ -60,20 +61,26 @@ void create() { final Menu savedMenu = menuBo.create(menu); - assertThat(savedMenu).isNotNull(); - assertThat(savedMenu.getId()).isEqualTo(menu.getId()); - assertThat(savedMenu.getName()).isEqualTo(menu.getName()); - assertThat(savedMenu.getPrice()).isEqualTo(menu.getPrice()); - assertThat(savedMenu.getMenuGroupId()).isEqualTo(menu.getMenuGroupId()); - assertThat(savedMenu.getMenuProducts().size()).isEqualTo(menu.getMenuProducts().size()); - assertThat(savedMenu.getMenuProducts().get(0).getProductId()) - .isEqualTo(menu.getMenuProducts().get(0).getProductId()); - assertThat(savedMenu.getMenuProducts().get(0).getQuantity()) - .isEqualTo(menu.getMenuProducts().get(0).getQuantity()); - assertThat(savedMenu.getMenuProducts().get(0).getMenuId()) - .isEqualTo(menu.getMenuProducts().get(0).getMenuId()); - assertThat(savedMenu.getMenuProducts().get(0).getSeq()) - .isEqualTo(menu.getMenuProducts().get(0).getSeq()); + assertAll( + () -> assertThat(savedMenu).isNotNull(), + () -> assertThat(savedMenu.getId()).isEqualTo(menu.getId()), + () -> assertThat(savedMenu.getName()).isEqualTo(menu.getName()), + () -> assertThat(savedMenu.getPrice()).isEqualTo(menu.getPrice()), + () -> assertThat(savedMenu.getMenuGroupId()) + .isEqualTo(menu.getMenuGroupId()), + () -> assertThat(savedMenu.getMenuProducts().size()) + .isEqualTo(menu.getMenuProducts().size()), + () -> assertThat(savedMenu.getMenuProducts().get(0).getProductId()) + .isEqualTo(menu.getMenuProducts().get(0).getProductId()), + () -> assertThat(savedMenu.getMenuProducts().get(0).getProductId()) + .isEqualTo(menu.getMenuProducts().get(0).getProductId()), + () -> assertThat(savedMenu.getMenuProducts().get(0).getQuantity()) + .isEqualTo(menu.getMenuProducts().get(0).getQuantity()), + () -> assertThat(savedMenu.getMenuProducts().get(0).getMenuId()) + .isEqualTo(menu.getMenuProducts().get(0).getMenuId()), + () -> assertThat(savedMenu.getMenuProducts().get(0).getSeq()) + .isEqualTo(menu.getMenuProducts().get(0).getSeq()) + ); } @ParameterizedTest @@ -126,11 +133,17 @@ void list() { final List list = menuBo.list(); - assertThat(list).isNotEmpty(); - assertThat(list.size()).isEqualTo(menus.size()); - assertThat(list.get(0).getMenuProducts().get(0).getSeq()).isEqualTo(menuProducts.get(0).getSeq()); - assertThat(list.get(0).getMenuProducts().get(0).getMenuId()).isEqualTo(menuProducts.get(0).getMenuId()); - assertThat(list.get(0).getMenuProducts().get(0).getQuantity()).isEqualTo(menuProducts.get(0).getQuantity()); - assertThat(list.get(0).getMenuProducts().get(0).getProductId()).isEqualTo(menuProducts.get(0).getProductId()); + assertAll( + () -> assertThat(list).isNotEmpty(), + () -> assertThat(list.size()).isEqualTo(menus.size()), + () -> assertThat(list.get(0).getMenuProducts().get(0).getSeq()) + .isEqualTo(menuProducts.get(0).getSeq()), + () -> assertThat(list.get(0).getMenuProducts().get(0).getMenuId()) + .isEqualTo(menuProducts.get(0).getMenuId()), + () -> assertThat(list.get(0).getMenuProducts().get(0).getQuantity()) + .isEqualTo(menuProducts.get(0).getQuantity()), + () -> assertThat(list.get(0).getMenuProducts().get(0).getProductId()) + .isEqualTo(menuProducts.get(0).getProductId()) + ); } } diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index 40c3bed3f..3d05a98a4 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -49,7 +49,7 @@ void list() { final List result = menuGroupBo.list(); - assertThat(menuGroupList).isNotEmpty(); - assertThat(menuGroupList.size()).isEqualTo(result.size()); + assertThat(result).isNotEmpty(); + assertThat(result.size()).isEqualTo(menuGroupList.size()); } } From 7a372feda008d9b247b84df9c7939fb92094fba4 Mon Sep 17 00:00:00 2001 From: Geonguk Han Date: Thu, 27 Feb 2020 16:47:09 +0900 Subject: [PATCH 20/20] =?UTF-8?q?refactor(Test):=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=EB=90=9C=20=EB=B6=80=EB=B6=84=EC=9D=B4=20=EB=A7=8E=EC=95=98?= =?UTF-8?q?=EC=8A=B5=EB=8B=88=EB=8B=A4.=20(=EA=BE=B8=EB=B2=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kitchenpos/bo/MenuGroupBoTest.java | 9 ++- src/test/java/kitchenpos/bo/OrderBoTest.java | 71 ++++++++++--------- src/test/java/kitchenpos/bo/TableBoTest.java | 12 +++- .../java/kitchenpos/bo/TableGroupBoTest.java | 22 +++--- 4 files changed, 68 insertions(+), 46 deletions(-) diff --git a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java index 3d05a98a4..c1b37ed14 100644 --- a/src/test/java/kitchenpos/bo/MenuGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/MenuGroupBoTest.java @@ -12,6 +12,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.BDDMockito.given; /** @@ -36,8 +37,11 @@ void create() { final MenuGroup savedMenuGroup = menuGroupBo.create(menuGroup); - assertThat(savedMenuGroup).isNotNull(); - assertThat(savedMenuGroup.getId()).isEqualTo(menuGroup.getId()); + assertAll( + () -> assertThat(savedMenuGroup).isNotNull(), + () -> assertThat(savedMenuGroup.getId()).isEqualTo(menuGroup.getId()), + () -> assertThat(savedMenuGroup.getName()).isEqualTo(menuGroup.getName()) + ); } @Test @@ -51,5 +55,6 @@ void list() { assertThat(result).isNotEmpty(); assertThat(result.size()).isEqualTo(menuGroupList.size()); + assertThat(result).containsExactlyInAnyOrderElementsOf(menuGroupList); } } diff --git a/src/test/java/kitchenpos/bo/OrderBoTest.java b/src/test/java/kitchenpos/bo/OrderBoTest.java index a56d64305..1be8b0059 100644 --- a/src/test/java/kitchenpos/bo/OrderBoTest.java +++ b/src/test/java/kitchenpos/bo/OrderBoTest.java @@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.BDDMockito.given; /** @@ -61,14 +62,14 @@ void create_empty_orderLineItem() { void create_notEqual_menuItem_size() { final Order order = new Order(); final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenuId(1l); + orderLineItem.setMenuId(1L); final OrderLineItem orderLineItem1 = new OrderLineItem(); - orderLineItem1.setMenuId(2l); + orderLineItem1.setMenuId(2L); order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), - orderLineItem1.getMenuId()))).willReturn(3l); + orderLineItem1.getMenuId()))).willReturn(3L); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> orderBo.create(order)); @@ -79,16 +80,16 @@ void create_notEqual_menuItem_size() { void create_notExist_orderTable() { final Order order = new Order(); final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenuId(1l); + orderLineItem.setMenuId(1L); final OrderLineItem orderLineItem1 = new OrderLineItem(); - orderLineItem1.setMenuId(2l); - order.setOrderTableId(1l); + orderLineItem1.setMenuId(2L); + order.setOrderTableId(1L); order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), - orderLineItem1.getMenuId()))).willReturn(2l); - given(orderTableDao.findById(order.getOrderTableId())).willThrow(IllegalArgumentException.class); + orderLineItem1.getMenuId()))).willReturn(2L); + given(orderTableDao.findById(order.getOrderTableId())).willReturn(Optional.empty()); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> orderBo.create(order)); @@ -99,18 +100,18 @@ void create_notExist_orderTable() { void create_empty_orderTable() { final Order order = new Order(); final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenuId(1l); + orderLineItem.setMenuId(1L); final OrderLineItem orderLineItem1 = new OrderLineItem(); - orderLineItem1.setMenuId(2l); - order.setOrderTableId(1l); + orderLineItem1.setMenuId(2L); + order.setOrderTableId(1L); order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); final OrderTable orderTable = Fixtures.orderTable; orderTable.setEmpty(true); given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), - orderLineItem1.getMenuId()))).willReturn(2l); + orderLineItem1.getMenuId()))).willReturn(2L); given(orderTableDao.findById(order.getOrderTableId())).willReturn(Optional.of(orderTable)); assertThatExceptionOfType(IllegalArgumentException.class) @@ -121,42 +122,48 @@ void create_empty_orderTable() { @DisplayName("주문 테이블이 정상 등록") void create_success() { final Order order = new Order(); - order.setOrderTableId(1l); + order.setOrderTableId(1L); - final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenuId(1l); + final OrderLineItem friedChicken = new OrderLineItem(); + friedChicken.setMenuId(1L); - final OrderLineItem orderLineItem1 = new OrderLineItem(); - orderLineItem1.setMenuId(2l); + final OrderLineItem seasonedChicken = new OrderLineItem(); + seasonedChicken.setMenuId(2L); - order.setOrderLineItems(Arrays.asList(orderLineItem, orderLineItem1)); + order.setOrderLineItems(Arrays.asList(friedChicken, seasonedChicken)); final OrderTable orderTable = Fixtures.orderTable; orderTable.setEmpty(false); - given(menuDao.countByIdIn(Arrays.asList(orderLineItem.getMenuId(), - orderLineItem1.getMenuId()))).willReturn(2l); + given(menuDao.countByIdIn(Arrays.asList(friedChicken.getMenuId(), + seasonedChicken.getMenuId()))).willReturn(2L); given(orderTableDao.findById(order.getOrderTableId())).willReturn(Optional.of(orderTable)); given(orderDao.save(order)).willReturn(order); - given(orderLineItemDao.save(orderLineItem)).willReturn(orderLineItem); - given(orderLineItemDao.save(orderLineItem1)).willReturn(orderLineItem1); + given(orderLineItemDao.save(friedChicken)).willReturn(friedChicken); + given(orderLineItemDao.save(seasonedChicken)).willReturn(seasonedChicken); final Order result = orderBo.create(order); - assertThat(result).isNotNull(); + assertAll( + () -> assertThat(result).isNotNull(), + () -> assertThat(result.getOrderLineItems()).containsExactlyInAnyOrderElementsOf(order.getOrderLineItems()), + () -> assertThat(result.getOrderStatus()).isEqualTo(order.getOrderStatus()), + () -> assertThat(result.getId()).isEqualTo(order.getId()), + () -> assertThat(result.getOrderTableId()).isEqualTo(order.getOrderTableId()) + ); } @Test @DisplayName("주문 목록을 조회 할 수 있다.") void list() { final Order order = new Order(); - order.setId(1l); + order.setId(1L); final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setOrderId(1l); + orderLineItem.setOrderId(1L); final OrderLineItem orderLineItem1 = new OrderLineItem(); - orderLineItem1.setOrderId(1l); + orderLineItem1.setOrderId(1L); final List orderLineItems = Arrays.asList(orderLineItem, orderLineItem1); order.setOrderLineItems(orderLineItems); @@ -172,12 +179,12 @@ void list() { } @Test - @DisplayName("주문이 존재 하지 않는 경우") + @DisplayName("주문 상태를 변경하는데, 주문 정보가 존재하지 않는 경우") void changeOrderStatus_notExist_order() { final Order order = new Order(); - order.setId(1l); + order.setId(1L); - given(orderDao.findById(order.getId())).willThrow(IllegalArgumentException.class); + given(orderDao.findById(order.getId())).willReturn(Optional.empty()); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> orderBo.changeOrderStatus(order.getId(), order)); @@ -187,7 +194,7 @@ void changeOrderStatus_notExist_order() { @DisplayName("주문이 완료된 경우") void changeOrderStatus_completed_order() { final Order order = new Order(); - order.setId(1l); + order.setId(1L); order.setOrderStatus(OrderStatus.COMPLETION.name()); given(orderDao.findById(order.getId())).willReturn(Optional.of(order)); @@ -200,11 +207,11 @@ void changeOrderStatus_completed_order() { @DisplayName("주문 상태를 변경 하는 경우") void changeOrderStatus_success() { final Order order = new Order(); - order.setId(1l); + order.setId(1L); order.setOrderStatus(OrderStatus.COOKING.name()); final Order updatedOrder = new Order(); - updatedOrder.setId(1l); + updatedOrder.setId(1L); updatedOrder.setOrderStatus(OrderStatus.MEAL.name()); given(orderDao.findById(order.getId())).willReturn(Optional.of(order)); diff --git a/src/test/java/kitchenpos/bo/TableBoTest.java b/src/test/java/kitchenpos/bo/TableBoTest.java index 3b564f251..394408c3b 100644 --- a/src/test/java/kitchenpos/bo/TableBoTest.java +++ b/src/test/java/kitchenpos/bo/TableBoTest.java @@ -95,7 +95,7 @@ void changeEmpty_check_orderStatus() { given(orderTableDao.findById(orderTable.getId())).willReturn(Optional.of(orderTable)); given(orderDao.existsByOrderTableIdAndOrderStatusIn(resolvedOrderTable.getId(), - Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willThrow(IllegalArgumentException.class); + Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willReturn(true); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> tableBo.changeEmpty(orderTable.getId(), orderTable)); @@ -114,4 +114,14 @@ void changeNumberOfGuests() { assertThat(result.getNumberOfGuests()).isEqualTo(newOrderTable.getNumberOfGuests()); } + + @Test + @DisplayName("주문 테이블이 비어있는 상태에서 인원수 업데이트는 불가능하다.") + void changeNumberOfGuests_empty_table() { + final OrderTable orderTable = Fixtures.orderTable; + orderTable.setNumberOfGuests(0); + + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> tableBo.changeNumberOfGuests(orderTable.getId(), orderTable)); + } } diff --git a/src/test/java/kitchenpos/bo/TableGroupBoTest.java b/src/test/java/kitchenpos/bo/TableGroupBoTest.java index f05264ba0..ea4a7d16c 100644 --- a/src/test/java/kitchenpos/bo/TableGroupBoTest.java +++ b/src/test/java/kitchenpos/bo/TableGroupBoTest.java @@ -44,14 +44,14 @@ class TableGroupBoTest extends Fixtures { @DisplayName("테이블 그룹을 만들 수 있다.") void create() { final TableGroup tableGroup = new TableGroup(); - tableGroup.setId(1l); + tableGroup.setId(1L); final OrderTable orderTable = new OrderTable(); - orderTable.setId(1l); + orderTable.setId(1L); orderTable.setEmpty(true); final OrderTable orderTable1 = new OrderTable(); - orderTable1.setId(2l); + orderTable1.setId(2L); orderTable1.setEmpty(true); final List orderTables = Arrays.asList(orderTable, orderTable1); @@ -72,10 +72,10 @@ void create() { @DisplayName("주문테이블이 1개 이상인 경우에 만들 수 있다.") void create_orderTable_validation() { final TableGroup tableGroup = new TableGroup(); - tableGroup.setId(1l); + tableGroup.setId(1L); final OrderTable orderTable = new OrderTable(); - orderTable.setId(1l); + orderTable.setId(1L); orderTable.setEmpty(true); final List orderTables = Arrays.asList(orderTable); @@ -89,15 +89,15 @@ void create_orderTable_validation() { @DisplayName("주문테이블의 사이즈와 동일해야 만들 수 있다.") void create_orderTable_size() { final TableGroup tableGroup = new TableGroup(); - tableGroup.setId(1l); + tableGroup.setId(1L); final OrderTable orderTable = new OrderTable(); - orderTable.setId(1l); + orderTable.setId(1L); orderTable.setEmpty(true); final OrderTable orderTable1 = new OrderTable(); - orderTable1.setId(2l); + orderTable1.setId(2L); orderTable1.setEmpty(true); final List orderTables = Arrays.asList(orderTable, orderTable1); @@ -115,7 +115,7 @@ void create_orderTable_size() { @DisplayName("테이블 그룹을 삭제 할 수 있다.") void delete() { final TableGroup tableGroup = new TableGroup(); - tableGroup.setId(1l); + tableGroup.setId(1L); tableGroup.setOrderTables(orderTables); final List orderTableIds = orderTables.stream().map(OrderTable::getId).collect(Collectors.toList()); @@ -141,7 +141,7 @@ void delete() { @DisplayName("주문 상태가 요리중이거나 먹고있으면 삭제 할 수 없다.") void delete_OrderStatus_cooking_or_meal() { final TableGroup tableGroup = new TableGroup(); - tableGroup.setId(1l); + tableGroup.setId(1L); tableGroup.setOrderTables(orderTables); final List orderTableIds = orderTables.stream().map(OrderTable::getId).collect(Collectors.toList()); @@ -151,7 +151,7 @@ void delete_OrderStatus_cooking_or_meal() { given(orderTableDao.findAllByTableGroupId(tableGroup.getId())).willReturn(Fixtures.orderTables); given(orderDao.existsByOrderTableIdInAndOrderStatusIn(orderTableIds, - Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willThrow(IllegalArgumentException.class); + Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))).willReturn(true); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> tableGroupBo.delete(tableGroup.getId()));