Skip to content

Commit

Permalink
[레거시 코드 리팩터링 - 1단계] 오찌(오지훈) 미션 제출합니다. (#204)
Browse files Browse the repository at this point in the history
* docs: 요구 사항 정리

* test: 상품에 대한 서비스 테스트 코드 작성

* test: 테스트 환경에서 flyway disable

* test: 상품에 대한 Dao 테스트 코드 작성

* test: 서비스와 Dao에 대한 테스트 설정을 어노테이션으로 분리

* test: ProductDao의 누락 테스트 추가

* test: 메뉴 그룹에 대한 Dao 테스트 코드 작성

* test: 메뉴 그룹에 대한 서비스 테스트 코드 작성

* test: 메뉴에 대한 Dao 테스트 코드 작성

* test: 메뉴에 대한 서비스 테스트 코드 작성

* chore: 자바 11로 마이그레이션

* test: 메뉴 상품에 대한 Dao 테스트 코드 작성

* test: 단체 지정에 대한 Dao 테스트 코드 작성

* test: 주문 테이블에 대한 Dao 테스트 코드 작성

* test: 단체 지정 픽스처 생성 구조 변경

* test: 외래키 null 가능 테스트 추가

* test: 주문에 대한 Dao 테스트 코드 작성

* test: 주문 항목에 대한 Dao 테스트 코드 작성

* test: 주문 테이블에 대한 서비스 테스트 코드 작성

* test: 단체 지정에 대한 서비스 테스트 코드 작성

* test: 주문에 대한 서비스 테스트 코드 작성

* test: 서비스 테스트가 테스트 대상 서비스만 의존하고 나머지는 DAO를 의존하도록 수정
  • Loading branch information
Ohzzi authored Oct 24, 2022
1 parent 6902546 commit d12d39b
Show file tree
Hide file tree
Showing 23 changed files with 1,669 additions and 14 deletions.
56 changes: 56 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,59 @@
| 단체 지정 | table group | 통합 계산을 위해 개별 주문 테이블을 그룹화하는 기능 |
| 주문 항목 | order line item | 주문에 속하는 수량이 있는 메뉴 |
| 매장 식사 | eat in | 포장하지 않고 매장에서 식사하는 것 |

## 요구 사항

### 상품

- 상품을 생성할 수 있다.
- 상품 가격은 0원 이상이어야 한다.
- 상품 목록을 조회할 수 있다.

### 메뉴 그룹

- 메뉴 그룹을 생성할 수 있다.
- 메뉴 그룹의 목록을 조회할 수 있다.

### 메뉴

- 메뉴를 생성할 수 있다.
- 메뉴 가격은 0원 이상이어야 한다.
- 메뉴는 존재하는 메뉴 그룹에 속해야 한다.
- 메뉴는 존재하는 상품들만 포함해야 한다.
- 메뉴의 가격은 메뉴에 속하는 상품의 가격 합보다 작거나 같아야 한다.
- 메뉴 목록을 조회할 수 있다.

### 주문

- 주문을 생성할 수 있다.
- 주문 항목이 있어야 한다.
- 주문 항목의 메뉴가 모두 존재해야 한다.
- 주문은 존재하는 주문 테이블에 속해야 한다.
- 주문이 속한 주문 테이블은 빈 주문 테이블이 아니어야 한다.
- 주문 상태를 변경할 수 있다.
- 상태를 변경하려는 주문이 존재해야 한다.
- 이미 완료된 주문의 상태는 변경할 수 없다.

### 주문 테이블

- 주문 테이블을 생성할 수 있다.
- 주문 테이블 목록을 조회할 수 있다.
- 주문 테이블을 빈 테이블로 변경할 수 있다.
- 변경 대상 테이블이 존재해야 한다.
- 변경 대상 테이블이 단체 지정되어 있지 않아야 한다.
- 변경 대상 테이블의 주문 상태가 조리 또는 식사가 아니어야 한다.
- 테이블의 방문한 손님 수를 변경할 수 있다.
- 방문한 손님 수는 0 이상이어야 한다.
- 변경 대상 테이블이 존재해야 한다.
- 변경 대상 테이블이 빈 테이블이 아니어야 한다.

### 단체 지정

- 단체 지정을 할 수 있다.
- 지정하려는 테이블은 2개 이상이어야 한다.
- 지정하려는 테이블이 모두 존재하는 테이블이어야 한다.
- 지정하려는 테이블이 빈 테이블이어야 한다.
- 이미 지정된 테이블을 단체 지정할 수는 없다.
- 단체 지정을 해제할 수 있다.
- 해제하려는 테이블의 주문 상태가 조리 또는 식사가 아니어야 한다.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {

group = 'camp.nextstep.edu'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
sourceCompatibility = '1.11'

repositories {
mavenCentral()
Expand Down
15 changes: 7 additions & 8 deletions src/main/java/kitchenpos/application/TableGroupService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package kitchenpos.application;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import kitchenpos.dao.OrderDao;
import kitchenpos.dao.OrderTableDao;
import kitchenpos.dao.TableGroupDao;
Expand All @@ -10,19 +14,14 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Service
public class TableGroupService {
private final OrderDao orderDao;
private final OrderTableDao orderTableDao;
private final TableGroupDao tableGroupDao;

public TableGroupService(final OrderDao orderDao, final OrderTableDao orderTableDao, final TableGroupDao tableGroupDao) {
public TableGroupService(final OrderDao orderDao, final OrderTableDao orderTableDao,
final TableGroupDao tableGroupDao) {
this.orderDao = orderDao;
this.orderTableDao = orderTableDao;
this.tableGroupDao = tableGroupDao;
Expand Down Expand Up @@ -76,7 +75,7 @@ public void ungroup(final Long tableGroupId) {
.collect(Collectors.toList());

if (orderDao.existsByOrderTableIdInAndOrderStatusIn(
orderTableIds, Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))) {
orderTableIds, List.of(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))) {
throw new IllegalArgumentException();
}

Expand Down
8 changes: 3 additions & 5 deletions src/main/java/kitchenpos/application/TableService.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package kitchenpos.application;

import java.util.List;
import java.util.Objects;
import kitchenpos.dao.OrderDao;
import kitchenpos.dao.OrderTableDao;
import kitchenpos.domain.OrderStatus;
import kitchenpos.domain.OrderTable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

@Service
public class TableService {
private final OrderDao orderDao;
Expand Down Expand Up @@ -43,7 +41,7 @@ public OrderTable changeEmpty(final Long orderTableId, final OrderTable orderTab
}

if (orderDao.existsByOrderTableIdAndOrderStatusIn(
orderTableId, Arrays.asList(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))) {
orderTableId, List.of(OrderStatus.COOKING.name(), OrderStatus.MEAL.name()))) {
throw new IllegalArgumentException();
}

Expand Down
43 changes: 43 additions & 0 deletions src/test/java/kitchenpos/application/MenuGroupServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package kitchenpos.application;

import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;

import java.util.List;
import kitchenpos.domain.MenuGroup;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

@ServiceTest
class MenuGroupServiceTest {

@Autowired
private MenuGroupService menuGroupService;

@Test
void 메뉴_그룹을_생성할_수_있다() {
MenuGroup menuGroup = 메뉴_그룹을_생성한다("메뉴 그룹");

MenuGroup savedMenuGroup = menuGroupService.create(menuGroup);

assertAll(
() -> assertThat(savedMenuGroup.getId()).isNotNull(),
() -> assertThat(savedMenuGroup).usingRecursiveComparison()
.ignoringFields("id")
.isEqualTo(menuGroup)
);
}

@Test
void 메뉴_그룹의_목록을_조회할_수_있다() {
MenuGroup menuGroup1 = menuGroupService.create(메뉴_그룹을_생성한다("메뉴 그룹1"));
MenuGroup menuGroup2 = menuGroupService.create(메뉴_그룹을_생성한다("메뉴 그룹2"));

List<MenuGroup> actual = menuGroupService.list();

assertThat(actual).hasSize(2)
.usingFieldByFieldElementComparator()
.containsExactly(menuGroup1, menuGroup2);
}
}
107 changes: 107 additions & 0 deletions src/test/java/kitchenpos/application/MenuServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package kitchenpos.application;

import static kitchenpos.support.TestFixtureFactory.메뉴_그룹을_생성한다;
import static kitchenpos.support.TestFixtureFactory.메뉴_상품을_생성한다;
import static kitchenpos.support.TestFixtureFactory.메뉴를_생성한다;
import static kitchenpos.support.TestFixtureFactory.상품을_생성한다;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertAll;

import java.math.BigDecimal;
import java.util.List;
import kitchenpos.dao.MenuGroupDao;
import kitchenpos.dao.ProductDao;
import kitchenpos.domain.Menu;
import kitchenpos.domain.MenuProduct;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

@ServiceTest
class MenuServiceTest {

@Autowired
private ProductDao productDao;
@Autowired
private MenuGroupDao menuGroupDao;
@Autowired
private MenuService menuService;

@Test
void 메뉴를_생성할_수_있다() {
Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹"))
.getId();
Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(1_000)))
.getId();
MenuProduct menuProduct = 메뉴_상품을_생성한다(null, productId, 1);
Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(0), menuGroupId, List.of(menuProduct));

Menu savedMenu = menuService.create(menu);

assertAll(
() -> assertThat(savedMenu.getId()).isNotNull(),
() -> assertThat(savedMenu.getPrice().compareTo(menu.getPrice())).isZero(),
() -> assertThat(savedMenu).usingRecursiveComparison()
.ignoringFields("id", "price", "menuProducts")
.isEqualTo(savedMenu),
() -> assertThat(savedMenu.getMenuProducts()).hasSize(1)
.usingElementComparatorIgnoringFields("seq")
.containsOnly(menuProduct)
);
}

@Test
void 메뉴_가격이_0원_미만이면_예외를_반환한다() {
Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(-1), null, null);

assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class);
}

@Test
void 메뉴_그룹이_존재하지_않으면_예외를_반환한다() {
Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(0), 0L, null);

assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class);
}

