test(user-creator-chat): 크리에이터 시작 DM 생성을 검증한다
This commit is contained in:
+5
-5
@@ -59,20 +59,20 @@ class UserCreatorChatService(
|
|||||||
private val cloudFrontHost: String
|
private val cloudFrontHost: String
|
||||||
) {
|
) {
|
||||||
@Transactional
|
@Transactional
|
||||||
fun createOrGetRoom(member: Member, creatorId: Long): CreateUserCreatorChatRoomResponse {
|
fun createOrGetRoom(member: Member, recipientId: Long): CreateUserCreatorChatRoomResponse {
|
||||||
val creator = memberRepository.findById(creatorId).orElseThrow {
|
val recipient = memberRepository.findById(recipientId).orElseThrow {
|
||||||
SodaException(messageKey = "message.error.recipient_not_found")
|
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) {
|
if (existingRoom != null) {
|
||||||
return CreateUserCreatorChatRoomResponse(roomId = existingRoom.id!!)
|
return CreateUserCreatorChatRoomResponse(roomId = existingRoom.id!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
val room = roomRepository.save(UserCreatorChatRoom())
|
val room = roomRepository.save(UserCreatorChatRoom())
|
||||||
participantRepository.save(UserCreatorChatParticipant(room, member))
|
participantRepository.save(UserCreatorChatParticipant(room, member))
|
||||||
participantRepository.save(UserCreatorChatParticipant(room, creator))
|
participantRepository.save(UserCreatorChatParticipant(room, recipient))
|
||||||
return CreateUserCreatorChatRoomResponse(roomId = room.id!!)
|
return CreateUserCreatorChatRoomResponse(roomId = room.id!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+36
@@ -31,6 +31,42 @@ class UserCreatorChatServiceIntegrationTest @Autowired constructor(
|
|||||||
private val messageRepository: UserCreatorChatMessageRepository,
|
private val messageRepository: UserCreatorChatMessageRepository,
|
||||||
private val entityManager: EntityManager
|
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
|
@Test
|
||||||
@DisplayName("AI 캐릭터용 Member와는 유저-크리에이터 DM 방을 생성할 수 없다")
|
@DisplayName("AI 캐릭터용 Member와는 유저-크리에이터 DM 방을 생성할 수 없다")
|
||||||
fun shouldRejectCreateRoomWhenCreatorIsAiCharacterMember() {
|
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.fcm.FcmEventType
|
||||||
import kr.co.vividnext.sodalive.member.Member
|
import kr.co.vividnext.sodalive.member.Member
|
||||||
import kr.co.vividnext.sodalive.member.MemberRepository
|
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.member.block.BlockMemberRepository
|
||||||
import kr.co.vividnext.sodalive.v2.usercreatorchat.dto.UserCreatorChatMessageItemDto
|
import kr.co.vividnext.sodalive.v2.usercreatorchat.dto.UserCreatorChatMessageItemDto
|
||||||
import kr.co.vividnext.sodalive.v2.usercreatorchat.repository.UserCreatorChatMessageRepository
|
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))
|
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
|
@Test
|
||||||
@DisplayName("방 입장 응답은 상대방 닉네임과 프로필 이미지 URL을 포함한다")
|
@DisplayName("방 입장 응답은 상대방 닉네임과 프로필 이미지 URL을 포함한다")
|
||||||
fun shouldOpenRoomWithOpponentProfileWhenOpponentHasProfileImage() {
|
fun shouldOpenRoomWithOpponentProfileWhenOpponentHasProfileImage() {
|
||||||
|
|||||||
Reference in New Issue
Block a user