diff --git a/src/main/java/com/umc/yourweather/controller/MemoController.java b/src/main/java/com/umc/yourweather/controller/MemoController.java index bd29358..f24cf49 100644 --- a/src/main/java/com/umc/yourweather/controller/MemoController.java +++ b/src/main/java/com/umc/yourweather/controller/MemoController.java @@ -39,7 +39,7 @@ public ResponseDto write( } @GetMapping("/daily/{weatherId}") - @Operation(summary = "하루 치 메모 반환", description = "하루치 메모 리스트를 반환하기 위한 API입니다. weather-controller에 있는 monthly API의 반환 값에 있는 weatherIzzd를 이용해서 조회합니다. ") + @Operation(summary = "하루 치 메모 반환", description = "하루치 메모 리스트를 반환하기 위한 API입니다. weather-controller에 있는 monthly API의 반환 값에 있는 weatherId를 이용해서 조회합니다. ") public ResponseDto daily(@PathVariable Long weatherId, @AuthenticationPrincipal CustomUserDetails userDetails) { diff --git a/src/main/java/com/umc/yourweather/jwt/JwtTokenManager.java b/src/main/java/com/umc/yourweather/jwt/JwtTokenManager.java index a8354c1..71b80ec 100644 --- a/src/main/java/com/umc/yourweather/jwt/JwtTokenManager.java +++ b/src/main/java/com/umc/yourweather/jwt/JwtTokenManager.java @@ -147,6 +147,12 @@ public boolean isRefreshTokenValid(String token) { public void updateRefreshToken(User user, String refreshToken) { user.updateRefreshToken(refreshToken); } + + public void setValue(String secretKey, Long accessTokenExpiration, Long refreshTokenExpiration) { + this.secretKey = secretKey; + this.accessTokenExpiration = accessTokenExpiration; + this.refreshTokenExpiration = refreshTokenExpiration; + } } diff --git a/src/main/java/com/umc/yourweather/request/ChangePasswordRequestDto.java b/src/main/java/com/umc/yourweather/request/ChangePasswordRequestDto.java index 9ad86a5..faf0c45 100644 --- a/src/main/java/com/umc/yourweather/request/ChangePasswordRequestDto.java +++ b/src/main/java/com/umc/yourweather/request/ChangePasswordRequestDto.java @@ -1,6 +1,7 @@ package com.umc.yourweather.request; import jakarta.validation.constraints.NotBlank; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,4 +14,11 @@ public class ChangePasswordRequestDto { @NotBlank String newPassword; + + @Builder + + public ChangePasswordRequestDto(String password, String newPassword) { + this.password = password; + this.newPassword = newPassword; + } } diff --git a/src/test/java/com/umc/yourweather/repository/test/UserTestRepository.java b/src/test/java/com/umc/yourweather/repository/test/UserTestRepository.java new file mode 100644 index 0000000..e2de8dc --- /dev/null +++ b/src/test/java/com/umc/yourweather/repository/test/UserTestRepository.java @@ -0,0 +1,48 @@ +package com.umc.yourweather.repository.test; + +import com.umc.yourweather.domain.entity.User; +import com.umc.yourweather.repository.UserRepository; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class UserTestRepository implements UserRepository { + + List repository = new ArrayList<>(); + + @Override + public Optional findByEmail(String email) { + for (User user : repository) { + if (user.getEmail().equals(email)) { + return Optional.of(user); + } + } + return Optional.empty(); + } + + @Override + public Optional findByRefreshToken(String refreshToken) { + for (User user : repository) { + if (user.getEmail().equals(refreshToken)) { + return Optional.of(user); + } + } + return Optional.empty(); + } + + @Override + public User save(User user) { + repository.add(user); + return user; + } + + @Override + public void deleteExpiredUser() { + for (User user : repository) { + if (!user.isActivate()) { + repository.remove(user); + } + } + return; + } +} diff --git a/src/test/java/com/umc/yourweather/service/UserServiceTest.java b/src/test/java/com/umc/yourweather/service/UserServiceTest.java index 2b9397c..db4f5ae 100644 --- a/src/test/java/com/umc/yourweather/service/UserServiceTest.java +++ b/src/test/java/com/umc/yourweather/service/UserServiceTest.java @@ -1,110 +1,204 @@ -//package com.umc.yourweather.service; -// -//import static org.junit.jupiter.api.Assertions.*; -// -//import com.umc.yourweather.auth.CustomUserDetails; -//import com.umc.yourweather.domain.enums.Platform; -//import com.umc.yourweather.domain.enums.Role; -//import com.umc.yourweather.domain.entity.User; -//import com.umc.yourweather.repository.UserRepository; -//import com.umc.yourweather.request.ChangePasswordRequestDto; -//import com.umc.yourweather.request.SignupRequestDto; -//import com.umc.yourweather.response.UserResponseDto; -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -// -//@SpringBootTest -//class UserServiceTest { -// -// @Autowired -// private UserService userService; -// -// @Autowired -// private UserRepository userRepository; -// -// @BeforeEach -// void setup() { -// userRepository.save(User.builder() -// .email("test@test.com") -// .password("password") -// .nickname("nickname") -// .platform(Platform.YOURWEATHER) -// .role(Role.ROLE_USER) -// .isActivate(true) -// .build()); -// } -// -// @Test -// @DisplayName("mypage 조회") -// void mypage() { -// // given -// User user = User.builder() -// .email("test@test.com") -// .password("password") -// .nickname("nickname") -// .platform(Platform.YOURWEATHER) -// .role(Role.ROLE_USER) -// .isActivate(true) -// .build(); -// -// CustomUserDetails userDetails = new CustomUserDetails(user); -// -// // when -// UserResponseDto response = userService.mypage(userDetails); -// -// // then -// assertEquals(userDetails.getUser().getEmail(), response.getEmail()); -// assertEquals(userDetails.getUser().getNickname(), response.getNickname()); -// } -// -// @Test -// @DisplayName("비밀번호 변경") -// void changePassword(){ -// // given -// ChangePasswordRequestDto request = new ChangePasswordRequestDto("password2"); -// -// User user = User.builder() -// .email("test@test.com") -// .password("password") -// .nickname("nickname") -// .platform(Platform.YOURWEATHER) -// .role(Role.ROLE_USER) -// .isActivate(true) -// .build(); -// -// CustomUserDetails userDetails = new CustomUserDetails(user); -// -// // when -// userService.changePassword(request, userDetails); -// -// // then -// User findUser = userRepository.findByEmail("test@test.com").get(); -// assertEquals(findUser.getPassword(), "password2"); -// } -// -// @Test -// @DisplayName("회원 탈퇴") -// void withdraw(){ -// //given -// User user = User.builder() -// .email("test@test.com") -// .password("password") -// .nickname("nickname") -// .platform(Platform.YOURWEATHER) -// .role(Role.ROLE_USER) -// .isActivate(true) -// .build(); -// -// CustomUserDetails userDetails = new CustomUserDetails(user); -// -// // when -// userService.withdraw(userDetails); -// -// // then -// User findUser = userRepository.findByEmail("test@test.com").get(); -// assertEquals(findUser.isActivate(), false); -// } -//} \ No newline at end of file +package com.umc.yourweather.service; + +import static org.junit.jupiter.api.Assertions.*; + +import com.umc.yourweather.auth.CustomUserDetails; +import com.umc.yourweather.domain.enums.Platform; +import com.umc.yourweather.domain.enums.Role; +import com.umc.yourweather.domain.entity.User; +import com.umc.yourweather.jwt.JwtTokenManager; +import com.umc.yourweather.repository.UserRepository; +import com.umc.yourweather.repository.test.UserTestRepository; +import com.umc.yourweather.request.ChangePasswordRequestDto; +import com.umc.yourweather.request.SignupRequestDto; +import com.umc.yourweather.response.AuthorizationResponseDto; +import com.umc.yourweather.response.ChangePasswordResponseDto; +import com.umc.yourweather.response.UserResponseDto; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +class UserServiceTest { + + // 의존성 주입 최소화 + private final String secretKey = "secretKey"; + private UserRepository userRepository = new UserTestRepository(); + private JwtTokenManager jwtTokenManager = new JwtTokenManager(); + private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + private UserService userService = new UserService(userRepository, + passwordEncoder, jwtTokenManager); + + + @BeforeEach + void setup() { + userRepository.save(User.builder() + .email("test@test.com") + .password(passwordEncoder.encode("password")) + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .role(Role.ROLE_USER) + .isActivate(true) + .build()); + } + + @Test + void createAccessToken이_정상적으로_작동한다() { + // given + User user = User.builder() + .email("test@test.com") + .password("password") + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .role(Role.ROLE_USER) + .isActivate(true) + .build(); + + // @Value 값을 채워주기 위한 임시 값 세팅 + jwtTokenManager.setValue(secretKey, 1L, 1L); + + // when + String accessToken = jwtTokenManager.createAccessToken(user); + + // then + assertNotNull(accessToken); + } + + @Test + void 회원_가입이_정상적으로_작동한다() { + // given + SignupRequestDto request = SignupRequestDto.builder() + .email("user@test.com") + .password("password") + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .build(); + + // @Value 값을 채워주기 위한 임시 값 세팅 + jwtTokenManager.setValue(secretKey, 1L, 1L); + + // when + AuthorizationResponseDto authorizationResponseDto = userService.signup(request, secretKey); + + // then + assertNotNull(authorizationResponseDto.getAccessToken()); + assertNotNull(authorizationResponseDto.getRefreshToken()); + } + + @Test + void 중복_이메일은_회원_가입을_할_수_없다() { + // given + SignupRequestDto request = SignupRequestDto.builder() + .email("test@test.com") + .password("password") + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .build(); + + // when + // then + assertThrows(RuntimeException.class, () -> { + userService.signup(request, secretKey); + }); + } + + @Test + void 데이터베이스에_정상적으로_저장된다() { + // given + SignupRequestDto request = SignupRequestDto.builder() + .email("user@test.com") + .password("password") + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .build(); + jwtTokenManager.setValue(secretKey, 1L, 1L); + + // when + userService.signup(request, secretKey); + + // then + Optional optionalUser = userRepository.findByEmail("user@test.com"); + assertTrue(optionalUser.isPresent()); + assertEquals("nickname", optionalUser.get().getNickname()); + } + + @Test + void 마이_페이지_조회가_가능하다() { + // given + User user = User.builder() + .email("test@test.com") + .password("password") + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .role(Role.ROLE_USER) + .isActivate(true) + .build(); + + CustomUserDetails userDetails = new CustomUserDetails(user); + + // when + UserResponseDto response = userService.mypage(userDetails); + + // then + assertEquals(userDetails.getUser().getEmail(), response.getEmail()); + assertEquals(userDetails.getUser().getNickname(), response.getNickname()); + } + + @Test + void 비밀번호_변경이_가능하다() { + // given + User user = User.builder() + .email("test@test.com") + .password(passwordEncoder.encode("password")) + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .role(Role.ROLE_USER) + .isActivate(true) + .build(); + + CustomUserDetails userDetails = new CustomUserDetails(user); + + ChangePasswordRequestDto request = ChangePasswordRequestDto.builder() + .password("password") + .newPassword("newPassword") + .build(); + + // when + ChangePasswordResponseDto changePasswordResponseDto = userService.changePassword(request, + userDetails); + + // then + assertEquals(true, changePasswordResponseDto.isSuccess()); + assertEquals("비밀번호 변경 완료", changePasswordResponseDto.getMessage()); + } + + @Test + void 기존_비밀번호를_틀릴_시_비밀번호_변경이_불가하다() { + // given + User user = User.builder() + .email("test@test.com") + .password(passwordEncoder.encode("password")) + .nickname("nickname") + .platform(Platform.YOURWEATHER) + .role(Role.ROLE_USER) + .isActivate(true) + .build(); + + CustomUserDetails userDetails = new CustomUserDetails(user); + + ChangePasswordRequestDto request = ChangePasswordRequestDto.builder() + .password("wrongPassword") + .newPassword("newPassword") + .build(); + + // when + ChangePasswordResponseDto changePasswordResponseDto = userService.changePassword(request, + userDetails); + + // then + assertEquals(changePasswordResponseDto.isSuccess(), false); + assertEquals(changePasswordResponseDto.getMessage(), + "요청으로 들어온 기존 비밀번호가 DB에 있는 정보와 일치하지 않습니다."); + } +}