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

step3: 테스트를 통한 코드 보호 #535

Open
wants to merge 5 commits into
base: seungjoopet
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 34 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,51 +10,54 @@ docker compose -p kitchenpos up -d
## 요구 사항

- 상품
- [ ] 상품은 가격을 가지고 있고 가격은 양수이다.
- [ ] 상품은 이름을 가지고 있다.
- [ ] 상품의 이름에는 욕이 포함될 수 없다.
- [ ] 가격은 양수로만 변경할 수 있다.
- [ ] 상품의 가격이 변경됐을 때, 해당 상품이 포함된 메뉴들에 대해 메뉴 노출에 대한 조정을 한다.(메뉴의 각 메뉴상품들 가격과 수량을 곱한 총 합보다 메뉴의 값이
크면 메뉴를
숨긴다.)
- [x] 상품은 가격을 가지고 있다.
- [x] 가격은 양수이다.
- [x] 상품은 이름을 가지고 있다.
- [x] 이름에는 욕이 포함될 수 없다.
- [x] 상품은 가격을 변경할 수 있다
- [x] 존재하는 상품만 가격을 변경시킬 수 있다.
- [x] 가격은 양수로만 변경할 수 있다.
- [x] 상품의 가격이 변경됐을 때 해당 상품이 포함된 메뉴들에 대해 메뉴에 속한 상품 금액의 합보다 크면 메뉴가 숨겨진다.


- 메뉴
- [ ] 메뉴는 가격을 가지고 있고, 가격은 양수이다.
- [ ] 메뉴는 특정 그룹을 가지고 있다
- [ ] 메뉴의 그룹은 이름을 가지고 있다.
- [ ] 메뉴의 그룹 이름은 없을 수 없다.
- [ ] 메뉴는 1개 이상의 메뉴상품을 가진다.
- [ ] 메뉴상품은 하나의 상품과 0개 이상의 수량을 가진다.
- [ ] 메뉴상품에 있는 상품은 실제 있는 상품이어야 한다.
- [ ] 메뉴의 가격은 메뉴상품들의 각 상품의 가격과 수량을 곱한 총 총 합보다 클 수 없다.
- [ ] 메뉴의 가격은 양수이고 메뉴상품들의 수량과 상품가격을 곱한 값의 총 합보다 작을 때 변경할 수 있다.
- [ ] 메뉴는 이름을 가지고 있고, 이름에는 욕이 포함될 수 없다.
- [ ] 메뉴는 노출여부를 가지고 있고 이를 조정할 수 있다.
- [ ] 메뉴는 메뉴상품들의 수량과 상품가격을 곱한 값의 총 합보다 작을 때 노출할 수 있다.
- [ ] 메뉴를 숨기는 것은 조건 없이 할 수 있다.
- [x] 메뉴는 특정 그룹을 가지고 있다
- [x] 메뉴의 그룹은 이름을 가지고 있다.
- [x] 메뉴의 그룹 이름은 없을 수 없다.
- [x] 메뉴는 1개 이상의 메뉴상품을 가진다.
- [x] 메뉴상품은 하나의 상품과 0개 이상의 수량을 가진다.
- [x] 메뉴상품에 있는 상품은 실제 있는 상품이어야 한다.
- [x] 메뉴는 가격을 가지고 있다.
- [x] 가격은 양수이다.
- [x] 가격은 메뉴상품들의 각 상품의 가격과 수량을 곱한 총 총 합보다 클 수 없다.
- [x] 메뉴의 가격은 양수이고 메뉴상품들의 수량과 상품가격을 곱한 값의 총 합보다 작을 때 변경할 수 있다.
- [x] 메뉴는 이름을 가지고 있다.
- [x] 이름에는 욕이 포함될 수 없다.
- [x] 메뉴는 노출여부를 가지고 있고 이를 조정할 수 있다.
- [x] 메뉴는 메뉴상품들의 수량과 상품가격을 곱한 값의 총 합보다 작을 때 노출할 수 있다.
- [x] 메뉴를 숨기는 것은 조건 없이 할 수 있다.

- 주문
- [ ] 주문은 1개 이상의 주문상품(orderLineItem)을 가진다.
- [ ] 주문상품은 메뉴에 존재해야 한다.
- [ ] 주문상품은 메뉴에 노출된 상태여야 한다.
- [ ] 주문상품의 가격은 메뉴의 가격과 같아야 한다.
- [ ] 주문상품은 메뉴에 존재해야 한다.
- [ ] 주문상품은 메뉴에 노출된 상태여야 한다.
- [ ] 주문상품의 가격은 메뉴의 가격과 같아야 한다.
- [ ] 배달, 포장 주문이면 주문상품의 수량이 0보다 작으면 안된다.
Comment on lines +42 to +45

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트를 작성 했으면 체크리스트는 체크해도 좋을 것 같아요. 🙂

