Skip to content

Commit f0142ed

Browse files
committed
Test: 테스트 작성
1 parent 4d32242 commit f0142ed

File tree

3 files changed

+442
-1
lines changed

3 files changed

+442
-1
lines changed

src/main/java/com/back/domain/board/post/controller/PostLikeController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class PostLikeController {
1616
private final PostLikeService postLikeService;
1717

1818
// 게시글 좋아요
19-
@GetMapping
19+
@PostMapping
2020
public ResponseEntity<RsData<PostLikeResponse>> likePost(
2121
@PathVariable Long postId,
2222
@AuthenticationPrincipal CustomUserDetails user
Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
package com.back.domain.board.controller;
2+
3+
import com.back.domain.board.post.entity.Post;
4+
import com.back.domain.board.post.repository.PostRepository;
5+
import com.back.domain.user.entity.User;
6+
import com.back.domain.user.entity.UserProfile;
7+
import com.back.domain.user.entity.UserStatus;
8+
import com.back.domain.user.repository.UserRepository;
9+
import com.back.fixture.TestJwtTokenProvider;
10+
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import org.junit.jupiter.api.DisplayName;
12+
import org.junit.jupiter.api.Test;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
15+
import org.springframework.boot.test.context.SpringBootTest;
16+
import org.springframework.http.MediaType;
17+
import org.springframework.security.crypto.password.PasswordEncoder;
18+
import org.springframework.test.context.ActiveProfiles;
19+
import org.springframework.test.web.servlet.MockMvc;
20+
import org.springframework.transaction.annotation.Transactional;
21+
22+
import java.time.LocalDate;
23+
24+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
25+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
26+
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
27+
28+
@SpringBootTest
29+
@AutoConfigureMockMvc
30+
@ActiveProfiles("test")
31+
@Transactional
32+
class PostLikeControllerTest {
33+
34+
@Autowired
35+
private MockMvc mvc;
36+
37+
@Autowired
38+
private UserRepository userRepository;
39+
40+
@Autowired
41+
private PostRepository postRepository;
42+
43+
@Autowired
44+
private PasswordEncoder passwordEncoder;
45+
46+
@Autowired
47+
private TestJwtTokenProvider testJwtTokenProvider;
48+
49+
@Autowired
50+
private ObjectMapper objectMapper;
51+
52+
private String generateAccessToken(User user) {
53+
return testJwtTokenProvider.createAccessToken(user.getId(), user.getUsername(), user.getRole().name());
54+
}
55+
56+
// ====================== 게시글 좋아요 등록 ======================
57+
58+
@Test
59+
@DisplayName("게시글 좋아요 등록 성공 → 200 OK")
60+
void likePost_success() throws Exception {
61+
// given
62+
User user = User.createUser("likeUser", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
63+
user.setUserProfile(new UserProfile(user, "홍길동", null, "소개글", LocalDate.of(2000, 1, 1), 0));
64+
user.setUserStatus(UserStatus.ACTIVE);
65+
userRepository.save(user);
66+
67+
Post post = new Post(user, "좋아요 테스트", "내용입니다");
68+
postRepository.save(post);
69+
70+
String accessToken = generateAccessToken(user);
71+
72+
// when
73+
mvc.perform(post("/api/posts/{postId}/like", post.getId())
74+
.header("Authorization", "Bearer " + accessToken)
75+
.contentType(MediaType.APPLICATION_JSON))
76+
.andDo(print())
77+
// then
78+
.andExpect(status().isOk())
79+
.andExpect(jsonPath("$.success").value(true))
80+
.andExpect(jsonPath("$.code").value("SUCCESS_200"))
81+
.andExpect(jsonPath("$.message").value("게시글 좋아요가 등록되었습니다."))
82+
.andExpect(jsonPath("$.data.postId").value(post.getId()))
83+
.andExpect(jsonPath("$.data.likeCount").value(1));
84+
}
85+
86+
@Test
87+
@DisplayName("게시글 좋아요 실패 - 존재하지 않는 사용자 → 404 Not Found")
88+
void likePost_userNotFound() throws Exception {
89+
// given
90+
String fakeToken = testJwtTokenProvider.createAccessToken(999L, "ghost", "USER");
91+
92+
// 실제 게시글은 존재
93+
User writer = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
94+
writer.setUserProfile(new UserProfile(writer, "작성자", null, null, null, 0));
95+
writer.setUserStatus(UserStatus.ACTIVE);
96+
userRepository.save(writer);
97+
98+
Post post = new Post(writer, "게시글", "내용");
99+
postRepository.save(post);
100+
101+
// when & then
102+
mvc.perform(post("/api/posts/{postId}/like", post.getId())
103+
.header("Authorization", "Bearer " + fakeToken)
104+
.contentType(MediaType.APPLICATION_JSON))
105+
.andDo(print())
106+
.andExpect(status().isNotFound())
107+
.andExpect(jsonPath("$.code").value("USER_001"))
108+
.andExpect(jsonPath("$.message").value("존재하지 않는 사용자입니다."));
109+
}
110+
111+
@Test
112+
@DisplayName("게시글 좋아요 실패 - 존재하지 않는 게시글 → 404 Not Found")
113+
void likePost_postNotFound() throws Exception {
114+
// given
115+
User user = User.createUser("likeUser2", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
116+
user.setUserProfile(new UserProfile(user, "작성자", null, null, null, 0));
117+
user.setUserStatus(UserStatus.ACTIVE);
118+
userRepository.save(user);
119+
String accessToken = generateAccessToken(user);
120+
121+
// when & then
122+
mvc.perform(post("/api/posts/{postId}/like", 999L)
123+
.header("Authorization", "Bearer " + accessToken)
124+
.contentType(MediaType.APPLICATION_JSON))
125+
.andDo(print())
126+
.andExpect(status().isNotFound())
127+
.andExpect(jsonPath("$.code").value("POST_001"))
128+
.andExpect(jsonPath("$.message").value("존재하지 않는 게시글입니다."));
129+
}
130+
131+
@Test
132+
@DisplayName("게시글 좋아요 실패 - 이미 좋아요 누름 → 409 Conflict")
133+
void likePost_alreadyLiked() throws Exception {
134+
// given
135+
User user = User.createUser("likeUser3", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
136+
user.setUserProfile(new UserProfile(user, "홍길동", null, null, null, 0));
137+
user.setUserStatus(UserStatus.ACTIVE);
138+
userRepository.save(user);
139+
140+
Post post = new Post(user, "테스트 게시글", "내용");
141+
postRepository.save(post);
142+
143+
String accessToken = generateAccessToken(user);
144+
145+
// 먼저 좋아요 1회
146+
mvc.perform(post("/api/posts/{postId}/like", post.getId())
147+
.header("Authorization", "Bearer " + accessToken))
148+
.andExpect(status().isOk());
149+
150+
// 같은 요청 반복
151+
mvc.perform(post("/api/posts/{postId}/like", post.getId())
152+
.header("Authorization", "Bearer " + accessToken))
153+
.andDo(print())
154+
.andExpect(status().isConflict())
155+
.andExpect(jsonPath("$.code").value("POST_005"))
156+
.andExpect(jsonPath("$.message").value("이미 좋아요한 게시글입니다."));
157+
}
158+
159+
@Test
160+
@DisplayName("게시글 좋아요 실패 - 토큰 없음 → 401 Unauthorized")
161+
void likePost_noToken() throws Exception {
162+
// given
163+
User writer = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
164+
writer.setUserProfile(new UserProfile(writer, "작성자", null, null, null, 0));
165+
writer.setUserStatus(UserStatus.ACTIVE);
166+
userRepository.save(writer);
167+
168+
Post post = new Post(writer, "테스트", "내용");
169+
postRepository.save(post);
170+
171+
// when & then
172+
mvc.perform(post("/api/posts/{postId}/like", post.getId())
173+
.contentType(MediaType.APPLICATION_JSON))
174+
.andDo(print())
175+
.andExpect(status().isUnauthorized())
176+
.andExpect(jsonPath("$.code").value("AUTH_001"))
177+
.andExpect(jsonPath("$.message").value("인증이 필요합니다."));
178+
}
179+
180+
// ====================== 게시글 좋아요 취소 ======================
181+
182+
@Test
183+
@DisplayName("게시글 좋아요 취소 성공 → 200 OK")
184+
void cancelLikePost_success() throws Exception {
185+
// given
186+
User user = User.createUser("cancelUser", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
187+
user.setUserProfile(new UserProfile(user, "홍길동", null, null, null, 0));
188+
user.setUserStatus(UserStatus.ACTIVE);
189+
userRepository.save(user);
190+
191+
Post post = new Post(user, "좋아요 취소 테스트", "내용입니다");
192+
postRepository.save(post);
193+
194+
String accessToken = generateAccessToken(user);
195+
196+
// 먼저 좋아요 등록
197+
mvc.perform(post("/api/posts/{postId}/like", post.getId())
198+
.header("Authorization", "Bearer " + accessToken))
199+
.andExpect(status().isOk());
200+
201+
// when: 좋아요 취소
202+
mvc.perform(delete("/api/posts/{postId}/like", post.getId())
203+
.header("Authorization", "Bearer " + accessToken))
204+
.andDo(print())
205+
// then
206+
.andExpect(status().isOk())
207+
.andExpect(jsonPath("$.success").value(true))
208+
.andExpect(jsonPath("$.code").value("SUCCESS_200"))
209+
.andExpect(jsonPath("$.message").value("게시글 좋아요가 취소되었습니다."))
210+
.andExpect(jsonPath("$.data.postId").value(post.getId()))
211+
.andExpect(jsonPath("$.data.likeCount").value(0));
212+
}
213+
214+
@Test
215+
@DisplayName("게시글 좋아요 취소 실패 - 존재하지 않는 사용자 → 404 Not Found")
216+
void cancelLikePost_userNotFound() throws Exception {
217+
// given
218+
String fakeToken = testJwtTokenProvider.createAccessToken(999L, "ghost", "USER");
219+
220+
// 실제 게시글 존재
221+
User writer = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
222+
writer.setUserProfile(new UserProfile(writer, "작성자", null, null, null, 0));
223+
writer.setUserStatus(UserStatus.ACTIVE);
224+
userRepository.save(writer);
225+
226+
Post post = new Post(writer, "게시글", "내용");
227+
postRepository.save(post);
228+
229+
// when & then
230+
mvc.perform(delete("/api/posts/{postId}/like", post.getId())
231+
.header("Authorization", "Bearer " + fakeToken))
232+
.andDo(print())
233+
.andExpect(status().isNotFound())
234+
.andExpect(jsonPath("$.code").value("USER_001"))
235+
.andExpect(jsonPath("$.message").value("존재하지 않는 사용자입니다."));
236+
}
237+
238+
@Test
239+
@DisplayName("게시글 좋아요 취소 실패 - 존재하지 않는 게시글 → 404 Not Found")
240+
void cancelLikePost_postNotFound() throws Exception {
241+
// given
242+
User user = User.createUser("cancelUser2", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
243+
user.setUserProfile(new UserProfile(user, "작성자", null, null, null, 0));
244+
user.setUserStatus(UserStatus.ACTIVE);
245+
userRepository.save(user);
246+
String accessToken = generateAccessToken(user);
247+
248+
// when & then
249+
mvc.perform(delete("/api/posts/{postId}/like", 999L)
250+
.header("Authorization", "Bearer " + accessToken))
251+
.andDo(print())
252+
.andExpect(status().isNotFound())
253+
.andExpect(jsonPath("$.code").value("POST_001"))
254+
.andExpect(jsonPath("$.message").value("존재하지 않는 게시글입니다."));
255+
}
256+
257+
@Test
258+
@DisplayName("게시글 좋아요 취소 실패 - 좋아요 기록 없음 → 404 Not Found")
259+
void cancelLikePost_notFound() throws Exception {
260+
// given
261+
User user = User.createUser("cancelUser3", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
262+
user.setUserProfile(new UserProfile(user, "작성자", null, null, null, 0));
263+
user.setUserStatus(UserStatus.ACTIVE);
264+
userRepository.save(user);
265+
266+
Post post = new Post(user, "테스트 게시글", "내용");
267+
postRepository.save(post);
268+
269+
String accessToken = generateAccessToken(user);
270+
271+
// when & then
272+
mvc.perform(delete("/api/posts/{postId}/like", post.getId())
273+
.header("Authorization", "Bearer " + accessToken))
274+
.andDo(print())
275+
.andExpect(status().isNotFound())
276+
.andExpect(jsonPath("$.code").value("POST_006"))
277+
.andExpect(jsonPath("$.message").value("해당 게시글에 대한 좋아요 기록이 없습니다."));
278+
}
279+
280+
@Test
281+
@DisplayName("게시글 좋아요 취소 실패 - 토큰 없음 → 401 Unauthorized")
282+
void cancelLikePost_noToken() throws Exception {
283+
// given
284+
User writer = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
285+
writer.setUserProfile(new UserProfile(writer, "작성자", null, null, null, 0));
286+
writer.setUserStatus(UserStatus.ACTIVE);
287+
userRepository.save(writer);
288+
289+
Post post = new Post(writer, "테스트", "내용");
290+
postRepository.save(post);
291+
292+
// when & then
293+
mvc.perform(delete("/api/posts/{postId}/like", post.getId())
294+
.contentType(MediaType.APPLICATION_JSON))
295+
.andDo(print())
296+
.andExpect(status().isUnauthorized())
297+
.andExpect(jsonPath("$.code").value("AUTH_001"))
298+
.andExpect(jsonPath("$.message").value("인증이 필요합니다."));
299+
}
300+
}

0 commit comments

Comments
 (0)