diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt index 74afe0f..2f5c80c 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt @@ -26,6 +26,11 @@ class CafeService( /** * 카페 생성 로직 + * - 카페 생성시 카페정보 뿐만 아니라 하위 메뉴정보, 옵션, 옵션상세 같이 생성 + * - 카페 정보(이름, 주소, 전화번호, 소개글) + * - 카페 메뉴정보 (메뉴 이름, 가격 /ex. 아메리카노, 2,800) + * - 메뉴 옵션 (옵션 이름 /ex. 사이즈) + * - 옵션 상세 (상세 이름, 추가 금액 /ex. [(medium, 0), (large, 200), (venti, 700)]) */ fun createCafe( name: String, @@ -69,6 +74,10 @@ class CafeService( return CafeInfoResponseDto.of(cafe) } + /** + * 카페 정보 수정 + * - 카페 정보만 수정 (하위 엔티티에 대해서는 각 도메인 영역에서 수정) + */ @Transactional fun updateCafe( id: Long, diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 372538c..18daeae 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -1,13 +1,87 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import org.junit.jupiter.api.Assertions.* +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.MenuOptionInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.OptionDetailInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe +import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository +import org.junit.jupiter.api.Assertions.assertEquals 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.Mockito.* +import org.mockito.junit.jupiter.MockitoExtension +import java.math.BigDecimal +import javax.persistence.GeneratedValue +@ExtendWith(MockitoExtension::class) internal class CafeServiceTest { + @InjectMocks + lateinit var mockCafeService: CafeService + + @Mock + lateinit var mockCafeRepository: CafeRepository + @Test @DisplayName("카페 신규 생성 테스트") fun createCafeTest() { + val cafeName = "beanie_cafe" + val cafeAddress = "beanie_cafe_address" + val phoneNumber = "01012345678" + val description = "beanie_cafe_description" + val sizeOptionDetailList = listOf( + OptionDetailInfoRequestDto(name = "medium", extraPrice = BigDecimal.ZERO), + OptionDetailInfoRequestDto(name = "large", extraPrice = BigDecimal.valueOf(200L)), + OptionDetailInfoRequestDto(name = "venti", extraPrice = BigDecimal.valueOf(700L)) + ) + val sizeMenuOption = MenuOptionInfoRequestDto( + title = "size", + optionDetailList = sizeOptionDetailList + ) + + val cafeMenuList = listOf( + CafeMenuInfoRequestDto( + name = "menu1", + price = BigDecimal.valueOf(2_800L), + menuOptionList = listOf(sizeMenuOption) + ), + CafeMenuInfoRequestDto( + name = "menu2", + price = BigDecimal.valueOf(3_500L), + menuOptionList = listOf(sizeMenuOption) + ), + ) + + val savedMockCafeId = 100L + + `when`(mockCafeRepository.findByName(cafeName)).thenReturn(null) + `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { + val argument = it.getArgument(0) + val idField = argument.javaClass.declaredFields + .find { f -> + f.getAnnotation(GeneratedValue::class.java) != null + } ?: return@thenAnswer argument + + idField.isAccessible = true + idField.set(argument, savedMockCafeId) + + return@thenAnswer argument + } + + val savedCafeId = mockCafeService.createCafe( + name = cafeName, + address = cafeAddress, + phoneNumber = phoneNumber, + description = description, + cafeMenuRequestList = cafeMenuList + ) + + verify(mockCafeRepository).findByName(cafeName) + verify(mockCafeRepository).save(any(Cafe::class.java)) + + assertEquals(savedCafeId, savedMockCafeId) } } \ No newline at end of file