feat(live-room): 라이브 캡쳐 녹화 가능 여부를 생성 조회에 반영한다

This commit is contained in:
2026-03-30 21:27:40 +09:00
parent a4ffab0351
commit 38fd826fe4
7 changed files with 114 additions and 3 deletions

View File

@@ -16,6 +16,7 @@ import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository
import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancelRepository
import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfo
import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository
import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutService
import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenuService
@@ -33,9 +34,12 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito
import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.domain.PageRequest
import java.time.LocalDateTime
import java.util.Optional
class LiveRoomServiceAdultVisibilityPolicyTest {
private lateinit var menuService: LiveRoomMenuService
@@ -240,6 +244,86 @@ class LiveRoomServiceAdultVisibilityPolicyTest {
)
}
@Test
@DisplayName("라이브 생성 시 캡쳐/녹화 가능 여부를 저장한다")
fun shouldPersistCaptureAndRecordingAvailabilityOnCreate() {
val member = createMember(id = 300L)
val request = CreateLiveRoomRequest(
title = "title",
content = "notice",
coverImageUrl = "https://image.example.com/cover.png",
isAdult = false,
tags = emptyList(),
numberOfPeople = 10,
timezone = "Asia/Seoul",
isCaptureRecordingAvailable = false
)
Mockito.`when`(repository.getActiveRoomIdList(memberId = 300L)).thenReturn(0)
Mockito.`when`(repository.getRoomActiveAndChannelNameIsNotNull(memberId = 300L)).thenReturn(emptyList())
Mockito.`when`(objectMapper.readValue("request-json", CreateLiveRoomRequest::class.java)).thenReturn(request)
Mockito.`when`(repository.save(Mockito.any(LiveRoom::class.java))).thenAnswer { invocation ->
invocation.arguments[0] as LiveRoom
}
service.createLiveRoom(coverImage = null, requestString = "request-json", member = member)
val roomCaptor = ArgumentCaptor.forClass(LiveRoom::class.java)
Mockito.verify(repository).save(roomCaptor.capture())
assertEquals(false, roomCaptor.value.isCaptureRecordingAvailable)
}
@Test
@DisplayName("라이브 정보 조회에 캡쳐/녹화 가능 여부를 포함한다")
fun shouldIncludeCaptureAndRecordingAvailabilityInRoomInfo() {
val viewer = createMember(id = 400L)
val creator = createMember(id = 401L)
creator.isVisibleDonationRank = false
val room = LiveRoom(
title = "title",
notice = "notice",
beginDateTime = LocalDateTime.now(),
numberOfPeople = 10,
coverImage = "cover/image.png",
isAdult = false,
isCaptureRecordingAvailable = false
)
room.id = 999L
room.member = creator
room.channelName = "SODA_LIVE_CHANNEL_TEST"
val roomInfo = LiveRoomInfo(roomId = 999L)
Mockito.`when`(roomInfoRepository.findById(999L)).thenReturn(Optional.of(roomInfo))
Mockito.`when`(repository.findById(999L)).thenReturn(Optional.of(room))
Mockito.`when`(blockMemberRepository.isBlocked(Mockito.anyLong(), Mockito.anyLong())).thenReturn(false)
Mockito.`when`(
rtcTokenBuilder.buildTokenWithUid(
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyInt()
)
).thenReturn("rtc-token")
Mockito.`when`(
rtmTokenBuilder.buildToken(
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyInt()
)
).thenReturn("rtm-token")
Mockito.`when`(explorerQueryRepository.getNotificationUserIds(creator.id!!)).thenReturn(emptyList())
Mockito.`when`(rouletteRepository.findByCreatorId(creator.id!!)).thenReturn(emptyList())
Mockito.`when`(pushTokenRepository.findByMemberId(creator.id!!)).thenReturn(emptyList())
val response = service.getRoomInfo(roomId = 999L, member = viewer)
assertEquals(false, response.isCaptureRecordingAvailable)
}
private fun createMember(id: Long): Member {
val member = Member(
email = "member$id@test.com",