feat(chat): DM 채팅 저장소를 추가한다

This commit is contained in:
2026-06-10 18:11:47 +09:00
parent 630f84c3e5
commit a289849a07
2 changed files with 231 additions and 0 deletions

View File

@@ -0,0 +1,171 @@
package kr.co.vividnext.sodalive.v2.main.chat.dm
import io.reactivex.rxjava3.core.Single
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.CreateDmChatRoomRequest
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.CreateDmChatRoomResponse
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.DmChatApi
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.DmChatMessageResponse
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.DmChatMessagesPageResponse
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.DmChatRepository
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.DmChatRoomOpenResponse
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.SendDmChatMessageResponse
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.SendDmTextMessageRequest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
class DmChatRepositoryTest {
private val api = FakeDmChatApi()
private val repository = DmChatRepository(api)
@Test
fun `createOrGetRoom은 bearer header와 creatorId를 API에 위임한다`() {
repository.createOrGetRoom(token = "test-token", creatorId = 11L).blockingGet()
assertEquals("Bearer test-token", api.lastAuthHeader)
assertEquals(CreateDmChatRoomRequest(creatorId = 11L), api.lastCreateRequest)
}
@Test
fun `openRoom은 기본 limit 20과 bearer header를 API에 위임한다`() {
repository.openRoom(token = "test-token", roomId = 12L).blockingGet()
assertEquals("Bearer test-token", api.lastAuthHeader)
assertEquals(12L, api.lastRoomId)
assertEquals(20, api.lastLimit)
}
@Test
fun `getMessages는 cursor와 limit을 API에 위임한다`() {
repository.getMessages(token = "test-token", roomId = 12L, cursor = 30L, limit = 10).blockingGet()
assertEquals("Bearer test-token", api.lastAuthHeader)
assertEquals(12L, api.lastRoomId)
assertEquals(30L, api.lastCursor)
assertEquals(10, api.lastLimit)
}
@Test
fun `sendTextMessage는 textMessage request를 API에 위임한다`() {
repository.sendTextMessage(token = "test-token", roomId = 12L, textMessage = "안녕").blockingGet()
assertEquals("Bearer test-token", api.lastAuthHeader)
assertEquals(12L, api.lastRoomId)
assertEquals(SendDmTextMessageRequest(textMessage = "안녕"), api.lastSendRequest)
}
@Test
fun `disconnectRealtime은 bearer header와 roomId를 API에 위임한다`() {
repository.disconnectRealtime(token = "test-token", roomId = 12L).blockingGet()
assertEquals("Bearer test-token", api.lastAuthHeader)
assertEquals(12L, api.lastRoomId)
assertNull(api.lastSendRequest)
}
private class FakeDmChatApi : DmChatApi {
var lastAuthHeader: String? = null
var lastCreateRequest: CreateDmChatRoomRequest? = null
var lastSendRequest: SendDmTextMessageRequest? = null
var lastRoomId: Long? = null
var lastCursor: Long? = null
var lastLimit: Int? = null
override fun createDmChatRoom(
authHeader: String,
request: CreateDmChatRoomRequest
): Single<ApiResponse<CreateDmChatRoomResponse>> {
lastAuthHeader = authHeader
lastCreateRequest = request
return Single.just(ApiResponse(success = true, data = CreateDmChatRoomResponse(roomId = 12L)))
}
override fun openDmChatRoom(
authHeader: String,
roomId: Long,
limit: Int
): Single<ApiResponse<DmChatRoomOpenResponse>> {
lastAuthHeader = authHeader
lastRoomId = roomId
lastLimit = limit
return Single.just(
ApiResponse(
success = true,
data = DmChatRoomOpenResponse(
roomId = roomId,
opponentNickname = "상대",
opponentProfileImageUrl = "https://example.com/profile.png",
messages = emptyList(),
hasMore = false,
nextCursor = null
)
)
)
}
override fun getDmChatMessages(
authHeader: String,
roomId: Long,
cursor: Long?,
limit: Int
): Single<ApiResponse<DmChatMessagesPageResponse>> {
lastAuthHeader = authHeader
lastRoomId = roomId
lastCursor = cursor
lastLimit = limit
return Single.just(
ApiResponse(
success = true,
data = DmChatMessagesPageResponse(
messages = emptyList(),
hasMore = false,
nextCursor = null
)
)
)
}
override fun sendDmTextMessage(
authHeader: String,
roomId: Long,
request: SendDmTextMessageRequest
): Single<ApiResponse<SendDmChatMessageResponse>> {
lastAuthHeader = authHeader
lastRoomId = roomId
lastSendRequest = request
return Single.just(
ApiResponse(
success = true,
data = SendDmChatMessageResponse(
message = message(),
deliveredRealtime = true,
pushSent = false
)
)
)
}
override fun disconnectRealtime(
authHeader: String,
roomId: Long
): Single<ApiResponse<Boolean>> {
lastAuthHeader = authHeader
lastRoomId = roomId
return Single.just(ApiResponse(success = true, data = true))
}
private fun message() = DmChatMessageResponse(
messageId = 1L,
messageType = "TEXT",
mine = true,
createdAt = 1000L,
textMessage = "안녕",
voiceMessageUrl = null,
senderId = 2L,
senderNickname = "",
senderProfileImageUrl = "https://example.com/profile.png"
)
}
}