From 04067641aa596b17b473027e7094f1e60934381b Mon Sep 17 00:00:00 2001 From: Gape <45617104+jaekkang@users.noreply.github.com> Date: Sun, 29 Oct 2023 21:29:21 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20Member=20controller=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8A=B9=EC=9D=B8(#60)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Init: Create member repository 멤버 데이터를 저장하기 위한 저장소를 만들었습니다. 기본적인 영속성 추가를 위한 save()와 단건 데이터 검색과 전체 조회 메서드를 추가했습니다. * Refactor: Change MemberRepository type MemberRepository의 형식을 JPA Repository를 상속받는 형식으로 수정하였습니다. * Feat: Add method for findByName name을 기준으로 검색을 하는 메서드를 추가했습니다. * Refactor: Change logic in create method 생성 메서드를 Builder 사용하는 방식으로 수정하였습니다. * Style: Change method name 잘못 작성한 메서드의 이름을 변경하였습니다. findByName -> findByusername * Test: Add MemberRepository Test 작성한 Member Repository Test 추가했습니다. 간단히 - 빌더통해 생성 확인 - 저장한 데이터 불러오기 - 잘못된 색인시 에러 나는지 * Feat: Add hasher Hasher 부분이 사용되지 않은 것을 확인해서 추가했습니다. * Init: Create DTO for signup method 회원가입시 사용될 DTO를 작성했습니다. * Feat: Add signupMember 가입 승인을 신청하는 url을 맵핑했습니다. * Feat: Remove validate validator가 잘못된 곳에서 사용되고 있어서 삭제했습니다. * Feat: Add optional for empty data Repository에서 서치시 데이터가 없을 경우를 위해 Optional로 감쌋습니다. * Test: remove default method 빌더를 통한 객체 생성 테스트를 제외하고 jpaRepository에서 자동 생성되는 메서드의 테스트는 삭제했습니다. * Style: Change method name - validatePassword를 의미적으로 좀 더 맞는 verifyPassword로 변경되었습니다. - 메서드에 대한 설명도 추가되었습니다. * Test: Change test Test문이 줄어 빌더 생성관련 밖에 남지 않아 MemberTest로 변경되었습니다. * Doc: README.md 추가 (#39) * Doc: README.md 추가 - 커스텀 로고 - 사용 기술 목록 - Content 목록 조회 기능에 대해 고민한 것들과 마주친 문제, 해결방안 등. * Refactor: add return value in signupMember() signupMember 메서드의 리턴 밸류가 void였는데 response status 200을 주는 것으로 변경했습니다. * Feat: Add fields in SignupMemberDTO 가입 승인 로직에서 사용될 DTO에 적절한 필드를 추가하였습니다. * Init: Add tmp member sevice Contoller의 동작을 테스트 하기 위한 임시 service를 작성하였습니다. * Comment: Add comment for signupMember method signupMember 메서드를 위한 주석을 추가했습니다. * Test: Add test for member controller 멤버 Controller의 동작을 확인하기 위한 테스트를 작성했습니다. * Refactor: Remove response wildcard ResponseEntity를 와일드카드로 반환하는 부분을 void로 변경 * Refactor: Remove SignupMemberDTO 목적이 같은 DTO를 삭제 및 Confirm객체로 교체하였습니다. * Refactor: Remove tmp memberServiceImpl 임시로 넣어서 사용했던, MemberServiceImpl을 삭제하고, Controller에서도 인터페이스에 종속되도록 변경하였습니다. --- .../member/controller/MemberController.java | 13 ++++ .../controller/MemberControllerTest.java | 73 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/test/java/beforespring/socialfeed/member/controller/MemberControllerTest.java diff --git a/src/main/java/beforespring/socialfeed/member/controller/MemberController.java b/src/main/java/beforespring/socialfeed/member/controller/MemberController.java index 4800b87..01a2b7b 100644 --- a/src/main/java/beforespring/socialfeed/member/controller/MemberController.java +++ b/src/main/java/beforespring/socialfeed/member/controller/MemberController.java @@ -8,6 +8,7 @@ import javax.validation.Valid; +import static beforespring.socialfeed.member.controller.dto.ConfirmTokenDto.*; import static beforespring.socialfeed.member.controller.dto.CreateMemberDto.CreateMemberRequest; import static beforespring.socialfeed.member.controller.dto.CreateMemberDto.CreateMemberResponse; @@ -28,4 +29,16 @@ public CreateMemberResponse createMember(@RequestBody @Valid CreateMemberRequest Long memberId = memberService.join(request); return new CreateMemberResponse(memberId); } + + /** + * 가입 승인 요청시 사용될 메서드입니다. + * request로 받은 유저의 정보를 토대로 + * joinConfirm service를 호출합니다. + * + * @param request + */ + @PostMapping("/api/member/confirm") + public void signupMember(@RequestBody @Valid ConfirmTokenRequest request) { + memberService.joinConfirm(request); + } } diff --git a/src/test/java/beforespring/socialfeed/member/controller/MemberControllerTest.java b/src/test/java/beforespring/socialfeed/member/controller/MemberControllerTest.java new file mode 100644 index 0000000..2369ce6 --- /dev/null +++ b/src/test/java/beforespring/socialfeed/member/controller/MemberControllerTest.java @@ -0,0 +1,73 @@ +package beforespring.socialfeed.member.controller; + +import beforespring.socialfeed.content.controller.ContentController; +import beforespring.socialfeed.member.service.MemberService; +import com.fasterxml.jackson.databind.ObjectMapper; +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.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static beforespring.socialfeed.member.controller.dto.ConfirmTokenDto.ConfirmTokenRequest; +import static beforespring.socialfeed.member.controller.dto.CreateMemberDto.CreateMemberRequest; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +class MemberControllerTest { + @Autowired + MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @MockBean + MemberController memberController; + + @MockBean + ContentController contentController; + + @MockBean + MemberService memberService; + + /** + * 멤버 등록에 적절한 데이터를 가지고 등록 URL 호출시 + * 회원 등록 서비스가 실행되어야됩니다. + *

+ * Mock 테스트시 objectMapper가 json 변환에 실패할 경우 + * checked exception을 던지기 때문에 해당 함수 전체에서 + * throws Exception을 하도록 설정해놓았습니다. + * + * @throws Exception + */ + @Test + @DisplayName("데이터를 가지고 API가 호출되면 회원 등록 서비스가 실행되어야됩니다") + void save_member_test() throws Exception { + CreateMemberRequest request = new CreateMemberRequest("username", "1234@etst.com", "12@12334asdf"); + + String requestBody = objectMapper.writeValueAsString(request); + + mockMvc.perform(post("/api/member/new") + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + } + + @Test + @DisplayName("데이터를 가지고 API가 호출되면 가입 승인 서비스가 실행되어야됩니다") + void confirm_member_test() throws Exception { + ConfirmTokenRequest request = new ConfirmTokenRequest("username", "1234", "1234"); + + String requestBody = objectMapper.writeValueAsString(request); + + mockMvc.perform(post("/api/member/confirm") + .contentType(MediaType.APPLICATION_JSON) + .content(requestBody)) + .andExpect(status().isOk()) + .andReturn(); + } +} \ No newline at end of file