Skip to content

Commit a486b08

Browse files
committed
Test: 테스트 작성
1 parent 2636287 commit a486b08

File tree

3 files changed

+166
-8
lines changed

3 files changed

+166
-8
lines changed

src/main/java/com/back/domain/board/repository/PostRepositoryImpl.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.querydsl.core.Tuple;
1111
import com.querydsl.core.types.Order;
1212
import com.querydsl.core.types.OrderSpecifier;
13+
import com.querydsl.core.types.dsl.Expressions;
1314
import com.querydsl.core.types.dsl.PathBuilder;
1415
import com.querydsl.jpa.impl.JPAQuery;
1516
import com.querydsl.jpa.impl.JPAQueryFactory;
@@ -19,10 +20,7 @@
1920
import org.springframework.data.domain.Pageable;
2021
import org.springframework.data.domain.Sort;
2122

22-
import java.util.ArrayList;
23-
import java.util.List;
24-
import java.util.Map;
25-
import java.util.Objects;
23+
import java.util.*;
2624
import java.util.stream.Collectors;
2725

2826
@RequiredArgsConstructor
@@ -141,7 +139,7 @@ private List<PostListResponse> fetchPosts(BooleanBuilder where, List<OrderSpecif
141139
post.id,
142140
new QPostListResponse_AuthorResponse(user.id, user.userProfile.nickname),
143141
post.title,
144-
null, // 카테고리는 나중에 주입
142+
Expressions.constant(Collections.emptyList()), // 카테고리는 나중에 주입
145143
postLike.id.countDistinct(),
146144
postBookmark.id.countDistinct(),
147145
comment.id.countDistinct(),

src/test/java/com/back/domain/board/controller/PostControllerTest.java

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.back.domain.board.controller;
22

33
import com.back.domain.board.dto.PostRequest;
4+
import com.back.domain.board.entity.Post;
45
import com.back.domain.board.entity.PostCategory;
56
import com.back.domain.board.repository.PostCategoryRepository;
7+
import com.back.domain.board.repository.PostRepository;
68
import com.back.domain.user.entity.User;
79
import com.back.domain.user.entity.UserProfile;
810
import com.back.domain.user.entity.UserStatus;
@@ -24,7 +26,7 @@
2426
import java.time.LocalDate;
2527
import java.util.List;
2628

27-
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
29+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
2830
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
2931
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
3032

@@ -40,6 +42,9 @@ class PostControllerTest {
4042
@Autowired
4143
private UserRepository userRepository;
4244

45+
@Autowired
46+
private PostRepository postRepository;
47+
4348
@Autowired
4449
private PostCategoryRepository postCategoryRepository;
4550

@@ -168,4 +173,82 @@ void createPost_badRequest() throws Exception {
168173
.andExpect(jsonPath("$.code").value("COMMON_400"))
169174
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."));
170175
}
176+
177+
// ====================== 게시글 조회 테스트 ======================
178+
179+
@Test
180+
@DisplayName("게시글 다건 조회 성공 → 200 OK")
181+
void getPosts_success() throws Exception {
182+
// given: 유저 + 카테고리 + 게시글 2개
183+
User user = User.createUser("reader", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
184+
user.setUserProfile(new UserProfile(user, "홍길동", null, null, null, 0));
185+
user.setUserStatus(UserStatus.ACTIVE);
186+
userRepository.save(user);
187+
188+
PostCategory c1 = new PostCategory("공지사항");
189+
PostCategory c2 = new PostCategory("자유게시판");
190+
postCategoryRepository.saveAll(List.of(c1, c2));
191+
192+
Post post1 = new Post(user, "첫 글", "내용1");
193+
post1.updateCategories(List.of(c1));
194+
postRepository.save(post1);
195+
196+
Post post2 = new Post(user, "두 번째 글", "내용2");
197+
post2.updateCategories(List.of(c2));
198+
postRepository.save(post2);
199+
200+
// when
201+
mvc.perform(get("/api/posts")
202+
.param("page", "0")
203+
.param("size", "10")
204+
.contentType(MediaType.APPLICATION_JSON))
205+
.andDo(print())
206+
// then
207+
.andExpect(status().isOk())
208+
.andExpect(jsonPath("$.success").value(true))
209+
.andExpect(jsonPath("$.code").value("SUCCESS_200"))
210+
.andExpect(jsonPath("$.data.items.length()").value(2))
211+
.andExpect(jsonPath("$.data.items[0].author.nickname").value("홍길동"));
212+
}
213+
214+
@Test
215+
@DisplayName("게시글 단건 조회 성공 → 200 OK")
216+
void getPost_success() throws Exception {
217+
// given
218+
User user = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
219+
user.setUserProfile(new UserProfile(user, "이몽룡", null, null, null, 0));
220+
user.setUserStatus(UserStatus.ACTIVE);
221+
userRepository.save(user);
222+
223+
PostCategory c1 = new PostCategory("공지사항");
224+
postCategoryRepository.save(c1);
225+
226+
Post post = new Post(user, "조회 테스트 글", "조회 테스트 내용");
227+
post.updateCategories(List.of(c1));
228+
postRepository.save(post);
229+
230+
// when
231+
mvc.perform(get("/api/posts/{postId}", post.getId())
232+
.contentType(MediaType.APPLICATION_JSON))
233+
.andDo(print())
234+
// then
235+
.andExpect(status().isOk())
236+
.andExpect(jsonPath("$.success").value(true))
237+
.andExpect(jsonPath("$.code").value("SUCCESS_200"))
238+
.andExpect(jsonPath("$.data.postId").value(post.getId()))
239+
.andExpect(jsonPath("$.data.title").value("조회 테스트 글"))
240+
.andExpect(jsonPath("$.data.author.nickname").value("이몽룡"))
241+
.andExpect(jsonPath("$.data.categories[0].name").value("공지사항"));
242+
}
243+
244+
@Test
245+
@DisplayName("게시글 단건 조회 실패 - 존재하지 않는 게시글 → 404 Not Found")
246+
void getPost_fail_notFound() throws Exception {
247+
mvc.perform(get("/api/posts/{postId}", 999L)
248+
.contentType(MediaType.APPLICATION_JSON))
249+
.andDo(print())
250+
.andExpect(status().isNotFound())
251+
.andExpect(jsonPath("$.code").value("POST_001"))
252+
.andExpect(jsonPath("$.message").value("존재하지 않는 게시글입니다."));
253+
}
171254
}

src/test/java/com/back/domain/board/service/PostServiceTest.java

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.back.domain.board.service;
22

3-
import com.back.domain.board.dto.PostRequest;
4-
import com.back.domain.board.dto.PostResponse;
3+
import com.back.domain.board.dto.*;
4+
import com.back.domain.board.entity.Post;
55
import com.back.domain.board.entity.PostCategory;
66
import com.back.domain.board.repository.PostCategoryRepository;
77
import com.back.domain.board.repository.PostRepository;
@@ -15,6 +15,9 @@
1515
import org.junit.jupiter.api.Test;
1616
import org.springframework.beans.factory.annotation.Autowired;
1717
import org.springframework.boot.test.context.SpringBootTest;
18+
import org.springframework.data.domain.PageRequest;
19+
import org.springframework.data.domain.Pageable;
20+
import org.springframework.data.domain.Sort;
1821
import org.springframework.test.context.ActiveProfiles;
1922
import org.springframework.transaction.annotation.Transactional;
2023

@@ -95,4 +98,78 @@ void createPost_fail_categoryNotFound() {
9598
.isInstanceOf(CustomException.class)
9699
.hasMessage(ErrorCode.CATEGORY_NOT_FOUND.getMessage());
97100
}
101+
102+
// ====================== 게시글 조회 테스트 ======================
103+
104+
105+
@Test
106+
@DisplayName("게시글 다건 조회 성공 - 페이징 + 카테고리")
107+
void getPosts_success() {
108+
// given
109+
User user = User.createUser("writer3", "[email protected]", "encodedPwd");
110+
user.setUserProfile(new UserProfile(user, "작성자3", null, null, null, 0));
111+
user.setUserStatus(UserStatus.ACTIVE);
112+
userRepository.save(user);
113+
114+
PostCategory c1 = new PostCategory("공지사항");
115+
PostCategory c2 = new PostCategory("자유게시판");
116+
postCategoryRepository.saveAll(List.of(c1, c2));
117+
118+
Post post1 = new Post(user, "첫 번째 글", "내용1");
119+
post1.updateCategories(List.of(c1));
120+
postRepository.save(post1);
121+
122+
Post post2 = new Post(user, "두 번째 글", "내용2");
123+
post2.updateCategories(List.of(c2));
124+
postRepository.save(post2);
125+
126+
Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "createdAt"));
127+
128+
// when
129+
PageResponse<PostListResponse> response = postService.getPosts(null, null, null, pageable);
130+
131+
// then
132+
assertThat(response.items()).hasSize(2);
133+
assertThat(response.items().get(0).getTitle()).isEqualTo("두 번째 글");
134+
assertThat(response.items().get(1).getTitle()).isEqualTo("첫 번째 글");
135+
}
136+
137+
@Test
138+
@DisplayName("게시글 단건 조회 성공")
139+
void getPost_success() {
140+
// given
141+
User user = User.createUser("reader", "[email protected]", "encodedPwd");
142+
user.setUserProfile(new UserProfile(user, "독자", null, null, null, 0));
143+
user.setUserStatus(UserStatus.ACTIVE);
144+
userRepository.save(user);
145+
146+
PostCategory category = new PostCategory("공지");
147+
postCategoryRepository.save(category);
148+
149+
Post post = new Post(user, "조회용 제목", "조회용 내용");
150+
post.updateCategories(List.of(category));
151+
postRepository.save(post);
152+
153+
// when
154+
PostDetailResponse response = postService.getPost(post.getId());
155+
156+
// then
157+
assertThat(response.postId()).isEqualTo(post.getId());
158+
assertThat(response.title()).isEqualTo("조회용 제목");
159+
assertThat(response.content()).isEqualTo("조회용 내용");
160+
assertThat(response.author().nickname()).isEqualTo("독자");
161+
assertThat(response.categories()).extracting("name").containsExactly("공지");
162+
assertThat(response.likeCount()).isZero();
163+
assertThat(response.bookmarkCount()).isZero();
164+
assertThat(response.commentCount()).isZero();
165+
}
166+
167+
@Test
168+
@DisplayName("게시글 단건 조회 실패 - 존재하지 않는 게시글")
169+
void getPost_fail_postNotFound() {
170+
// when & then
171+
assertThatThrownBy(() -> postService.getPost(999L))
172+
.isInstanceOf(CustomException.class)
173+
.hasMessage(ErrorCode.POST_NOT_FOUND.getMessage());
174+
}
98175
}

0 commit comments

Comments
 (0)