#535 (comment)

테스트에 대한 설명이 요구 사항을 그대로 반영하면 다른 구성원이 테스트만 보고 비즈니스를 파악할 수 있지 않을까요?

- [ ] 주문은 하나의 타입을 가진다.(타입 종류 : delivery(배달), takeout(포장), eatin(매장식사))
- [ ] 배달, 포장 주문이면 주문상품의 수량이 0보다 작으면 안된다.
- [ ] 배달 주문이면 주소가 있어야 한다.
- [ ] 매장식사 주문이면 주문테이블이 있으며 테이블은 점유된 상태가 아니어야 한다.
- [ ] 주문은 하나의 상태를 가지고 있다.(상태 종류: waiting(대기중), accepted(수락됨), served(서브됨), delivering(배달중),
delivered(배달됨), completed(완료됨))
- [ ] 주문을 받으면 대기중 상태를 가진다.
- [ ] 주문은 대기중일 때 수락될 수 있다.
- [ ] 주문이 수락될 때 주문의 상태는 수락됨으로 변경된다.
- [ ] 주문을 받으면 대기중 상태를 가진다.
- [ ] 주문은 대기중일 때 수락될 수 있다.
- [ ] 주문이 수락될 때 주문의 상태는 수락됨으로 변경된다.
- [ ] 주문이 수락 상태일 때 서브할 수 있다.
- [ ] 주문이 서브될 때 주문의 상태는 서브됨으로 변경된다.
- [ ] 배달이 시작될 때 주문의 상태는 배달중으로 변경된다.
- [ ] 배달이 완료될 때 상태는 배달됨으로 변경된다.
- [ ] 주문이 수락될 때 배달주문이면 라이더에게 배달을 요청해야 한다.
- [ ] 주문이 수락 상태일 때 서브할 수 있다.
- [ ] 주문이 서브될 때 주문의 상태는 서브됨으로 변경된다.
- [ ] 배달주문이고 서브되지 않았을 때 배달을 시작할 수 있다.
- [ ] 배달이 시작될 때 주문의 상태는 배달중으로 변경된다.
- [ ] 주문이 배달중일 때 배달을 완료할 수 있다.
- [ ] 배달이 완료될 때 상태는 배달됨으로 변경된다.
- [ ] 배달 주문일 때 상태가 배달됨이면 주문 완료처리를 할 수 있다.
- [ ] 포장이거나 매장식사 주문일 때 상태가 서브됨이면 주문 완료처리를 할 수 있다.
- [ ] 매장식사 주문일 때 주문 완료시점에 주문 테이블을 초기화한다.
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/kitchenpos/application/MenuGroupService.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package kitchenpos.application;

import java.util.List;
import java.util.Objects;
import java.util.UUID;
import kitchenpos.domain.MenuGroup;
import kitchenpos.domain.MenuGroupRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;
import java.util.UUID;

