Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3단계 - 테스트를 통한 코드 보호 #661

Open
wants to merge 25 commits into
base: pawoo0211
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fc12ec3
docs: 요구사항 마지막 피드백 반영
pawoo0211 May 6, 2024
443c866
test: 메뉴 그룹 테스트 코드 작성
pawoo0211 May 6, 2024
06db615
test: 상품 뼈대 테스트 코드 작성
pawoo0211 May 6, 2024
004ae26
docs: 요구사항 Slot box 추가
pawoo0211 May 8, 2024
7aa384a
test: 상품 요구 사항 예외 케이스 테스트 코드 작성
pawoo0211 May 8, 2024
5597328
test: 메뉴 관련 Fixture 및 Helper 테스트 코드 작성
pawoo0211 May 8, 2024
46bc806
test: 메뉴 추가 기능 테스트 코드 작성
pawoo0211 May 8, 2024
c289b0c
test: 메뉴 추가 기능 예외 케이스 테스트 코드 작성
pawoo0211 May 9, 2024
07dccc1
test: 메뉴 가격 변경 테스트 코드 작성
pawoo0211 May 9, 2024
8559f86
test: 메뉴 활성화 및 비활성화 테스트 코드 작성
pawoo0211 May 9, 2024
61da7d8
test: 상품 가격 변경 테스트 코드 작성
pawoo0211 May 9, 2024
06ca73d
test: 테이블 테스트 코드 작성
pawoo0211 May 9, 2024
c61164d
test: 식당 주문 테스트 코드 작성
pawoo0211 May 10, 2024
3b57eb1
test: Static -> Non-Static fixture 변경
pawoo0211 May 10, 2024
d3e68c2
test: 음식 주문 기본 테스트 코드 작성
pawoo0211 May 10, 2024
a093058
test: static -> non-static 변수 변경
pawoo0211 May 10, 2024
e942cde
test: 상품 가격 변경 테스트 코드 수정
pawoo0211 May 10, 2024
d164baf
test: 사용하지 않는 import 제거
pawoo0211 May 10, 2024
e953f44
test: id 값 유무 판단으로의 객체 생성 검증 로직 변경
pawoo0211 May 11, 2024
55798de
test: 반목문 안에 있는 단언문 -> assertAll 메서드 사용으로 변경
pawoo0211 May 11, 2024
da7979c
test: 중첩 클래스를 이용한 테스트 분류
pawoo0211 May 11, 2024
649074f
test: Fixture 네이밍 구분 값 추가
pawoo0211 May 11, 2024
c4d18ed
test: 메뉴 생성 시 기존 상품 수량 확인 테스트 코드 작성
pawoo0211 May 11, 2024
41502de
test: 매장 주인 테이블 정리 테스트 코드 작성
pawoo0211 May 11, 2024
a74f453
test: 메뉴 예외 케이스 테스트 코드 추가
pawoo0211 May 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 54 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,68 +11,68 @@ docker compose -p kitchenpos up -d
- 식당 음식 판매 정보 관리 기기 구현하기
- 메뉴 그룹
- 메뉴 그룹이란 메뉴들의 집합을 의미한다.
- 새로운 메뉴 그룹을 추가할 수 있다.
- 메뉴 그룹 추가 시 이름이 반드시 존재해야 한다.
- 모든 메뉴 그룹을 조회할 수 있다.
- [O] 새로운 메뉴 그룹을 추가할 수 있다.
- [O] 메뉴 그룹 추가 시 이름이 반드시 존재해야 한다.
- [] 모든 메뉴 그룹을 조회할 수 있다.
- 메뉴
- 메뉴란 식당에서 판매되고 있는 음식과 해당 음식에 관련된 정보들이다.
- 새로운 메뉴를 추가할 수 있다.
- 메뉴는 반드시 메뉴 그룹에 포함 되어야 한다.
- 메뉴는 반드시 가격, 이름, 상품 정보를 가지고 있어야 한다.
- 메뉴의 상품 수량은 기존 상품의 수량과 같아야 한다.
- 메뉴의 가격은 상품 (수량 * 가격) 보다 클 수 없다.
- 메뉴 추가 시 메뉴의 이름이 부적절한지 검사한다.
- 메뉴의 가격을 변경할 수 있다.
- 메뉴의 가격은 해당 상품의 (수량 * 가격)이다.
- 메뉴의 가격은 상품 (수량 * 가격) 보다 클 수 없다.
- 메뉴를 고객에게 보여줄 수 있으며 숨길 수 있다.
- 모든 메뉴를 조회할 수 있다.
- [O] 새로운 메뉴를 추가할 수 있다.
- [O] 메뉴는 반드시 메뉴 그룹에 포함 되어야 한다.
- [O] 메뉴는 반드시 가격, 이름, 상품 정보를 가지고 있어야 한다.
- [O] 메뉴의 상품 수량은 기존 상품의 수량과 같아야 한다.
- [O] 메뉴의 가격은 상품 포함된 상품의 총 가격 보다 클 수 없다.
- [O] 메뉴 추가 시 메뉴의 이름이 부적절한지 검사한다.
- [O] 메뉴의 가격을 변경할 수 있다.
- [O] 메뉴의 가격은 해당 상품 총 가격 보다 클 수 없다.
- [O] 메뉴를 노출할 수 있다.
- [O] 메뉴를 숨길 수 있다.
- [] 모든 메뉴를 조회할 수 있다.
- 주문
- 주문이란 식당에 있는 메뉴에 있는 음식에 주문한는 것을 의미한다.
- 주문 시 주문 항목은 반드시 존재해야 한다.
- 주문 항목 개수는 메뉴의 개수와 일치해야 한다.
- 주문 항목에 있는 메뉴들은 판매 되고 있는 메뉴들이어야 한다.
- 주문 가격은 주문 항목에 있는 메뉴의 가격 총합과 같아야 한다.
- 주문을 하게 되면 즉시 해당 주문의 상태는 주문 대기 상태가 된다.
- 손님은 식당에서 음식을 주문할 수 있다.
- 식당 주문 시 주문 항목에 반드시 수량이 존재해야 한다.
- 식당 주문 시 자리가 존재해야 하며 앉을 수 있어야 한다.
- 주문이 접수가 되면 손님에게 음식을 제공한다.
- 손님에게 음식이 제공되면 주문 상태를 주문 완료로 변경한다.
- 주문 상태가 주문 완료가 되면 매장 주인은 테이블을 정리한다.
- 손님은 배달을 주문 할 수 있다.
- 배달 주문 시 주소 정보가 반드시 있어야 한다.
- 배달 주문이 접수가 되면 라이더에게 주문 정보와 배송지 정보를 전달하며 배달을 요청한다.
- 배달을 요청할 경우 해당 주문의 상태는 접수 상태로 변경된다.
- 배달이 시작되면 주문의 상태를 배달 중으로 변경한다.
- 배달이 완료되면 주문의 상태를 배달 완료로 변경한다.
- 배달 완료가 확인되면 주문의 상태를 주문 상태를 주문 완료로 변경한다.
- 손님은 포장 주문을 할 수 있다.
- 주문이 접수가 되면 손님에게 음식을 제공한다.
- 손님에게 음식이 제공되면 주문 상태를 주문 완료로 변경한다.
- 주문을 했을 때 주문이 가능하다면 주문 접수를 진행한다.
- 주문의 상태는 대기, 접수, 전달, 배달 중, 배달 완료, 완료를 가진다.
- 주문을 하게 되면 가장 먼저 주문 대기 상태가 된 후 접수 상태로 변경된다.
- 모든 주문을 조회할 수 있다.
- [O] 주문의 상태는 대기, 접수, 제공, 배달 중, 배달 완료, 완료가 존재한다.
- [O] 주문의 유형은 매장 식사, 포장, 배달이 존재한다.
- [O] 주문 시 주문 유형 및 항목은 반드시 존재 해야한다.
- [O] 주문 항목 개수는 메뉴의 개수와 일치해야 한다.
- [O] 주문 항목에 있는 메뉴들은 판매 되고 있는 메뉴들이어야 한다.
- [] 주문 가격은 주문 항목에 있는 메뉴의 가격 총합과 같아야 한다.
- [O] 주문을 하게 되면 해당 주문의 상태는 주문 대기 상태가 된다.
- [O] 손님은 식당에서 음식을 주문할 수 있다.
- [O] 식당 주문 시 주문 테이블이 존재해야 하며 빈 테이블일 수 없다.
- [O] 주문이 접수 되면 손님에게 음식을 제공한다.
- [O] 손님에게 음식이 제공되면 주문 상태를 주문 완료로 변경한다.
- [O] 식당 주문 완료가 되면 매장 주인은 테이블을 정리한다.
- [O] 손님은 배달 주문을 할 수 있다.
- [O] 주문 항목에 반드시 수량이 존재해야 한다.
- [O] 배달 주문 시 배달 주소지가 반드시 있어야 한다.
- [O] 라이더에게 주문 정보와 배달 주소시를 전달 후 배달을 요청하며 주문을 접수한다.
- [O] 배달이 시작되면 주문의 상태를 배달 중으로 변경한다.
- [O] 배달이 완료되면 주문의 상태를 배달 완료로 변경한다.
- [O] 배달 완료가 확인되면 주문의 상태를 주문 상태를 주문 완료로 변경한다.
- [O] 손님은 포장 주문을 할 수 있다.
- [O] 주문 항목에 반드시 수량이 존재해야 한다.
- [O] 주문이 접수 되면 손님에게 음식을 제공한다.
- [O] 손님에게 음식이 제공되면 주문 상태를 주문 완료로 변경한다.
- [] 모든 주문을 조회할 수 있다.
- 테이블
- 테이블이란 식당에서 식사할 수 있는 탁자를 의미한다.
- 새로운 테이블을 추가할 수 있다.
- 새로운 테이블을 추가 시 테이블의 이름은 반드시 존재해야 한다.
- 추가된 테이블은 손님이 바로 식사 할 수 있다.
- 손님은 테이블에 앉을 수 있다.
- 매장 주인은 테이블을 정리할 수 있다.
- 주문이 완료 된 상태의 테이블에서만 청소가 가능하다.
- 테이블에 앉는 손님의 수는 변경될 수 있다.
- 현재 테이블은 손님이 앉아있는 상태여야 한다.
- 앉아 있는 손님은 1명 이상이어야 한다.
- 모든 테이블을 조회 할 수 있다.
- [O] 새로운 테이블을 추가할 수 있다.
- [O] 새로운 테이블을 추가 시 테이블의 이름은 반드시 존재해야 한다.
- [O] 추가된 테이블은 손님이 바로 식사 할 수 있다.
- [O] 손님은 테이블에 앉을 수 있다.
- [O] 매장 주인은 테이블을 정리할 수 있다.
- [] 주문이 완료 된 상태의 테이블에서만 청소가 가능하다.
- [O] 테이블에 앉는 손님의 수는 변경될 수 있다.
- [O] 현재 테이블은 손님이 앉아있는 상태여야 한다.
- [O] 손님은 0명 이상이어야 한다.
- [] 모든 테이블을 조회 할 수 있다.
- 상품
- 상품이란 메뉴에 구성되는 상품을 의미한다.
- 새로운 상품을 추가 할 수 있다.
- 상품은 이름과 가격 정보가 존재해야 하며 상품의 이름이 부적절한지 검사한다.
- 상품의 가격을 변경할 수 있다.
- 해당 상품으로 구성된 메뉴의 가격이 변경된 상품의 가격 총합보다 크다면 메뉴를 노출하지 않는다.
- 모든 상품을 조회 할 수 있다.
- [O] 새로운 상품을 추가 할 수 있다.
- [O] 상품의 가격은 반드시 존재해야 하며 0보다 커야 한다.
- [O] 상품의 이름은 반드시 존재해야 하며 부적절한지 검사한다.
- [O] 상품의 가격을 변경할 수 있다.
- [O] 해당 상품으로 구성된 메뉴의 가격이 변경된 상품의 가격 총합보다 크다면 메뉴를 노출하지 않는다.
- [] 모든 상품을 조회 할 수 있다.

