Skip to content

Commit 28aced9

Browse files
committed
Test: 테스트 작성
1 parent 7c0e236 commit 28aced9

File tree

2 files changed

+284
-0
lines changed

2 files changed

+284
-0
lines changed

src/test/java/com/back/domain/user/controller/UserControllerTest.java

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.user.controller;
22

3+
import com.back.domain.user.dto.ChangePasswordRequest;
34
import com.back.domain.user.dto.UpdateUserProfileRequest;
45
import com.back.domain.user.entity.User;
56
import com.back.domain.user.entity.UserProfile;
@@ -333,6 +334,188 @@ void updateMyProfile_expiredAccessToken() throws Exception {
333334
.andExpect(jsonPath("$.message").value("만료된 액세스 토큰입니다."));
334335
}
335336

337+
// ====================== 내 비밀번호 변경 테스트 ======================
338+
339+
@Test
340+
@DisplayName("비밀번호 변경 성공 → 200 OK")
341+
void changePassword_success() throws Exception {
342+
// given
343+
User user = User.createUser("changepw", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
344+
user.setUserProfile(new UserProfile(user, "홍길동", null, "소개글", LocalDate.of(2000, 1, 1), 1000));
345+
user.setUserStatus(UserStatus.ACTIVE);
346+
userRepository.save(user);
347+
348+
String accessToken = generateAccessToken(user);
349+
350+
ChangePasswordRequest request = new ChangePasswordRequest("P@ssw0rd!", "NewP@ssw0rd!");
351+
352+
// when & then
353+
mvc.perform(patch("/api/users/me/password")
354+
.header("Authorization", "Bearer " + accessToken)
355+
.contentType(MediaType.APPLICATION_JSON)
356+
.content(objectMapper.writeValueAsString(request)))
357+
.andDo(print())
358+
.andExpect(status().isOk())
359+
.andExpect(jsonPath("$.success").value(true))
360+
.andExpect(jsonPath("$.code").value("SUCCESS_200"))
361+
.andExpect(jsonPath("$.message").value("비밀번호가 변경되었습니다."));
362+
363+
// DB 값 검증
364+
User updated = userRepository.findById(user.getId()).orElseThrow();
365+
assertThat(passwordEncoder.matches("NewP@ssw0rd!", updated.getPassword())).isTrue();
366+
}
367+
368+
@Test
369+
@DisplayName("현재 비밀번호 불일치 → 401 Unauthorized (USER_006)")
370+
void changePassword_invalidCurrentPassword() throws Exception {
371+
// given
372+
User user = User.createUser("wrongpw", "[email protected]", passwordEncoder.encode("Correct1!"));
373+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
374+
user.setUserStatus(UserStatus.ACTIVE);
375+
userRepository.save(user);
376+
377+
String accessToken = generateAccessToken(user);
378+
379+
ChangePasswordRequest request = new ChangePasswordRequest("Wrong1!", "NewP@ssw0rd!");
380+
381+
// when & then
382+
mvc.perform(patch("/api/users/me/password")
383+
.header("Authorization", "Bearer " + accessToken)
384+
.contentType(MediaType.APPLICATION_JSON)
385+
.content(objectMapper.writeValueAsString(request)))
386+
.andDo(print())
387+
.andExpect(status().isUnauthorized())
388+
.andExpect(jsonPath("$.code").value("USER_006"))
389+
.andExpect(jsonPath("$.message").value("아이디 또는 비밀번호가 올바르지 않습니다."));
390+
}
391+
392+
@Test
393+
@DisplayName("새 비밀번호 정책 위반 → 400 Bad Request (USER_005)")
394+
void changePassword_invalidNewPassword() throws Exception {
395+
// given
396+
User user = User.createUser("invalidpw", "[email protected]", passwordEncoder.encode("Valid1!"));
397+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
398+
user.setUserStatus(UserStatus.ACTIVE);
399+
userRepository.save(user);
400+
401+
String accessToken = generateAccessToken(user);
402+
403+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "short");
404+
405+
// when & then
406+
mvc.perform(patch("/api/users/me/password")
407+
.header("Authorization", "Bearer " + accessToken)
408+
.contentType(MediaType.APPLICATION_JSON)
409+
.content(objectMapper.writeValueAsString(request)))
410+
.andDo(print())
411+
.andExpect(status().isBadRequest())
412+
.andExpect(jsonPath("$.code").value("USER_005"))
413+
.andExpect(jsonPath("$.message").value("비밀번호는 최소 8자 이상, 숫자/특수문자를 포함해야 합니다."));
414+
}
415+
416+
@Test
417+
@DisplayName("탈퇴 계정 비밀번호 변경 시도 → 410 Gone (USER_009)")
418+
void changePassword_deletedUser() throws Exception {
419+
// given
420+
User user = User.createUser("deletedpw", "[email protected]", passwordEncoder.encode("Valid1!"));
421+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
422+
user.setUserStatus(UserStatus.DELETED);
423+
userRepository.save(user);
424+
425+
String accessToken = generateAccessToken(user);
426+
427+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "NewP@ssw0rd!");
428+
429+
// when & then
430+
mvc.perform(patch("/api/users/me/password")
431+
.header("Authorization", "Bearer " + accessToken)
432+
.contentType(MediaType.APPLICATION_JSON)
433+
.content(objectMapper.writeValueAsString(request)))
434+
.andDo(print())
435+
.andExpect(status().isGone())
436+
.andExpect(jsonPath("$.code").value("USER_009"))
437+
.andExpect(jsonPath("$.message").value("탈퇴한 계정입니다."));
438+
}
439+
440+
@Test
441+
@DisplayName("정지 계정 비밀번호 변경 시도 → 403 Forbidden (USER_008)")
442+
void changePassword_suspendedUser() throws Exception {
443+
// given
444+
User user = User.createUser("suspendedpw", "[email protected]", passwordEncoder.encode("Valid1!"));
445+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
446+
user.setUserStatus(UserStatus.SUSPENDED);
447+
userRepository.save(user);
448+
449+
String accessToken = generateAccessToken(user);
450+
451+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "NewP@ssw0rd!");
452+
453+
// when & then
454+
mvc.perform(patch("/api/users/me/password")
455+
.header("Authorization", "Bearer " + accessToken)
456+
.contentType(MediaType.APPLICATION_JSON)
457+
.content(objectMapper.writeValueAsString(request)))
458+
.andDo(print())
459+
.andExpect(status().isForbidden())
460+
.andExpect(jsonPath("$.code").value("USER_008"))
461+
.andExpect(jsonPath("$.message").value("정지된 계정입니다. 관리자에게 문의하세요."));
462+
}
463+
464+
@Test
465+
@DisplayName("AccessToken 없음으로 비밀번호 변경 시도 → 401 Unauthorized (AUTH_001)")
466+
void changePassword_noAccessToken() throws Exception {
467+
ChangePasswordRequest request = new ChangePasswordRequest("P@ssw0rd!", "NewP@ssw0rd!");
468+
469+
mvc.perform(patch("/api/users/me/password")
470+
.contentType(MediaType.APPLICATION_JSON)
471+
.content(objectMapper.writeValueAsString(request)))
472+
.andDo(print())
473+
.andExpect(status().isUnauthorized())
474+
.andExpect(jsonPath("$.code").value("AUTH_001"))
475+
.andExpect(jsonPath("$.message").value("인증이 필요합니다."));
476+
}
477+
478+
@Test
479+
@DisplayName("잘못된 AccessToken으로 비밀번호 변경 시도 → 401 Unauthorized (AUTH_002)")
480+
void changePassword_invalidAccessToken() throws Exception {
481+
ChangePasswordRequest request = new ChangePasswordRequest("P@ssw0rd!", "NewP@ssw0rd!");
482+
483+
mvc.perform(patch("/api/users/me/password")
484+
.header("Authorization", "Bearer invalidToken")
485+
.contentType(MediaType.APPLICATION_JSON)
486+
.content(objectMapper.writeValueAsString(request)))
487+
.andDo(print())
488+
.andExpect(status().isUnauthorized())
489+
.andExpect(jsonPath("$.code").value("AUTH_002"))
490+
.andExpect(jsonPath("$.message").value("유효하지 않은 액세스 토큰입니다."));
491+
}
492+
493+
@Test
494+
@DisplayName("만료된 AccessToken으로 비밀번호 변경 시도 → 401 Unauthorized (AUTH_004)")
495+
void changePassword_expiredAccessToken() throws Exception {
496+
// given
497+
User user = User.createUser("expiredpw", "[email protected]", passwordEncoder.encode("Valid1!"));
498+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
499+
user.setUserStatus(UserStatus.ACTIVE);
500+
userRepository.save(user);
501+
502+
String expiredToken = testJwtTokenProvider.createExpiredAccessToken(
503+
user.getId(), user.getUsername(), user.getRole().name()
504+
);
505+
506+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "NewP@ssw0rd!");
507+
508+
// when & then
509+
mvc.perform(patch("/api/users/me/password")
510+
.header("Authorization", "Bearer " + expiredToken)
511+
.contentType(MediaType.APPLICATION_JSON)
512+
.content(objectMapper.writeValueAsString(request)))
513+
.andDo(print())
514+
.andExpect(status().isUnauthorized())
515+
.andExpect(jsonPath("$.code").value("AUTH_004"))
516+
.andExpect(jsonPath("$.message").value("만료된 액세스 토큰입니다."));
517+
}
518+
336519
// ====================== 내 계정 삭제 테스트 ======================
337520

