From 4af396636d481df4a615a2f70b587d0b5d433a0e Mon Sep 17 00:00:00 2001 From: bum12ark Date: Thu, 24 Feb 2022 21:39:30 +0900 Subject: [PATCH] =?UTF-8?q?feat(user-service):=20=EC=A0=90=EC=A3=BC=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20-=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 중복 이메일 로직 추가 - DuplicateUserEmailException 추가 - 테스트 추가 --- user-service/src/docs/asciidoc/api-docs.adoc | 4 +- .../user/exception/DuplicateUserEmail.java | 11 +++ .../user/repository/UserRepository.java | 1 + .../domain/user/service/UserServiceImpl.java | 8 +- .../domain/user/web/UserControllerTest.java | 93 ++++++++++++++++++- 5 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 user-service/src/main/java/com/justpickup/userservice/domain/user/exception/DuplicateUserEmail.java diff --git a/user-service/src/docs/asciidoc/api-docs.adoc b/user-service/src/docs/asciidoc/api-docs.adoc index da78051..8bb36ad 100644 --- a/user-service/src/docs/asciidoc/api-docs.adoc +++ b/user-service/src/docs/asciidoc/api-docs.adoc @@ -72,4 +72,6 @@ operation::customer-get-notExistUserException[snippets='curl-request,http-reques == 점주 === 회원가입 - 점주 -operation::storeOwner-post[snippets='curl-request,http-request,http-response,request-fields,response-fields'] \ No newline at end of file +operation::storeOwner-post[snippets='curl-request,http-request,http-response,request-fields,response-fields'] +=== 회원가입 - 점주 : 중복 이메일 +operation::storeOwner-post-duplicateUserEmailException[snippets='curl-request,http-request,http-response,request-fields,response-fields'] \ No newline at end of file diff --git a/user-service/src/main/java/com/justpickup/userservice/domain/user/exception/DuplicateUserEmail.java b/user-service/src/main/java/com/justpickup/userservice/domain/user/exception/DuplicateUserEmail.java new file mode 100644 index 0000000..6d4f0a3 --- /dev/null +++ b/user-service/src/main/java/com/justpickup/userservice/domain/user/exception/DuplicateUserEmail.java @@ -0,0 +1,11 @@ +package com.justpickup.userservice.domain.user.exception; + +import com.justpickup.userservice.global.exception.CustomException; +import org.springframework.http.HttpStatus; + +public class DuplicateUserEmail extends CustomException { + + public DuplicateUserEmail(String message) { + super(HttpStatus.CONFLICT, message); + } +} diff --git a/user-service/src/main/java/com/justpickup/userservice/domain/user/repository/UserRepository.java b/user-service/src/main/java/com/justpickup/userservice/domain/user/repository/UserRepository.java index 4b8113c..c5efd3c 100644 --- a/user-service/src/main/java/com/justpickup/userservice/domain/user/repository/UserRepository.java +++ b/user-service/src/main/java/com/justpickup/userservice/domain/user/repository/UserRepository.java @@ -7,4 +7,5 @@ import java.util.Optional; public interface UserRepository extends JpaRepository { Optional findByEmail(String username); + boolean existsByEmail(String email); } diff --git a/user-service/src/main/java/com/justpickup/userservice/domain/user/service/UserServiceImpl.java b/user-service/src/main/java/com/justpickup/userservice/domain/user/service/UserServiceImpl.java index aa4e323..7ac0eda 100644 --- a/user-service/src/main/java/com/justpickup/userservice/domain/user/service/UserServiceImpl.java +++ b/user-service/src/main/java/com/justpickup/userservice/domain/user/service/UserServiceImpl.java @@ -5,6 +5,7 @@ import com.justpickup.userservice.domain.user.dto.StoreOwnerDto; import com.justpickup.userservice.domain.user.entity.Customer; import com.justpickup.userservice.domain.user.entity.StoreOwner; import com.justpickup.userservice.domain.user.entity.User; +import com.justpickup.userservice.domain.user.exception.DuplicateUserEmail; import com.justpickup.userservice.domain.user.exception.NotExistUserException; import com.justpickup.userservice.domain.user.repository.CustomerRepository; import com.justpickup.userservice.domain.user.repository.UserRepository; @@ -53,9 +54,14 @@ public class UserServiceImpl implements UserService, UserDetailsService { @Override @Transactional public void saveStoreOwner(StoreOwnerDto storeOwnerDto) { + String email = storeOwnerDto.getEmail(); + boolean exists = userRepository.existsByEmail(email); + + if (exists) throw new DuplicateUserEmail(email + "은 중복된 이메일입니다."); + String encode = passwordEncoder.encode(storeOwnerDto.getPassword()); - StoreOwner storeOwner = new StoreOwner(storeOwnerDto.getEmail(), encode, storeOwnerDto.getName(), + StoreOwner storeOwner = new StoreOwner(email, encode, storeOwnerDto.getName(), storeOwnerDto.getPhoneNumber(), storeOwnerDto.getBusinessNumber()); StoreOwner save = userRepository.save(storeOwner); diff --git a/user-service/src/test/java/com/justpickup/userservice/domain/user/web/UserControllerTest.java b/user-service/src/test/java/com/justpickup/userservice/domain/user/web/UserControllerTest.java index d27be15..93c2c3d 100644 --- a/user-service/src/test/java/com/justpickup/userservice/domain/user/web/UserControllerTest.java +++ b/user-service/src/test/java/com/justpickup/userservice/domain/user/web/UserControllerTest.java @@ -3,25 +3,34 @@ package com.justpickup.userservice.domain.user.web; import com.fasterxml.jackson.databind.ObjectMapper; import com.justpickup.userservice.config.TestConfig; import com.justpickup.userservice.domain.user.dto.CustomerDto; +import com.justpickup.userservice.domain.user.exception.DuplicateUserEmail; import com.justpickup.userservice.domain.user.exception.NotExistUserException; import com.justpickup.userservice.domain.user.service.UserService; import com.justpickup.userservice.global.dto.Code; +import com.justpickup.userservice.global.security.SecurityConfig; +import com.justpickup.userservice.global.utils.CookieProvider; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +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.boot.test.mock.mockito.SpyBean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; -import org.springframework.restdocs.payload.FieldDescriptor; +import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willThrow; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -29,7 +38,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@WebMvcTest(UserController.class) +@WebMvcTest(controllers = UserController.class, + excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class)} +) +@AutoConfigureMockMvc(addFilters = false) @Import(TestConfig.class) @AutoConfigureRestDocs(uriHost = "127.0.0.1", uriPort = 8001) class UserControllerTest { @@ -43,6 +55,9 @@ class UserControllerTest { @MockBean UserService userService; + @SpyBean + CookieProvider cookieProvider; + @Test @DisplayName("회원 조회") void getCustomer() throws Exception { @@ -115,4 +130,72 @@ class UserControllerTest { )) ; } + + @Test + @DisplayName("회원가입 - 점주") + void registerStoreOwner() throws Exception { + UserController.JoinStoreOwnerRequest requestBody = + new UserController.JoinStoreOwnerRequest("test@naver.com", "1234", "Park", + "010-1234-5678", "1234"); + + ResultActions actions = mockMvc.perform(post("/store-owner") + .content(objectMapper.writeValueAsString(requestBody)) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + ); + + actions.andExpect(status().isCreated()) + .andDo(print()) + .andDo(document("storeOwner-post", + requestFields( + fieldWithPath("email").description("이메일"), + fieldWithPath("password").description("비밀번호"), + fieldWithPath("name").description("이름"), + fieldWithPath("phoneNumber").description("휴대폰번호"), + fieldWithPath("businessNumber").description("사업자등록번호") + ), + responseFields( + fieldWithPath("code").description("결과코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data").description("데이터") + ) + )) + ; + } + + @Test + @DisplayName("회원가입 - 점주 : 존재하는 회원 이메일") + void registerStoreOwnerDuplicateUserEmailException() throws Exception { + String email = "test@naver.com"; + UserController.JoinStoreOwnerRequest requestBody = + new UserController.JoinStoreOwnerRequest(email, "1234", "Park", + "010-1234-5678", "1234"); + + willThrow(new DuplicateUserEmail(email + "은 중복된 이메일입니다.")) + .given(userService).saveStoreOwner(any()); + + ResultActions actions = mockMvc.perform(post("/store-owner") + .content(objectMapper.writeValueAsString(requestBody)) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + ); + + actions.andExpect(status().isConflict()) + .andDo(print()) + .andDo(document("storeOwner-post-duplicateUserEmailException", + requestFields( + fieldWithPath("email").description("이메일"), + fieldWithPath("password").description("비밀번호"), + fieldWithPath("name").description("이름"), + fieldWithPath("phoneNumber").description("휴대폰번호"), + fieldWithPath("businessNumber").description("사업자등록번호") + ), + responseFields( + fieldWithPath("code").description("결과코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data").description("데이터") + ) + )) + ; + } } \ No newline at end of file