feat(creator-channel): FanTalk 탭 응답 조립을 추가한다

This commit is contained in:
2026-06-22 14:51:44 +09:00
parent 831c26c155
commit 90bf4c770c
4 changed files with 245 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
package kr.co.vividnext.sodalive.v2.api.creator.channel.fantalk.application
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.v2.api.creator.channel.fantalk.dto.CreatorChannelFanTalkTabResponse
import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.application.CreatorChannelFanTalkQueryService
import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.domain.CreatorChannelFanTalk
import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.domain.CreatorChannelFanTalkReply
import kr.co.vividnext.sodalive.v2.creator.channel.fantalk.domain.CreatorChannelFanTalkTab
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelPage
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.Mockito
import java.time.LocalDateTime
class CreatorChannelFanTalkFacadeTest {
@Test
@DisplayName("FanTalk 탭 응답 DTO는 domain tab 값을 공개 응답 필드와 UTC 문자열로 매핑한다")
fun shouldMapFanTalkTabDomainToPublicResponse() {
val response = CreatorChannelFanTalkTabResponse.from(createTab())
assertEquals(2, response.fanTalkCount)
assertEquals(101L, response.fanTalks.first().fanTalkId)
assertEquals(10L, response.fanTalks.first().writerId)
assertEquals("fan", response.fanTalks.first().writerNickname)
assertEquals("https://cdn.test/fan.png", response.fanTalks.first().writerProfileImageUrl)
assertEquals("fan talk", response.fanTalks.first().content)
assertEquals("2026-06-21T03:30:00Z", response.fanTalks.first().createdAtUtc)
assertEquals(201L, response.fanTalks.first().creatorReplies.first().fanTalkId)
assertEquals(1L, response.fanTalks.first().creatorReplies.first().writerId)
assertEquals("creator", response.fanTalks.first().creatorReplies.first().writerNickname)
assertEquals("https://cdn.test/creator.png", response.fanTalks.first().creatorReplies.first().writerProfileImageUrl)
assertEquals("creator reply", response.fanTalks.first().creatorReplies.first().content)
assertEquals("2026-06-21T03:35:00Z", response.fanTalks.first().creatorReplies.first().createdAtUtc)
assertEquals(1, response.page)
assertEquals(20, response.size)
assertTrue(response.hasNext)
val mapper = ObjectMapper().registerModule(KotlinModule.Builder().build())
val json = mapper.readTree(mapper.writeValueAsString(response))
assertTrue(json["hasNext"].asBoolean())
assertFalse(json.has("languageCode"))
}
@Test
@DisplayName("FanTalk 탭 facade는 query service 결과를 공개 응답 DTO로 변환한다")
fun shouldMapFanTalkTabQueryResultToPublicResponse() {
val service = Mockito.mock(CreatorChannelFanTalkQueryService::class.java)
val facade = CreatorChannelFanTalkFacade(service)
val viewer = createMember(id = 10L)
val now = LocalDateTime.of(2026, 6, 21, 12, 0)
Mockito.doReturn(createTab()).`when`(service).getFanTalkTab(
creatorId = 1L,
viewer = viewer,
page = -1,
size = 100,
now = now
)
val response = facade.getFanTalkTab(
creatorId = 1L,
viewer = viewer,
page = -1,
size = 100,
now = now
)
assertEquals(2, response.fanTalkCount)
assertEquals(101L, response.fanTalks.first().fanTalkId)
assertEquals("https://cdn.test/fan.png", response.fanTalks.first().writerProfileImageUrl)
assertEquals(201L, response.fanTalks.first().creatorReplies.first().fanTalkId)
assertEquals(1, response.page)
assertEquals(20, response.size)
assertTrue(response.hasNext)
}
private fun createMember(id: Long): Member {
return Member(
email = "viewer$id@test.com",
password = "password",
nickname = "viewer$id",
role = MemberRole.USER
).apply { this.id = id }
}
private fun createTab(): CreatorChannelFanTalkTab {
return CreatorChannelFanTalkTab(
fanTalkCount = 2,
fanTalks = listOf(
CreatorChannelFanTalk(
fanTalkId = 101L,
writerId = 10L,
writerNickname = "fan",
writerProfileImageUrl = "https://cdn.test/fan.png",
content = "fan talk",
createdAt = LocalDateTime.of(2026, 6, 21, 3, 30),
creatorReplies = listOf(
CreatorChannelFanTalkReply(
fanTalkId = 201L,
writerId = 1L,
writerNickname = "creator",
writerProfileImageUrl = "https://cdn.test/creator.png",
content = "creator reply",
createdAt = LocalDateTime.of(2026, 6, 21, 3, 35)
)
)
)
),
page = CreatorChannelPage(page = 1, size = 20),
hasNext = true
)
}
}