Skip to content

Commit

Permalink
Merge pull request #70 from f-lab-edu/test/#45,#46,#56
Browse files Browse the repository at this point in the history
[#45,#46,#56] 테스트 코드 작성
  • Loading branch information
memoer committed Aug 16, 2022
2 parents 10a4be5 + 38fba74 commit 244a964
Show file tree
Hide file tree
Showing 25 changed files with 560 additions and 157 deletions.
14 changes: 14 additions & 0 deletions src/main/java/com/airjnc/common/service/CommonCheckService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.airjnc.common.service;

import com.airjnc.common.exception.BadRequestException;
import com.airjnc.common.exception.DefaultException;
import com.airjnc.common.util.factory.ErrorsFactory;
import lombok.RequiredArgsConstructor;
Expand All @@ -21,4 +22,17 @@ public void shouldBeMatch(int actual, int expected) {
ErrorsFactory.createAndReject(this.getClass().getSimpleName(), "shouldBeMatch", new Object[]{actual, expected})
);
}

public void shouldBeMatch(String actual, String expected) {
if (actual.equals(expected)) {
return;
}
/*
1. CommonCheckService.isNotMatch
2. CommonCheckService
*/
throw new BadRequestException(
ErrorsFactory.createAndReject(this.getClass().getSimpleName(), "shouldBeMatch", new Object[]{actual, expected})
);
}
}
14 changes: 2 additions & 12 deletions src/main/java/com/airjnc/common/service/CommonUtilService.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.airjnc.common.service;

