Merge pull request 'test' (#438) from test into main

Reviewed-on: #438
This commit is contained in:
2026-07-12 10:42:33 +00:00
5 changed files with 21 additions and 2 deletions

View File

@@ -4,10 +4,12 @@
1. Happy path: 상대방이 DM Room에 입장하지 않은 상태에서 WebSocket 텍스트 메시지를 보내면 `FcmEvent.messageKey``message.fcm.dm_received`이다. 1. Happy path: 상대방이 DM Room에 입장하지 않은 상태에서 WebSocket 텍스트 메시지를 보내면 `FcmEvent.messageKey``message.fcm.dm_received`이다.
2. Edge: `message.fcm.dm_received`가 KO/EN/JA에서 조회되고, 기존 `message.fcm.text_received` 한국어 문구는 그대로다. 2. Edge: `message.fcm.dm_received`가 KO/EN/JA에서 조회되고, 기존 `message.fcm.text_received` 한국어 문구는 그대로다.
3. Adjacent regression: DM 음성 메시지 푸시는 계속 `message.fcm.voice_received`를 사용한다. 3. Adjacent regression: DM 음성 메시지 푸시는 계속 `message.fcm.voice_received`를 사용한다.
4. Title: DM 텍스트 푸시의 `titleKey``message.fcm.dm_title`("DM"), 음성 등 그 외는 `message.fcm.title`을 유지한다.
## 작업 ## 작업
1. RED: `SodaMessageSourceTest`에 DM 전용 키 다국어 조회와 기존 키 보존 테스트를 추가한다. 1. RED: `SodaMessageSourceTest`에 DM 전용 키 다국어 조회와 기존 키 보존 테스트를 추가한다.
2. RED: `UserCreatorChatServiceTest`에 DM 텍스트 푸시 키와 음성 푸시 키 회귀 assertion을 추가한다. 2. RED: `UserCreatorChatServiceTest`에 DM 텍스트 푸시 키와 음성 푸시 키 회귀 assertion을 추가한다.
3. GREEN: `SodaMessageSource``message.fcm.dm_received` 다국어 메시지를 추가한다. 3. GREEN: `SodaMessageSource``message.fcm.dm_received` 다국어 메시지를 추가한다.
4. GREEN: `UserCreatorChatService.publishMessagePush`의 텍스트 분기만 새 키로 바꾼다. 4. GREEN: `UserCreatorChatService.publishMessagePush`의 텍스트 분기만 새 키로 바꾼다.
5. VERIFY: 관련 테스트와 lint를 실행한다. 5. GREEN: `SodaMessageSource``message.fcm.dm_title`(KO/EN/JA "DM")를 추가하고, `publishMessagePush`가 DM 텍스트일 때만 `titleKey``message.fcm.dm_title`로 분기한다.
6. VERIFY: 관련 테스트와 lint를 실행한다.

View File

@@ -9,6 +9,8 @@ DM Room에서 텍스트 메시지를 보냈을 때 상대방이 해당 채팅방
- 새 한국어 문구는 기존 문구의 `문자메시지가``DM이`로 바꾼다. - 새 한국어 문구는 기존 문구의 `문자메시지가``DM이`로 바꾼다.
- 새 메시지 키는 한국어, 영어, 일본어를 모두 제공한다. - 새 메시지 키는 한국어, 영어, 일본어를 모두 제공한다.
- DM 음성 메시지 푸시는 기존 `message.fcm.voice_received`를 유지한다. - DM 음성 메시지 푸시는 기존 `message.fcm.voice_received`를 유지한다.
- DM 텍스트 푸시(`message.fcm.dm_received`) 사용 시 푸시 제목을 새 키 `message.fcm.dm_title`("DM")로 표시한다.
- 음성 등 그 외 푸시 제목은 기존 `message.fcm.title`을 유지한다.
## 비범위 ## 비범위
- FCM 발송 구조, deep link, 수신자 선정 로직은 변경하지 않는다. - FCM 발송 구조, deep link, 수신자 선정 로직은 변경하지 않는다.
@@ -18,3 +20,5 @@ DM Room에서 텍스트 메시지를 보냈을 때 상대방이 해당 채팅방
- 오프라인 DM 텍스트 메시지 푸시 이벤트가 새 DM 메시지 키를 사용한다. - 오프라인 DM 텍스트 메시지 푸시 이벤트가 새 DM 메시지 키를 사용한다.
- `message.fcm.text_received`는 기존 값으로 남아 있다. - `message.fcm.text_received`는 기존 값으로 남아 있다.
- 새 DM 메시지 키가 `Lang.KO`, `Lang.EN`, `Lang.JA`에서 조회된다. - 새 DM 메시지 키가 `Lang.KO`, `Lang.EN`, `Lang.JA`에서 조회된다.
- DM 텍스트 푸시 이벤트의 `titleKey``message.fcm.dm_title`이고, 음성 등 그 외 푸시는 `message.fcm.title`을 유지한다.
- `message.fcm.dm_title``Lang.KO`, `Lang.EN`, `Lang.JA` 모두 "DM"으로 조회된다.

View File

@@ -1175,6 +1175,11 @@ class SodaMessageSource {
Lang.EN to "You have received a DM from %s.", Lang.EN to "You have received a DM from %s.",
Lang.JA to "%sからDMが届きました。" Lang.JA to "%sからDMが届きました。"
), ),
"message.fcm.dm_title" to mapOf(
Lang.KO to "DM",
Lang.EN to "DM",
Lang.JA to "DM"
),
"message.fcm.voice_received" to mapOf( "message.fcm.voice_received" to mapOf(
Lang.KO to "%s님으로 부터 음성메시지가 도착했습니다.", Lang.KO to "%s님으로 부터 음성메시지가 도착했습니다.",
Lang.EN to "You have received a voice message from %s.", Lang.EN to "You have received a voice message from %s.",

View File

@@ -226,11 +226,16 @@ class UserCreatorChatService(
} else { } else {
"message.fcm.dm_received" "message.fcm.dm_received"
} }
val titleKey = if (messageKey == "message.fcm.dm_received") {
"message.fcm.dm_title"
} else {
"message.fcm.title"
}
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
FcmEvent( FcmEvent(
type = FcmEventType.INDIVIDUAL, type = FcmEventType.INDIVIDUAL,
category = PushNotificationCategory.MESSAGE, category = PushNotificationCategory.MESSAGE,
titleKey = "message.fcm.title", titleKey = titleKey,
messageKey = messageKey, messageKey = messageKey,
senderMemberId = sender.id, senderMemberId = sender.id,
args = listOf(sender.nickname), args = listOf(sender.nickname),

View File

@@ -198,6 +198,7 @@ class UserCreatorChatServiceTest {
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey) assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey)
assertEquals("message.fcm.dm_title", eventCaptor.value.titleKey)
assertEquals(listOf(2L), eventCaptor.value.recipients) assertEquals(listOf(2L), eventCaptor.value.recipients)
assertEquals(null, eventCaptor.value.roomId) assertEquals(null, eventCaptor.value.roomId)
assertEquals(null, eventCaptor.value.messageId) assertEquals(null, eventCaptor.value.messageId)
@@ -231,6 +232,7 @@ class UserCreatorChatServiceTest {
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey) assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey)
assertEquals("message.fcm.dm_title", eventCaptor.value.titleKey)
assertEquals(listOf(2L), eventCaptor.value.recipients) assertEquals(listOf(2L), eventCaptor.value.recipients)
Mockito.verifyNoInteractions(roomMessageBroker) Mockito.verifyNoInteractions(roomMessageBroker)
} }
@@ -289,6 +291,7 @@ class UserCreatorChatServiceTest {
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
assertEquals("message.fcm.voice_received", eventCaptor.value.messageKey) assertEquals("message.fcm.voice_received", eventCaptor.value.messageKey)
assertEquals("message.fcm.title", eventCaptor.value.titleKey)
assertEquals(listOf(2L), eventCaptor.value.recipients) assertEquals(listOf(2L), eventCaptor.value.recipients)
assertEquals(null, eventCaptor.value.roomId) assertEquals(null, eventCaptor.value.roomId)
assertEquals(null, eventCaptor.value.messageId) assertEquals(null, eventCaptor.value.messageId)