@Service
public class MenuGroupService {

private final MenuGroupRepository menuGroupRepository;

public MenuGroupService(final MenuGroupRepository menuGroupRepository) {
Expand Down
20 changes: 15 additions & 5 deletions src/main/java/kitchenpos/application/MenuService.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
package kitchenpos.application;

import kitchenpos.domain.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuGroup;
import kitchenpos.domain.MenuGroupRepository;
import kitchenpos.domain.MenuProduct;
import kitchenpos.domain.MenuRepository;
import kitchenpos.domain.Product;
import kitchenpos.domain.ProductRepository;
import kitchenpos.infra.PurgomalumClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class MenuService {

private final MenuRepository menuRepository;
private final MenuGroupRepository menuGroupRepository;
private final ProductRepository productRepository;
Expand Down
27 changes: 20 additions & 7 deletions src/main/java/kitchenpos/application/OrderService.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,29 @@
package kitchenpos.application;

import kitchenpos.domain.*;
import kitchenpos.infra.KitchenridersClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuRepository;
import kitchenpos.domain.Order;
import kitchenpos.domain.OrderLineItem;
import kitchenpos.domain.OrderRepository;
import kitchenpos.domain.OrderStatus;
import kitchenpos.domain.OrderTable;
import kitchenpos.domain.OrderTableRepository;
import kitchenpos.domain.OrderType;
import kitchenpos.infra.KitchenridersClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

private final OrderRepository orderRepository;
private final MenuRepository menuRepository;
private final OrderTableRepository orderTableRepository;
Expand Down Expand Up @@ -167,7 +179,8 @@ public Order complete(final UUID orderId) {
order.setStatus(OrderStatus.COMPLETED);
if (type == OrderType.EAT_IN) {
final OrderTable orderTable = order.getOrderTable();
if (!orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) {
if (!orderRepository.existsByOrderTableAndStatusNot(orderTable,
OrderStatus.COMPLETED)) {
orderTable.setNumberOfGuests(0);
orderTable.setOccupied(false);
}
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/kitchenpos/application/ProductService.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package kitchenpos.application;

import kitchenpos.domain.*;
import kitchenpos.infra.PurgomalumClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.UUID;
import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuProduct;
import kitchenpos.domain.MenuRepository;
import kitchenpos.domain.Product;
import kitchenpos.domain.ProductRepository;
import kitchenpos.infra.PurgomalumClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ProductService {

private final ProductRepository productRepository;
private final MenuRepository menuRepository;
private final PurgomalumClient purgomalumClient;
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/kitchenpos/domain/MenuGroupJpaRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kitchenpos.domain;

import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MenuGroupJpaRepository
extends JpaRepository<MenuGroup, UUID>, MenuGroupRepository {

}
12 changes: 9 additions & 3 deletions src/main/java/kitchenpos/domain/MenuGroupRepository.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package kitchenpos.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

public interface MenuGroupRepository extends JpaRepository<MenuGroup, UUID> {
public interface MenuGroupRepository {

Comment on lines +7 to +8

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

repository 추상화 👍

MenuGroup save(final MenuGroup entity);

Optional<MenuGroup> findById(final UUID id);

List<MenuGroup> findAll();
}
15 changes: 15 additions & 0 deletions src/main/java/kitchenpos/domain/MenuJpaRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package kitchenpos.domain;

import java.util.List;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface MenuJpaRepository extends JpaRepository<Menu, UUID>, MenuRepository {

List<Menu> findAllByIdIn(List<UUID> ids);

@Query("select m from Menu m, MenuProduct mp where mp.product.id = :productId")
List<Menu> findAllByProductId(@Param("productId") UUID productId);
}
19 changes: 11 additions & 8 deletions src/main/java/kitchenpos/domain/MenuRepository.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package kitchenpos.domain;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

public interface MenuRepository extends JpaRepository<Menu, UUID> {
List<Menu> findAllByIdIn(List<UUID> ids);
public interface MenuRepository {

Menu save(final Menu entity);

Optional<Menu> findById(final UUID id);

List<Menu> findAll();

List<Menu> findAllByIdIn(final List<UUID> ids);

@Query("select m from Menu m, MenuProduct mp where mp.product.id = :productId")
List<Menu> findAllByProductId(@Param("productId") UUID productId);
List<Menu> findAllByProductId(final UUID productId);
}
10 changes: 10 additions & 0 deletions src/main/java/kitchenpos/domain/ProductJpaRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kitchenpos.domain;

import java.util.List;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductJpaRepository extends JpaRepository<Product, UUID>, ProductRepository {

List<Product> findAllByIdIn(List<UUID> ids);
}
14 changes: 10 additions & 4 deletions src/main/java/kitchenpos/domain/ProductRepository.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package kitchenpos.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

public interface ProductRepository extends JpaRepository<Product, UUID> {
List<Product> findAllByIdIn(List<UUID> ids);
public interface ProductRepository {

Optional<Product> findById(final UUID id);

List<Product> findAllByIdIn(final List<UUID> ids);

List<Product> findAll();

Product save(final Product entity);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package kitchenpos.application;


import java.math.BigDecimal;
import java.util.List;
import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuGroup;
import kitchenpos.domain.MenuProduct;
import kitchenpos.domain.Product;


public abstract class AbstractApplicationServiceTest {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트를 위한 객체 생성 메서드들이 모여있는데요. 클래스 이름은 조금 어색한 것 같아요.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이름이 너무 고민이네요 ^_ㅠ
Utils라고 하긴 어렵고
그렇다고 환경설정이나 공통되는 테스트가 들어있는 것도 아니고..

protected Product createProductRequest(final String name, final BigDecimal price) {
final Product product = new Product();
product.setName(name);
product.setPrice(price);

return product;
}

protected Menu createMenuRequest(final String name, final BigDecimal price,
final List<MenuProduct> menuProducts, final MenuGroup menuGroup, final boolean display) {

final Menu menu = new Menu();
menu.setName(name);
menu.setPrice(price);
menu.setMenuGroup(menuGroup);
menu.setMenuProducts(menuProducts);
menu.setMenuGroupId(menuGroup.getId());
menu.setDisplayed(display);

return menu;
}

protected MenuGroup createMenuGroupRequest(final String name) {
final MenuGroup menuGroup = new MenuGroup();
menuGroup.setName(name);

return menuGroup;
}

protected MenuProduct createMenuProductRequest(final Product product, final long quantity) {
final MenuProduct menuProduct = new MenuProduct();
menuProduct.setProduct(product);
menuProduct.setProductId(product.getId());
menuProduct.setQuantity(quantity);

return menuProduct;
}
}
Loading