diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt index e4fc4696..71e6ac06 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt @@ -139,6 +139,8 @@ class UserCreatorChatService( memberId = opponent.id!!, payload = websocketMessagePayload(UserCreatorChatWebSocketMessageType.MESSAGE, roomId, opponentMessage) ) + } else { + publishMessagePush(message, sender, opponent) } return senderMessage } @@ -236,7 +238,9 @@ class UserCreatorChatService( senderMemberId = sender.id, args = listOf(sender.nickname), recipients = listOf(opponent.id!!), - messageId = message.id + roomId = message.chatRoom.id, + messageId = message.id, + chatType = USER_CREATOR_CHAT_TYPE ) ) } @@ -298,4 +302,8 @@ class UserCreatorChatService( val senderParticipant: UserCreatorChatParticipant, val opponentParticipant: UserCreatorChatParticipant ) + + companion object { + private const val USER_CREATOR_CHAT_TYPE = "USER_CREATOR" + } } diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt index 5435f22c..dcaced8f 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt @@ -251,6 +251,34 @@ class UserCreatorChatServiceTest { Mockito.verifyNoInteractions(eventPublisher) } + @Test + @DisplayName("WebSocket 텍스트 전송은 상대방 presence가 없으면 채팅방 이동용 푸시 이벤트를 발행한다") + fun shouldPublishPushEventWithChatPayloadWhenOpponentPresenceDoesNotExist() { + val user = member(1L, "user") + val creator = member(2L, "creator") + val room = room(10L) + val senderParticipant = participant(100L, room, user) + val recipientParticipant = participant(101L, room, creator) + Mockito.`when`(roomRepository.findByIdAndIsActiveTrue(10L)).thenReturn(room) + Mockito.`when`(participantRepository.findActiveByRoomIdAndMemberId(10L, 1L)).thenReturn(senderParticipant) + Mockito.`when`(participantRepository.findActiveOpponent(10L, 1L)).thenReturn(recipientParticipant) + Mockito.`when`(presenceService.hasPresence(10L, 2L)).thenReturn(false) + Mockito.`when`(messageRepository.save(Mockito.any(UserCreatorChatMessage::class.java))).thenAnswer { invocation -> + (invocation.arguments[0] as UserCreatorChatMessage).apply { id = 204L } + } + + service.sendTextMessageByWebSocket(memberId = 1L, roomId = 10L, textMessage = "hello") + + val eventCaptor = ArgumentCaptor.forClass(FcmEvent::class.java) + Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) + assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) + assertEquals(listOf(2L), eventCaptor.value.recipients) + assertEquals(10L, eventCaptor.value.roomId) + assertEquals(204L, eventCaptor.value.messageId) + assertEquals("USER_CREATOR", eventCaptor.value.chatType) + Mockito.verifyNoInteractions(roomMessageBroker) + } + @Test @DisplayName("커서가 있으면 기본 20개 기준으로 이전 메시지를 조회한다") fun shouldGetPreviousMessagesWithDefaultLimitWhenCursorExists() {