Skip to content

Commit 4ede784

Browse files
committed
feat(be):Add Message,Room Test
1 parent 9284d0b commit 4ede784

File tree

2 files changed

+287
-0
lines changed

2 files changed

+287
-0
lines changed
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
package com.back.koreaTravelGuide.domain.userChat.chatmessage.controller
2+
3+
import com.back.koreaTravelGuide.common.security.JwtTokenProvider
4+
import com.back.koreaTravelGuide.domain.user.entity.User
5+
import com.back.koreaTravelGuide.domain.user.enums.UserRole
6+
import com.back.koreaTravelGuide.domain.user.repository.UserRepository
7+
import com.back.koreaTravelGuide.domain.userChat.chatmessage.dto.ChatMessageSendRequest
8+
import com.back.koreaTravelGuide.domain.userChat.chatmessage.entity.ChatMessage
9+
import com.back.koreaTravelGuide.domain.userChat.chatmessage.repository.ChatMessageRepository
10+
import com.back.koreaTravelGuide.domain.userChat.chatroom.entity.ChatRoom
11+
import com.back.koreaTravelGuide.domain.userChat.chatroom.repository.ChatRoomRepository
12+
import com.fasterxml.jackson.databind.ObjectMapper
13+
import org.junit.jupiter.api.Assertions.assertEquals
14+
import org.junit.jupiter.api.BeforeEach
15+
import org.junit.jupiter.api.DisplayName
16+
import org.junit.jupiter.api.Test
17+
import org.springframework.beans.factory.annotation.Autowired
18+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
19+
import org.springframework.boot.test.context.SpringBootTest
20+
import org.springframework.http.MediaType
21+
import org.springframework.test.context.ActiveProfiles
22+
import org.springframework.test.web.servlet.MockMvc
23+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
24+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
25+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
26+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
27+
import org.springframework.transaction.annotation.Transactional
28+
29+
@ActiveProfiles("test")
30+
@SpringBootTest
31+
@AutoConfigureMockMvc
32+
@Transactional
33+
class ChatMessageControllerTest {
34+
@Autowired
35+
private lateinit var mockMvc: MockMvc
36+
37+
@Autowired
38+
private lateinit var chatMessageRepository: ChatMessageRepository
39+
40+
@Autowired
41+
private lateinit var chatRoomRepository: ChatRoomRepository
42+
43+
@Autowired
44+
private lateinit var userRepository: UserRepository
45+
46+
@Autowired
47+
private lateinit var jwtTokenProvider: JwtTokenProvider
48+
49+
@Autowired
50+
private lateinit var objectMapper: ObjectMapper
51+
52+
private lateinit var guide: User
53+
private lateinit var guest: User
54+
private lateinit var guideToken: String
55+
private lateinit var guestToken: String
56+
private lateinit var room: ChatRoom
57+
private lateinit var firstMessage: ChatMessage
58+
59+
@BeforeEach
60+
fun setUp() {
61+
chatMessageRepository.deleteAll()
62+
chatRoomRepository.deleteAll()
63+
userRepository.deleteAll()
64+
guide =
65+
userRepository.save(
66+
User(
67+
email = "[email protected]",
68+
nickname = "guideTwo",
69+
role = UserRole.GUIDE,
70+
oauthProvider = "test",
71+
oauthId = "guide456",
72+
),
73+
)
74+
guest =
75+
userRepository.save(
76+
User(
77+
email = "[email protected]",
78+
nickname = "guestTwo",
79+
role = UserRole.USER,
80+
oauthProvider = "test",
81+
oauthId = "guest456",
82+
),
83+
)
84+
guideToken = jwtTokenProvider.createAccessToken(guide.id!!, guide.role)
85+
guestToken = jwtTokenProvider.createAccessToken(guest.id!!, guest.role)
86+
room =
87+
chatRoomRepository.save(
88+
ChatRoom(
89+
title = "Guide-${guide.id} · User-${guest.id}",
90+
guideId = guide.id!!,
91+
userId = guest.id!!,
92+
),
93+
)
94+
firstMessage =
95+
chatMessageRepository.save(
96+
ChatMessage(
97+
roomId = room.id!!,
98+
senderId = guide.id!!,
99+
content = "첫 메세지",
100+
),
101+
)
102+
}
103+
104+
@Test
105+
@DisplayName("listMessages returns latest batch when after is missing")
106+
fun listMessagesReturnsLatest() {
107+
mockMvc.perform(
108+
get("/api/userchat/rooms/${room.id}/messages")
109+
.header("Authorization", "Bearer $guestToken"),
110+
)
111+
.andExpect(status().isOk)
112+
.andExpect(jsonPath("$.data[0].id").value(firstMessage.id!!.toInt()))
113+
.andExpect(jsonPath("$.data[0].content").value(firstMessage.content))
114+
}
115+
116+
@Test
117+
@DisplayName("listMessages filters newer messages when after provided")
118+
fun listMessagesFiltersNewer() {
119+
val newer =
120+
chatMessageRepository.save(
121+
ChatMessage(
122+
roomId = room.id!!,
123+
senderId = guest.id!!,
124+
content = "두 번째",
125+
),
126+
)
127+
128+
mockMvc.perform(
129+
get("/api/userchat/rooms/${room.id}/messages")
130+
.param("after", firstMessage.id!!.toString())
131+
.header("Authorization", "Bearer $guestToken"),
132+
)
133+
.andExpect(status().isOk)
134+
.andExpect(jsonPath("$.data.length()").value(1))
135+
.andExpect(jsonPath("$.data[0].id").value(newer.id!!.toInt()))
136+
.andExpect(jsonPath("$.data[0].content").value(newer.content))
137+
}
138+
139+
@Test
140+
@DisplayName("sendMessage stores message and updates room summary")
141+
fun sendMessageStoresMessage() {
142+
val before = chatMessageRepository.count()
143+
val body = objectMapper.writeValueAsString(ChatMessageSendRequest("새 메세지"))
144+
145+
mockMvc.perform(
146+
post("/api/userchat/rooms/${room.id}/messages")
147+
.header("Authorization", "Bearer $guestToken")
148+
.contentType(MediaType.APPLICATION_JSON)
149+
.content(body),
150+
)
151+
.andExpect(status().isCreated)
152+
.andExpect(jsonPath("$.data.content").value("새 메세지"))
153+
154+
val messages = chatMessageRepository.findAll()
155+
assertEquals(before + 1, messages.size.toLong())
156+
val latest = messages.maxByOrNull { it.id ?: 0L }!!
157+
assertEquals(latest.id, chatRoomRepository.findById(room.id!!).get().lastMessageId)
158+
}
159+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package com.back.koreaTravelGuide.domain.userChat.chatroom.controller
2+
3+
import com.back.koreaTravelGuide.common.security.JwtTokenProvider
4+
import com.back.koreaTravelGuide.domain.user.entity.User
5+
import com.back.koreaTravelGuide.domain.user.enums.UserRole
6+
import com.back.koreaTravelGuide.domain.user.repository.UserRepository
7+
import com.back.koreaTravelGuide.domain.userChat.chatroom.dto.ChatRoomStartRequest
8+
import com.back.koreaTravelGuide.domain.userChat.chatroom.entity.ChatRoom
9+
import com.back.koreaTravelGuide.domain.userChat.chatroom.repository.ChatRoomRepository
10+
import com.fasterxml.jackson.databind.ObjectMapper
11+
import org.junit.jupiter.api.Assertions.assertFalse
12+
import org.junit.jupiter.api.BeforeEach
13+
import org.junit.jupiter.api.DisplayName
14+
import org.junit.jupiter.api.Test
15+
import org.springframework.beans.factory.annotation.Autowired
16+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
17+
import org.springframework.boot.test.context.SpringBootTest
18+
import org.springframework.http.MediaType
19+
import org.springframework.test.context.ActiveProfiles
20+
import org.springframework.test.web.servlet.MockMvc
21+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete
22+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
23+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
24+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
25+
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
26+
import org.springframework.transaction.annotation.Transactional
27+
28+
@ActiveProfiles("test")
29+
@SpringBootTest
30+
@AutoConfigureMockMvc
31+
@Transactional
32+
class ChatRoomControllerTest {
33+
@Autowired
34+
private lateinit var mockMvc: MockMvc
35+
36+
@Autowired
37+
private lateinit var chatRoomRepository: ChatRoomRepository
38+
39+
@Autowired
40+
private lateinit var userRepository: UserRepository
41+
42+
@Autowired
43+
private lateinit var jwtTokenProvider: JwtTokenProvider
44+
45+
@Autowired
46+
private lateinit var objectMapper: ObjectMapper
47+
48+
private lateinit var guide: User
49+
private lateinit var guest: User
50+
private lateinit var guideToken: String
51+
private lateinit var guestToken: String
52+
private lateinit var existingRoom: ChatRoom
53+
54+
@BeforeEach
55+
fun setUp() {
56+
chatRoomRepository.deleteAll()
57+
userRepository.deleteAll()
58+
guide =
59+
userRepository.save(
60+
User(
61+
email = "[email protected]",
62+
nickname = "guideUser",
63+
role = UserRole.GUIDE,
64+
oauthProvider = "test",
65+
oauthId = "guide123",
66+
),
67+
)
68+
guest =
69+
userRepository.save(
70+
User(
71+
email = "[email protected]",
72+
nickname = "guestUser",
73+
role = UserRole.USER,
74+
oauthProvider = "test",
75+
oauthId = "guest123",
76+
),
77+
)
78+
guideToken = jwtTokenProvider.createAccessToken(guide.id!!, guide.role)
79+
guestToken = jwtTokenProvider.createAccessToken(guest.id!!, guest.role)
80+
existingRoom =
81+
chatRoomRepository.save(
82+
ChatRoom(
83+
title = "Guide-${guide.id} · User-${guest.id}",
84+
guideId = guide.id!!,
85+
userId = guest.id!!,
86+
),
87+
)
88+
}
89+
90+
@Test
91+
@DisplayName("startChat returns existing room for participant")
92+
fun startChatReturnsExistingRoom() {
93+
val body = objectMapper.writeValueAsString(ChatRoomStartRequest(guide.id!!, guest.id!!))
94+
mockMvc.perform(
95+
post("/api/userchat/rooms/start")
96+
.header("Authorization", "Bearer $guestToken")
97+
.contentType(MediaType.APPLICATION_JSON)
98+
.content(body),
99+
)
100+
.andExpect(status().isOk)
101+
.andExpect(jsonPath("$.data.id").value(existingRoom.id!!.toInt()))
102+
.andExpect(jsonPath("$.data.guideId").value(guide.id!!.toInt()))
103+
.andExpect(jsonPath("$.data.userId").value(guest.id!!.toInt()))
104+
}
105+
106+
@Test
107+
@DisplayName("get returns room for participant")
108+
fun getReturnsRoomForParticipant() {
109+
mockMvc.perform(
110+
get("/api/userchat/rooms/${existingRoom.id}")
111+
.header("Authorization", "Bearer $guideToken"),
112+
)
113+
.andExpect(status().isOk)
114+
.andExpect(jsonPath("$.data.id").value(existingRoom.id!!.toInt()))
115+
.andExpect(jsonPath("$.data.title").value(existingRoom.title))
116+
}
117+
118+
@Test
119+
@DisplayName("delete removes room when requester is owner")
120+
fun deleteRemovesRoomWhenOwner() {
121+
mockMvc.perform(
122+
delete("/api/userchat/rooms/${existingRoom.id}")
123+
.header("Authorization", "Bearer $guestToken"),
124+
)
125+
.andExpect(status().isOk)
126+
assertFalse(chatRoomRepository.existsById(existingRoom.id!!))
127+
}
128+
}

0 commit comments

Comments
 (0)