feat(user-creator-chat): WebSocket 메시지 계약을 추가한다
This commit is contained in:
@@ -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<UserCreatorChatWebSocketMessage>(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<UserCreatorChatWebSocketMessage>(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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user