Skip to content

Commit 4714a9a

Browse files
committed
Test: 테스트 작성
1 parent e60a91a commit 4714a9a

File tree

3 files changed

+276
-0
lines changed

3 files changed

+276
-0
lines changed

src/main/java/com/back/domain/board/entity/PostCategory.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import lombok.Getter;
88
import lombok.NoArgsConstructor;
99

10+
import java.util.ArrayList;
1011
import java.util.List;
1112

1213
@Entity
@@ -17,4 +18,10 @@ public class PostCategory extends BaseEntity {
1718

1819
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
1920
private List<PostCategoryMapping> postCategoryMappings;
21+
22+
// -------------------- 생성자 --------------------
23+
public PostCategory(String name) {
24+
this.name = name;
25+
this.postCategoryMappings = new ArrayList<>();
26+
}
2027
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package com.back.domain.board.controller;
2+
3+
import com.back.domain.board.dto.PostRequest;
4+
import com.back.domain.board.entity.PostCategory;
5+
import com.back.domain.board.repository.PostCategoryRepository;
6+
import com.back.domain.user.entity.User;
7+
import com.back.domain.user.entity.UserProfile;
8+
import com.back.domain.user.entity.UserStatus;
9+
import com.back.domain.user.repository.UserRepository;
10+
import com.back.fixture.TestJwtTokenProvider;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
16+
import org.springframework.boot.test.context.SpringBootTest;
17+
import org.springframework.http.MediaType;
18+
import org.springframework.security.crypto.password.PasswordEncoder;
19+
import org.springframework.test.context.ActiveProfiles;
20+
import org.springframework.test.web.servlet.MockMvc;
21+
import org.springframework.test.web.servlet.ResultActions;
22+
import org.springframework.transaction.annotation.Transactional;
23+
24+
import java.time.LocalDate;
25+
import java.util.List;
26+
27+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
28+
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
29+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
30+
31+
@SpringBootTest
32+
@AutoConfigureMockMvc
33+
@ActiveProfiles("test")
34+
@Transactional
35+
class PostControllerTest {
36+
37+
@Autowired
38+
private MockMvc mvc;
39+
40+
@Autowired
41+
private UserRepository userRepository;
42+
43+
@Autowired
44+
private PostCategoryRepository postCategoryRepository;
45+
46+
@Autowired
47+
private TestJwtTokenProvider testJwtTokenProvider;
48+
49+
@Autowired
50+
private PasswordEncoder passwordEncoder;
51+
52+
@Autowired
53+
private ObjectMapper objectMapper;
54+
55+
private String generateAccessToken(User user) {
56+
return testJwtTokenProvider.createAccessToken(user.getId(), user.getUsername(), user.getRole().name());
57+
}
58+
59+
// ====================== 게시글 생성 테스트 ======================
60+
61+
@Test
62+
@DisplayName("게시글 생성 성공 → 201 Created")
63+
void createPost_success() throws Exception {
64+
// given: 정상 유저 생성
65+
User user = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
66+
user.setUserProfile(new UserProfile(user, "홍길동", null, "소개글", LocalDate.of(2000, 1, 1), 1000));
67+
user.setUserStatus(UserStatus.ACTIVE);
68+
userRepository.save(user);
69+
70+
String accessToken = generateAccessToken(user);
71+
72+
// 카테고리 등록
73+
PostCategory c1 = new PostCategory("공지사항");
74+
postCategoryRepository.save(c1);
75+
76+
PostCategory c2 = new PostCategory("자유게시판");
77+
postCategoryRepository.save(c2);
78+
79+
PostRequest request = new PostRequest("첫 번째 게시글", "안녕하세요, 첫 글입니다!", List.of(c1.getId(), c2.getId()));
80+
81+
// when
82+
ResultActions resultActions = mvc.perform(
83+
post("/api/posts")
84+
.header("Authorization", "Bearer " + accessToken)
85+
.contentType(MediaType.APPLICATION_JSON)
86+
.content(objectMapper.writeValueAsString(request))
87+
).andDo(print());
88+
89+
// then
90+
resultActions
91+
.andExpect(status().isCreated())
92+
.andExpect(jsonPath("$.success").value(true))
93+
.andExpect(jsonPath("$.code").value("SUCCESS_200"))
94+
.andExpect(jsonPath("$.data.title").value("첫 번째 게시글"))
95+
.andExpect(jsonPath("$.data.author.nickname").value("홍길동"))
96+
.andExpect(jsonPath("$.data.categories.length()").value(2));
97+
}
98+
99+
@Test
100+
@DisplayName("존재하지 않는 사용자 → 404 Not Found")
101+
void createPost_userNotFound() throws Exception {
102+
// given: 토큰만 발급(실제 DB엔 없음)
103+
String fakeToken = testJwtTokenProvider.createAccessToken(999L, "ghost", "USER");
104+
105+
PostRequest request = new PostRequest("제목", "내용", null);
106+
107+
// when & then
108+
mvc.perform(post("/api/posts")
109+
.header("Authorization", "Bearer " + fakeToken)
110+
.contentType(MediaType.APPLICATION_JSON)
111+
.content(objectMapper.writeValueAsString(request)))
112+
.andDo(print())
113+
.andExpect(status().isNotFound())
114+
.andExpect(jsonPath("$.code").value("USER_001"))
115+
.andExpect(jsonPath("$.message").value("존재하지 않는 사용자입니다."));
116+
}
117+
118+
@Test
119+
@DisplayName("존재하지 않는 카테고리 → 404 Not Found")
120+
void createPost_categoryNotFound() throws Exception {
121+
// given: 정상 유저
122+
User user = User.createUser("writer2", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
123+
user.setUserProfile(new UserProfile(user, "작성자", null, null, null, 0));
124+
user.setUserStatus(UserStatus.ACTIVE);
125+
userRepository.save(user);
126+
127+
String accessToken = generateAccessToken(user);
128+
129+
// 존재하지 않는 카테고리 ID
130+
PostRequest request = new PostRequest("제목", "내용", List.of(999L));
131+
132+
// when & then
133+
mvc.perform(post("/api/posts")
134+
.header("Authorization", "Bearer " + accessToken)
135+
.contentType(MediaType.APPLICATION_JSON)
136+
.content(objectMapper.writeValueAsString(request)))
137+
.andDo(print())
138+
.andExpect(status().isNotFound())
139+
.andExpect(jsonPath("$.code").value("POST_003"))
140+
.andExpect(jsonPath("$.message").value("존재하지 않는 카테고리입니다."));
141+
}
142+
143+
@Test
144+
@DisplayName("잘못된 요청(필드 누락) → 400 Bad Request")
145+
void createPost_badRequest() throws Exception {
146+
// given: 정상 유저 생성
147+
User user = User.createUser("writer", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
148+
user.setUserProfile(new UserProfile(user, "홍길동", null, "소개글", LocalDate.of(2000, 1, 1), 1000));
149+
user.setUserStatus(UserStatus.ACTIVE);
150+
userRepository.save(user);
151+
152+
String accessToken = generateAccessToken(user);
153+
154+
// given: title 누락
155+
String invalidJson = """
156+
{
157+
"content": "본문만 있음"
158+
}
159+
""";
160+
161+
// when & then
162+
mvc.perform(post("/api/posts")
163+
.header("Authorization", "Bearer " + accessToken)
164+
.contentType(MediaType.APPLICATION_JSON)
165+
.content(invalidJson))
166+
.andDo(print())
167+
.andExpect(status().isBadRequest())
168+
.andExpect(jsonPath("$.code").value("COMMON_400"))
169+
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."));
170+
}
171+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.back.domain.board.service;
2+
3+
import com.back.domain.board.dto.PostRequest;
4+
import com.back.domain.board.dto.PostResponse;
5+
import com.back.domain.board.entity.PostCategory;
6+
import com.back.domain.board.repository.PostCategoryRepository;
7+
import com.back.domain.board.repository.PostRepository;
8+
import com.back.domain.user.entity.User;
9+
import com.back.domain.user.entity.UserProfile;
10+
import com.back.domain.user.entity.UserStatus;
11+
import com.back.domain.user.repository.UserRepository;
12+
import com.back.global.exception.CustomException;
13+
import com.back.global.exception.ErrorCode;
14+
import org.junit.jupiter.api.DisplayName;
15+
import org.junit.jupiter.api.Test;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.boot.test.context.SpringBootTest;
18+
import org.springframework.test.context.ActiveProfiles;
19+
import org.springframework.transaction.annotation.Transactional;
20+
21+
import java.util.List;
22+
23+
import static org.assertj.core.api.Assertions.*;
24+
25+
@SpringBootTest
26+
@Transactional
27+
@ActiveProfiles("test")
28+
class PostServiceTest {
29+
30+
@Autowired
31+
private PostService postService;
32+
33+
@Autowired
34+
private PostRepository postRepository;
35+
36+
@Autowired
37+
private UserRepository userRepository;
38+
39+
@Autowired
40+
private PostCategoryRepository postCategoryRepository;
41+
42+
// ====================== 게시글 생성 테스트 ======================
43+
44+
@Test
45+
@DisplayName("게시글 생성 성공 - 카테고리 포함")
46+
void createPost_success_withCategories() {
47+
// given: 유저 + 카테고리 저장
48+
User user = User.createUser("writer", "[email protected]", "encodedPwd");
49+
user.setUserProfile(new UserProfile(user, "작성자", null, null, null, 0));
50+
user.setUserStatus(UserStatus.ACTIVE);
51+
userRepository.save(user);
52+
53+
PostCategory category = new PostCategory("공지");
54+
postCategoryRepository.save(category);
55+
56+
PostRequest request = new PostRequest("제목", "내용", List.of(category.getId()));
57+
58+
// when
59+
PostResponse response = postService.createPost(request, user.getId());
60+
61+
// then
62+
assertThat(response.title()).isEqualTo("제목");
63+
assertThat(response.content()).isEqualTo("내용");
64+
assertThat(response.author().nickname()).isEqualTo("작성자");
65+
assertThat(response.categories()).hasSize(1);
66+
assertThat(response.categories().get(0).name()).isEqualTo("공지");
67+
}
68+
69+
@Test
70+
@DisplayName("게시글 생성 실패 - 존재하지 않는 유저")
71+
void createPost_fail_userNotFound() {
72+
// given
73+
PostRequest request = new PostRequest("제목", "내용", null);
74+
75+
// when & then
76+
assertThatThrownBy(() -> postService.createPost(request, 999L))
77+
.isInstanceOf(CustomException.class)
78+
.hasMessage(ErrorCode.USER_NOT_FOUND.getMessage());
79+
}
80+
81+
@Test
82+
@DisplayName("게시글 생성 실패 - 존재하지 않는 카테고리 ID 포함")
83+
void createPost_fail_categoryNotFound() {
84+
// given: 유저는 정상
85+
User user = User.createUser("writer2", "[email protected]", "encodedPwd");
86+
user.setUserProfile(new UserProfile(user, "작성자2", null, null, null, 0));
87+
user.setUserStatus(UserStatus.ACTIVE);
88+
userRepository.save(user);
89+
90+
// 실제 저장 안 된 카테고리 ID 요청
91+
PostRequest request = new PostRequest("제목", "내용", List.of(100L, 200L));
92+
93+
// when & then
94+
assertThatThrownBy(() -> postService.createPost(request, user.getId()))
95+
.isInstanceOf(CustomException.class)
96+
.hasMessage(ErrorCode.CATEGORY_NOT_FOUND.getMessage());
97+
}
98+
}

0 commit comments

Comments
 (0)