From bbb84d4ffa38266d1d2fbb000d4ecc8ebec62868 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 19 Jun 2026 00:09:51 +0900 Subject: [PATCH] =?UTF-8?q?fix(dm):=20FCM=20DM=20payload=20=EB=B3=B4?= =?UTF-8?q?=EC=A1=B4=EC=9D=84=20=EB=B3=B4=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fcm/SodaFirebaseMessagingService.kt | 3 ++ .../SodaFirebaseMessagingServiceSourceTest.kt | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 app/src/test/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingServiceSourceTest.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingService.kt b/app/src/main/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingService.kt index 1e0e9b37..d0b1e56e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingService.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingService.kt @@ -78,10 +78,13 @@ class SodaFirebaseMessagingService : FirebaseMessagingService() { val deepLinkExtras = if (!deepLinkUrl.isNullOrBlank()) { android.os.Bundle().apply { putString("deep_link", deepLinkUrl) + messageData["chat_type"]?.let { putString("chat_type", it) } + messageData["room_id"]?.let { putString("room_id", it) } } } else { android.os.Bundle().apply { messageData["room_id"]?.let { putString("room_id", it) } + messageData["chat_type"]?.let { putString("chat_type", it) } messageData["message_id"]?.let { putString("message_id", it) } messageData["content_id"]?.let { putString("content_id", it) } messageData["channel_id"]?.let { putString("channel_id", it) } diff --git a/app/src/test/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingServiceSourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingServiceSourceTest.kt new file mode 100644 index 00000000..b6cf95fb --- /dev/null +++ b/app/src/test/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingServiceSourceTest.kt @@ -0,0 +1,41 @@ +package kr.co.vividnext.sodalive.fcm + +import org.junit.Assert.assertTrue +import org.junit.Test +import java.io.File + +class SodaFirebaseMessagingServiceSourceTest { + + @Test + fun `FCM notification extras는 DM chat_type과 기존 deep link 값을 보존한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingService.kt" + ).readText() + + assertTrue(source.contains("messageData[\"chat_type\"]?.let { putString(\"chat_type\", it) }")) + assertTrue(source.contains("messageData[\"room_id\"]?.let { putString(\"room_id\", it) }")) + assertTrue(source.contains("messageData[\"message_id\"]?.let { putString(\"message_id\", it) }")) + assertTrue(source.contains("messageData[\"deep_link_value\"]?.let { putString(\"deep_link_value\", it) }")) + } + + @Test + fun `FCM deepLink payload도 DM chat_type과 room_id를 extra bundle에 보존한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/fcm/SodaFirebaseMessagingService.kt" + ).readText() + + val deepLinkBundleStart = source.indexOf("if (!deepLinkUrl.isNullOrBlank())") + val fallbackBundleStart = source.indexOf("} else {", deepLinkBundleStart) + val deepLinkBundleSource = source.substring(deepLinkBundleStart, fallbackBundleStart) + + assertTrue(deepLinkBundleSource.contains("putString(\"deep_link\", deepLinkUrl)")) + assertTrue(deepLinkBundleSource.contains("messageData[\"chat_type\"]?.let { putString(\"chat_type\", it) }")) + assertTrue(deepLinkBundleSource.contains("messageData[\"room_id\"]?.let { putString(\"room_id\", it) }")) + } + + private fun projectFile(relativePath: String): File { + val candidates = listOf(File(relativePath), File("../$relativePath")) + return candidates.firstOrNull { it.exists() } + ?: error("Project file not found: $relativePath") + } +}