@@ -3,9 +3,7 @@ package team.aliens.dms.event.handler
33import com.fasterxml.jackson.databind.ObjectMapper
44import io.kotest.core.spec.IsolationMode
55import io.kotest.core.spec.style.DescribeSpec
6- import io.mockk.Runs
76import io.mockk.every
8- import io.mockk.just
97import io.mockk.mockk
108import io.mockk.verify
119import team.aliens.dms.common.dto.OutboxData
@@ -14,17 +12,15 @@ import team.aliens.dms.common.spi.OutboxPort
1412import team.aliens.dms.contract.model.notification.DeviceTokenInfo
1513import team.aliens.dms.contract.remote.rabbitmq.SaveDeviceTokenMessage
1614import team.aliens.dms.event.SaveDeviceTokenEvent
17- import team.aliens.dms.thirdparty.messagebroker.NotificationProducer
1815import java.util.UUID
1916
2017class DeviceTokenEventHandlerTest : DescribeSpec ({
2118
2219 isolationMode = IsolationMode .InstancePerLeaf
2320
2421 val outboxPort = mockk<OutboxPort >()
25- val notificationProducer = mockk<NotificationProducer >()
2622 val objectMapper = ObjectMapper ()
27- val deviceTokenEventHandler = DeviceTokenEventHandler (outboxPort, notificationProducer, objectMapper)
23+ val deviceTokenEventHandler = DeviceTokenEventHandler (outboxPort, objectMapper)
2824
2925 describe("saveOutbox") {
3026 context("SaveDeviceTokenEvent 가 발생하면") {
@@ -61,68 +57,4 @@ class DeviceTokenEventHandlerTest : DescribeSpec({
6157 }
6258 }
6359 }
64-
65- describe("publishMessage") {
66- context("메시지 전송에 성공하면") {
67- val userId = UUID .randomUUID()
68- val deviceTokenInfo = DeviceTokenInfo (
69- userId = userId,
70- schoolId = UUID .randomUUID(),
71- token = "test-fcm-token"
72- )
73- val event = SaveDeviceTokenEvent (deviceTokenInfo = deviceTokenInfo)
74- val outboxId = UUID .randomUUID()
75- val savedOutbox = OutboxData (
76- id = outboxId,
77- aggregateType = "device_token",
78-
79- eventType = "SaveDeviceTokenMessage ",
80- payload = objectMapper.writeValueAsString(SaveDeviceTokenMessage (deviceTokenInfo)),
81- status = OutboxStatus .PENDING ,
82- retryCount = 0
83- )
84-
85- every { outboxPort.save(any()) } returns savedOutbox
86- every { notificationProducer.sendMessage(any()) } just Runs
87- every { outboxPort.deleteById(outboxId) } just Runs
88-
89- it("메시지를 전송하고 Outbox 를 삭제한다") {
90- deviceTokenEventHandler.saveOutbox(event)
91- deviceTokenEventHandler.publishMessage(event)
92-
93- verify { notificationProducer.sendMessage(any()) }
94- verify { outboxPort.deleteById(outboxId) }
95- }
96- }
97-
98- context("메시지 전송에 실패하면") {
99- val userId = UUID .randomUUID()
100- val deviceTokenInfo = DeviceTokenInfo (
101- userId = userId,
102- schoolId = UUID .randomUUID(),
103- token = "test-fcm-token"
104- )
105- val event = SaveDeviceTokenEvent (deviceTokenInfo = deviceTokenInfo)
106- val outboxId = UUID .randomUUID()
107- val savedOutbox = OutboxData (
108- id = outboxId,
109- aggregateType = "device_token",
110- eventType = "SaveDeviceTokenMessage ",
111- payload = objectMapper.writeValueAsString(SaveDeviceTokenMessage (deviceTokenInfo)),
112- status = OutboxStatus .PENDING ,
113- retryCount = 0
114- )
115-
116- every { outboxPort.save(any()) } returns savedOutbox
117- every { notificationProducer.sendMessage(any()) } throws RuntimeException ("Send failed")
118-
119- it("Outbox 를 삭제하지 않고 스케줄러가 재시도하도록 남겨둔다") {
120- deviceTokenEventHandler.saveOutbox(event)
121- deviceTokenEventHandler.publishMessage(event)
122-
123- verify { notificationProducer.sendMessage(any()) }
124- verify(exactly = 0) { outboxPort.deleteById(any()) }
125- }
126- }
127- }
12860})
0 commit comments