feat(gift): 관리자 선물함 조회 서비스를 추가한다
This commit is contained in:
+228
@@ -0,0 +1,228 @@
|
||||
package kr.co.vividnext.sodalive.v2.gift.application
|
||||
|
||||
import kr.co.vividnext.sodalive.common.SodaException
|
||||
import kr.co.vividnext.sodalive.configs.QueryDslConfig
|
||||
import kr.co.vividnext.sodalive.member.Member
|
||||
import kr.co.vividnext.sodalive.member.MemberRepository
|
||||
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.Gift
|
||||
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftCategory
|
||||
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftCategoryRepository
|
||||
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftDelivery
|
||||
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftDeliveryRepository
|
||||
import kr.co.vividnext.sodalive.v2.gift.adapter.out.persistence.GiftRepository
|
||||
import kr.co.vividnext.sodalive.v2.gift.domain.GiftSize
|
||||
import kr.co.vividnext.sodalive.v2.gift.domain.GiftStatus
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertThrows
|
||||
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 org.springframework.context.annotation.Import
|
||||
import java.time.LocalDateTime
|
||||
|
||||
@DataJpaTest(
|
||||
properties = [
|
||||
"spring.cache.type=none",
|
||||
"spring.datasource.url=jdbc:h2:mem:gift-admin-query;MODE=MySQL;NON_KEYWORDS=VALUE"
|
||||
]
|
||||
)
|
||||
@Import(QueryDslConfig::class)
|
||||
@DisplayName("관리자 선물함 조회 서비스 테스트")
|
||||
class GiftAdminQueryServiceTest @Autowired constructor(
|
||||
private val giftRepository: GiftRepository,
|
||||
private val deliveryRepository: GiftDeliveryRepository,
|
||||
private val categoryRepository: GiftCategoryRepository,
|
||||
private val memberRepository: MemberRepository
|
||||
) {
|
||||
@Test
|
||||
@DisplayName("관리자는 선물함 목록을 필터링하고 가능한 액션을 조회한다")
|
||||
fun shouldListAdminGiftsWithFiltersAndAvailableActions() {
|
||||
val sender = saveMember("fan-alpha")
|
||||
val recipient = saveMember("creator-alpha")
|
||||
val otherSender = saveMember("fan-beta")
|
||||
val otherRecipient = saveMember("creator-beta")
|
||||
val category = saveCategory()
|
||||
saveGift(
|
||||
applicationNo = "A-1002609300001",
|
||||
sender = sender,
|
||||
recipient = recipient,
|
||||
category = category,
|
||||
status = GiftStatus.TRACKING_REGISTERED,
|
||||
withTracking = true
|
||||
)
|
||||
saveGift(
|
||||
applicationNo = "A-1002609300002",
|
||||
sender = otherSender,
|
||||
recipient = otherRecipient,
|
||||
category = category,
|
||||
status = GiftStatus.RECEIVED
|
||||
)
|
||||
|
||||
val result = service().getGifts(
|
||||
status = GiftStatus.TRACKING_REGISTERED,
|
||||
applicationNo = "0001",
|
||||
nickname = "alpha",
|
||||
page = 0,
|
||||
size = 20
|
||||
)
|
||||
|
||||
assertEquals(1L, result.totalCount)
|
||||
assertEquals(1, result.items.size)
|
||||
assertEquals(0, result.page)
|
||||
assertEquals(20, result.size)
|
||||
assertEquals(false, result.hasNext)
|
||||
val item = result.items.single()
|
||||
assertEquals("A-1002609300001", item.applicationNo)
|
||||
assertEquals("fan-alpha", item.senderNickname)
|
||||
assertEquals("creator-alpha", item.recipientNickname)
|
||||
assertEquals("SMALL", item.sizeCode)
|
||||
assertEquals("소형", item.sizeName)
|
||||
assertEquals("인형", item.categoryName)
|
||||
assertEquals("100", item.classificationNumber)
|
||||
assertEquals("CJ대한통운", item.courierCompanyName)
|
||||
assertEquals("1234567890", item.trackingNumber)
|
||||
assertEquals(GiftStatus.TRACKING_REGISTERED, item.status)
|
||||
assertEquals("발송 확인", item.statusName)
|
||||
assertEquals(listOf("ARRIVE_MAILBOX", "MARK_UNDELIVERABLE"), item.availableActions)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자는 선물 상세에서 개인정보와 상품 정보를 조회하고 미입력 수취인 정보는 빈 문자열로 받는다")
|
||||
fun shouldGetAdminGiftDetailWithPersonalInformation() {
|
||||
val sender = saveMember("fan-alpha")
|
||||
val recipient = saveMember("creator-alpha")
|
||||
val category = saveCategory()
|
||||
saveGift(
|
||||
applicationNo = "A-1002609300001",
|
||||
sender = sender,
|
||||
recipient = recipient,
|
||||
category = category,
|
||||
status = GiftStatus.ARRIVED_AT_MAILBOX,
|
||||
withTracking = true
|
||||
)
|
||||
|
||||
val result = service().getGiftDetail("A-1002609300001")
|
||||
|
||||
assertEquals("A-1002609300001", result.applicationNo)
|
||||
assertEquals("fan-alpha", result.senderInfo.nickname)
|
||||
assertEquals("홍길동", result.senderInfo.name)
|
||||
assertEquals("01012345678", result.senderInfo.phoneNumber)
|
||||
assertEquals("(06234) 서울시 강남구, 101동 1001호", result.senderInfo.address)
|
||||
assertEquals("creator-alpha", result.recipientInfo.nickname)
|
||||
assertEquals("", result.recipientInfo.name)
|
||||
assertEquals("", result.recipientInfo.phoneNumber)
|
||||
assertEquals("", result.recipientInfo.address)
|
||||
assertEquals("SMALL", result.productInfo.sizeCode)
|
||||
assertEquals("소형", result.productInfo.sizeName)
|
||||
assertEquals("인형", result.productInfo.categoryName)
|
||||
assertEquals("100", result.productInfo.classificationNumber)
|
||||
assertEquals("CJ대한통운", result.inboundDeliveryInfo.courierCompanyName)
|
||||
assertEquals("1234567890", result.inboundDeliveryInfo.trackingNumber)
|
||||
assertEquals(GiftStatus.ARRIVED_AT_MAILBOX, result.status)
|
||||
assertEquals("사서함 도착", result.statusName)
|
||||
assertEquals(listOf("COMPLETE_INSPECTION", "MARK_UNDELIVERABLE"), result.availableActions)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 선물 상세는 상태별 가능한 액션을 반환하고 없는 신청번호를 거부한다")
|
||||
fun shouldReturnAvailableActionsByStatusAndRejectUnknownApplicationNo() {
|
||||
val sender = saveMember("fan-alpha")
|
||||
val recipient = saveMember("creator-alpha")
|
||||
val category = saveCategory()
|
||||
GiftStatus.values().forEachIndexed { index, status ->
|
||||
saveGift("A-10026093010$index", sender, recipient, category, status)
|
||||
}
|
||||
|
||||
val service = service()
|
||||
|
||||
assertEquals(emptyList<String>(), service.getGiftDetail("A-100260930100").availableActions)
|
||||
assertEquals(
|
||||
listOf("ARRIVE_MAILBOX", "MARK_UNDELIVERABLE"),
|
||||
service.getGiftDetail("A-100260930101").availableActions
|
||||
)
|
||||
assertEquals(
|
||||
listOf("COMPLETE_INSPECTION", "MARK_UNDELIVERABLE"),
|
||||
service.getGiftDetail("A-100260930102").availableActions
|
||||
)
|
||||
assertEquals(
|
||||
listOf("COMPLETE_DELIVERY", "MARK_UNDELIVERABLE"),
|
||||
service.getGiftDetail("A-100260930103").availableActions
|
||||
)
|
||||
assertEquals(emptyList<String>(), service.getGiftDetail("A-100260930104").availableActions)
|
||||
assertEquals(emptyList<String>(), service.getGiftDetail("A-100260930105").availableActions)
|
||||
assertEquals(emptyList<String>(), service.getGiftDetail("A-100260930106").availableActions)
|
||||
val exception = assertThrows(SodaException::class.java) {
|
||||
service.getGiftDetail("UNKNOWN")
|
||||
}
|
||||
assertEquals("common.error.invalid_request", exception.messageKey)
|
||||
}
|
||||
|
||||
private fun service() = GiftAdminQueryService(
|
||||
giftRepository = giftRepository,
|
||||
deliveryRepository = deliveryRepository,
|
||||
categoryRepository = categoryRepository,
|
||||
memberRepository = memberRepository
|
||||
)
|
||||
|
||||
private fun saveMember(nickname: String) = memberRepository.save(Member(password = "password", nickname = nickname))
|
||||
|
||||
private fun saveCategory() = categoryRepository.save(
|
||||
GiftCategory(
|
||||
classificationNumber = "100",
|
||||
categoryCode = "DOLL",
|
||||
name = "인형",
|
||||
receiptCode = "A",
|
||||
representativeItem = "피규어"
|
||||
)
|
||||
)
|
||||
|
||||
private fun saveGift(
|
||||
applicationNo: String,
|
||||
sender: Member,
|
||||
recipient: Member,
|
||||
category: GiftCategory,
|
||||
status: GiftStatus,
|
||||
withTracking: Boolean = false
|
||||
): Gift {
|
||||
val gift = giftRepository.save(
|
||||
Gift(
|
||||
applicationNo = applicationNo,
|
||||
senderMemberId = sender.id!!,
|
||||
recipientMemberId = recipient.id!!,
|
||||
status = status,
|
||||
sizeCode = GiftSize.SMALL,
|
||||
categoryId = category.id!!,
|
||||
categoryNameSnapshot = category.name,
|
||||
salePriceCan = 80,
|
||||
canUsageId = 10L,
|
||||
senderTermsAgreed = true,
|
||||
senderPrivacyAgreed = true,
|
||||
senderTermsAgreedAt = NOW,
|
||||
senderPrivacyAgreedAt = NOW
|
||||
)
|
||||
)
|
||||
deliveryRepository.save(
|
||||
GiftDelivery(
|
||||
giftId = gift.id!!,
|
||||
senderName = "홍길동",
|
||||
senderPhoneNumber = "01012345678",
|
||||
senderZipCode = "06234",
|
||||
senderAddress = "서울시 강남구",
|
||||
senderAddressDetail = "101동 1001호",
|
||||
trackingDeadlineAt = NOW.plusDays(3)
|
||||
).apply {
|
||||
if (withTracking) {
|
||||
courierCompanyName = "CJ대한통운"
|
||||
trackingNumber = "1234567890"
|
||||
trackingRegisteredAt = NOW.plusHours(1)
|
||||
}
|
||||
}
|
||||
)
|
||||
return gift
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val NOW: LocalDateTime = LocalDateTime.of(2026, 9, 30, 12, 0)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user