## 용어 사전

Expand Down
1 change: 1 addition & 0 deletions src/main/java/kitchenpos/application/MenuService.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public Menu create(final Menu request) {
menuProduct.setQuantity(quantity);
menuProducts.add(menuProduct);
}

if (price.compareTo(sum) > 0) {
throw new IllegalArgumentException();
}
Expand Down
97 changes: 97 additions & 0 deletions src/test/java/kitchenpos/menu/fixture/MenuFixture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package kitchenpos.menu.fixture;

import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuGroup;
import kitchenpos.domain.MenuProduct;
import kitchenpos.domain.Product;

import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

public class MenuFixture {
private MenuGroupFixture menuGroupFixture = new MenuGroupFixture();
private MenuProductFixture menuProductFixture = new MenuProductFixture();

public Menu 메뉴 = create(
"메뉴_A", new BigDecimal(10000), menuGroupFixture.메뉴_그룹_A,
true, List.of(menuProductFixture.메뉴_상품)
);
public Menu 메뉴_A_가격_10000 = create(
"메뉴_A", new BigDecimal(10000), menuGroupFixture.메뉴_그룹_A,
true, List.of(menuProductFixture.메뉴_상품_A_수량_10)
);
public Menu 메뉴_B_가격_5000 = create(
"메뉴_B", new BigDecimal(5000), menuGroupFixture.메뉴_그룹_A,
true, List.of(menuProductFixture.메뉴_상품_B)
);
public Menu 메뉴_C_가격_100000 = create(
"메뉴_C", new BigDecimal(100000), menuGroupFixture.메뉴_그룹_A,
false, List.of(menuProductFixture.메뉴_상품_C)
);
public Menu 메뉴_그룹_없는_메뉴 = create(
"메뉴", new BigDecimal(10000), null,
true, List.of(menuProductFixture.메뉴_상품_A_수량_10)
);
public Menu 가격_없는_메뉴 = create(
"메뉴", null, null,
true, List.of(menuProductFixture.메뉴_상품_A_수량_10)
);
public Menu 상품_없는_메뉴 = create(
"메뉴", new BigDecimal(10000), menuGroupFixture.메뉴_그룹_A,
true, null
);
public Menu 이름_없는_메뉴 = create(
null, new BigDecimal(10000), menuGroupFixture.메뉴_그룹_A,
true, List.of(menuProductFixture.메뉴_상품_A_수량_10)
);
public Menu 부적절한_이름_메뉴 = create(
"fuck", new BigDecimal(10000), menuGroupFixture.메뉴_그룹_A,
true, List.of(menuProductFixture.메뉴_상품_A_수량_10)
);
public Menu 비활성화_메뉴 = create(
"메뉴_A", new BigDecimal(10000), menuGroupFixture.메뉴_그룹_A,
false, List.of(menuProductFixture.메뉴_상품)
);
public Menu 메뉴_가격_11000_상품_가격_10000 = create(
"메뉴", new BigDecimal(11000), menuGroupFixture.메뉴_그룹_A,
true, List.of(menuProductFixture.메뉴_상품_A_수량_10)
);

public static Menu create(String name, BigDecimal price, MenuGroup menuGroup,
boolean isDisplayed, List<MenuProduct> menuProducts) {
return create(UUID.randomUUID(), name, price, menuGroup, isDisplayed, menuProducts);
}

public static Menu create(UUID id, String name, BigDecimal price, MenuGroup menuGroup,
boolean isDisplayed, List<MenuProduct> menuProducts) {
Menu menu = new Menu();
menu.setId(id);
menu.setName(name);
menu.setPrice(price);
menu.setMenuGroup(menuGroup);
menu.setDisplayed(isDisplayed);
menu.setMenuProducts(menuProducts);

return menu;
}

public static MenuGroup extractMenuGroupFrom(Menu menu) {
return menu.getMenuGroup();
}

public static List<Product> extractProductsFrom(Menu menu) {
List<Product> products = menu.getMenuProducts()
.stream()
.map(menuProduct -> menuProduct.getProduct())
.collect(Collectors.toList());

return products;
}

public static Product extractProductFrom(Menu menu) {
MenuProduct menuProduct = menu.getMenuProducts().get(0);
return menuProduct.getProduct();
}
}
21 changes: 21 additions & 0 deletions src/test/java/kitchenpos/menu/fixture/MenuGroupFixture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kitchenpos.menu.fixture;

