From bd33383c100d13901c7f1d429c649ada9a476057 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Wed, 27 Jul 2022 02:35:24 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[#8]=20feat:=20=EC=B9=B4=ED=8E=98=20?= =?UTF-8?q?=EC=8B=A0=EA=B7=9C=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/BaseTimeEntity.kt | 10 +-- .../domain/cafe/controller/CafeController.kt | 15 ++++- .../cafe/dto/cafe/CafeUpdateRequestDto.kt | 8 --- .../cafe/dto/request/CafeInfoRequestDto.kt | 9 +++ .../dto/request/CafeMenuInfoRequestDto.kt | 9 +++ .../dto/request/MenuOptionInfoRequestDto.kt | 13 ++++ .../dongnecafe/domain/cafe/entity/Cafe.kt | 65 +++++++++++++++---- .../dongnecafe/domain/cafe/entity/CafeMenu.kt | 33 +++++++--- .../domain/cafe/entity/MenuOption.kt | 4 +- .../domain/cafe/entity/OptionDetail.kt | 2 +- .../domain/cafe/error/CafeExistedException.kt | 3 + .../domain/cafe/repository/CafeRepository.kt | 1 + .../domain/cafe/service/CafeService.kt | 45 +++++++++++-- .../domain/cafe/service/CafeServiceTest.kt | 13 ++++ 14 files changed, 186 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeUpdateRequestDto.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt b/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt index 633cad1..ceb58e2 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt @@ -11,16 +11,16 @@ import javax.persistence.MappedSuperclass @MappedSuperclass @EntityListeners(AuditingEntityListener::class) -class BaseTimeEntity( +class BaseTimeEntity protected constructor() { @CreatedDate - val createdAt: LocalDateTime = LocalDateTime.now(), + val createdAt: LocalDateTime = LocalDateTime.now() @CreatedBy - val createdBy: String = "", + val createdBy: String = "" @LastModifiedDate - val updatedAt: LocalDateTime? = null, + val updatedAt: LocalDateTime? = null @LastModifiedBy val updatedBy: String? = null -) \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index 19d68f5..cf00f69 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -2,7 +2,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.controller import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeInfoResponseDto import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeSearchResponseDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeUpdateRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto import io.beaniejoy.dongnecafe.domain.cafe.service.CafeService import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable @@ -15,6 +15,17 @@ import org.springframework.web.bind.annotation.* class CafeController( private val cafeService: CafeService ) { + @PostMapping + fun createCafe(@RequestBody resource: CafeInfoRequestDto) { + val savedCafeId = cafeService.createCafe( + name = resource.name!!, + address = resource.address!!, + phoneNumber = resource.phoneNumber!!, + description = resource.description!!, + cafeMenuRequestList = resource.cafeMenuList + ) + } + @GetMapping fun searchCafeList( @PageableDefault(sort = ["name"], direction = Sort.Direction.ASC, page = 0, size = 10) pageable: Pageable @@ -31,7 +42,7 @@ class CafeController( @PutMapping("/{id}") fun updateCafeInfo( @PathVariable("id") id: Long, - @RequestBody resource: CafeUpdateRequestDto + @RequestBody resource: CafeInfoRequestDto ): String { cafeService.updateCafe( id = id, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeUpdateRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeUpdateRequestDto.kt deleted file mode 100644 index 3664938..0000000 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeUpdateRequestDto.kt +++ /dev/null @@ -1,8 +0,0 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.cafe - -data class CafeUpdateRequestDto( - val name: String? = null, - val address: String? = null, - val phoneNumber: String? = null, - val description: String? = null -) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt new file mode 100644 index 0000000..70fa918 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt @@ -0,0 +1,9 @@ +package io.beaniejoy.dongnecafe.domain.cafe.dto.request + +data class CafeInfoRequestDto( + val name: String? = null, + val address: String? = null, + val phoneNumber: String? = null, + val description: String? = null, + val cafeMenuList: List = arrayListOf() +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt new file mode 100644 index 0000000..1621c4e --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt @@ -0,0 +1,9 @@ +package io.beaniejoy.dongnecafe.domain.cafe.dto.request + +import java.math.BigDecimal + +data class CafeMenuInfoRequestDto( + val name: String? = null, + val price: BigDecimal = BigDecimal.ZERO, + val menuOptionList: List +) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt new file mode 100644 index 0000000..f38d6d5 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt @@ -0,0 +1,13 @@ +package io.beaniejoy.dongnecafe.domain.cafe.dto.request + +import java.math.BigDecimal + +data class MenuOptionInfoRequestDto( + val title: String, + val optionDetailList: List +) + +data class OptionDetailInfoRequestDto( + val name: String, + val extraPrice: BigDecimal +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt index c5bd554..5752f90 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt @@ -1,37 +1,76 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto import javax.persistence.* @Entity @Table(name = "cafe") -class Cafe( +class Cafe protected constructor( + name: String, + address: String, + phoneNumber: String, + description: String, +) : BaseTimeEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long = 0L, + val id: Long = 0L @Column(name = "name", nullable = false) - var name: String, + var name: String = name + protected set @Column(name = "address", nullable = false) - var address: String, + var address: String = address + protected set @Column(name = "phone_number", nullable = false) - var phoneNumber: String, + var phoneNumber: String = phoneNumber + protected set @Column(name = "total_rate", nullable = false) - val totalRate: Double, + val totalRate: Double = 0.0 @Column(name = "description", nullable = false) - var description: String, + var description: String = description + protected set - @OneToMany(mappedBy = "cafe", fetch = FetchType.LAZY) - val cafeMenuList: MutableList, + @OneToMany(mappedBy = "cafe", fetch = FetchType.LAZY, cascade = [CascadeType.ALL]) + val cafeMenuList: MutableList = arrayListOf() - @OneToMany(mappedBy = "cafe", fetch = FetchType.LAZY) - val cafeImageList: MutableList -) : BaseTimeEntity() { - fun updateInfo(name: String, address: String, phoneNumber: String, description: String) { + @OneToMany(mappedBy = "cafe", fetch = FetchType.LAZY, cascade = [CascadeType.ALL]) + val cafeImageList: MutableList = arrayListOf() + + companion object { + fun createCafe( + name: String, + address: String, + phoneNumber: String, + description: String, + cafeMenuList: List + ): Cafe { + return Cafe( + name = name, + address = address, + phoneNumber = phoneNumber, + description = description + ).apply { + cafeMenuList.forEach { this.addCafeMenu(it) } + } + } + } + + fun addCafeMenu(cafeMenu: CafeMenu) { + cafeMenuList.add(cafeMenu) + cafeMenu.updateCafe(this) + } + + fun updateInfo( + name: String, + address: String, + phoneNumber: String, + description: String + ) { this.name = name this.address = address this.phoneNumber = phoneNumber diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index b8f2872..5c5e559 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -7,20 +7,37 @@ import javax.persistence.* @Entity @Table(name = "cafe_menu") class CafeMenu( + name: String, + price: BigDecimal, +) : BaseTimeEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long = 0L, + val id: Long = 0L @Column(name = "name", nullable = false) - val name: String, + val name: String = name @Column(name = "price", nullable = false) - val price: BigDecimal = BigDecimal.ZERO, + val price: BigDecimal = price - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cafe_id", nullable = false) - val cafe: Cafe, + var cafe: Cafe? = null + protected set - @OneToMany(mappedBy = "cafeMenu", fetch = FetchType.LAZY) - val menuOptionList: MutableList -) : BaseTimeEntity() \ No newline at end of file + @OneToMany(mappedBy = "cafeMenu", fetch = FetchType.LAZY, cascade = [CascadeType.ALL]) + val menuOptionList: MutableList = arrayListOf() + + companion object { + fun createCafeMenu(name: String, price: BigDecimal): CafeMenu { + return CafeMenu( + name = name, + price = price + ) + } + } + + fun updateCafe(cafe: Cafe) { + this.cafe = cafe + } +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index 65884ba..303e4b8 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -13,10 +13,10 @@ class MenuOption( @Column(name = "title", nullable = false) val title: String, - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "menu_id", nullable = false) val cafeMenu: CafeMenu, - @OneToMany(mappedBy = "menuOption", fetch = FetchType.EAGER) + @OneToMany(mappedBy = "menuOption", fetch = FetchType.EAGER, cascade = [CascadeType.ALL]) val optionDetailList: MutableList ) : BaseTimeEntity() \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt index 68b8bf1..3224480 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt @@ -17,7 +17,7 @@ class OptionDetail( @Column(name = "extra_price", nullable = false) val extraPrice: BigDecimal, - @ManyToOne + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "option_id", nullable = false) val menuOption: MenuOption ): BaseTimeEntity() \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt new file mode 100644 index 0000000..3775d57 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt @@ -0,0 +1,3 @@ +package io.beaniejoy.dongnecafe.domain.cafe.error + +class CafeExistedException(name: String): RuntimeException("Cafe[$name] is already existed") \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt index 3d0314f..8cd1bac 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt @@ -4,4 +4,5 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe import org.springframework.data.jpa.repository.JpaRepository interface CafeRepository : JpaRepository { + fun findByName(name: String): Cafe? } \ No newline at end of file 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 adeffc1..d21f582 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 @@ -2,7 +2,10 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeInfoResponseDto import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeSearchResponseDto +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe +import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu +import io.beaniejoy.dongnecafe.domain.cafe.error.CafeExistedException import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository import mu.KLogging @@ -13,20 +16,51 @@ import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service -@Transactional +@Transactional(readOnly = true) class CafeService( - private val cafeRepository: CafeRepository + private val cafeRepository: CafeRepository, ) { - companion object: KLogging() + companion object : KLogging() + + fun createCafe( + name: String, + address: String, + phoneNumber: String, + description: String, + cafeMenuRequestList: List, + ): Long { + checkCafeExistedByName(name) + + val cafeMenuList = cafeMenuRequestList.map { + CafeMenu.createCafeMenu(it.name!!, it.price) + } + + val cafe = Cafe.createCafe( + name = name, + address = address, + phoneNumber = phoneNumber, + description = description, + cafeMenuList = cafeMenuList + ) + + val savedCafe = cafeRepository.save(cafe) + + return savedCafe.id + } + + private fun checkCafeExistedByName(name: String) { + val findCafe = cafeRepository.findByName(name) + if (findCafe != null) { + throw CafeExistedException(name) + } + } - @Transactional(readOnly = true) fun getCafeList(pageable: Pageable): Page { val cafeList: Page = cafeRepository.findAll(pageable) return cafeList.map { CafeSearchResponseDto.of(it) } } - @Transactional(readOnly = true) fun getCafeInfoByCafeId(id: Long): CafeInfoResponseDto { val cafe = cafeRepository.findByIdOrNull(id) ?: throw CafeNotFoundException(id) @@ -34,6 +68,7 @@ class CafeService( return CafeInfoResponseDto.of(cafe) } + @Transactional fun updateCafe( id: Long, name: String, 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 new file mode 100644 index 0000000..372538c --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -0,0 +1,13 @@ +package io.beaniejoy.dongnecafe.domain.cafe.service + +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class CafeServiceTest { + @Test + @DisplayName("카페 신규 생성 테스트") + fun createCafeTest() { + + } +} \ No newline at end of file From d9bafc8e80fce98c5236b755917d7ec17fbe5d21 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Wed, 27 Jul 2022 02:48:55 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[#8]=20feat:=20=EC=B9=B4=ED=8E=98=20?= =?UTF-8?q?=EC=8B=A0=EA=B7=9C=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cafe 관련 연관관계 엔티티 생성 로직 추가(CafeMenu, MenuOption, OptionDetail) --- .../dongnecafe/domain/cafe/entity/Cafe.kt | 2 +- .../dongnecafe/domain/cafe/entity/CafeMenu.kt | 13 +++++-- .../domain/cafe/entity/MenuOption.kt | 34 +++++++++++++++---- .../domain/cafe/entity/OptionDetail.kt | 29 ++++++++++++---- .../domain/cafe/service/CafeService.kt | 2 ++ 5 files changed, 64 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt index 5752f90..0027cee 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt @@ -61,7 +61,7 @@ class Cafe protected constructor( } fun addCafeMenu(cafeMenu: CafeMenu) { - cafeMenuList.add(cafeMenu) + this.cafeMenuList.add(cafeMenu) cafeMenu.updateCafe(this) } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index 5c5e559..bf943cf 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -6,7 +6,7 @@ import javax.persistence.* @Entity @Table(name = "cafe_menu") -class CafeMenu( +class CafeMenu protected constructor( name: String, price: BigDecimal, ) : BaseTimeEntity() { @@ -29,15 +29,22 @@ class CafeMenu( val menuOptionList: MutableList = arrayListOf() companion object { - fun createCafeMenu(name: String, price: BigDecimal): CafeMenu { + fun createCafeMenu(name: String, price: BigDecimal, menuOptionList: List): CafeMenu { return CafeMenu( name = name, price = price - ) + ).apply { + menuOptionList.forEach { this.addMenuOption(it) } + } } } fun updateCafe(cafe: Cafe) { this.cafe = cafe } + + fun addMenuOption(menuOption: MenuOption) { + this.menuOptionList.add(menuOption) + menuOption.updateCafeMenu(this) + } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index 303e4b8..37938fd 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -5,18 +5,40 @@ import javax.persistence.* @Entity @Table(name = "menu_option") -class MenuOption( +class MenuOption protected constructor( + title: String +) : BaseTimeEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long = 0L, + val id: Long = 0L @Column(name = "title", nullable = false) - val title: String, + val title: String = title @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "menu_id", nullable = false) - val cafeMenu: CafeMenu, + var cafeMenu: CafeMenu? = null + protected set @OneToMany(mappedBy = "menuOption", fetch = FetchType.EAGER, cascade = [CascadeType.ALL]) - val optionDetailList: MutableList -) : BaseTimeEntity() \ No newline at end of file + val optionDetailList: MutableList = arrayListOf() + + companion object { + fun createMenuOption(title: String, optionDetailList: List): MenuOption { + return MenuOption( + title = title + ).apply { + optionDetailList.forEach { this.addOptionDetail(it) } + } + } + } + + fun updateCafeMenu(cafeMenu: CafeMenu) { + this.cafeMenu = cafeMenu + } + + fun addOptionDetail(optionDetail: OptionDetail) { + this.optionDetailList.add(optionDetail) + optionDetail.updateMenuOption(this) + } +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt index 3224480..59b83f0 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt @@ -6,18 +6,35 @@ import javax.persistence.* @Entity @Table(name = "option_detail") -class OptionDetail( +class OptionDetail protected constructor( + name: String, + extraPrice: BigDecimal +) : BaseTimeEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - val id: Long = 0L, + val id: Long = 0L @Column(name = "name", nullable = false) - val name: String, + val name: String = name @Column(name = "extra_price", nullable = false) - val extraPrice: BigDecimal, + val extraPrice: BigDecimal = extraPrice @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "option_id", nullable = false) - val menuOption: MenuOption -): BaseTimeEntity() \ No newline at end of file + var menuOption: MenuOption? = null + protected set + + companion object { + fun createOptionDetail(name: String, extraPrice: BigDecimal): OptionDetail { + return OptionDetail( + name = name, + extraPrice = extraPrice + ) + } + } + + fun updateMenuOption(menuOption: MenuOption) { + this.menuOption = menuOption + } +} \ No newline at end of file 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 d21f582..309c0c7 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 @@ -31,6 +31,8 @@ class CafeService( ): Long { checkCafeExistedByName(name) + + val cafeMenuList = cafeMenuRequestList.map { CafeMenu.createCafeMenu(it.name!!, it.price) } From aeff3a51af7147cdf5c1a2cdff89f2b6ffee3483 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Thu, 4 Aug 2022 01:37:15 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[#8]=20feat:=20Cafe=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20CRUD=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cafe 생성 로직 수정 및 적용 --- .../domain/cafe/controller/CafeController.kt | 4 ++-- .../dongnecafe/domain/cafe/entity/Cafe.kt | 22 +++++++++++++++++-- .../domain/cafe/service/CafeService.kt | 13 +++++------ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index cf00f69..d9dbfee 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -16,8 +16,8 @@ class CafeController( private val cafeService: CafeService ) { @PostMapping - fun createCafe(@RequestBody resource: CafeInfoRequestDto) { - val savedCafeId = cafeService.createCafe( + fun createCafe(@RequestBody resource: CafeInfoRequestDto): Long { + return cafeService.createCafe( name = resource.name!!, address = resource.address!!, phoneNumber = resource.phoneNumber!!, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt index 0027cee..41d6442 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt @@ -47,8 +47,26 @@ class Cafe protected constructor( address: String, phoneNumber: String, description: String, - cafeMenuList: List + cafeMenuRequestList: List, ): Cafe { + val cafeMenuList = cafeMenuRequestList.map { cafeMenuRequestDto -> + CafeMenu.createCafeMenu( + name = cafeMenuRequestDto.name!!, + price = cafeMenuRequestDto.price, + menuOptionList = cafeMenuRequestDto.menuOptionList.map { menuOptionRequestDto -> + MenuOption.createMenuOption( + title = menuOptionRequestDto.title, + optionDetailList = menuOptionRequestDto.optionDetailList.map { optionDetailRequestDto -> + OptionDetail.createOptionDetail( + name = optionDetailRequestDto.name, + extraPrice = optionDetailRequestDto.extraPrice + ) + } + ) + } + ) + } + return Cafe( name = name, address = address, @@ -69,7 +87,7 @@ class Cafe protected constructor( name: String, address: String, phoneNumber: String, - description: String + description: String, ) { this.name = name this.address = address 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 309c0c7..74afe0f 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 @@ -5,6 +5,8 @@ import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeSearchResponseDto import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu +import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption +import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import io.beaniejoy.dongnecafe.domain.cafe.error.CafeExistedException import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository @@ -22,6 +24,9 @@ class CafeService( ) { companion object : KLogging() + /** + * 카페 생성 로직 + */ fun createCafe( name: String, address: String, @@ -31,18 +36,12 @@ class CafeService( ): Long { checkCafeExistedByName(name) - - - val cafeMenuList = cafeMenuRequestList.map { - CafeMenu.createCafeMenu(it.name!!, it.price) - } - val cafe = Cafe.createCafe( name = name, address = address, phoneNumber = phoneNumber, description = description, - cafeMenuList = cafeMenuList + cafeMenuRequestList = cafeMenuRequestList ) val savedCafe = cafeRepository.save(cafe) From 410943a74eae498a7d286d94b0bded18d3bcb4f6 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sat, 6 Aug 2022 21:56:37 +0900 Subject: [PATCH 4/9] =?UTF-8?q?[#8]=20feat:=20Cafe=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20CRUD=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CafeService 생성, 수정 로직 주석 추가 - CafeServiceTest를 통한 카페 생성 테스트(Mockito 사용) --- .../domain/cafe/service/CafeService.kt | 9 +++ .../domain/cafe/service/CafeServiceTest.kt | 76 ++++++++++++++++++- 2 files changed, 84 insertions(+), 1 deletion(-) 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 From a18dfdf193cde8611ac27fc0a7d302bd4bb6fff2 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sun, 7 Aug 2022 01:57:37 +0900 Subject: [PATCH 5/9] =?UTF-8?q?[#8]=20Cafe=20=EA=B8=B0=EB=B3=B8=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20Test=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카페 신규 생성시 예외 발생 케이스 테스트 - 카페 정보 변경 및 예외 발생 케이스 테스트 --- .../domain/cafe/service/CafeServiceTest.kt | 150 +++++++++++++++--- 1 file changed, 128 insertions(+), 22 deletions(-) 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 18daeae..e9a4d81 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,22 +1,30 @@ package io.beaniejoy.dongnecafe.domain.cafe.service +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto 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.error.CafeExistedException +import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException 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.MethodOrderer import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestMethodOrder +import org.junit.jupiter.api.assertThrows 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 java.util.* import javax.persistence.GeneratedValue @ExtendWith(MockitoExtension::class) +@TestMethodOrder(MethodOrderer.DisplayName::class) internal class CafeServiceTest { @InjectMocks lateinit var mockCafeService: CafeService @@ -26,7 +34,111 @@ internal class CafeServiceTest { @Test @DisplayName("카페 신규 생성 테스트") - fun createCafeTest() { + fun create_cafe_test() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val savedMockCafeId = 100L + + `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) + `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { + injectCafeId(it.getArgument(0), savedMockCafeId) + } + + // when + val savedCafeId = mockCafeService.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + // then + verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유 + verify(mockCafeRepository).save(any(Cafe::class.java)) + + assertEquals(savedCafeId, savedMockCafeId) + } + + @Test + @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") + fun fail_create_cafe_when_existed() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe) + + // then + assertThrows { + // when + mockCafeService.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + } + } + + @Test + @DisplayName("카페 정보 변경 테스트") + fun update_cafe_test() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + val cafeId = 50L + + // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) + + // then + mockCafeService.updateCafe( + id = cafeId, + name = "", + address = "", + phoneNumber = "", + description = "", + ) + + verify(mockCafeRepository).findById(eq(cafeId)) + + // TODO update TEST 방법? + } + + @Test + @DisplayName("카페 정보 변경시 존재하지 않는 카페 예외 발생 테스트") + fun fail_update_cafe_when_not_found() { + // given + val cafeId = 50L + + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty()) + + assertThrows { + mockCafeService.updateCafe( + id = cafeId, + name = "", + address = "", + phoneNumber = "", + description = "", + ) + } + } + + private fun createCreateCafeRequestDto(): CafeInfoRequestDto { val cafeName = "beanie_cafe" val cafeAddress = "beanie_cafe_address" val phoneNumber = "01012345678" @@ -55,33 +167,27 @@ internal class CafeServiceTest { ), ) - 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( + return CafeInfoRequestDto( name = cafeName, address = cafeAddress, phoneNumber = phoneNumber, description = description, - cafeMenuRequestList = cafeMenuList + cafeMenuList = cafeMenuList ) + } - verify(mockCafeRepository).findByName(cafeName) - verify(mockCafeRepository).save(any(Cafe::class.java)) + private fun injectCafeId( + cafe: Cafe, + newCafeId: Long, + ): Cafe { + val idField = cafe.javaClass.declaredFields + .find { f -> + f.getAnnotation(GeneratedValue::class.java) != null + } ?: return cafe - assertEquals(savedCafeId, savedMockCafeId) + idField.isAccessible = true + idField.set(cafe, newCafeId) + + return cafe } } \ No newline at end of file From bae794a5aa73a2b65c5229b8134e57b157df73d4 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Mon, 8 Aug 2022 00:10:43 +0900 Subject: [PATCH 6/9] =?UTF-8?q?[#8]=20feat:=20Cafe=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cafe.createCafe 메소드 리팩토링 - Cafe 기본적인 값 일치 테스트코드 추가 --- .../domain/cafe/controller/CafeController.kt | 2 +- .../dongnecafe/domain/cafe/entity/Cafe.kt | 16 +- .../dongnecafe/domain/cafe/entity/CafeMenu.kt | 12 +- .../domain/cafe/entity/MenuOption.kt | 12 +- .../domain/cafe/service/CafeService.kt | 1 + .../dongnecafe/domain/cafe/entity/CafeTest.kt | 106 ++++++++++ .../cafe/service/CafeServiceMockTest.kt | 193 ++++++++++++++++++ .../domain/cafe/service/CafeServiceTest.kt | 192 +---------------- 8 files changed, 326 insertions(+), 208 deletions(-) create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index d9dbfee..21b2f2f 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -27,7 +27,7 @@ class CafeController( } @GetMapping - fun searchCafeList( + fun searchCafe( @PageableDefault(sort = ["name"], direction = Sort.Direction.ASC, page = 0, size = 10) pageable: Pageable ): Page { return cafeService.getCafeList(pageable) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt index 41d6442..bd694fb 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt @@ -49,21 +49,11 @@ class Cafe protected constructor( description: String, cafeMenuRequestList: List, ): Cafe { - val cafeMenuList = cafeMenuRequestList.map { cafeMenuRequestDto -> + val cafeMenuEntityList = cafeMenuRequestList.map { cafeMenuRequestDto -> CafeMenu.createCafeMenu( name = cafeMenuRequestDto.name!!, price = cafeMenuRequestDto.price, - menuOptionList = cafeMenuRequestDto.menuOptionList.map { menuOptionRequestDto -> - MenuOption.createMenuOption( - title = menuOptionRequestDto.title, - optionDetailList = menuOptionRequestDto.optionDetailList.map { optionDetailRequestDto -> - OptionDetail.createOptionDetail( - name = optionDetailRequestDto.name, - extraPrice = optionDetailRequestDto.extraPrice - ) - } - ) - } + menuOptionRequestList = cafeMenuRequestDto.menuOptionList ) } @@ -73,7 +63,7 @@ class Cafe protected constructor( phoneNumber = phoneNumber, description = description ).apply { - cafeMenuList.forEach { this.addCafeMenu(it) } + cafeMenuEntityList.forEach { this.addCafeMenu(it) } } } } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index bf943cf..ed9d00d 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -1,6 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.MenuOptionInfoRequestDto import java.math.BigDecimal import javax.persistence.* @@ -29,12 +30,19 @@ class CafeMenu protected constructor( val menuOptionList: MutableList = arrayListOf() companion object { - fun createCafeMenu(name: String, price: BigDecimal, menuOptionList: List): CafeMenu { + fun createCafeMenu(name: String, price: BigDecimal, menuOptionRequestList: List): CafeMenu { + val menuOptionEntityList = menuOptionRequestList.map { menuOptionRequestDto -> + MenuOption.createMenuOption( + title = menuOptionRequestDto.title, + optionDetailRequestList = menuOptionRequestDto.optionDetailList + ) + } + return CafeMenu( name = name, price = price ).apply { - menuOptionList.forEach { this.addMenuOption(it) } + menuOptionEntityList.forEach { this.addMenuOption(it) } } } } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index 37938fd..ac18c11 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -1,6 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.OptionDetailInfoRequestDto import javax.persistence.* @Entity @@ -24,11 +25,18 @@ class MenuOption protected constructor( val optionDetailList: MutableList = arrayListOf() companion object { - fun createMenuOption(title: String, optionDetailList: List): MenuOption { + fun createMenuOption(title: String, optionDetailRequestList: List): MenuOption { + val optionDetailEntityList = optionDetailRequestList.map { optionDetailRequestDto -> + OptionDetail.createOptionDetail( + name = optionDetailRequestDto.name, + extraPrice = optionDetailRequestDto.extraPrice + ) + } + return MenuOption( title = title ).apply { - optionDetailList.forEach { this.addOptionDetail(it) } + optionDetailEntityList.forEach { this.addOptionDetail(it) } } } } 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 2f5c80c..c3563df 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 @@ -32,6 +32,7 @@ class CafeService( * - 메뉴 옵션 (옵션 이름 /ex. 사이즈) * - 옵션 상세 (상세 이름, 추가 금액 /ex. [(medium, 0), (large, 200), (venti, 700)]) */ + @Transactional fun createCafe( name: String, address: String, diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt new file mode 100644 index 0000000..70349f3 --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt @@ -0,0 +1,106 @@ +package io.beaniejoy.dongnecafe.domain.cafe.entity + +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto +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 org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test +import java.math.BigDecimal + +internal class CafeTest { + @Test + fun create_cafe_test() { + val cafeRequestDto = createCreateCafeRequestDto() + + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + assertEquals(cafeRequestDto.name, cafe.name) + assertEquals(cafeRequestDto.address, cafe.address) + assertEquals(cafeRequestDto.phoneNumber, cafe.phoneNumber) + assertEquals(cafeRequestDto.description, cafe.description) + + assertCafeMenuListEquals(cafeRequestDto.cafeMenuList, cafe.cafeMenuList) + } + + private fun assertCafeMenuListEquals( + cafeMenuRequestList: List, + cafeMenuList: List, + ) { + for (index in cafeMenuRequestList.indices) { + assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) + assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) + + assertMenuOptionListEquals(cafeMenuRequestList[index].menuOptionList, cafeMenuList[index].menuOptionList) + } + } + + private fun assertMenuOptionListEquals( + menuOptionRequestList: List, + menuOptionList: List, + ) { + for (index in menuOptionRequestList.indices) { + assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) + + assertOptionDetailListEquals( + menuOptionRequestList[index].optionDetailList, + menuOptionList[index].optionDetailList + ) + } + } + + private fun assertOptionDetailListEquals( + optionDetailRequestList: List, + optionDetailList: MutableList, + ) { + for (index in optionDetailRequestList.indices) { + assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) + assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) + + } + } + + private fun createCreateCafeRequestDto(): CafeInfoRequestDto { + 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) + ), + ) + + return CafeInfoRequestDto( + name = cafeName, + address = cafeAddress, + phoneNumber = phoneNumber, + description = description, + cafeMenuList = cafeMenuList + ) + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt new file mode 100644 index 0000000..cf85768 --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt @@ -0,0 +1,193 @@ +package io.beaniejoy.dongnecafe.domain.cafe.service + +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto +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.error.CafeExistedException +import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException +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.MethodOrderer +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestMethodOrder +import org.junit.jupiter.api.assertThrows +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 java.util.* +import javax.persistence.GeneratedValue + +@ExtendWith(MockitoExtension::class) +@TestMethodOrder(MethodOrderer.DisplayName::class) +internal class CafeServiceMockTest { + @InjectMocks + lateinit var mockCafeService: CafeService + + @Mock + lateinit var mockCafeRepository: CafeRepository + + @Test + @DisplayName("카페 신규 생성 테스트") + fun create_cafe_test() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val savedMockCafeId = 100L + + `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) + `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { + injectCafeId(it.getArgument(0), savedMockCafeId) + } + + // when + val savedCafeId = mockCafeService.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + // then + verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유 + verify(mockCafeRepository).save(any(Cafe::class.java)) + + assertEquals(savedCafeId, savedMockCafeId) + } + + @Test + @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") + fun fail_create_cafe_when_existed() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe) + + // then + assertThrows { + // when + mockCafeService.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + } + } + + @Test + @DisplayName("카페 정보 변경 테스트") + fun update_cafe_test() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + val cafeId = 50L + + // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) + + // then + mockCafeService.updateCafe( + id = cafeId, + name = "", + address = "", + phoneNumber = "", + description = "", + ) + + verify(mockCafeRepository).findById(eq(cafeId)) + + // TODO update TEST 방법? + } + + @Test + @DisplayName("카페 정보 변경시 존재하지 않는 카페 예외 발생 테스트") + fun fail_update_cafe_when_not_found() { + // given + val cafeId = 50L + + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty()) + + assertThrows { + mockCafeService.updateCafe( + id = cafeId, + name = "", + address = "", + phoneNumber = "", + description = "", + ) + } + } + + private fun createCreateCafeRequestDto(): CafeInfoRequestDto { + 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) + ), + ) + + return CafeInfoRequestDto( + name = cafeName, + address = cafeAddress, + phoneNumber = phoneNumber, + description = description, + cafeMenuList = cafeMenuList + ) + } + + private fun injectCafeId( + cafe: Cafe, + newCafeId: Long, + ): Cafe { + val idField = cafe.javaClass.declaredFields + .find { f -> + f.getAnnotation(GeneratedValue::class.java) != null + } ?: return cafe + + idField.isAccessible = true + idField.set(cafe, newCafeId) + + return cafe + } +} \ No newline at end of file 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 e9a4d81..ccd834b 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,193 +1,5 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto -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.error.CafeExistedException -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException -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.MethodOrderer -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestMethodOrder -import org.junit.jupiter.api.assertThrows -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 java.util.* -import javax.persistence.GeneratedValue - -@ExtendWith(MockitoExtension::class) -@TestMethodOrder(MethodOrderer.DisplayName::class) -internal class CafeServiceTest { - @InjectMocks - lateinit var mockCafeService: CafeService - - @Mock - lateinit var mockCafeRepository: CafeRepository - - @Test - @DisplayName("카페 신규 생성 테스트") - fun create_cafe_test() { - // given - val cafeRequestDto = createCreateCafeRequestDto() - val savedMockCafeId = 100L - - `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) - `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { - injectCafeId(it.getArgument(0), savedMockCafeId) - } - - // when - val savedCafeId = mockCafeService.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - - // then - verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유 - verify(mockCafeRepository).save(any(Cafe::class.java)) - - assertEquals(savedCafeId, savedMockCafeId) - } - - @Test - @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") - fun fail_create_cafe_when_existed() { - // given - val cafeRequestDto = createCreateCafeRequestDto() - val cafe = Cafe.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - - `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe) - - // then - assertThrows { - // when - mockCafeService.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - } - } - - @Test - @DisplayName("카페 정보 변경 테스트") - fun update_cafe_test() { - // given - val cafeRequestDto = createCreateCafeRequestDto() - val cafe = Cafe.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - val cafeId = 50L - - // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 - `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) - - // then - mockCafeService.updateCafe( - id = cafeId, - name = "", - address = "", - phoneNumber = "", - description = "", - ) - - verify(mockCafeRepository).findById(eq(cafeId)) - - // TODO update TEST 방법? - } - - @Test - @DisplayName("카페 정보 변경시 존재하지 않는 카페 예외 발생 테스트") - fun fail_update_cafe_when_not_found() { - // given - val cafeId = 50L - - `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty()) - - assertThrows { - mockCafeService.updateCafe( - id = cafeId, - name = "", - address = "", - phoneNumber = "", - description = "", - ) - } - } - - private fun createCreateCafeRequestDto(): CafeInfoRequestDto { - 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) - ), - ) - - return CafeInfoRequestDto( - name = cafeName, - address = cafeAddress, - phoneNumber = phoneNumber, - description = description, - cafeMenuList = cafeMenuList - ) - } - - private fun injectCafeId( - cafe: Cafe, - newCafeId: Long, - ): Cafe { - val idField = cafe.javaClass.declaredFields - .find { f -> - f.getAnnotation(GeneratedValue::class.java) != null - } ?: return cafe - - idField.isAccessible = true - idField.set(cafe, newCafeId) - - return cafe - } +// TODO spring jpa 연동 테스트 (h2 테스트 DB 사용) +class CafeServiceTest { } \ No newline at end of file From 02891e471f05e10674495ba47b662259db418e33 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Mon, 8 Aug 2022 21:55:35 +0900 Subject: [PATCH 7/9] =?UTF-8?q?[#8]=20Cafe=20JPA=20Repository=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CafeRepository 관련 테스트 코드 추가 - p6spy 모듈 적용(테스트 환경만) - BaseTimeEntity 필드 protected setter 적용 --- .gitignore | 3 + build.gradle | 1 + .../common/entity/BaseTimeEntity.kt | 14 +- src/main/resources/application.yml | 12 +- .../dongnecafe/domain/cafe/entity/CafeTest.kt | 45 +--- .../cafe/repository/CafeRepositoryTest.kt | 78 +++++++ .../cafe/service/CafeServiceMockTest.kt | 193 ------------------ .../domain/cafe/service/CafeServiceTest.kt | 192 ++++++++++++++++- .../domain/cafe/utils/CafeTestUtils.kt | 61 ++++++ src/test/resources/application.yml | 8 + 10 files changed, 363 insertions(+), 244 deletions(-) create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt delete mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt create mode 100644 src/test/resources/application.yml diff --git a/.gitignore b/.gitignore index 63d2f1a..441f28a 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ out/ ### VS Code ### .vscode/ + +### log ### +*.log \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0352f7f..db7a23b 100644 --- a/build.gradle +++ b/build.gradle @@ -63,6 +63,7 @@ dependencies { runtimeOnly 'com.h2database:h2' // H2 implementation "org.flywaydb:flyway-core:${flywayVersion}" // flyway + implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0") // query logging testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt b/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt index ceb58e2..bc366e1 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt @@ -11,16 +11,20 @@ import javax.persistence.MappedSuperclass @MappedSuperclass @EntityListeners(AuditingEntityListener::class) -class BaseTimeEntity protected constructor() { +abstract class BaseTimeEntity protected constructor() { @CreatedDate - val createdAt: LocalDateTime = LocalDateTime.now() + var createdAt: LocalDateTime = LocalDateTime.now() + protected set @CreatedBy - val createdBy: String = "" + var createdBy: String = "" + protected set @LastModifiedDate - val updatedAt: LocalDateTime? = null + var updatedAt: LocalDateTime? = null + protected set @LastModifiedBy - val updatedBy: String? = null + var updatedBy: String? = null + protected set } \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b923ae6..a926d97 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,8 +11,18 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQL5InnoDBDialect format_sql: true - show-sql: true +# show-sql: true flyway: baseline-on-migrate: true locations: classpath:db/migration,classpath:db/seed # baseline-version: 0 + +logging: + level: + org.hibernate.SQL: debug # logger 통해 로깅 + org.hibernate.type: trace + +decorator: + datasource: + p6spy: + enable-logging: false # "p6spy": only for testing diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt index 70349f3..534a740 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt @@ -4,6 +4,7 @@ import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto 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.utils.CafeTestUtils import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test import java.math.BigDecimal @@ -21,49 +22,7 @@ internal class CafeTest { cafeMenuRequestList = cafeRequestDto.cafeMenuList ) - assertEquals(cafeRequestDto.name, cafe.name) - assertEquals(cafeRequestDto.address, cafe.address) - assertEquals(cafeRequestDto.phoneNumber, cafe.phoneNumber) - assertEquals(cafeRequestDto.description, cafe.description) - - assertCafeMenuListEquals(cafeRequestDto.cafeMenuList, cafe.cafeMenuList) - } - - private fun assertCafeMenuListEquals( - cafeMenuRequestList: List, - cafeMenuList: List, - ) { - for (index in cafeMenuRequestList.indices) { - assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) - assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) - - assertMenuOptionListEquals(cafeMenuRequestList[index].menuOptionList, cafeMenuList[index].menuOptionList) - } - } - - private fun assertMenuOptionListEquals( - menuOptionRequestList: List, - menuOptionList: List, - ) { - for (index in menuOptionRequestList.indices) { - assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) - - assertOptionDetailListEquals( - menuOptionRequestList[index].optionDetailList, - menuOptionList[index].optionDetailList - ) - } - } - - private fun assertOptionDetailListEquals( - optionDetailRequestList: List, - optionDetailList: MutableList, - ) { - for (index in optionDetailRequestList.indices) { - assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) - assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) - - } + CafeTestUtils.assertCafeEquals(request = cafeRequestDto, entity = cafe) } private fun createCreateCafeRequestDto(): CafeInfoRequestDto { diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt new file mode 100644 index 0000000..58d6d0e --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt @@ -0,0 +1,78 @@ +package io.beaniejoy.dongnecafe.domain.cafe.repository + +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto +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.utils.CafeTestUtils +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import java.math.BigDecimal + +@DataJpaTest +internal class CafeRepositoryTest { + @Autowired + lateinit var cafeRepository: CafeRepository + + @Test + @DisplayName("[JPA] 신규 Cafe 저장 테스트") + fun saveTest() { + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = cafeRequestDto.let { + Cafe.createCafe( + name = it.name!!, + address = it.address!!, + phoneNumber = it.phoneNumber!!, + description = it.description!!, + cafeMenuRequestList = it.cafeMenuList + ) + } + + val savedCafe = cafeRepository.save(cafe) + + assertEquals(1L, savedCafe.id) + CafeTestUtils.assertCafeEquals(cafeRequestDto, savedCafe) + } + + private fun createCreateCafeRequestDto(): CafeInfoRequestDto { + 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) + ), + ) + + return CafeInfoRequestDto( + name = cafeName, + address = cafeAddress, + phoneNumber = phoneNumber, + description = description, + cafeMenuList = cafeMenuList + ) + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt deleted file mode 100644 index cf85768..0000000 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceMockTest.kt +++ /dev/null @@ -1,193 +0,0 @@ -package io.beaniejoy.dongnecafe.domain.cafe.service - -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto -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.error.CafeExistedException -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException -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.MethodOrderer -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestMethodOrder -import org.junit.jupiter.api.assertThrows -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 java.util.* -import javax.persistence.GeneratedValue - -@ExtendWith(MockitoExtension::class) -@TestMethodOrder(MethodOrderer.DisplayName::class) -internal class CafeServiceMockTest { - @InjectMocks - lateinit var mockCafeService: CafeService - - @Mock - lateinit var mockCafeRepository: CafeRepository - - @Test - @DisplayName("카페 신규 생성 테스트") - fun create_cafe_test() { - // given - val cafeRequestDto = createCreateCafeRequestDto() - val savedMockCafeId = 100L - - `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) - `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { - injectCafeId(it.getArgument(0), savedMockCafeId) - } - - // when - val savedCafeId = mockCafeService.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - - // then - verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유 - verify(mockCafeRepository).save(any(Cafe::class.java)) - - assertEquals(savedCafeId, savedMockCafeId) - } - - @Test - @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") - fun fail_create_cafe_when_existed() { - // given - val cafeRequestDto = createCreateCafeRequestDto() - val cafe = Cafe.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - - `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe) - - // then - assertThrows { - // when - mockCafeService.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - } - } - - @Test - @DisplayName("카페 정보 변경 테스트") - fun update_cafe_test() { - // given - val cafeRequestDto = createCreateCafeRequestDto() - val cafe = Cafe.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList - ) - val cafeId = 50L - - // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 - `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) - - // then - mockCafeService.updateCafe( - id = cafeId, - name = "", - address = "", - phoneNumber = "", - description = "", - ) - - verify(mockCafeRepository).findById(eq(cafeId)) - - // TODO update TEST 방법? - } - - @Test - @DisplayName("카페 정보 변경시 존재하지 않는 카페 예외 발생 테스트") - fun fail_update_cafe_when_not_found() { - // given - val cafeId = 50L - - `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty()) - - assertThrows { - mockCafeService.updateCafe( - id = cafeId, - name = "", - address = "", - phoneNumber = "", - description = "", - ) - } - } - - private fun createCreateCafeRequestDto(): CafeInfoRequestDto { - 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) - ), - ) - - return CafeInfoRequestDto( - name = cafeName, - address = cafeAddress, - phoneNumber = phoneNumber, - description = description, - cafeMenuList = cafeMenuList - ) - } - - private fun injectCafeId( - cafe: Cafe, - newCafeId: Long, - ): Cafe { - val idField = cafe.javaClass.declaredFields - .find { f -> - f.getAnnotation(GeneratedValue::class.java) != null - } ?: return cafe - - idField.isAccessible = true - idField.set(cafe, newCafeId) - - return cafe - } -} \ No newline at end of file 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 ccd834b..e9a4d81 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,5 +1,193 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -// TODO spring jpa 연동 테스트 (h2 테스트 DB 사용) -class CafeServiceTest { +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto +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.error.CafeExistedException +import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException +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.MethodOrderer +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestMethodOrder +import org.junit.jupiter.api.assertThrows +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 java.util.* +import javax.persistence.GeneratedValue + +@ExtendWith(MockitoExtension::class) +@TestMethodOrder(MethodOrderer.DisplayName::class) +internal class CafeServiceTest { + @InjectMocks + lateinit var mockCafeService: CafeService + + @Mock + lateinit var mockCafeRepository: CafeRepository + + @Test + @DisplayName("카페 신규 생성 테스트") + fun create_cafe_test() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val savedMockCafeId = 100L + + `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) + `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { + injectCafeId(it.getArgument(0), savedMockCafeId) + } + + // when + val savedCafeId = mockCafeService.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + // then + verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유 + verify(mockCafeRepository).save(any(Cafe::class.java)) + + assertEquals(savedCafeId, savedMockCafeId) + } + + @Test + @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") + fun fail_create_cafe_when_existed() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + + `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe) + + // then + assertThrows { + // when + mockCafeService.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + } + } + + @Test + @DisplayName("카페 정보 변경 테스트") + fun update_cafe_test() { + // given + val cafeRequestDto = createCreateCafeRequestDto() + val cafe = Cafe.createCafe( + name = cafeRequestDto.name!!, + address = cafeRequestDto.address!!, + phoneNumber = cafeRequestDto.phoneNumber!!, + description = cafeRequestDto.description!!, + cafeMenuRequestList = cafeRequestDto.cafeMenuList + ) + val cafeId = 50L + + // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) + + // then + mockCafeService.updateCafe( + id = cafeId, + name = "", + address = "", + phoneNumber = "", + description = "", + ) + + verify(mockCafeRepository).findById(eq(cafeId)) + + // TODO update TEST 방법? + } + + @Test + @DisplayName("카페 정보 변경시 존재하지 않는 카페 예외 발생 테스트") + fun fail_update_cafe_when_not_found() { + // given + val cafeId = 50L + + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty()) + + assertThrows { + mockCafeService.updateCafe( + id = cafeId, + name = "", + address = "", + phoneNumber = "", + description = "", + ) + } + } + + private fun createCreateCafeRequestDto(): CafeInfoRequestDto { + 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) + ), + ) + + return CafeInfoRequestDto( + name = cafeName, + address = cafeAddress, + phoneNumber = phoneNumber, + description = description, + cafeMenuList = cafeMenuList + ) + } + + private fun injectCafeId( + cafe: Cafe, + newCafeId: Long, + ): Cafe { + val idField = cafe.javaClass.declaredFields + .find { f -> + f.getAnnotation(GeneratedValue::class.java) != null + } ?: return cafe + + idField.isAccessible = true + idField.set(cafe, newCafeId) + + return cafe + } } \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt new file mode 100644 index 0000000..3bbf8d9 --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -0,0 +1,61 @@ +package io.beaniejoy.dongnecafe.domain.cafe.utils + +import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto +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.entity.CafeMenu +import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption +import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail +import org.junit.jupiter.api.Assertions + +class CafeTestUtils { + companion object { + fun assertCafeEquals(request: CafeInfoRequestDto, entity: Cafe) { + Assertions.assertEquals(request.name, entity.name) + Assertions.assertEquals(request.address, entity.address) + Assertions.assertEquals(request.phoneNumber, entity.phoneNumber) + Assertions.assertEquals(request.description, entity.description) + + assertCafeMenuListEquals(request.cafeMenuList, entity.cafeMenuList) + } + + private fun assertCafeMenuListEquals( + cafeMenuRequestList: List, + cafeMenuList: List, + ) { + for (index in cafeMenuRequestList.indices) { + Assertions.assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) + Assertions.assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) + + assertMenuOptionListEquals(cafeMenuRequestList[index].menuOptionList, cafeMenuList[index].menuOptionList) + } + } + + private fun assertMenuOptionListEquals( + menuOptionRequestList: List, + menuOptionList: List, + ) { + for (index in menuOptionRequestList.indices) { + Assertions.assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) + + assertOptionDetailListEquals( + menuOptionRequestList[index].optionDetailList, + menuOptionList[index].optionDetailList + ) + } + } + + private fun assertOptionDetailListEquals( + optionDetailRequestList: List, + optionDetailList: MutableList, + ) { + for (index in optionDetailRequestList.indices) { + Assertions.assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) + Assertions.assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) + + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..8852c16 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,8 @@ +spring: + flyway: + enabled: false + +logging: + level: + org.hibernate.SQL: debug # logger 통해 로깅 + org.hibernate.type: trace From b3d43d26b849235bf7f1066f32d1de1a7e6332cb Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Tue, 9 Aug 2022 00:23:47 +0900 Subject: [PATCH 8/9] =?UTF-8?q?[#8]=20modify:=20Cafe=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - p6spy 모듈 제거 - CafeRepositoryTest BaseTimeEntity auditing 이슈 해결 - CafeTestUtils로 공통 함수 관리 - application.yml 설정 변경(주로 logging 관련) --- .gitignore | 5 +- build.gradle | 1 - src/main/resources/application.yml | 9 +-- .../dongnecafe/domain/cafe/entity/CafeTest.kt | 46 +------------- .../cafe/repository/CafeRepositoryTest.kt | 62 +++++-------------- .../domain/cafe/service/CafeServiceTest.kt | 58 +++-------------- .../domain/cafe/utils/CafeTestUtils.kt | 44 ++++++++++++- src/test/resources/application.yml | 9 ++- 8 files changed, 78 insertions(+), 156 deletions(-) diff --git a/.gitignore b/.gitignore index 441f28a..c426c32 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,4 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ - -### log ### -*.log \ No newline at end of file +.vscode/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index db7a23b..0352f7f 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,6 @@ dependencies { runtimeOnly 'com.h2database:h2' // H2 implementation "org.flywaydb:flyway-core:${flywayVersion}" // flyway - implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0") // query logging testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a926d97..e3e2509 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,7 +11,7 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQL5InnoDBDialect format_sql: true -# show-sql: true + show-sql: false flyway: baseline-on-migrate: true locations: classpath:db/migration,classpath:db/seed @@ -20,9 +20,4 @@ spring: logging: level: org.hibernate.SQL: debug # logger 통해 로깅 - org.hibernate.type: trace - -decorator: - datasource: - p6spy: - enable-logging: false # "p6spy": only for testing +# org.hibernate.type: trace diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt index 534a740..f3d6628 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt @@ -1,18 +1,12 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto -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.utils.CafeTestUtils -import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test -import java.math.BigDecimal internal class CafeTest { @Test fun create_cafe_test() { - val cafeRequestDto = createCreateCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRequestDto() val cafe = Cafe.createCafe( name = cafeRequestDto.name!!, @@ -24,42 +18,4 @@ internal class CafeTest { CafeTestUtils.assertCafeEquals(request = cafeRequestDto, entity = cafe) } - - private fun createCreateCafeRequestDto(): CafeInfoRequestDto { - 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) - ), - ) - - return CafeInfoRequestDto( - name = cafeName, - address = cafeAddress, - phoneNumber = phoneNumber, - description = description, - cafeMenuList = cafeMenuList - ) - } } \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt index 58d6d0e..17fd8b9 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt @@ -1,9 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.repository -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto -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.common.config.AuditingConfig +import io.beaniejoy.dongnecafe.common.entity.BaseEntityAuditorAware import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils import org.junit.jupiter.api.Assertions.assertEquals @@ -11,9 +9,21 @@ import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest -import java.math.BigDecimal +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.FilterType -@DataJpaTest +@DataJpaTest( + includeFilters = [ + ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = [AuditingConfig::class] + ), + ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = [BaseEntityAuditorAware::class] + ) + ] +) internal class CafeRepositoryTest { @Autowired lateinit var cafeRepository: CafeRepository @@ -21,7 +31,7 @@ internal class CafeRepositoryTest { @Test @DisplayName("[JPA] 신규 Cafe 저장 테스트") fun saveTest() { - val cafeRequestDto = createCreateCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRequestDto() val cafe = cafeRequestDto.let { Cafe.createCafe( name = it.name!!, @@ -37,42 +47,4 @@ internal class CafeRepositoryTest { assertEquals(1L, savedCafe.id) CafeTestUtils.assertCafeEquals(cafeRequestDto, savedCafe) } - - private fun createCreateCafeRequestDto(): CafeInfoRequestDto { - 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) - ), - ) - - return CafeInfoRequestDto( - name = cafeName, - address = cafeAddress, - phoneNumber = phoneNumber, - description = description, - cafeMenuList = cafeMenuList - ) - } } \ No newline at end of file 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 e9a4d81..9cb91c7 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,25 +1,17 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto -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.error.CafeExistedException import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository +import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils +import org.junit.jupiter.api.* import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.MethodOrderer -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestMethodOrder -import org.junit.jupiter.api.assertThrows 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 java.util.* import javax.persistence.GeneratedValue @@ -36,7 +28,7 @@ internal class CafeServiceTest { @DisplayName("카페 신규 생성 테스트") fun create_cafe_test() { // given - val cafeRequestDto = createCreateCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRequestDto() val savedMockCafeId = 100L `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) @@ -64,7 +56,7 @@ internal class CafeServiceTest { @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") fun fail_create_cafe_when_existed() { // given - val cafeRequestDto = createCreateCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRequestDto() val cafe = Cafe.createCafe( name = cafeRequestDto.name!!, address = cafeRequestDto.address!!, @@ -86,13 +78,15 @@ internal class CafeServiceTest { cafeMenuRequestList = cafeRequestDto.cafeMenuList ) } + + verify(mockCafeRepository).findByName(cafeRequestDto.name!!) } @Test @DisplayName("카페 정보 변경 테스트") fun update_cafe_test() { // given - val cafeRequestDto = createCreateCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRequestDto() val cafe = Cafe.createCafe( name = cafeRequestDto.name!!, address = cafeRequestDto.address!!, @@ -138,44 +132,6 @@ internal class CafeServiceTest { } } - private fun createCreateCafeRequestDto(): CafeInfoRequestDto { - 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) - ), - ) - - return CafeInfoRequestDto( - name = cafeName, - address = cafeAddress, - phoneNumber = phoneNumber, - description = description, - cafeMenuList = cafeMenuList - ) - } - private fun injectCafeId( cafe: Cafe, newCafeId: Long, diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt index 3bbf8d9..7e17bb6 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -9,6 +9,7 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import org.junit.jupiter.api.Assertions +import java.math.BigDecimal class CafeTestUtils { companion object { @@ -29,7 +30,10 @@ class CafeTestUtils { Assertions.assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) Assertions.assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) - assertMenuOptionListEquals(cafeMenuRequestList[index].menuOptionList, cafeMenuList[index].menuOptionList) + assertMenuOptionListEquals( + cafeMenuRequestList[index].menuOptionList, + cafeMenuList[index].menuOptionList + ) } } @@ -57,5 +61,43 @@ class CafeTestUtils { } } + + fun createCafeRequestDto(): CafeInfoRequestDto { + 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) + ), + ) + + return CafeInfoRequestDto( + name = cafeName, + address = cafeAddress, + phoneNumber = phoneNumber, + description = description, + cafeMenuList = cafeMenuList + ) + } } } \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 8852c16..dc94f3f 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,8 +1,13 @@ spring: flyway: enabled: false + jpa: + properties: + hibernate: + format_sql: true + show_sql: false logging: level: - org.hibernate.SQL: debug # logger 통해 로깅 - org.hibernate.type: trace + org.hibernate.SQL: debug + org.hibernate.type: trace \ No newline at end of file From 0d1d199d2c34d1472b711a33662326b1f1b47aaf Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Fri, 12 Aug 2022 22:12:49 +0900 Subject: [PATCH 9/9] =?UTF-8?q?[#8]=20feat:=20CafeRepository=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=EC=A0=81=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cafe update JPA 처리 테스트 추가 - CafeTest import 수정 --- .../cafe/repository/CafeRepositoryTest.kt | 54 +++++++++++++++---- .../domain/cafe/utils/CafeTestUtils.kt | 21 ++++---- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt index 17fd8b9..8e085fd 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt @@ -11,17 +11,12 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.FilterType +import org.springframework.data.repository.findByIdOrNull @DataJpaTest( includeFilters = [ - ComponentScan.Filter( - type = FilterType.ASSIGNABLE_TYPE, - classes = [AuditingConfig::class] - ), - ComponentScan.Filter( - type = FilterType.ASSIGNABLE_TYPE, - classes = [BaseEntityAuditorAware::class] - ) + ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = [AuditingConfig::class]), + ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = [BaseEntityAuditorAware::class]) ] ) internal class CafeRepositoryTest { @@ -29,8 +24,8 @@ internal class CafeRepositoryTest { lateinit var cafeRepository: CafeRepository @Test - @DisplayName("[JPA] 신규 Cafe 저장 테스트") - fun saveTest() { + @DisplayName("[JPA] 신규 Cafe save 테스트") + fun save_cafe_test() { val cafeRequestDto = CafeTestUtils.createCafeRequestDto() val cafe = cafeRequestDto.let { Cafe.createCafe( @@ -47,4 +42,43 @@ internal class CafeRepositoryTest { assertEquals(1L, savedCafe.id) CafeTestUtils.assertCafeEquals(cafeRequestDto, savedCafe) } + + @Test + @DisplayName("[JPA] 기존 Cafe 정보 update 테스트") + fun update_cafe_test() { + // TODO 테스트용 카페 데이터 주입 구성하기 + val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafe = cafeRequestDto.let { + Cafe.createCafe( + name = it.name!!, + address = it.address!!, + phoneNumber = it.phoneNumber!!, + description = it.description!!, + cafeMenuRequestList = it.cafeMenuList + ) + } + + val savedId = cafeRepository.save(cafe).id + + val findCafe = cafeRepository.findByIdOrNull(savedId) + + val updatedName = "update cafe name" + val updatedAddress = "update cafe address" + val updatedPhoneNumber = "01011112222" + val updatedDescription = "update description" + + findCafe!!.updateInfo( + name = updatedName, + address = updatedAddress, + phoneNumber = updatedPhoneNumber, + description = updatedDescription + ) + + val updatedCafe = cafeRepository.findByIdOrNull(savedId) + + assertEquals(updatedName, updatedCafe!!.name) + assertEquals(updatedAddress, updatedCafe.address) + assertEquals(updatedPhoneNumber, updatedCafe.phoneNumber) + assertEquals(updatedDescription, updatedCafe.description) + } } \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt index 7e17bb6..f16125a 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -8,16 +8,16 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail -import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Assertions.* import java.math.BigDecimal class CafeTestUtils { companion object { fun assertCafeEquals(request: CafeInfoRequestDto, entity: Cafe) { - Assertions.assertEquals(request.name, entity.name) - Assertions.assertEquals(request.address, entity.address) - Assertions.assertEquals(request.phoneNumber, entity.phoneNumber) - Assertions.assertEquals(request.description, entity.description) + assertEquals(request.name, entity.name) + assertEquals(request.address, entity.address) + assertEquals(request.phoneNumber, entity.phoneNumber) + assertEquals(request.description, entity.description) assertCafeMenuListEquals(request.cafeMenuList, entity.cafeMenuList) } @@ -27,8 +27,8 @@ class CafeTestUtils { cafeMenuList: List, ) { for (index in cafeMenuRequestList.indices) { - Assertions.assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) - Assertions.assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) + assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) + assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) assertMenuOptionListEquals( cafeMenuRequestList[index].menuOptionList, @@ -42,7 +42,7 @@ class CafeTestUtils { menuOptionList: List, ) { for (index in menuOptionRequestList.indices) { - Assertions.assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) + assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) assertOptionDetailListEquals( menuOptionRequestList[index].optionDetailList, @@ -56,9 +56,8 @@ class CafeTestUtils { optionDetailList: MutableList, ) { for (index in optionDetailRequestList.indices) { - Assertions.assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) - Assertions.assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) - + assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) + assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) } }