import com.airjnc.common.dao.RedisDao;
import com.airjnc.common.exception.NotFoundException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Random;
Expand Down Expand Up @@ -30,16 +29,7 @@ public HttpEntity<String> createHttpEntity(HttpHeaders headers, Object body) {

public String generateCode() {
Random random = new Random(System.nanoTime());
String code = null;
while (true) {
try {
int n = random.nextInt(999_999);
code = String.format("%06d", n);
redisDao.get(code);
} catch (NotFoundException e) {
break;
}
}
return code;
int n = random.nextInt(999_999);
return String.format("%06d", n);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class AuthController {
private final UserStateService userStateService;

@PostMapping("/logIn")
public UserResp logIn(@RequestBody @Validated AuthLogInReq authLogInReq) {
public UserResp logIn(@Validated @RequestBody AuthLogInReq authLogInReq) {
UserResp userResp = authService.logIn(authLogInReq);
userStateService.create(userResp.getId());
return userResp;
Expand Down
8 changes: 0 additions & 8 deletions src/main/java/com/airjnc/user/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.airjnc.user.dto.request.UserInquiryEmailReq;
import com.airjnc.user.dto.request.UserInquiryPasswordViaEmailReq;
import com.airjnc.user.dto.request.UserResetPwdReq;
import com.airjnc.user.dto.request.inquiryPasswordViaPhoneReq;
import com.airjnc.user.dto.response.UserInquiryEmailResp;
import com.airjnc.user.dto.response.UserResp;
import com.airjnc.user.service.UserService;
Expand Down Expand Up @@ -60,13 +59,6 @@ public void inquiryPasswordViaEmail(
userService.inquiryPasswordViaEmail(userinquiryPasswordViaEmailReq);
}

// Naver에서 발신번호 등록이 계속해서 안되고 있어서, 일단 보류함
// @GetMapping(value = "/inquiryPassword", params = "phone")
public void inquiryPasswordViaPhone(
@Validated @ModelAttribute inquiryPasswordViaPhoneReq inquiryPasswordViaPhoneReq) {
userService.inquiryPasswordViaPhone(inquiryPasswordViaPhoneReq);
}

@PutMapping("/resetPassword")
public void resetPassword(@Validated @RequestBody UserResetPwdReq userResetPwdReq) {
userService.resetPassword(userResetPwdReq);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.airjnc.user.dto.request;

import com.airjnc.user.util.UserRegex;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
Expand All @@ -13,6 +14,10 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class UserResetPwdReq {

@NotBlank
@Email
private String email;

@NotBlank
@Size(min = 6, max = 6)
private String code;
Expand All @@ -23,7 +28,8 @@ public class UserResetPwdReq {


@Builder
public UserResetPwdReq(String code, String password) {
public UserResetPwdReq(String email, String code, String password) {
this.email = email;
this.code = code;
this.password = password;
}
Expand Down
33 changes: 11 additions & 22 deletions src/main/java/com/airjnc/user/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.airjnc.common.dao.RedisDao;
import com.airjnc.common.properties.SessionTtlProperties;
import com.airjnc.common.service.CommonCheckService;
import com.airjnc.common.service.CommonUtilService;
import com.airjnc.common.service.HashService;
import com.airjnc.mail.dto.SendUsingTemplateDto;
Expand All @@ -12,7 +13,6 @@
import com.airjnc.user.dto.request.UserInquiryEmailReq;
import com.airjnc.user.dto.request.UserInquiryPasswordViaEmailReq;
import com.airjnc.user.dto.request.UserResetPwdReq;
import com.airjnc.user.dto.request.inquiryPasswordViaPhoneReq;
import com.airjnc.user.dto.response.UserInquiryEmailResp;
import com.airjnc.user.dto.response.UserResp;
import com.airjnc.user.util.UserModelMapper;
Expand All @@ -39,6 +39,8 @@ public class UserService {

private final SessionTtlProperties sessionTtlProperties;

private final CommonCheckService commonCheckService;

public UserResp create(UserCreateReq userCreateReq) {
userCheckService.emailShouldNotBeDuplicated(userCreateReq.getEmail());
String hash = hashService.encrypt(userCreateReq.getPassword());
Expand All @@ -50,12 +52,6 @@ public void delete(Long currentUserId) {
userRepository.delete(currentUserId);
}

private String generateAndRestoreCode(String email) {
String code = commonUtilService.generateCode();
redisDao.store(code, email, sessionTtlProperties.getResetPasswordCode());
return code;
}

public UserInquiryEmailResp inquiryEmail(UserInquiryEmailReq userInquiryEmailReq) {
UserEntity userEntity = userRepository.findWithDeletedByNameAndBirthDate(
userInquiryEmailReq.getName(),
Expand All @@ -65,28 +61,21 @@ public UserInquiryEmailResp inquiryEmail(UserInquiryEmailReq userInquiryEmailReq
}

public void inquiryPasswordViaEmail(UserInquiryPasswordViaEmailReq userInquiryPasswordViaEmailReq) {
UserEntity user = userRepository.findByEmail(userInquiryPasswordViaEmailReq.getEmail());
String code = generateAndRestoreCode(user.getEmail());
UserEntity user = userRepository.findWithDeletedByEmail(userInquiryPasswordViaEmailReq.getEmail());
String code = commonUtilService.generateCode();
redisDao.store(user.getEmail(), code, sessionTtlProperties.getResetPasswordCode());
mailService.send(
userInquiryPasswordViaEmailReq.getEmail(),
SendUsingTemplateDto.builder()
.name(user.getName())
.code(code)
.build()
SendUsingTemplateDto.builder().name(user.getName()).code(code).build()
);
}

public void inquiryPasswordViaPhone(inquiryPasswordViaPhoneReq inquiryPasswordViaPhoneReq) {
UserEntity user = userRepository.findByPhoneNumber(inquiryPasswordViaPhoneReq.getPhone());
String code = generateAndRestoreCode(user.getEmail());
// TODO: send sms
}

public void resetPassword(UserResetPwdReq userResetPwdReq) {
String email = redisDao.get(userResetPwdReq.getCode());
redisDao.delete(userResetPwdReq.getCode());
String code = redisDao.get(userResetPwdReq.getEmail());
commonCheckService.shouldBeMatch(code, userResetPwdReq.getCode());
redisDao.delete(userResetPwdReq.getEmail());
String hash = hashService.encrypt(userResetPwdReq.getPassword());
userRepository.updatePasswordByEmail(email, hash);
userRepository.updatePasswordByEmail(userResetPwdReq.getEmail(), hash);
}

public void restore(Long userId) {
Expand Down
17 changes: 17 additions & 0 deletions src/test/java/com/airjnc/AirjncApplicationTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.airjnc;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

@ActiveProfiles("local")
@SpringBootTest
@Tag("integration")
public class AirjncApplicationTest {

@Test
void contextLoads() {
// 지우지마세요. SpringBoot 의존성 테스트를 하기 위한 메소드입니다.
}
}
20 changes: 0 additions & 20 deletions src/test/java/com/airjnc/common/service/CommonUtilServiceTest.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package com.airjnc.common.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.times;
import com.airjnc.common.dao.RedisDao;
import com.airjnc.common.exception.NotFoundException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.testutil.annotation.UnitTest;
Expand All @@ -22,9 +19,6 @@
@UnitTest
class CommonUtilServiceTest {

@Mock
RedisDao redisDao;

@Mock
ObjectMapper objectMapper;

Expand All @@ -47,23 +41,9 @@ void createEntity() throws JsonProcessingException {

@Test
void generateCodeOnce() {
//given
given(redisDao.get(anyString())).willThrow(NotFoundException.class);
//when
String code = commonUtilService.generateCode();
//then
assertThat(code.length()).isEqualTo(6);
then(redisDao).should(times(1)).get(code);
}

@Test
void generateCodeTwice() {
//given
given(redisDao.get(anyString())).willReturn(anyString()).willThrow(NotFoundException.class);
//when
String code = commonUtilService.generateCode();
//then
assertThat(code.length()).isEqualTo(6);
then(redisDao).should(times(2)).get(anyString());
}
}
7 changes: 3 additions & 4 deletions src/test/java/com/airjnc/mail/service/NcpMailServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import com.airjnc.mail.dto.SendUsingTemplateDto;
import com.airjnc.mail.properties.NcpMailProperties;
import com.testutil.annotation.UnitTest;
import com.testutil.fixture.UserEntityFixture;
import com.testutil.testdata.TestUser;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand Down Expand Up @@ -83,10 +83,9 @@ void send() {
given(commonUtilService.createHttpEntity(eq(headers), any(NcpMailSendReqDto.class))).willReturn(entity);
given(restTemplate.postForObject(sendUri, entity, NcpMailSendRespDto.class)).willReturn(res);
//when
SendUsingTemplateDto sendUsingTemplateDto = SendUsingTemplateDto.builder().name(UserEntityFixture.NAME)
.code("123456")
SendUsingTemplateDto sendUsingTemplateDto = SendUsingTemplateDto.builder().name(TestUser.NAME).code("123456")
.build();
ncpMailService.send(UserEntityFixture.EMAIL, sendUsingTemplateDto);
ncpMailService.send(TestUser.EMAIL, sendUsingTemplateDto);
//then
then(commonNcpService).should(times(1)).createHeaders(sendUri);
then(commonUtilService).should(times(1)).createHttpEntity(eq(headers), any(NcpMailSendReqDto.class));
Expand Down
15 changes: 15 additions & 0 deletions src/test/java/com/airjnc/user/controller/AuthControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,21 @@
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import com.airjnc.common.interceptor.CheckAuthInterceptor;
import com.airjnc.user.dto.request.AuthLogInReq;
import com.airjnc.user.dto.response.UserResp;
import com.airjnc.user.service.AuthService;
import com.airjnc.user.service.UserStateService;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.testutil.fixture.AuthLogInReqFixture;
import com.testutil.fixture.UserRespFixture;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

Expand All @@ -38,6 +42,15 @@ class AuthControllerTest {
@MockBean
UserStateService userStateService;

@SpyBean
CheckAuthInterceptor checkAuthInterceptor;

private void checkInterceptor(int n) throws Exception {
then(checkAuthInterceptor).should(times(1))
.preHandle(any(HttpServletRequest.class), any(HttpServletResponse.class), any(Object.class));
then(userStateService).should(times(n)).getUserId();
}

@Test
void logIn() throws Exception {
//given
Expand All @@ -53,6 +66,7 @@ void logIn() throws Exception {
.andExpect(status().isOk())
.andExpect(jsonPath("id").value(userResp.getId()));
//then
checkInterceptor(0);
then(authService).should(times(1)).logIn(any(AuthLogInReq.class));
then(userStateService).should(times(1)).create(userResp.getId());
}
Expand All @@ -66,6 +80,7 @@ void logOut() throws Exception {
).andDo(print())
.andExpect(status().isOk());
//then
checkInterceptor(1);
then(userStateService).should(times(1)).delete();
}
}
Loading

0 comments on commit 244a964

Please sign in to comment.