338521
@Test

src/test/java/com/back/domain/user/service/UserServiceTest.java

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.user.service;
22

3+
import com.back.domain.user.dto.ChangePasswordRequest;
34
import com.back.domain.user.dto.UpdateUserProfileRequest;
45
import com.back.domain.user.dto.UserDetailResponse;
56
import com.back.domain.user.entity.User;
@@ -179,6 +180,106 @@ void updateUserProfile_suspendedUser() {
179180
.hasMessage(ErrorCode.USER_SUSPENDED.getMessage());
180181
}
181182

183+
// ====================== 비밀번호 변경 테스트 ======================
184+
185+
@Test
186+
@DisplayName("비밀번호 변경 성공")
187+
void changePassword_success() {
188+
// given: 정상 유저 저장
189+
User user = User.createUser("changepw", "[email protected]", passwordEncoder.encode("P@ssw0rd!"));
190+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
191+
user.setUserStatus(UserStatus.ACTIVE);
192+
userRepository.save(user);
193+
194+
ChangePasswordRequest request = new ChangePasswordRequest("P@ssw0rd!", "NewP@ssw0rd!");
195+
196+
// when
197+
userService.changePassword(user.getId(), request);
198+
199+
// then: DB의 비밀번호가 변경되었는지 확인
200+
User updated = userRepository.findById(user.getId()).orElseThrow();
201+
assertThat(passwordEncoder.matches("NewP@ssw0rd!", updated.getPassword())).isTrue();
202+
}
203+
204+
@Test
205+
@DisplayName("현재 비밀번호 불일치 → INVALID_CREDENTIALS 예외")
206+
void changePassword_invalidCurrentPassword() {
207+
// given
208+
User user = User.createUser("wrongpw", "[email protected]", passwordEncoder.encode("Correct1!"));
209+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
210+
user.setUserStatus(UserStatus.ACTIVE);
211+
userRepository.save(user);
212+
213+
ChangePasswordRequest request = new ChangePasswordRequest("Wrong1!", "NewP@ssw0rd!");
214+
215+
// when & then
216+
assertThatThrownBy(() -> userService.changePassword(user.getId(), request))
217+
.isInstanceOf(CustomException.class)
218+
.hasMessage(ErrorCode.INVALID_CREDENTIALS.getMessage());
219+
}
220+
221+
@Test
222+
@DisplayName("새 비밀번호 정책 위반 → INVALID_PASSWORD 예외")
223+
void changePassword_invalidNewPassword() {
224+
// given
225+
User user = User.createUser("invalidpw", "[email protected]", passwordEncoder.encode("Valid1!"));
226+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
227+
user.setUserStatus(UserStatus.ACTIVE);
228+
userRepository.save(user);
229+
230+
// 숫자/특수문자 없는 비밀번호
231+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "short");
232+
233+
// when & then
234+
assertThatThrownBy(() -> userService.changePassword(user.getId(), request))
235+
.isInstanceOf(CustomException.class)
236+
.hasMessage(ErrorCode.INVALID_PASSWORD.getMessage());
237+
}
238+
239+
@Test
240+
@DisplayName("탈퇴한 유저 비밀번호 변경 → USER_DELETED 예외")
241+
void changePassword_deletedUser() {
242+
// given
243+
User user = User.createUser("deletedpw", "[email protected]", passwordEncoder.encode("Valid1!"));
244+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
245+
user.setUserStatus(UserStatus.DELETED);
246+
userRepository.save(user);
247+
248+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "NewP@ssw0rd!");
249+
250+
// when & then
251+
assertThatThrownBy(() -> userService.changePassword(user.getId(), request))
252+
.isInstanceOf(CustomException.class)
253+
.hasMessage(ErrorCode.USER_DELETED.getMessage());
254+
}
255+
256+
@Test
257+
@DisplayName("정지된 유저 비밀번호 변경 → USER_SUSPENDED 예외")
258+
void changePassword_suspendedUser() {
259+
// given
260+
User user = User.createUser("suspendedpw", "[email protected]", passwordEncoder.encode("Valid1!"));
261+
user.setUserProfile(new UserProfile(user, "닉네임", null, null, null, 0));
262+
user.setUserStatus(UserStatus.SUSPENDED);
263+
userRepository.save(user);
264+
265+
ChangePasswordRequest request = new ChangePasswordRequest("Valid1!", "NewP@ssw0rd!");
266+
267+
// when & then
268+
assertThatThrownBy(() -> userService.changePassword(user.getId(), request))
269+
.isInstanceOf(CustomException.class)
270+
.hasMessage(ErrorCode.USER_SUSPENDED.getMessage());
271+
}
272+
273+
@Test
274+
@DisplayName("존재하지 않는 유저 비밀번호 변경 → USER_NOT_FOUND 예외")
275+
void changePassword_userNotFound() {
276+
// when & then
277+
ChangePasswordRequest request = new ChangePasswordRequest("dummy", "NewP@ssw0rd!");
278+
assertThatThrownBy(() -> userService.changePassword(999L, request))
279+
.isInstanceOf(CustomException.class)
280+
.hasMessage(ErrorCode.USER_NOT_FOUND.getMessage());
281+
}
282+
182283
// ====================== 사용자 탈퇴 테스트 ======================
183284

184285
@Test

0 commit comments

Comments
 (0)