test(user-creator-chat): 크리에이터 시작 DM 생성을 검증한다

This commit is contained in:
2026-09-14 14:50:54 +09:00
parent de1a9eb114
commit 62c834d28f
3 changed files with 79 additions and 5 deletions
@@ -31,6 +31,42 @@ class UserCreatorChatServiceIntegrationTest @Autowired constructor(
private val messageRepository: UserCreatorChatMessageRepository,
private val entityManager: EntityManager
) {
@Test
@DisplayName("기존 리스너 시작 DM 방 생성 흐름은 계속 동작한다")
fun shouldCreateRoomWhenListenerStartsDmToCreator() {
val user = memberRepository.save(Member(email = "listener-start@test.com", password = "pw", nickname = "listener"))
val creator = memberRepository.save(
Member(email = "creator-target@test.com", password = "pw", nickname = "creator", role = MemberRole.CREATOR)
)
entityManager.flush()
entityManager.clear()
val response = service.createOrGetRoom(user, creator.id!!)
assertEquals(1, roomRepository.findAll().size)
assertEquals(roomRepository.findAll().single().id, response.roomId)
assertEquals(2, participantRepository.findAll().size)
assertEquals(0, messageRepository.findAll().size)
}
@Test
@DisplayName("크리에이터도 일반 회원에게 DM 방을 먼저 생성할 수 있다")
fun shouldCreateRoomWhenCreatorStartsDmToListener() {
val creator = memberRepository.save(
Member(email = "creator-start@test.com", password = "pw", nickname = "creator", role = MemberRole.CREATOR)
)
val listener = memberRepository.save(Member(email = "listener-target@test.com", password = "pw", nickname = "listener"))
entityManager.flush()
entityManager.clear()
val response = service.createOrGetRoom(creator, listener.id!!)
assertEquals(1, roomRepository.findAll().size)
assertEquals(roomRepository.findAll().single().id, response.roomId)
assertEquals(2, participantRepository.findAll().size)
assertEquals(0, messageRepository.findAll().size)
}
@Test
@DisplayName("AI 캐릭터용 Member와는 유저-크리에이터 DM 방을 생성할 수 없다")
fun shouldRejectCreateRoomWhenCreatorIsAiCharacterMember() {
@@ -8,6 +8,7 @@ import kr.co.vividnext.sodalive.fcm.FcmEvent
import kr.co.vividnext.sodalive.fcm.FcmEventType
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import kr.co.vividnext.sodalive.v2.usercreatorchat.dto.UserCreatorChatMessageItemDto
import kr.co.vividnext.sodalive.v2.usercreatorchat.repository.UserCreatorChatMessageRepository
@@ -93,6 +94,43 @@ class UserCreatorChatServiceTest {
Mockito.verify(participantRepository, Mockito.times(2)).save(Mockito.any(UserCreatorChatParticipant::class.java))
}
@Test
@DisplayName("크리에이터도 일반 회원에게 DM 방을 먼저 생성할 수 있고 메시지는 생성하지 않는다")
fun shouldCreateRoomWhenCreatorStartsDmToUser() {
val creator = member(1L, "creator").apply { role = MemberRole.CREATOR }
val user = member(2L, "user")
Mockito.`when`(memberRepository.findById(2L)).thenReturn(Optional.of(user))
Mockito.`when`(roomRepository.findActiveRoomByParticipantMemberIds(1L, 2L)).thenReturn(null)
Mockito.`when`(roomRepository.save(Mockito.any(UserCreatorChatRoom::class.java))).thenAnswer { invocation ->
(invocation.arguments[0] as UserCreatorChatRoom).apply { id = 10L }
}
val response = service.createOrGetRoom(creator, 2L)
assertEquals(10L, response.roomId)
val participantCaptor = ArgumentCaptor.forClass(UserCreatorChatParticipant::class.java)
Mockito.verify(participantRepository, Mockito.times(2)).save(participantCaptor.capture())
assertEquals(listOf(creator, user), participantCaptor.allValues.map { it.member })
Mockito.verifyNoInteractions(messageRepository)
}
@Test
@DisplayName("기존 활성 방이 있으면 새 방과 메시지를 생성하지 않고 기존 roomId를 반환한다")
fun shouldReturnExistingRoomWithoutCreatingMessage() {
val creator = member(1L, "creator").apply { role = MemberRole.CREATOR }
val user = member(2L, "user")
val existingRoom = room(10L)
Mockito.`when`(memberRepository.findById(2L)).thenReturn(Optional.of(user))
Mockito.`when`(roomRepository.findActiveRoomByParticipantMemberIds(1L, 2L)).thenReturn(existingRoom)
val response = service.createOrGetRoom(creator, 2L)
assertEquals(10L, response.roomId)
Mockito.verify(roomRepository, Mockito.never()).save(Mockito.any(UserCreatorChatRoom::class.java))
Mockito.verifyNoInteractions(participantRepository)
Mockito.verifyNoInteractions(messageRepository)
}
@Test
@DisplayName("방 입장 응답은 상대방 닉네임과 프로필 이미지 URL을 포함한다")
fun shouldOpenRoomWithOpponentProfileWhenOpponentHasProfileImage() {