import kitchenpos.domain.MenuGroup;

import java.util.UUID;

public class MenuGroupFixture {
public MenuGroup 메뉴_그룹_A = MenuGroupFixture.create(UUID.randomUUID(), "그룹A");

public static MenuGroup create(String name) {
return create(UUID.randomUUID(), name);
}

public static MenuGroup create(UUID id, String name) {
MenuGroup menuGroup = new MenuGroup();
menuGroup.setId(id);
menuGroup.setName(name);

return menuGroup;
}
}
21 changes: 21 additions & 0 deletions src/test/java/kitchenpos/menu/fixture/MenuProductFixture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kitchenpos.menu.fixture;

import kitchenpos.domain.MenuProduct;
import kitchenpos.domain.Product;

public class MenuProductFixture {
private ProductFixture productFixture = new ProductFixture();

public MenuProduct 메뉴_상품 = create(productFixture.상품, 10);
public MenuProduct 메뉴_상품_A_수량_10 = create(productFixture.상품_A_가격_1000,10);
public MenuProduct 메뉴_상품_B = create(productFixture.상품_B, 10);
public MenuProduct 메뉴_상품_C = create(productFixture.상품_C_가격_10000, 10);

public static MenuProduct create(Product product, long quantity) {
MenuProduct menuProduct = new MenuProduct();
menuProduct.setProduct(product);
menuProduct.setQuantity(quantity);

return menuProduct;
}
}
29 changes: 29 additions & 0 deletions src/test/java/kitchenpos/menu/fixture/ProductFixture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package kitchenpos.menu.fixture;

