From fefd62c63a12284b31be7016d399b6ae8fb959cc Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 18 Jun 2026 17:06:25 +0900 Subject: [PATCH] =?UTF-8?q?feat(user-creator-chat):=20WebSocket=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B3=84=EC=95=BD=EC=9D=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserCreatorChatWebSocketMessage.kt | 22 ++++++ .../UserCreatorChatWebSocketMessageTest.kt | 77 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessage.kt create mode 100644 src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessageTest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessage.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessage.kt new file mode 100644 index 00000000..a5dfd989 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessage.kt @@ -0,0 +1,22 @@ +package kr.co.vividnext.sodalive.v2.usercreatorchat.websocket + +import com.fasterxml.jackson.databind.JsonNode + +data class UserCreatorChatWebSocketMessage( + val type: UserCreatorChatWebSocketMessageType, + val requestId: String?, + val roomId: Long, + val payload: JsonNode +) + +enum class UserCreatorChatWebSocketMessageType { + JOIN_ROOM, + SEND_TEXT, + LEAVE_ROOM, + PING, + JOINED, + MESSAGE, + SEND_ACK, + ERROR, + PONG +} diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessageTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessageTest.kt new file mode 100644 index 00000000..e232437e --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/websocket/UserCreatorChatWebSocketMessageTest.kt @@ -0,0 +1,77 @@ +package kr.co.vividnext.sodalive.v2.usercreatorchat.websocket + +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +class UserCreatorChatWebSocketMessageTest { + private val objectMapper = jacksonObjectMapper() + + @Test + @DisplayName("WebSocket message type enum은 클라이언트 요청과 서버 응답 타입을 모두 가진다") + fun shouldDefineAllWebSocketMessageTypes() { + val names = UserCreatorChatWebSocketMessageType.values().map { it.name } + + assertEquals( + listOf( + "JOIN_ROOM", + "SEND_TEXT", + "LEAVE_ROOM", + "PING", + "JOINED", + "MESSAGE", + "SEND_ACK", + "ERROR", + "PONG" + ), + names, + "Expected WebSocket message types to match the protocol contract" + ) + } + + @Test + @DisplayName("SEND_TEXT JSON envelope를 JsonNode payload로 역직렬화한다") + fun shouldDeserializeSendTextEnvelopeWithJsonNodePayload() { + val json = """ + { + "type": "SEND_TEXT", + "requestId": "client-request-id", + "roomId": 10, + "payload": { + "textMessage": "hello" + } + } + """.trimIndent() + + val message = objectMapper.readValue(json) + + assertEquals(UserCreatorChatWebSocketMessageType.SEND_TEXT, message.type) + assertEquals("client-request-id", message.requestId) + assertEquals(10L, message.roomId) + assertNotNull(message.payload, "Expected payload JsonNode to be present") + assertEquals("hello", message.payload["textMessage"].asText()) + } + + @Test + @DisplayName("payload가 비어 있는 JOIN_ROOM envelope도 역직렬화한다") + fun shouldDeserializeJoinRoomEnvelopeWithEmptyPayload() { + val json = """ + { + "type": "JOIN_ROOM", + "requestId": "join-request-id", + "roomId": 10, + "payload": {} + } + """.trimIndent() + + val message = objectMapper.readValue(json) + + assertEquals(UserCreatorChatWebSocketMessageType.JOIN_ROOM, message.type) + assertEquals("join-request-id", message.requestId) + assertEquals(10L, message.roomId) + assertEquals(0, message.payload.size(), "Expected empty JSON object payload") + } +}