@Test
void 존재하지_않는_상품이_메뉴에_포함되어_있으면_예외를_반환한다() {
Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹"))
.getId();
MenuProduct menuProduct = 메뉴_상품을_생성한다(null, 0L, 1);
Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(2_000), menuGroupId, List.of(menuProduct));

assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class);
}

@Test
void 메뉴_가격이_메뉴_상품_가격의_합보다_크면_예외를_반환한다() {
Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹"))
.getId();
Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(1_000)))
.getId();
MenuProduct menuProduct = 메뉴_상품을_생성한다(null, productId, 1);
Menu menu = 메뉴를_생성한다("메뉴", new BigDecimal(2_000), menuGroupId, List.of(menuProduct));

assertThatThrownBy(() -> menuService.create(menu)).isInstanceOf(IllegalArgumentException.class);
}

@Test
void 모든_메뉴를_조회할_수_있다() {
Long menuGroupId = menuGroupDao.save(메뉴_그룹을_생성한다("메뉴 그룹"))
.getId();
Long productId = productDao.save(상품을_생성한다("상품", new BigDecimal(1_000)))
.getId();
MenuProduct menuProduct = 메뉴_상품을_생성한다(null, productId, 1);
Menu menu1 = menuService.create(
메뉴를_생성한다("메뉴1", new BigDecimal(0), menuGroupId, List.of(menuProduct)));
Menu menu2 = menuService.create(
메뉴를_생성한다("메뉴2", new BigDecimal(0), menuGroupId, List.of(menuProduct)));

List<Menu> actual = menuService.list();

assertThat(actual).hasSize(2)
.usingElementComparatorIgnoringFields("price", "menuProducts")
.containsExactly(menu1, menu2);
}
}
Loading

0 comments on commit d12d39b

Please sign in to comment.