import kitchenpos.domain.Product;

import java.math.BigDecimal;
import java.util.UUID;

public class ProductFixture {
public Product 상품 = create( "상품", new BigDecimal(1000));
public Product 상품_A_가격_1000 = create( "상품A", new BigDecimal(1000));
public Product 상품_B = create("상품B", new BigDecimal(500));
public Product 상품_C_가격_10000 = create("상품C", new BigDecimal(10000));
public Product 가격_없는_상품 = create(UUID.randomUUID(), "상품", null);
public Product 가격_음수_상품 = create(UUID.randomUUID(), "상품", new BigDecimal(-1));
public Product 부적절한_이름_상품 = create(UUID.randomUUID(), "fuck", new BigDecimal(-1));

public static Product create(String name, BigDecimal price) {
return create(UUID.randomUUID(), name, price);
}

public static Product create(UUID id, String name, BigDecimal price) {
Product product = new Product();
product.setId(id);
product.setName(name);
product.setPrice(price);

return product;
}
}
55 changes: 55 additions & 0 deletions src/test/java/kitchenpos/menu/service/MenuGroupServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package kitchenpos.menu.service;

import kitchenpos.application.MenuGroupService;
import kitchenpos.domain.MenuGroup;
import kitchenpos.domain.MenuGroupRepository;
import kitchenpos.menu.fixture.MenuGroupFixture;
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.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.mockito.AdditionalAnswers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

@DisplayName("메뉴 그룹 서비스 테스트")
@ExtendWith(MockitoExtension.class)
public class MenuGroupServiceTest {
@Mock
private MenuGroupRepository menuGroupRepository;
@InjectMocks
private MenuGroupService menuGroupService;

private MenuGroupFixture menuGroupFixture;

@BeforeEach
void setUp() {
menuGroupFixture = new MenuGroupFixture();
}

@Test
@DisplayName("새로운 메뉴 그룹을 추가할 수 있다.")
void create() {
MenuGroup 한식 = menuGroupFixture.메뉴_그룹_A;

Mockito.when(menuGroupRepository.save(Mockito.any()))
.then(AdditionalAnswers.returnsFirstArg());
MenuGroup result = menuGroupService.create(한식);

Assertions.assertThat(result.getId()).isNotNull();
}

@ParameterizedTest
@NullAndEmptySource
@DisplayName("메뉴 그룹 추가 시 이름이 반드시 존재해야 한다.")
void test(String name) {
Assertions.assertThatThrownBy(
() -> menuGroupService.create(MenuGroupFixture.create(name))
).isInstanceOf(IllegalArgumentException.class);
}
}
Loading