From fe59d5c1f7489a41f0cd375c112d6c42286ed007 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 1 Nov 2026 14:33:43 +0900 Subject: [PATCH] =?UTF-8?q?test(gift):=20=EC=A0=84=EB=8B=AC=EB=B6=88?= =?UTF-8?q?=EA=B0=80=20=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4=20=ED=8C=8C?= =?UTF-8?q?=EA=B8=B0=20=ED=9B=84=20=EC=A1=B0=ED=9A=8C=20=EA=B3=84=EC=95=BD?= =?UTF-8?q?=EC=9D=84=20=EA=B2=80=EC=A6=9D=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gift/adapter/in/web/GiftControllerTest.kt | 24 ++++++++++++---- .../application/GiftAdminQueryServiceTest.kt | 13 +++++---- .../gift/application/GiftQueryServiceTest.kt | 28 ++++++++++++------- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/gift/adapter/in/web/GiftControllerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/gift/adapter/in/web/GiftControllerTest.kt index f461254b..8c57216e 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/gift/adapter/in/web/GiftControllerTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/gift/adapter/in/web/GiftControllerTest.kt @@ -33,6 +33,7 @@ import org.hamcrest.Matchers.nullValue import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.EnumSource import org.junit.jupiter.params.provider.ValueSource import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired @@ -222,12 +223,13 @@ class GiftControllerTest @Autowired constructor( .andExpect(jsonPath("$.data.statusTimeline[1].occurredAt").value("2026-09-30T12:00:00Z")) } - @Test + @ParameterizedTest + @EnumSource(value = GiftStatus::class, names = ["DELIVERED", "UNDELIVERABLE"]) @DisplayName("배송 개인정보가 지워져도 보낸 선물과 받은 선물의 상세 응답 계약을 유지한다") - fun shouldReturnCompatibleErasedGiftDetailsForSenderAndRecipient() { + fun shouldReturnCompatibleErasedGiftDetailsForSenderAndRecipient(giftStatus: GiftStatus) { val sender = memberRepository.save(Member(password = "password", nickname = "erased-fan")) val recipient = memberRepository.save(Member(password = "password", nickname = "erased-creator")) - val gift = saveGift("G-CONTROLLER-ERASED", sender.id!!, recipient.id!!, GiftStatus.DELIVERED) + val gift = saveGift("ERASE-$giftStatus", sender.id!!, recipient.id!!, giftStatus) val delivery = GiftDelivery( giftId = gift.id!!, senderName = null, @@ -236,7 +238,9 @@ class GiftControllerTest @Autowired constructor( senderAddress = null, trackingDeadlineAt = LocalDateTime.of(2026, 10, 2, 12, 0), recipientAddressDeadlineAt = LocalDateTime.of(2026, 10, 7, 12, 0), - deliveredAt = LocalDateTime.of(2026, 10, 3, 12, 0) + deliveredAt = LocalDateTime.of(2026, 10, 3, 12, 0).takeIf { giftStatus == GiftStatus.DELIVERED }, + undeliverableAt = LocalDateTime.of(2026, 10, 3, 12, 0).takeIf { giftStatus == GiftStatus.UNDELIVERABLE }, + undeliverableReason = "검수 실패".takeIf { giftStatus == GiftStatus.UNDELIVERABLE } ) giftDeliveryRepository.saveAndFlush(delivery) @@ -244,7 +248,7 @@ class GiftControllerTest @Autowired constructor( .andExpect(status().isOk) .andExpect(jsonPath("$.success").value(true)) .andExpect(jsonPath("$.data.direction").value("SENT")) - .andExpect(jsonPath("$.data.status").value("DELIVERED")) + .andExpect(jsonPath("$.data.status").value(giftStatus.name)) .andExpect(jsonPath("$.data.senderInfo").isMap) .andExpect(jsonPath("$.data.senderInfo.name").value("")) .andExpect(jsonPath("$.data.senderInfo.phoneNumber").value("")) @@ -255,7 +259,15 @@ class GiftControllerTest @Autowired constructor( .andExpect(jsonPath("$.data.trackingRequired").value(false)) .andExpect(jsonPath("$.data.recipientAddressRequired").value(false)) .andExpect(jsonPath("$.data.mailbox").value(nullValue())) - .andExpect(jsonPath("$.data.statusTimeline[4].occurredAt").value("2026-10-03T12:00:00Z")) + .andExpect( + jsonPath("$.data.statusTimeline[4].occurredAt") + .value("2026-10-03T12:00:00Z".takeIf { giftStatus == GiftStatus.DELIVERED }) + ) + .andExpect( + jsonPath("$.data.delivery.undeliverableAt") + .value("2026-10-03T12:00:00Z".takeIf { giftStatus == GiftStatus.UNDELIVERABLE }) + ) + .andExpect(jsonPath("$.data.delivery.undeliverableReason").value(delivery.undeliverableReason)) mockMvc.perform(get("/api/v2/gifts/{applicationNo}", gift.applicationNo).with(user(MemberAdapter(recipient)))) .andExpect(status().isOk) diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftAdminQueryServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftAdminQueryServiceTest.kt index e6407534..68b22de9 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftAdminQueryServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftAdminQueryServiceTest.kt @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.EnumSource import org.junit.jupiter.params.provider.NullAndEmptySource import org.junit.jupiter.params.provider.ValueSource import org.springframework.beans.factory.annotation.Autowired @@ -130,12 +131,13 @@ class GiftAdminQueryServiceTest @Autowired constructor( assertEquals(listOf("COMPLETE_INSPECTION", "MARK_UNDELIVERABLE"), result.availableActions) } - @Test + @ParameterizedTest + @EnumSource(value = GiftStatus::class, names = ["DELIVERED", "UNDELIVERABLE"]) @DisplayName("개인정보가 지워진 관리자 선물 응답은 닉네임과 종료 상태 액션을 유지한다") - fun shouldMapErasedDeliveryStringsWithoutChangingActions() { + fun shouldMapErasedDeliveryStringsWithoutChangingActions(status: GiftStatus) { val sender = saveMember("fan-alpha") val recipient = saveMember("creator-alpha") - val gift = saveGift("A-ERASED-DETAIL", sender, recipient, saveCategory(), GiftStatus.DELIVERED) + val gift = saveGift("A-ERASED-DETAIL", sender, recipient, saveCategory(), status) requireNotNull(deliveryRepository.findByGiftId(gift.id!!)).apply { senderName = null senderPhoneNumber = null @@ -147,16 +149,17 @@ class GiftAdminQueryServiceTest @Autowired constructor( entityManager.clear() val detail = service().getGiftDetail(gift.applicationNo) - val item = service().getGifts(GiftStatus.DELIVERED, null, null, 0, 20).items.single() + val item = service().getGifts(status, null, null, 0, 20).items.single() assertEquals(AdminGiftMemberInfoResult("fan-alpha", "", "", ""), detail.senderInfo) assertEquals(AdminGiftMemberInfoResult("creator-alpha", "", "", ""), detail.recipientInfo) assertNull(detail.inboundDeliveryInfo.courierCompanyName) assertNull(detail.inboundDeliveryInfo.trackingNumber) - assertEquals(GiftStatus.DELIVERED, detail.status) + assertEquals(status, detail.status) assertEquals(emptyList(), detail.availableActions) assertEquals("fan-alpha", item.senderNickname) assertEquals("creator-alpha", item.recipientNickname) + assertEquals(status, item.status) assertNull(item.courierCompanyName) assertNull(item.trackingNumber) assertEquals(emptyList(), item.availableActions) diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftQueryServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftQueryServiceTest.kt index 5a46de9e..f9b94378 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftQueryServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/gift/application/GiftQueryServiceTest.kt @@ -28,6 +28,7 @@ import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.EnumSource import org.junit.jupiter.params.provider.NullAndEmptySource import org.junit.jupiter.params.provider.ValueSource import org.springframework.beans.factory.annotation.Autowired @@ -318,14 +319,15 @@ class GiftQueryServiceTest @Autowired constructor( assertNull(result.statusTimeline[1].occurredAt) } - @Test + @ParameterizedTest + @EnumSource(value = GiftStatus::class, names = ["DELIVERED", "UNDELIVERABLE"]) @DisplayName("개인정보가 지워진 보낸 선물은 발신자 객체와 빈 문자열을 유지한다") - fun shouldMapErasedSentSenderDetailsToEmptyStrings() { + fun shouldMapErasedSentSenderDetailsToEmptyStrings(status: GiftStatus) { val sender = saveMember("fan") val recipient = saveMember("creator", "profile/creator.png") - val gift = saveGift("G-ERASED-SENT", sender.id!!, recipient.id!!, GiftStatus.DELIVERED) + val gift = saveGift("G-ERASED-SENT", sender.id!!, recipient.id!!, status) saveDelivery(gift).apply { - applyStatusTimes(GiftStatus.DELIVERED) + applyStatusTimes(status) recipientAddressDeadlineAt = NOW.plusDays(7) senderName = null senderPhoneNumber = null @@ -340,7 +342,7 @@ class GiftQueryServiceTest @Autowired constructor( val item = queryService().getGifts(sender.id!!, GiftListType.SENT, 0, 20, Lang.KO).items.single() assertEquals(GiftDirection.SENT, result.direction) - assertEquals(GiftStatus.DELIVERED, result.status) + assertEquals(status, result.status) assertEquals(GiftAddressResult("", "", ""), result.senderInfo) assertNull(result.recipientAddress) assertNull(result.giftInfo.tracking) @@ -348,21 +350,24 @@ class GiftQueryServiceTest @Autowired constructor( assertEquals("creator", result.giftInfo.recipientCreatorNickname) assertEquals(false, result.trackingRequired) assertEquals(false, result.recipientAddressRequired) - assertEquals(NOW.plusHours(4), result.statusTimeline.last().occurredAt) + assertEquals(NOW.plusHours(4).takeIf { status == GiftStatus.DELIVERED }, result.statusTimeline.last().occurredAt) + assertEquals(NOW.plusHours(4).takeIf { status == GiftStatus.UNDELIVERABLE }, result.delivery.undeliverableAt) + assertEquals("검수 실패".takeIf { status == GiftStatus.UNDELIVERABLE }, result.delivery.undeliverableReason) assertEquals("creator", item.counterpartNickname) assertEquals("https://cdn.test/profile/creator.png", item.counterpartProfileImageUrl) assertEquals(false, item.recipientAddressRegistered) assertEquals(NOW.plusDays(7), item.recipientAddressDeadlineAt) } - @Test + @ParameterizedTest + @EnumSource(value = GiftStatus::class, names = ["DELIVERED", "UNDELIVERABLE"]) @DisplayName("개인정보가 지워진 받은 선물은 발신자 정보와 수신자 배송지를 null로 유지한다") - fun shouldKeepReceivedSenderInfoNullAndRecipientAddressNullWhenErased() { + fun shouldKeepReceivedSenderInfoNullAndRecipientAddressNullWhenErased(status: GiftStatus) { val sender = saveMember("fan", "profile/fan.png") val recipient = saveMember("creator") - val gift = saveGift("G-ERASED-RECEIVED", sender.id!!, recipient.id!!, GiftStatus.DELIVERED) + val gift = saveGift("G-ERASED-RECEIVED", sender.id!!, recipient.id!!, status) saveDelivery(gift).apply { - applyStatusTimes(GiftStatus.DELIVERED) + applyStatusTimes(status) recipientAddressDeadlineAt = NOW.plusDays(7) senderName = null senderPhoneNumber = null @@ -377,12 +382,15 @@ class GiftQueryServiceTest @Autowired constructor( val item = queryService().getGifts(recipient.id!!, GiftListType.RECEIVED, 0, 20, Lang.KO).items.single() assertEquals(GiftDirection.RECEIVED, result.direction) + assertEquals(status, result.status) assertNull(result.senderInfo) assertNull(result.recipientAddress) assertNull(result.giftInfo.tracking) assertEquals("fan", result.giftInfo.senderNickname) assertEquals(false, result.trackingRequired) assertEquals(false, result.recipientAddressRequired) + assertEquals(NOW.plusHours(4).takeIf { status == GiftStatus.UNDELIVERABLE }, result.delivery.undeliverableAt) + assertEquals("검수 실패".takeIf { status == GiftStatus.UNDELIVERABLE }, result.delivery.undeliverableReason) assertEquals(NOW.plusDays(7), result.recipientAddressDeadlineAt) assertEquals("fan", item.counterpartNickname) assertEquals("https://cdn.test/profile/fan.png", item.counterpartProfileImageUrl)