From 3866d94f33594abb2c02a93367cc9ce9e5973e0a Mon Sep 17 00:00:00 2001 From: byunyourim Date: Tue, 3 Sep 2024 15:02:31 +0900 Subject: [PATCH] =?UTF-8?q?test:LoginControllerTest.java,=20UserApiControl?= =?UTF-8?q?lerTest.java=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/login/LoginController.java | 13 +- .../controller/login/dto/LoginRequest.java | 14 ++ .../controller/user/UserApiController.java | 23 ++- .../controller/user/UserController.java | 6 +- .../user/dto/SignupRequest.java} | 6 +- .../user/dto/SignupResponse.java} | 8 +- .../controller/user/dto/SmsRequest.java | 11 ++ .../java/com/kboticket/dto/SmsRequestDto.java | 15 +- src/main/java/com/kboticket/dto/TermsDto.java | 1 - .../com/kboticket/dto/login/LoginDto.java | 27 +++ .../kboticket/dto/login/LoginRequestDto.java | 19 -- .../java/com/kboticket/enums/ErrorCode.java | 3 +- .../kboticket/service/login/LoginService.java | 8 +- .../kboticket/service/user/UserService.java | 7 +- .../controller/LoginControllerTest.java | 60 ++++++ .../controller/UserApiControllerTest.java | 179 ++++++++++++++++++ .../controller/UserControllerTest.java | 64 +++++-- 17 files changed, 397 insertions(+), 67 deletions(-) create mode 100644 src/main/java/com/kboticket/controller/login/dto/LoginRequest.java rename src/main/java/com/kboticket/{dto/user/UserSignupRequest.java => controller/user/dto/SignupRequest.java} (84%) rename src/main/java/com/kboticket/{dto/user/UserSignupResponse.java => controller/user/dto/SignupResponse.java} (53%) create mode 100644 src/main/java/com/kboticket/controller/user/dto/SmsRequest.java create mode 100644 src/main/java/com/kboticket/dto/login/LoginDto.java delete mode 100644 src/main/java/com/kboticket/dto/login/LoginRequestDto.java create mode 100644 src/test/java/com/kboticket/controller/LoginControllerTest.java create mode 100644 src/test/java/com/kboticket/controller/UserApiControllerTest.java diff --git a/src/main/java/com/kboticket/controller/login/LoginController.java b/src/main/java/com/kboticket/controller/login/LoginController.java index 7568fad..1620d2a 100644 --- a/src/main/java/com/kboticket/controller/login/LoginController.java +++ b/src/main/java/com/kboticket/controller/login/LoginController.java @@ -1,6 +1,7 @@ package com.kboticket.controller.login; -import com.kboticket.dto.login.LoginRequestDto; +import com.kboticket.controller.login.dto.LoginRequest; +import com.kboticket.dto.login.LoginDto; import com.kboticket.service.login.LoginService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -9,6 +10,10 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +/** + * @author winnie + */ + @RestController @RequiredArgsConstructor public class LoginController { @@ -17,8 +22,8 @@ public class LoginController { @PostMapping("/login") @ResponseStatus(HttpStatus.OK) - public void login(@RequestBody LoginRequestDto loginRequestDto) { - loginService.login(loginRequestDto); + public void login(@RequestBody LoginRequest request) { + LoginDto loginDto = LoginDto.from(request); + loginService.login(loginDto); } - } diff --git a/src/main/java/com/kboticket/controller/login/dto/LoginRequest.java b/src/main/java/com/kboticket/controller/login/dto/LoginRequest.java new file mode 100644 index 0000000..b9aaef4 --- /dev/null +++ b/src/main/java/com/kboticket/controller/login/dto/LoginRequest.java @@ -0,0 +1,14 @@ +package com.kboticket.controller.login.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter @Setter +@AllArgsConstructor +public class LoginRequest { + private String username; + private String password; +} diff --git a/src/main/java/com/kboticket/controller/user/UserApiController.java b/src/main/java/com/kboticket/controller/user/UserApiController.java index 0ebf47d..cf00ee7 100644 --- a/src/main/java/com/kboticket/controller/user/UserApiController.java +++ b/src/main/java/com/kboticket/controller/user/UserApiController.java @@ -2,9 +2,10 @@ import com.kboticket.common.CommonResponse; import com.kboticket.config.jwt.JwtTokenProvider; +import com.kboticket.controller.user.dto.SmsRequest; import com.kboticket.dto.SmsRequestDto; import com.kboticket.dto.TokenDto; -import com.kboticket.dto.user.UserSignupRequest; +import com.kboticket.controller.user.dto.SignupRequest; import com.kboticket.dto.response.EmailResponse; import com.kboticket.dto.response.PasswordResponse; import com.kboticket.dto.response.VerificationResponse; @@ -20,6 +21,10 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +/** + * @author winnie + */ + @Slf4j @RestController @RequestMapping("/api/user") @@ -36,24 +41,24 @@ public class UserApiController { */ @PostMapping("/sms-send") @ResponseStatus(HttpStatus.OK) - public void sendSms(@RequestBody SmsRequestDto smsRequestDto) { - smsSenderService.sendVeritificationKey(smsRequestDto.getPhone()); + public void sendSms(@RequestBody SmsRequest request) { + String phone = request.getPhone(); + smsSenderService.sendVeritificationKey(phone); } - /** * 인증 번호 확인 후 토큰 발급 */ @PostMapping("/verify") - public CommonResponse smsVerification(@RequestBody SmsRequestDto smsRequestDto) { - boolean isValid = smsSenderService.verifySms(smsRequestDto); + public CommonResponse smsVerification(@RequestBody SmsRequest request) { + SmsRequestDto requestDto = SmsRequestDto.from(request); + boolean isValid = smsSenderService.verifySms(requestDto); if (!isValid) { throw new KboTicketException(ErrorCode.INVALID_VERIFICATION_CODE); } - String verificationToken = jwtTokenProvider.generateToken(smsRequestDto.getPhone(), TokenType.ACCESS); - log.info(verificationToken); + String verificationToken = jwtTokenProvider.generateToken(requestDto.getPhone(), TokenType.ACCESS); return new CommonResponse(new VerificationResponse(verificationToken)); } @@ -63,7 +68,7 @@ public CommonResponse smsVerification(@RequestBody SmsRequestDto smsReques */ @PostMapping("/signup") @ResponseStatus(HttpStatus.CREATED) - public void signup(@RequestBody UserSignupRequest request) { + public void signup(@RequestBody SignupRequest request) { boolean isAgreeAllMandaotryTerms = termsService.checkAllMandatoryTermsAgreed(request.getTerms()); if (!isAgreeAllMandaotryTerms) { diff --git a/src/main/java/com/kboticket/controller/user/UserController.java b/src/main/java/com/kboticket/controller/user/UserController.java index 538b872..4c87167 100644 --- a/src/main/java/com/kboticket/controller/user/UserController.java +++ b/src/main/java/com/kboticket/controller/user/UserController.java @@ -15,6 +15,9 @@ import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; +/** + * @author winnie + */ @Slf4j @RestController @@ -29,8 +32,6 @@ public class UserController { */ @GetMapping("/view") public CommonResponse getUserInfo(Authentication authentication) { - log.info("authentication.getName()=======>" + authentication.getName()); - String email = authentication.getName(); UserDto userDto = userService.getUserDto(email); @@ -59,7 +60,6 @@ public void verifyPassword(Authentication authentication, @ResponseStatus(HttpStatus.OK) public void updateInfo(Authentication authentication, @RequestBody UpdateUserRequest request) { - String email = authentication.getName(); UserInfoDto userInfoDto = UserInfoDto.from(request); diff --git a/src/main/java/com/kboticket/dto/user/UserSignupRequest.java b/src/main/java/com/kboticket/controller/user/dto/SignupRequest.java similarity index 84% rename from src/main/java/com/kboticket/dto/user/UserSignupRequest.java rename to src/main/java/com/kboticket/controller/user/dto/SignupRequest.java index 36c964f..e8df57e 100644 --- a/src/main/java/com/kboticket/dto/user/UserSignupRequest.java +++ b/src/main/java/com/kboticket/controller/user/dto/SignupRequest.java @@ -1,4 +1,4 @@ -package com.kboticket.dto.user; +package com.kboticket.controller.user.dto; import com.kboticket.dto.TermsDto; import jakarta.validation.constraints.*; @@ -10,7 +10,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) @Builder @AllArgsConstructor -public class UserSignupRequest { +public class SignupRequest { @NotBlank(message = "이메일은 필수 입력 항목입니다.") @Email(message = "유효하지 않은 이메일 주소입니다.") @@ -24,7 +24,7 @@ public class UserSignupRequest { private String verificationKey; - private List terms; // TermsRequest + private List terms; } diff --git a/src/main/java/com/kboticket/dto/user/UserSignupResponse.java b/src/main/java/com/kboticket/controller/user/dto/SignupResponse.java similarity index 53% rename from src/main/java/com/kboticket/dto/user/UserSignupResponse.java rename to src/main/java/com/kboticket/controller/user/dto/SignupResponse.java index 30844ac..09ba3a1 100644 --- a/src/main/java/com/kboticket/dto/user/UserSignupResponse.java +++ b/src/main/java/com/kboticket/controller/user/dto/SignupResponse.java @@ -1,4 +1,4 @@ -package com.kboticket.dto.user; +package com.kboticket.controller.user.dto; import com.kboticket.domain.User; import lombok.*; @@ -6,12 +6,12 @@ @Getter @Builder @AllArgsConstructor -public class UserSignupResponse { +public class SignupResponse { private String email; - public static UserSignupResponse from(User user) { - return UserSignupResponse.builder() + public static SignupResponse from(User user) { + return SignupResponse.builder() .email(user.getEmail()) .build(); } diff --git a/src/main/java/com/kboticket/controller/user/dto/SmsRequest.java b/src/main/java/com/kboticket/controller/user/dto/SmsRequest.java new file mode 100644 index 0000000..3717fd1 --- /dev/null +++ b/src/main/java/com/kboticket/controller/user/dto/SmsRequest.java @@ -0,0 +1,11 @@ +package com.kboticket.controller.user.dto; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class SmsRequest { + private String phone; + private String certificationNumber; +} diff --git a/src/main/java/com/kboticket/dto/SmsRequestDto.java b/src/main/java/com/kboticket/dto/SmsRequestDto.java index e73a97f..6c5e178 100644 --- a/src/main/java/com/kboticket/dto/SmsRequestDto.java +++ b/src/main/java/com/kboticket/dto/SmsRequestDto.java @@ -1,12 +1,21 @@ package com.kboticket.dto; +import com.kboticket.controller.user.dto.SmsRequest; +import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; +import lombok.Getter; -@Data @Builder +@Getter +@AllArgsConstructor public class SmsRequestDto { - private String phone; private String certificationNumber; + + public static SmsRequestDto from(SmsRequest request) { + return SmsRequestDto.builder() + .phone(request.getPhone()) + .certificationNumber(request.getCertificationNumber()) + .build(); + } } diff --git a/src/main/java/com/kboticket/dto/TermsDto.java b/src/main/java/com/kboticket/dto/TermsDto.java index ad37cf7..0dd96a3 100644 --- a/src/main/java/com/kboticket/dto/TermsDto.java +++ b/src/main/java/com/kboticket/dto/TermsDto.java @@ -8,5 +8,4 @@ public class TermsDto { private String version; private String content; private boolean mandatory; - } diff --git a/src/main/java/com/kboticket/dto/login/LoginDto.java b/src/main/java/com/kboticket/dto/login/LoginDto.java new file mode 100644 index 0000000..84c9b1c --- /dev/null +++ b/src/main/java/com/kboticket/dto/login/LoginDto.java @@ -0,0 +1,27 @@ +package com.kboticket.dto.login; + + +import com.kboticket.controller.login.dto.LoginRequest; +import lombok.*; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Builder +@Getter @Setter +@AllArgsConstructor +public class LoginDto { + + private String username; + private String password; + + public static LoginDto from(LoginRequest request) { + return LoginDto.builder() + .username(request.getUsername()) + .password(request.getPassword()) + .build(); + } + +// public void passwordEncryption(BCryptPasswordEncoder bCryptPasswordEncoder){ +// this.password = bCryptPasswordEncoder.encode(password); +// } + +} diff --git a/src/main/java/com/kboticket/dto/login/LoginRequestDto.java b/src/main/java/com/kboticket/dto/login/LoginRequestDto.java deleted file mode 100644 index 01e934f..0000000 --- a/src/main/java/com/kboticket/dto/login/LoginRequestDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.kboticket.dto.login; - - -import lombok.*; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -@Builder -@Getter @Setter -@AllArgsConstructor -public class LoginRequestDto { - - private String username; - private String password; - - public void passwordEncryption(BCryptPasswordEncoder bCryptPasswordEncoder){ - this.password = bCryptPasswordEncoder.encode(password); - } - -} diff --git a/src/main/java/com/kboticket/enums/ErrorCode.java b/src/main/java/com/kboticket/enums/ErrorCode.java index 0dff0c4..1a5f6e9 100644 --- a/src/main/java/com/kboticket/enums/ErrorCode.java +++ b/src/main/java/com/kboticket/enums/ErrorCode.java @@ -25,7 +25,7 @@ public enum ErrorCode { GENERATE_TEMP_PW_ERR(10013, "Generate temp Password Failed", HttpStatus.CONFLICT), INCORRECT_PASSWORD(10014, "The password is incorrect", HttpStatus.NOT_FOUND), INVALID_AUTHORIZATION(10015, "Invalid or missing Authorization", HttpStatus.BAD_REQUEST), - + FAILED_GENERATE_TOKEN(10016, "Failed during token creation", HttpStatus.BAD_REQUEST), /** @@ -83,7 +83,6 @@ public enum ErrorCode { PAYMENT_AMOUNT_EXP(30035, "invalid payment amount", HttpStatus.CONFLICT), ALREADY_APPROVED(30036, "already approved", HttpStatus.CONFLICT) ; - public final int code; public final String message; public final HttpStatus httpcode; diff --git a/src/main/java/com/kboticket/service/login/LoginService.java b/src/main/java/com/kboticket/service/login/LoginService.java index 05dd107..e02de7a 100644 --- a/src/main/java/com/kboticket/service/login/LoginService.java +++ b/src/main/java/com/kboticket/service/login/LoginService.java @@ -1,7 +1,7 @@ package com.kboticket.service.login; import com.kboticket.config.jwt.JwtTokenProvider; -import com.kboticket.dto.login.LoginRequestDto; +import com.kboticket.dto.login.LoginDto; import com.kboticket.enums.ErrorCode; import com.kboticket.enums.TokenType; import com.kboticket.exception.KboTicketException; @@ -25,9 +25,9 @@ public class LoginService { private final RedisTemplate redisTemplate; @Transactional - public void login(LoginRequestDto loginRequestDto) { - String email = loginRequestDto.getUsername(); - String password = loginRequestDto.getPassword(); + public void login(LoginDto loginDto) { + String email = loginDto.getUsername(); + String password = loginDto.getPassword(); // 이메일로 존재하는 유저인지 확인 userService.isExistEmail(email); diff --git a/src/main/java/com/kboticket/service/user/UserService.java b/src/main/java/com/kboticket/service/user/UserService.java index f54465f..9de5d09 100644 --- a/src/main/java/com/kboticket/service/user/UserService.java +++ b/src/main/java/com/kboticket/service/user/UserService.java @@ -6,7 +6,7 @@ import com.kboticket.dto.user.UserDto; import com.kboticket.dto.user.UserInfoDto; import com.kboticket.dto.user.UserPasswordDto; -import com.kboticket.dto.user.UserSignupRequest; +import com.kboticket.controller.user.dto.SignupRequest; import com.kboticket.enums.ErrorCode; import com.kboticket.exception.*; import com.kboticket.repository.terms.TermsRepository; @@ -35,7 +35,7 @@ public class UserService { private final BCryptPasswordEncoder bCryptPasswordEncoder; @Transactional - public void signup(UserSignupRequest request) { + public void signup(SignupRequest request) { String email = request.getEmail(); String password = request.getPassword(); String confirmPassword = request.getConfirmpassword(); @@ -158,9 +158,12 @@ public String findbyPhone(String phone) { // 기존 비밀 번호 확인 public boolean checkPassword(String email, String inputPassword) { + log.info("storedpassword : " + inputPassword); + Optional optionalUser = userRepository.findByEmail(email); String storedPassword = optionalUser.get().getPassword(); + log.info("storedpassword : " + storedPassword); return bCryptPasswordEncoder.matches(inputPassword, storedPassword); } } diff --git a/src/test/java/com/kboticket/controller/LoginControllerTest.java b/src/test/java/com/kboticket/controller/LoginControllerTest.java new file mode 100644 index 0000000..319231a --- /dev/null +++ b/src/test/java/com/kboticket/controller/LoginControllerTest.java @@ -0,0 +1,60 @@ +package com.kboticket.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kboticket.controller.login.LoginController; +import com.kboticket.controller.login.dto.LoginRequest; +import com.kboticket.dto.login.LoginDto; +import com.kboticket.service.login.LoginService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(LoginController.class) +@ExtendWith(SpringExtension.class) +public class LoginControllerTest { + + private MockMvc mockMvc; + + @MockBean + private LoginService loginService; + + @BeforeEach + void setUp() { + LoginController loginController = new LoginController(loginService); + this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build(); + } + + @Test + @DisplayName("[SUCCESS] 로그인 성공") + void loginTest() throws Exception { + String username = "test@naver.com"; + String password = "1111"; + + LoginRequest request = LoginRequest.builder() + .username(username) + .password(password) + .build(); + + LoginDto loginDto = LoginDto.from(request); + String json = new ObjectMapper().writeValueAsString(loginDto); + + doNothing().when(loginService).login(any(LoginDto.class)); + + mockMvc.perform(post("/login") + .content(json) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } +} diff --git a/src/test/java/com/kboticket/controller/UserApiControllerTest.java b/src/test/java/com/kboticket/controller/UserApiControllerTest.java new file mode 100644 index 0000000..b2dcdc8 --- /dev/null +++ b/src/test/java/com/kboticket/controller/UserApiControllerTest.java @@ -0,0 +1,179 @@ +package com.kboticket.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kboticket.config.jwt.JwtTokenProvider; +import com.kboticket.controller.user.UserApiController; +import com.kboticket.controller.user.dto.SignupRequest; +import com.kboticket.dto.SmsRequestDto; +import com.kboticket.dto.TokenDto; +import com.kboticket.enums.ErrorCode; +import com.kboticket.exception.KboTicketException; +import com.kboticket.service.SmsSenderService; +import com.kboticket.service.terms.TermsService; +import com.kboticket.service.user.UserService; +import jakarta.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import java.util.ArrayList; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willThrow; +import static org.mockito.Mockito.doNothing; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(UserApiControllerTest.class) +@ExtendWith(SpringExtension.class) +public class UserApiControllerTest { + + private MockMvc mockMvc; + @Mock + private UserService userService; + @Mock + private TermsService termsService; + @Mock + private SmsSenderService smsSenderService; + @Mock + private JwtTokenProvider jwtTokenProvider; + + @BeforeEach + void setUp() { + UserApiController userApiController = new UserApiController(userService, termsService, smsSenderService, jwtTokenProvider); + this.mockMvc = MockMvcBuilders.standaloneSetup(userApiController).build(); + } + + @Test + @DisplayName("[SUCCESS] 인증 번호 발송 테스트") + void sendSmsTest() throws Exception { + // given + String phone = "010-1111-1111"; + + doNothing().when(smsSenderService).sendVeritificationKey(anyString()); + + // when & then + mockMvc.perform(post("/api/user/sms-send") + .content(phone) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + @DisplayName("[FAIL] sms 인증 실패") + void smsVerificationFailTest() throws Exception { + // given + SmsRequestDto requestDto = new SmsRequestDto("010-1234-5678", "123456"); + String json = new ObjectMapper().writeValueAsString(requestDto); + + given(smsSenderService.verifySms(requestDto)).willReturn(false); + + // when & then + mockMvc.perform(post("/api/user/verify") + .contentType(MediaType.APPLICATION_JSON) + .content(json)) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("[SUCCESS] 회원 가입") + void signupSuccessTest() throws Exception { + // given + SignupRequest signupRequest = new SignupRequest("test@example.com", "1111", "1111", "00000", new ArrayList<>()); + String json = new ObjectMapper().writeValueAsString(signupRequest); + + given(termsService.checkAllMandatoryTermsAgreed(signupRequest.getTerms())).willReturn(true); + doNothing().when(userService).signup(signupRequest); + + // when & then + mockMvc.perform(post("/api/user/signup") + .contentType(MediaType.APPLICATION_JSON) + .content(json)) + .andExpect(status().isCreated()); + } + + @Test + @DisplayName("[FAIL] 회원 가입 실패") + void signupFailedTest() throws Exception { + // given + SignupRequest signupRequest = new SignupRequest("test@example.com", "1111", "1111", "00000", new ArrayList<>()); + String json = new ObjectMapper().writeValueAsString(signupRequest); + + given(termsService.checkAllMandatoryTermsAgreed(signupRequest.getTerms())).willReturn(false); + + // when & then + mockMvc.perform(post("/api/user/signup") + .contentType(MediaType.APPLICATION_JSON) + .content(json)) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("[SUCCESS] 인증 번호 재발급") + void reissuedSuccessTest() throws Exception { + // given + HttpServletRequest request = new MockHttpServletRequest(); + TokenDto tokenDto = new TokenDto("newAccessToken", "refreshToken"); + + given(userService.reissue(request)).willReturn(tokenDto); + + // when & then + mockMvc.perform(post("/api/user/reissued") + .requestAttr("javax.servlet.request", request)) + .andExpect(status().isOk()); + } + + @Test + @DisplayName("[FAIL] 인증 번호 재발급 실패") + void reissuedFailureTest() throws Exception { + // given + HttpServletRequest request = new MockHttpServletRequest(); + + willThrow(new KboTicketException(ErrorCode.FAILED_GENERATE_TOKEN)) + .given(userService) + .reissue(any()); + + // when & then + mockMvc.perform(post("/api/user/reissued") + .requestAttr("javax.servlet.request", request)) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("[SUCCESS] 이메일 중복 검사") + void checkDuplicateEmailSuccessTest() throws Exception { + // given + String email = "test@naver.com"; + given(userService.isExistEmail(email)).willReturn(false); + + // when & then + mockMvc.perform(get("/api/user/check-email") + .param("email", email)) + .andExpect(status().isOk()); + } + + @Test + @DisplayName("[Fail] 이메일 중복 검사") + void checkDuplicateEmailFailTest() throws Exception { + // given + String email = "test@naver.com"; + given(userService.isExistEmail(email)).willReturn(true); + + // when & then + mockMvc.perform(get("/api/user/check-email") + .param("email", email)) + .andExpect(status().isConflict()); + } + +} diff --git a/src/test/java/com/kboticket/controller/UserControllerTest.java b/src/test/java/com/kboticket/controller/UserControllerTest.java index 352a90f..7e92835 100644 --- a/src/test/java/com/kboticket/controller/UserControllerTest.java +++ b/src/test/java/com/kboticket/controller/UserControllerTest.java @@ -1,29 +1,27 @@ package com.kboticket.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import com.kboticket.controller.user.UserController; -import com.kboticket.enums.ErrorCode; -import com.kboticket.exception.KboTicketException; +import com.kboticket.controller.user.dto.ChangePasswordRequest; +import com.kboticket.controller.user.dto.UpdateUserRequest; import com.kboticket.service.user.UserService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(UserController.class) @@ -51,11 +49,11 @@ void verifyPasswordSuccessTest() throws Exception { String email = "test@naver.com"; String password = "1111"; - when(authentication.getName()).thenReturn(email); - when(userService.checkPassword(email, password)).thenReturn(true); + given(authentication.getName()).willReturn(email); + given(userService.checkPassword(anyString(), anyString())).willReturn(false); // when & then - mockMvc.perform(MockMvcRequestBuilders.post("/users/verify-password") + mockMvc.perform(post("/users/verify-password") .principal(authentication) .content(password) .contentType(MediaType.APPLICATION_JSON)) @@ -72,11 +70,11 @@ void verifyPasswordFailTest() throws Exception { String email = "test@naver.com"; String password = "failtest"; - when(authentication.getName()).thenReturn(email); - when(userService.checkPassword(email, password)).thenReturn(false); + given(authentication.getName()).willReturn(email); + doNothing().when(userService).updateUserInfo(anyString(), any()); // when & then - mockMvc.perform(MockMvcRequestBuilders.post("/users/verify-password") + mockMvc.perform(post("/users/verify-password") .principal(authentication) .content(password) .contentType(MediaType.APPLICATION_JSON)) @@ -86,9 +84,49 @@ void verifyPasswordFailTest() throws Exception { verify(userService).checkPassword(email, password); } + @Test + @DisplayName("[SUCCESS 유저 정보 변경") + void updateInfoTest() throws Exception{ + // given + String email = "test@naver.com"; + UpdateUserRequest request = UpdateUserRequest.builder() + .city("Seoul") + .build(); + String json = new ObjectMapper().writeValueAsString(request); + given(authentication.getName()).willReturn(email); + doNothing().when(userService).updateUserInfo(anyString(), any()); + // when & then + mockMvc.perform(post("/users/update-info") + .principal(authentication) + .content(json) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + @Test + @DisplayName("[Success] 유저 password 변경") + void updatePasswordTest() throws Exception{ + // given + String email = "test@naver.com"; + ChangePasswordRequest request = ChangePasswordRequest.builder() + .currentPassword("1111") + .newPassword("0000") + .confirmPassword("1234") + .build(); + + String json = new ObjectMapper().writeValueAsString(request); + + given(authentication.getName()).willReturn(email); + doNothing().when(userService).updatePassword(any()); + // when/ then + mockMvc.perform(post("/users/update-password") + .principal(authentication) + .content(json) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } }