test(user-creator-chat): 크리에이터 시작 DM 생성을 검증한다
This commit is contained in:
+5
-5
@@ -59,20 +59,20 @@ class UserCreatorChatService(
|
||||
private val cloudFrontHost: String
|
||||
) {
|
||||
@Transactional
|
||||
fun createOrGetRoom(member: Member, creatorId: Long): CreateUserCreatorChatRoomResponse {
|
||||
val creator = memberRepository.findById(creatorId).orElseThrow {
|
||||
fun createOrGetRoom(member: Member, recipientId: Long): CreateUserCreatorChatRoomResponse {
|
||||
val recipient = memberRepository.findById(recipientId).orElseThrow {
|
||||
SodaException(messageKey = "message.error.recipient_not_found")
|
||||
}
|
||||
validateRecipient(member, creator)
|
||||
validateRecipient(member, recipient)
|
||||
|
||||
val existingRoom = roomRepository.findActiveRoomByParticipantMemberIds(member.id!!, creator.id!!)
|
||||
val existingRoom = roomRepository.findActiveRoomByParticipantMemberIds(member.id!!, recipient.id!!)
|
||||
if (existingRoom != null) {
|
||||
return CreateUserCreatorChatRoomResponse(roomId = existingRoom.id!!)
|
||||
}
|
||||
|
||||
val room = roomRepository.save(UserCreatorChatRoom())
|
||||
participantRepository.save(UserCreatorChatParticipant(room, member))
|
||||
participantRepository.save(UserCreatorChatParticipant(room, creator))
|
||||
participantRepository.save(UserCreatorChatParticipant(room, recipient))
|
||||
return CreateUserCreatorChatRoomResponse(roomId = room.id!!)
|
||||
}
|
||||
|
||||
|
||||
+36
@@ -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() {
|
||||
|
||||
+38
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user