From 3ed2f0f93f7c4e5a21c6d15d025b5331cef0488f Mon Sep 17 00:00:00 2001 From: memoer Date: Wed, 27 Jul 2022 19:47:57 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feature(#45):=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EB=94=94=20=EC=B0=BE=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 테스트 코드 아직 작성하지 않았습니다. - "이름, 생년월일" 을 통해 유저 아이디 찾기를 진행합니다. - "생년월일"이 아이디 찾기에서 사용되기 때문에, 회원가입시 "생년월일" 데이터를 필수적으로 넘겨야 하는 식으로 변경하였습니다. --- .../airjnc/user/util/UserModelMapperImpl.java | 6 ++- .../airjnc/common/advice/ExceptionAdvice.java | 4 +- .../common/exception/BadRequestException.java | 2 +- .../common/exception/DefaultException.java | 2 +- .../common/exception/DuplicatedException.java | 2 +- .../common/exception/NotFoundException.java | 2 +- .../exception/UnauthorizedException.java | 2 +- .../com/airjnc/common/util/CommonRegex.java | 6 +++ .../common/util/constant/SessionKey.java | 5 -- .../{constant => enumerate}/ErrorCode.java | 2 +- .../common/util/enumerate/SessionKey.java | 5 ++ .../common/util/factory/ErrorsFactory.java | 2 +- .../user/controller/UserController.java | 9 +++- .../com/airjnc/user/dao/UserRepository.java | 4 ++ .../user/dao/impl/MybatisUserRepository.java | 6 +++ .../airjnc/user/dao/mapper/UserMapper.java | 3 ++ .../airjnc/user/dto/request/CreateDTO.java | 13 +++-- .../airjnc/user/dto/request/FindEmailDTO.java | 18 +++++++ .../com/airjnc/user/dto/request/LogInDTO.java | 4 +- .../user/service/SessionUserStateService.java | 2 +- .../com/airjnc/user/service/UserService.java | 5 ++ src/main/java/com/airjnc/user/util/Regex.java | 10 ---- .../java/com/airjnc/user/util/UserRegex.java | 7 +++ .../resources/application-local.properties | 2 - src/main/resources/messages/errors.properties | 2 +- src/main/resources/mybatis/mapper/user.xml | 51 +++++++++++-------- .../common/util/ErrorResponseFactoryTest.java | 20 +------- .../user/controller/UserControllerTest.java | 13 ++++- .../service/SessionUserStateServiceTest.java | 2 +- .../testutil/fixture/CreateDTOFixture.java | 5 +- src/test/resources/messages/errors.properties | 3 -- 31 files changed, 138 insertions(+), 81 deletions(-) create mode 100644 src/main/java/com/airjnc/common/util/CommonRegex.java delete mode 100644 src/main/java/com/airjnc/common/util/constant/SessionKey.java rename src/main/java/com/airjnc/common/util/{constant => enumerate}/ErrorCode.java (69%) create mode 100644 src/main/java/com/airjnc/common/util/enumerate/SessionKey.java create mode 100644 src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java delete mode 100644 src/main/java/com/airjnc/user/util/Regex.java create mode 100644 src/main/java/com/airjnc/user/util/UserRegex.java delete mode 100644 src/test/resources/messages/errors.properties diff --git a/src/main/generated/com/airjnc/user/util/UserModelMapperImpl.java b/src/main/generated/com/airjnc/user/util/UserModelMapperImpl.java index 8c22a7d..4fb2ffd 100644 --- a/src/main/generated/com/airjnc/user/util/UserModelMapperImpl.java +++ b/src/main/generated/com/airjnc/user/util/UserModelMapperImpl.java @@ -3,12 +3,13 @@ import com.airjnc.user.domain.UserEntity; import com.airjnc.user.dto.request.CreateDTO; import com.airjnc.user.dto.response.UserDTO; +import java.time.LocalDate; import javax.annotation.processing.Generated; import org.springframework.stereotype.Component; @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2022-07-26T18:22:14+0900", + date = "2022-07-29T19:30:31+0900", comments = "version: 1.5.2.Final, compiler: javac, environment: Java 11.0.10 (AdoptOpenJDK)" ) @Component @@ -46,6 +47,9 @@ public UserEntity createDTOToUserEntity(CreateDTO createDTO) { userEntity.password( createDTO.getPassword() ); userEntity.name( createDTO.getName() ); userEntity.gender( createDTO.getGender() ); + if ( createDTO.getBirthDate() != null ) { + userEntity.birthDate( LocalDate.parse( createDTO.getBirthDate() ) ); + } return userEntity.build(); } diff --git a/src/main/java/com/airjnc/common/advice/ExceptionAdvice.java b/src/main/java/com/airjnc/common/advice/ExceptionAdvice.java index 7033ba7..1355d6a 100644 --- a/src/main/java/com/airjnc/common/advice/ExceptionAdvice.java +++ b/src/main/java/com/airjnc/common/advice/ExceptionAdvice.java @@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.MessageSource; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -45,7 +45,7 @@ public ErrorResponse handleDefaultException(DefaultException ex) { } // 400 - Bean Validation, BAD REQUEST - @ExceptionHandler({MethodArgumentNotValidException.class, BadRequestException.class}) + @ExceptionHandler({BindException.class, BadRequestException.class}) @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorResponse handleBadRequestException(Exception ex) { return ErrorResponseFactory.create(ex, messageSource); diff --git a/src/main/java/com/airjnc/common/exception/BadRequestException.java b/src/main/java/com/airjnc/common/exception/BadRequestException.java index 96a9187..d3d597f 100644 --- a/src/main/java/com/airjnc/common/exception/BadRequestException.java +++ b/src/main/java/com/airjnc/common/exception/BadRequestException.java @@ -1,7 +1,7 @@ package com.airjnc.common.exception; -import com.airjnc.common.util.constant.ErrorCode; +import com.airjnc.common.util.enumerate.ErrorCode; import com.airjnc.common.util.factory.ErrorsFactory; import org.springframework.validation.Errors; diff --git a/src/main/java/com/airjnc/common/exception/DefaultException.java b/src/main/java/com/airjnc/common/exception/DefaultException.java index 274fcb2..915aedd 100644 --- a/src/main/java/com/airjnc/common/exception/DefaultException.java +++ b/src/main/java/com/airjnc/common/exception/DefaultException.java @@ -1,6 +1,6 @@ package com.airjnc.common.exception; -import com.airjnc.common.util.constant.ErrorCode; +import com.airjnc.common.util.enumerate.ErrorCode; import com.airjnc.common.util.factory.ErrorsFactory; import org.springframework.validation.Errors; diff --git a/src/main/java/com/airjnc/common/exception/DuplicatedException.java b/src/main/java/com/airjnc/common/exception/DuplicatedException.java index 41e476f..83ec0df 100644 --- a/src/main/java/com/airjnc/common/exception/DuplicatedException.java +++ b/src/main/java/com/airjnc/common/exception/DuplicatedException.java @@ -1,7 +1,7 @@ package com.airjnc.common.exception; -import com.airjnc.common.util.constant.ErrorCode; +import com.airjnc.common.util.enumerate.ErrorCode; import com.airjnc.common.util.factory.ErrorsFactory; import org.springframework.validation.Errors; diff --git a/src/main/java/com/airjnc/common/exception/NotFoundException.java b/src/main/java/com/airjnc/common/exception/NotFoundException.java index e68cab7..61df51c 100644 --- a/src/main/java/com/airjnc/common/exception/NotFoundException.java +++ b/src/main/java/com/airjnc/common/exception/NotFoundException.java @@ -1,7 +1,7 @@ package com.airjnc.common.exception; -import com.airjnc.common.util.constant.ErrorCode; +import com.airjnc.common.util.enumerate.ErrorCode; import com.airjnc.common.util.factory.ErrorsFactory; import org.springframework.validation.Errors; diff --git a/src/main/java/com/airjnc/common/exception/UnauthorizedException.java b/src/main/java/com/airjnc/common/exception/UnauthorizedException.java index 5328851..593124c 100644 --- a/src/main/java/com/airjnc/common/exception/UnauthorizedException.java +++ b/src/main/java/com/airjnc/common/exception/UnauthorizedException.java @@ -1,7 +1,7 @@ package com.airjnc.common.exception; -import com.airjnc.common.util.constant.ErrorCode; +import com.airjnc.common.util.enumerate.ErrorCode; import com.airjnc.common.util.factory.ErrorsFactory; import org.springframework.validation.Errors; diff --git a/src/main/java/com/airjnc/common/util/CommonRegex.java b/src/main/java/com/airjnc/common/util/CommonRegex.java new file mode 100644 index 0000000..52c1790 --- /dev/null +++ b/src/main/java/com/airjnc/common/util/CommonRegex.java @@ -0,0 +1,6 @@ +package com.airjnc.common.util; + +public interface CommonRegex { + + String localDate = "\\d{4}-\\d{2}-\\d{2}"; +} diff --git a/src/main/java/com/airjnc/common/util/constant/SessionKey.java b/src/main/java/com/airjnc/common/util/constant/SessionKey.java deleted file mode 100644 index 0c6e7a0..0000000 --- a/src/main/java/com/airjnc/common/util/constant/SessionKey.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.airjnc.common.util.constant; - -public enum SessionKey { - USER, -} diff --git a/src/main/java/com/airjnc/common/util/constant/ErrorCode.java b/src/main/java/com/airjnc/common/util/enumerate/ErrorCode.java similarity index 69% rename from src/main/java/com/airjnc/common/util/constant/ErrorCode.java rename to src/main/java/com/airjnc/common/util/enumerate/ErrorCode.java index 9785736..3597f12 100644 --- a/src/main/java/com/airjnc/common/util/constant/ErrorCode.java +++ b/src/main/java/com/airjnc/common/util/enumerate/ErrorCode.java @@ -1,4 +1,4 @@ -package com.airjnc.common.util.constant; +package com.airjnc.common.util.enumerate; public enum ErrorCode { INTERNAL, diff --git a/src/main/java/com/airjnc/common/util/enumerate/SessionKey.java b/src/main/java/com/airjnc/common/util/enumerate/SessionKey.java new file mode 100644 index 0000000..11ac2ca --- /dev/null +++ b/src/main/java/com/airjnc/common/util/enumerate/SessionKey.java @@ -0,0 +1,5 @@ +package com.airjnc.common.util.enumerate; + +public enum SessionKey { + USER, +} diff --git a/src/main/java/com/airjnc/common/util/factory/ErrorsFactory.java b/src/main/java/com/airjnc/common/util/factory/ErrorsFactory.java index 0a276c7..93f2ab7 100644 --- a/src/main/java/com/airjnc/common/util/factory/ErrorsFactory.java +++ b/src/main/java/com/airjnc/common/util/factory/ErrorsFactory.java @@ -1,6 +1,6 @@ package com.airjnc.common.util.factory; -import com.airjnc.common.util.constant.ErrorCode; +import com.airjnc.common.util.enumerate.ErrorCode; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.Errors; diff --git a/src/main/java/com/airjnc/user/controller/UserController.java b/src/main/java/com/airjnc/user/controller/UserController.java index 8d01722..f26994f 100644 --- a/src/main/java/com/airjnc/user/controller/UserController.java +++ b/src/main/java/com/airjnc/user/controller/UserController.java @@ -3,6 +3,7 @@ import com.airjnc.common.annotation.CheckAuth; import com.airjnc.common.annotation.CurrentUserId; import com.airjnc.user.dto.request.CreateDTO; +import com.airjnc.user.dto.request.FindEmailDTO; import com.airjnc.user.dto.response.UserDTO; import com.airjnc.user.service.UserService; import com.airjnc.user.service.UserStateService; @@ -10,6 +11,8 @@ import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,6 +28,11 @@ public class UserController { private final UserStateService userStateService; + @GetMapping("/findEmail") + public String findEmail(@Validated @ModelAttribute FindEmailDTO findEmailDTO) { + return userService.findEmail(findEmailDTO); + } + @PostMapping @ResponseStatus(HttpStatus.CREATED) public UserDTO create(@RequestBody @Validated CreateDTO createDTO) { @@ -33,7 +41,6 @@ public UserDTO create(@RequestBody @Validated CreateDTO createDTO) { return userDTO; } - @DeleteMapping("/me") @ResponseStatus(HttpStatus.NO_CONTENT) @CheckAuth diff --git a/src/main/java/com/airjnc/user/dao/UserRepository.java b/src/main/java/com/airjnc/user/dao/UserRepository.java index b64404b..61d90e8 100644 --- a/src/main/java/com/airjnc/user/dao/UserRepository.java +++ b/src/main/java/com/airjnc/user/dao/UserRepository.java @@ -2,6 +2,7 @@ import com.airjnc.user.domain.UserEntity; import com.airjnc.user.dto.request.CreateDTO; +import com.airjnc.user.dto.request.FindEmailDTO; public interface UserRepository { @@ -9,7 +10,10 @@ public interface UserRepository { UserEntity findByEmail(String email); + String getEmail(FindEmailDTO findEmailDTO); + UserEntity save(CreateDTO createDTO); + void remove(Long id); } diff --git a/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java b/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java index 0f8beca..b8204e6 100644 --- a/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java +++ b/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java @@ -6,6 +6,7 @@ import com.airjnc.user.dao.mapper.UserMapper; import com.airjnc.user.domain.UserEntity; import com.airjnc.user.dto.request.CreateDTO; +import com.airjnc.user.dto.request.FindEmailDTO; import com.airjnc.user.util.UserModelMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -30,6 +31,11 @@ public UserEntity findByEmail(String email) { return userMapper.findByEmail(email).orElseThrow(NotFoundException::new); } + @Override + public String getEmail(FindEmailDTO findEmailDTO) { + return userMapper.getEmail(findEmailDTO).orElseThrow(NotFoundException::new); + } + @Override public UserEntity save(CreateDTO createDTO) { int affect = userMapper.save(createDTO); diff --git a/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java b/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java index 0d02d7a..277ff6a 100644 --- a/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java +++ b/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java @@ -2,6 +2,7 @@ import com.airjnc.user.domain.UserEntity; import com.airjnc.user.dto.request.CreateDTO; +import com.airjnc.user.dto.request.FindEmailDTO; import java.util.Optional; import org.apache.ibatis.annotations.Mapper; @@ -12,6 +13,8 @@ public interface UserMapper { Optional findByEmail(String email); + Optional getEmail(FindEmailDTO findEmailDTO); + int save(CreateDTO createDTO); int remove(Long id); diff --git a/src/main/java/com/airjnc/user/dto/request/CreateDTO.java b/src/main/java/com/airjnc/user/dto/request/CreateDTO.java index af95a2d..04ec5ea 100644 --- a/src/main/java/com/airjnc/user/dto/request/CreateDTO.java +++ b/src/main/java/com/airjnc/user/dto/request/CreateDTO.java @@ -1,8 +1,9 @@ package com.airjnc.user.dto.request; import com.airjnc.common.util.BCryptHashEncrypter; +import com.airjnc.common.util.CommonRegex; import com.airjnc.user.domain.Gender; -import com.airjnc.user.util.Regex; +import com.airjnc.user.util.UserRegex; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; @@ -28,16 +29,22 @@ public class CreateDTO { private Gender gender; @NotNull - @Pattern(regexp = Regex.Password.format) + @Pattern(regexp = UserRegex.password) private String password; + @NotNull + @Pattern(regexp = CommonRegex.localDate) + private String birthDate; + @Builder - public CreateDTO(Long id, String email, String password, String name, Gender gender) { + public CreateDTO(Long id, String email, String password, String name, Gender gender, + String birthDate) { this.id = id; this.email = email; this.password = password; this.name = name; this.gender = gender; + this.birthDate = birthDate; } public void changePasswordToHash() { diff --git a/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java b/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java new file mode 100644 index 0000000..48d40f2 --- /dev/null +++ b/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java @@ -0,0 +1,18 @@ +package com.airjnc.user.dto.request; + +import com.airjnc.common.util.CommonRegex; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class FindEmailDTO { + + @NotNull + private final String name; + + @Pattern(regexp = CommonRegex.localDate) + private final String birthDate; +} diff --git a/src/main/java/com/airjnc/user/dto/request/LogInDTO.java b/src/main/java/com/airjnc/user/dto/request/LogInDTO.java index 869ea89..67058da 100644 --- a/src/main/java/com/airjnc/user/dto/request/LogInDTO.java +++ b/src/main/java/com/airjnc/user/dto/request/LogInDTO.java @@ -1,6 +1,6 @@ package com.airjnc.user.dto.request; -import com.airjnc.user.util.Regex; +import com.airjnc.user.util.UserRegex; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; @@ -18,7 +18,7 @@ public class LogInDTO { private String email; @NotNull - @Pattern(regexp = Regex.Password.format) + @Pattern(regexp = UserRegex.password) private String password; @Builder diff --git a/src/main/java/com/airjnc/user/service/SessionUserStateService.java b/src/main/java/com/airjnc/user/service/SessionUserStateService.java index c4cb77f..3dfdc03 100644 --- a/src/main/java/com/airjnc/user/service/SessionUserStateService.java +++ b/src/main/java/com/airjnc/user/service/SessionUserStateService.java @@ -1,6 +1,6 @@ package com.airjnc.user.service; -import com.airjnc.common.util.constant.SessionKey; +import com.airjnc.common.util.enumerate.SessionKey; import javax.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/airjnc/user/service/UserService.java b/src/main/java/com/airjnc/user/service/UserService.java index 654419e..107d551 100644 --- a/src/main/java/com/airjnc/user/service/UserService.java +++ b/src/main/java/com/airjnc/user/service/UserService.java @@ -3,6 +3,7 @@ import com.airjnc.user.dao.UserRepository; import com.airjnc.user.domain.UserEntity; import com.airjnc.user.dto.request.CreateDTO; +import com.airjnc.user.dto.request.FindEmailDTO; import com.airjnc.user.dto.response.UserDTO; import com.airjnc.user.util.UserModelMapper; import lombok.RequiredArgsConstructor; @@ -28,4 +29,8 @@ public UserDTO create(CreateDTO createDTO) { public void remove(Long id) { userRepository.remove(id); } + + public String findEmail(FindEmailDTO findEmailDTO) { + return userRepository.getEmail(findEmailDTO); + } } diff --git a/src/main/java/com/airjnc/user/util/Regex.java b/src/main/java/com/airjnc/user/util/Regex.java deleted file mode 100644 index 39f1673..0000000 --- a/src/main/java/com/airjnc/user/util/Regex.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.airjnc.user.util; - -public interface Regex { - - interface Password { - - String format = "^(?=.*[0-9])(?=.*[a-z])(?=.*[@#!~$%^&-+=()])(?=\\S+$).{8,16}$"; - } -} - diff --git a/src/main/java/com/airjnc/user/util/UserRegex.java b/src/main/java/com/airjnc/user/util/UserRegex.java new file mode 100644 index 0000000..839e7bb --- /dev/null +++ b/src/main/java/com/airjnc/user/util/UserRegex.java @@ -0,0 +1,7 @@ +package com.airjnc.user.util; + +public interface UserRegex { + + String password = "^(?=.*[0-9])(?=.*[a-z])(?=.*[@#!~$%^&-+=()])(?=\\S+$).{8,16}$"; +} + diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 7c41079..e4c6e3a 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -5,5 +5,3 @@ spring.datasource.password=q1w2e3 logging.level.org.springframework.jdbc=debug # MessageSource spring.messages.basename=errors -# Session -session.expire=86400 \ No newline at end of file diff --git a/src/main/resources/messages/errors.properties b/src/main/resources/messages/errors.properties index da45a88..5d9cff6 100644 --- a/src/main/resources/messages/errors.properties +++ b/src/main/resources/messages/errors.properties @@ -16,4 +16,4 @@ Pattern.password=\uC601\uC5B4 \uC18C\uBB38\uC790, \uC22B\uC790, \uD2B9\uC218\uBB ### Mine UserCheckService.emailIsDuplicated=\uC774\uBBF8 \uC874\uC7AC\uD558\uB294 \uC774\uBA54\uC77C\uC785\uB2C8\uB2E4. UserCheckService.passwordIsNotMatch=\uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -CommonCheckService.isNotMatch=actual: {0}, but expected: {1} +CommonInternalCheckService.isNotMatch=actual: {0}, but expected: {1} diff --git a/src/main/resources/mybatis/mapper/user.xml b/src/main/resources/mybatis/mapper/user.xml index ff6a544..ab366b2 100644 --- a/src/main/resources/mybatis/mapper/user.xml +++ b/src/main/resources/mybatis/mapper/user.xml @@ -1,25 +1,32 @@ - + - - - - INSERT INTO user (email, password, name, gender) - VALUES (#{email}, #{password}, #{name}, #{gender}); - - - UPDATE user - set deleted_at = now() - WHERE id = #{id} - AND deleted_at IS NULL - + + UPDATE user + set deleted_at = now() + WHERE id = #{id} + AND deleted_at IS NULL + + + INSERT INTO user (email, password, name, gender) + VALUES (#{email}, #{password}, #{name}, #{gender}); + + + + diff --git a/src/test/java/com/airjnc/common/util/ErrorResponseFactoryTest.java b/src/test/java/com/airjnc/common/util/ErrorResponseFactoryTest.java index 221027f..47538cd 100644 --- a/src/test/java/com/airjnc/common/util/ErrorResponseFactoryTest.java +++ b/src/test/java/com/airjnc/common/util/ErrorResponseFactoryTest.java @@ -11,8 +11,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.validation.BeanPropertyBindingResult; -import org.springframework.validation.BindException; import org.springframework.validation.Errors; @UnitTest @@ -28,31 +26,17 @@ void beforeEach() { } @Test - void whenCodeIsInPropertiesThenGetTheMessageInProperties() { + void whenDefaultExceptionThenSuccessfullyResolveMessage() { //given DefaultException ex = new DefaultException(); //when ErrorResponse errorResponse = ErrorResponseFactory.create(ex, messageSource); //then assertThat(errorResponse.getGlobal().size()).isSameAs(1); - assertThat(errorResponse.getGlobal().get(0)).isEqualTo("message from errors.properties"); + assertThat(errorResponse.getGlobal().get(0)).isEqualTo("Error"); assertThat(errorResponse.getField().size()).isSameAs(0); } - @Test - void whenPassBindExceptionThenSuccessfullyResolveMessage() { - //given - BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(new Target(), "target"); - bindingResult.rejectValue("test", "required"); - BindException ex = new BindException(bindingResult); - //when - ErrorResponse errorResponse = ErrorResponseFactory.create(ex, messageSource); - //then - assertThat(errorResponse.getGlobal().size()).isSameAs(0); - assertThat(errorResponse.getField().size()).isSameAs(1); - assertThat(errorResponse.getField().get("test")).isEqualTo("required message"); - } - // 어떤 Code들이 나오는지 학습 테스트 @Test void codesTest() { diff --git a/src/test/java/com/airjnc/user/controller/UserControllerTest.java b/src/test/java/com/airjnc/user/controller/UserControllerTest.java index b263cdc..b62b8f5 100644 --- a/src/test/java/com/airjnc/user/controller/UserControllerTest.java +++ b/src/test/java/com/airjnc/user/controller/UserControllerTest.java @@ -5,6 +5,7 @@ import static org.mockito.BDDMockito.then; import static org.mockito.BDDMockito.times; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +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.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -19,6 +20,7 @@ import com.testutil.annotation.AopTest; import com.testutil.fixture.CreateDTOFixture; import com.testutil.fixture.UserDTOFixture; +import java.time.LocalDate; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -49,6 +51,16 @@ class UserControllerTest { @SpyBean CurrentUserIdArgumentResolver currentUserIdArgumentResolver; + @Test + void findEmail() throws Exception { + LocalDate now = LocalDate.now(); + mockMvc.perform( + get("/users/findEmail") + .param("email", "hanjn2842@naver.com") + .param("birthDate", "2022-01-02") + ).andDo(print()); + } + @Test void create() throws Exception { //given @@ -88,4 +100,3 @@ void remove() throws Exception { then(userStateService).should(times(1)).remove(); } } - diff --git a/src/test/java/com/airjnc/user/service/SessionUserStateServiceTest.java b/src/test/java/com/airjnc/user/service/SessionUserStateServiceTest.java index 7f64641..efcd829 100644 --- a/src/test/java/com/airjnc/user/service/SessionUserStateServiceTest.java +++ b/src/test/java/com/airjnc/user/service/SessionUserStateServiceTest.java @@ -4,7 +4,7 @@ import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.mockito.BDDMockito.times; -import com.airjnc.common.util.constant.SessionKey; +import com.airjnc.common.util.enumerate.SessionKey; import com.testutil.annotation.UnitTest; import javax.servlet.http.HttpSession; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/testutil/fixture/CreateDTOFixture.java b/src/test/java/com/testutil/fixture/CreateDTOFixture.java index 158da22..c98194e 100644 --- a/src/test/java/com/testutil/fixture/CreateDTOFixture.java +++ b/src/test/java/com/testutil/fixture/CreateDTOFixture.java @@ -13,11 +13,14 @@ public class CreateDTOFixture { public static final Gender GENDER = Gender.MALE; + public static final String birthDate = "2020-01-01"; + public static CreateDTO.CreateDTOBuilder getBuilder() { return CreateDTO.builder() .email(EMAIL) .password(PASSWORD) .name(NAME) - .gender(GENDER); + .gender(GENDER) + .birthDate(birthDate); } } diff --git a/src/test/resources/messages/errors.properties b/src/test/resources/messages/errors.properties deleted file mode 100644 index 02c12cc..0000000 --- a/src/test/resources/messages/errors.properties +++ /dev/null @@ -1,3 +0,0 @@ -INTERNAL=message from errors.properties -required=required message -CommonInternalCheckService.isNotMatch=actual: {0}, but expected: {1} From e600920f75a394a751b16feac57ccbde4012081c Mon Sep 17 00:00:00 2001 From: memoer Date: Wed, 27 Jul 2022 20:23:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?test(#45):=20=EC=9C=A0=EC=A0=80=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=20=EC=B0=BE=EA=B8=B0=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/airjnc/user/dao/UserRepository.java | 9 +++--- .../user/dao/impl/MybatisUserRepository.java | 22 +++++++------- .../airjnc/user/dao/mapper/UserMapper.java | 8 ++--- .../airjnc/user/dto/request/FindEmailDTO.java | 9 ++++-- src/main/resources/mybatis/mapper/user.xml | 2 +- .../user/controller/UserControllerTest.java | 22 ++++++++++---- .../dao/impl/MybatisUserRepositoryTest.java | 15 ++++++++++ .../airjnc/user/service/UserServiceTest.java | 16 ++++++++-- .../testutil/config/TestDatabaseConfig.java | 20 +++++++++---- .../testutil/fixture/CreateDTOFixture.java | 8 ++--- .../testutil/fixture/FindEmailDTOFixture.java | 12 ++++++++ .../com/testutil/fixture/LogInDTOFixture.java | 5 +--- .../com/testutil/fixture/UserDTOFixture.java | 30 +++++-------------- .../testutil/fixture/UserEntityFixture.java | 2 +- 14 files changed, 111 insertions(+), 69 deletions(-) create mode 100644 src/test/java/com/testutil/fixture/FindEmailDTOFixture.java diff --git a/src/main/java/com/airjnc/user/dao/UserRepository.java b/src/main/java/com/airjnc/user/dao/UserRepository.java index 61d90e8..54762de 100644 --- a/src/main/java/com/airjnc/user/dao/UserRepository.java +++ b/src/main/java/com/airjnc/user/dao/UserRepository.java @@ -6,14 +6,13 @@ public interface UserRepository { - UserEntity findById(Long id); + void remove(Long id); - UserEntity findByEmail(String email); + UserEntity save(CreateDTO createDTO); String getEmail(FindEmailDTO findEmailDTO); - UserEntity save(CreateDTO createDTO); - + UserEntity findByEmail(String email); - void remove(Long id); + UserEntity findById(Long id); } diff --git a/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java b/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java index b8204e6..7b56e9e 100644 --- a/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java +++ b/src/main/java/com/airjnc/user/dao/impl/MybatisUserRepository.java @@ -22,13 +22,16 @@ public class MybatisUserRepository implements UserRepository { private final UserModelMapper userModelMapper; @Override - public UserEntity findById(Long id) { - return userMapper.findById(id).orElseThrow(NotFoundException::new); + public void remove(Long id) { + int affect = userMapper.remove(id); + commonInternalCheckService.shouldBeMatch(affect, 1); } @Override - public UserEntity findByEmail(String email) { - return userMapper.findByEmail(email).orElseThrow(NotFoundException::new); + public UserEntity save(CreateDTO createDTO) { + int affect = userMapper.save(createDTO); + commonInternalCheckService.shouldBeMatch(affect, 1); + return userModelMapper.createDTOToUserEntity(createDTO); } @Override @@ -37,15 +40,12 @@ public String getEmail(FindEmailDTO findEmailDTO) { } @Override - public UserEntity save(CreateDTO createDTO) { - int affect = userMapper.save(createDTO); - commonInternalCheckService.shouldBeMatch(affect, 1); - return userModelMapper.createDTOToUserEntity(createDTO); + public UserEntity findById(Long id) { + return userMapper.findById(id).orElseThrow(NotFoundException::new); } @Override - public void remove(Long id) { - int affect = userMapper.remove(id); - commonInternalCheckService.shouldBeMatch(affect, 1); + public UserEntity findByEmail(String email) { + return userMapper.findByEmail(email).orElseThrow(NotFoundException::new); } } diff --git a/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java b/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java index 277ff6a..b706b90 100644 --- a/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java +++ b/src/main/java/com/airjnc/user/dao/mapper/UserMapper.java @@ -9,13 +9,13 @@ @Mapper public interface UserMapper { - Optional findById(Long id); + int remove(Long id); - Optional findByEmail(String email); + int save(CreateDTO createDTO); Optional getEmail(FindEmailDTO findEmailDTO); - int save(CreateDTO createDTO); + Optional findById(Long id); - int remove(Long id); + Optional findByEmail(String email); } diff --git a/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java b/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java index 48d40f2..cd8690d 100644 --- a/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java +++ b/src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java @@ -3,11 +3,10 @@ import com.airjnc.common.util.CommonRegex; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; +import lombok.Builder; import lombok.Getter; -import lombok.RequiredArgsConstructor; @Getter -@RequiredArgsConstructor public class FindEmailDTO { @NotNull @@ -15,4 +14,10 @@ public class FindEmailDTO { @Pattern(regexp = CommonRegex.localDate) private final String birthDate; + + @Builder + public FindEmailDTO(String name, String birthDate) { + this.name = name; + this.birthDate = birthDate; + } } diff --git a/src/main/resources/mybatis/mapper/user.xml b/src/main/resources/mybatis/mapper/user.xml index ab366b2..6b78100 100644 --- a/src/main/resources/mybatis/mapper/user.xml +++ b/src/main/resources/mybatis/mapper/user.xml @@ -16,7 +16,7 @@ SELECT email FROM user WHERE name = #{name} - AND birthdate = ${birthDate}; + AND birthdate = #{birthDate};