From 10e27557847892cb63889c6abb92916b06af4efd Mon Sep 17 00:00:00 2001 From: hseong3243 <48748265+hseong3243@users.noreply.github.com> Date: Wed, 8 Nov 2023 00:33:12 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=9C=EB=8B=A4.=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 보호소 이메일 중복 확인 서비스 로직을 구현한다. * feat: 보호소 이메일 중복 확인 api를 구현한다. * feat: 봉사자 이메일 중복 확인 서비스 로직을 구현한다. * feat: 봉사자 이메일 중복 확인 API를 구현한다. --- .../shelter/controller/ShelterController.java | 10 +++++ .../CheckDuplicateShelterEmailRequest.java | 9 ++++ .../dto/CheckDuplicateShelterResponse.java | 9 ++++ .../exception/ShelterConflictException.java | 11 +++++ .../shelter/repository/ShelterRepository.java | 2 + .../shelter/service/ShelterService.java | 12 +++++- .../controller/VolunteerController.java | 11 +++++ .../CheckDuplicateVolunteerEmailRequest.java | 9 ++++ .../CheckDuplicateVolunteerEmailResponse.java | 8 ++++ .../repository/VolunteerRepository.java | 2 + .../volunteer/service/VolunteerService.java | 8 ++++ .../global/config/SecurityConfig.java | 2 + .../controller/ShelterControllerTest.java | 41 +++++++++++++++++-- .../shelter/service/ShelterServiceTest.java | 23 +++++++++++ .../controller/VolunteerControllerTest.java | 35 ++++++++++++++++ .../service/VolunteerServiceTest.java | 22 ++++++++++ .../support/VolunteerDtoFixture.java | 5 +++ 17 files changed, 214 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterEmailRequest.java create mode 100644 src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterResponse.java create mode 100644 src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterConflictException.java create mode 100644 src/main/java/com/clova/anifriends/domain/volunteer/dto/request/CheckDuplicateVolunteerEmailRequest.java create mode 100644 src/main/java/com/clova/anifriends/domain/volunteer/dto/response/CheckDuplicateVolunteerEmailResponse.java diff --git a/src/main/java/com/clova/anifriends/domain/shelter/controller/ShelterController.java b/src/main/java/com/clova/anifriends/domain/shelter/controller/ShelterController.java index 88cee9e4b..ff5541cd0 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/controller/ShelterController.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/controller/ShelterController.java @@ -1,6 +1,8 @@ package com.clova.anifriends.domain.shelter.controller; import com.clova.anifriends.domain.auth.resolver.LoginUser; +import com.clova.anifriends.domain.shelter.dto.CheckDuplicateShelterEmailRequest; +import com.clova.anifriends.domain.shelter.dto.CheckDuplicateShelterResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterDetailResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterMyPageResponse; import com.clova.anifriends.domain.shelter.service.ShelterService; @@ -22,6 +24,14 @@ public class ShelterController { private final ShelterService shelterService; + @PostMapping("/shelters/email") + public ResponseEntity checkDuplicateShelterEmail( + @RequestBody @Valid CheckDuplicateShelterEmailRequest checkDuplicateShelterEmailRequest) { + CheckDuplicateShelterResponse checkDuplicateShelterResponse + = shelterService.checkDuplicateEmail(checkDuplicateShelterEmailRequest.email()); + return ResponseEntity.ok(checkDuplicateShelterResponse); + } + @PostMapping("/shelters") public ResponseEntity registerShelter( @RequestBody @Valid RegisterShelterRequest registerShelterRequest) { diff --git a/src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterEmailRequest.java b/src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterEmailRequest.java new file mode 100644 index 000000000..d7ae6ea5e --- /dev/null +++ b/src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterEmailRequest.java @@ -0,0 +1,9 @@ +package com.clova.anifriends.domain.shelter.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CheckDuplicateShelterEmailRequest( + @NotBlank(message = "이메일은 필수값입니다.") + String email) { + +} diff --git a/src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterResponse.java b/src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterResponse.java new file mode 100644 index 000000000..fd356da12 --- /dev/null +++ b/src/main/java/com/clova/anifriends/domain/shelter/dto/CheckDuplicateShelterResponse.java @@ -0,0 +1,9 @@ +package com.clova.anifriends.domain.shelter.dto; + +public record CheckDuplicateShelterResponse( + boolean isDuplicated) { + + public static CheckDuplicateShelterResponse from(boolean isDuplicated) { + return new CheckDuplicateShelterResponse(isDuplicated); + } +} diff --git a/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterConflictException.java b/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterConflictException.java new file mode 100644 index 000000000..eb9fbc09e --- /dev/null +++ b/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterConflictException.java @@ -0,0 +1,11 @@ +package com.clova.anifriends.domain.shelter.exception; + +import com.clova.anifriends.global.exception.ConflictException; +import com.clova.anifriends.global.exception.ErrorCode; + +public class ShelterConflictException extends ConflictException { + + public ShelterConflictException(String message) { + super(ErrorCode.ALREADY_EXISTS, message); + } +} diff --git a/src/main/java/com/clova/anifriends/domain/shelter/repository/ShelterRepository.java b/src/main/java/com/clova/anifriends/domain/shelter/repository/ShelterRepository.java index 89ffa77d4..f9cccc585 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/repository/ShelterRepository.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/repository/ShelterRepository.java @@ -8,4 +8,6 @@ public interface ShelterRepository extends JpaRepository { Optional findByEmail(ShelterEmail email); + + boolean existsByEmail(ShelterEmail email); } diff --git a/src/main/java/com/clova/anifriends/domain/shelter/service/ShelterService.java b/src/main/java/com/clova/anifriends/domain/shelter/service/ShelterService.java index 4c785c664..dbbcda7ed 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/service/ShelterService.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/service/ShelterService.java @@ -1,11 +1,13 @@ package com.clova.anifriends.domain.shelter.service; import com.clova.anifriends.domain.shelter.Shelter; +import com.clova.anifriends.domain.shelter.dto.CheckDuplicateShelterResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterDetailResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterMyPageResponse; import com.clova.anifriends.domain.shelter.exception.ShelterBadRequestException; import com.clova.anifriends.domain.shelter.exception.ShelterNotFoundException; import com.clova.anifriends.domain.shelter.repository.ShelterRepository; +import com.clova.anifriends.domain.shelter.wrapper.ShelterEmail; import java.text.MessageFormat; import java.util.Objects; import lombok.RequiredArgsConstructor; @@ -53,19 +55,25 @@ private String encodePassword(String password) { } private void validatePasswordNotNull(String password) { - if(Objects.isNull(password)) { + if (Objects.isNull(password)) { throw new ShelterBadRequestException("패스워드는 필수값입니다."); } } private void validatePasswordLength(String password) { - if(password.length() < MIN_PASSWORD_LENGTH || password.length() > MAX_PASSWORD_LENGTH) { + if (password.length() < MIN_PASSWORD_LENGTH || password.length() > MAX_PASSWORD_LENGTH) { throw new ShelterBadRequestException( MessageFormat.format("패스워드는 {0}자 이상, {1}자 이하여야 합니다.", MIN_PASSWORD_LENGTH, MAX_PASSWORD_LENGTH)); } } + @Transactional(readOnly = true) + public CheckDuplicateShelterResponse checkDuplicateEmail(String email) { + boolean isDuplicated = shelterRepository.existsByEmail(new ShelterEmail(email)); + return CheckDuplicateShelterResponse.from(isDuplicated); + } + @Transactional(readOnly = true) public FindShelterDetailResponse findShelterDetail( Long shelterId diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/controller/VolunteerController.java b/src/main/java/com/clova/anifriends/domain/volunteer/controller/VolunteerController.java index e4ac6ed00..d81b8e3ad 100644 --- a/src/main/java/com/clova/anifriends/domain/volunteer/controller/VolunteerController.java +++ b/src/main/java/com/clova/anifriends/domain/volunteer/controller/VolunteerController.java @@ -1,7 +1,9 @@ package com.clova.anifriends.domain.volunteer.controller; import com.clova.anifriends.domain.auth.resolver.LoginUser; +import com.clova.anifriends.domain.volunteer.dto.request.CheckDuplicateVolunteerEmailRequest; import com.clova.anifriends.domain.volunteer.dto.request.RegisterVolunteerRequest; +import com.clova.anifriends.domain.volunteer.dto.response.CheckDuplicateVolunteerEmailResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerMyPageResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerProfileResponse; import com.clova.anifriends.domain.volunteer.service.VolunteerService; @@ -24,6 +26,15 @@ public class VolunteerController { private final VolunteerService volunteerService; private static final String BASE_URI = "/api/volunteers/"; + @PostMapping("/volunteers/email") + public ResponseEntity checkDuplicateVolunteerEmail( + @RequestBody @Valid CheckDuplicateVolunteerEmailRequest checkDuplicateVolunteerEmailRequest) { + String targetEmail = checkDuplicateVolunteerEmailRequest.email(); + CheckDuplicateVolunteerEmailResponse checkDuplicateVolunteerEmailResponse + = volunteerService.checkDuplicateVolunteerEmail(targetEmail); + return ResponseEntity.ok(checkDuplicateVolunteerEmailResponse); + } + @PostMapping("/volunteers") public ResponseEntity registerVolunteer( @RequestBody @Valid RegisterVolunteerRequest registerVolunteerRequest diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/dto/request/CheckDuplicateVolunteerEmailRequest.java b/src/main/java/com/clova/anifriends/domain/volunteer/dto/request/CheckDuplicateVolunteerEmailRequest.java new file mode 100644 index 000000000..bd1a9c6c9 --- /dev/null +++ b/src/main/java/com/clova/anifriends/domain/volunteer/dto/request/CheckDuplicateVolunteerEmailRequest.java @@ -0,0 +1,9 @@ +package com.clova.anifriends.domain.volunteer.dto.request; + +import jakarta.validation.constraints.NotBlank; + +public record CheckDuplicateVolunteerEmailRequest( + @NotBlank(message = "이메일은 필수값입니다.") + String email) { + +} diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/CheckDuplicateVolunteerEmailResponse.java b/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/CheckDuplicateVolunteerEmailResponse.java new file mode 100644 index 000000000..89f85dc8a --- /dev/null +++ b/src/main/java/com/clova/anifriends/domain/volunteer/dto/response/CheckDuplicateVolunteerEmailResponse.java @@ -0,0 +1,8 @@ +package com.clova.anifriends.domain.volunteer.dto.response; + +public record CheckDuplicateVolunteerEmailResponse(boolean isDuplicated) { + + public static CheckDuplicateVolunteerEmailResponse from(boolean isDuplicated) { + return new CheckDuplicateVolunteerEmailResponse(isDuplicated); + } +} diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/repository/VolunteerRepository.java b/src/main/java/com/clova/anifriends/domain/volunteer/repository/VolunteerRepository.java index 058895f5a..ba0419e01 100644 --- a/src/main/java/com/clova/anifriends/domain/volunteer/repository/VolunteerRepository.java +++ b/src/main/java/com/clova/anifriends/domain/volunteer/repository/VolunteerRepository.java @@ -8,4 +8,6 @@ public interface VolunteerRepository extends JpaRepository { Optional findByEmail(VolunteerEmail email); + + boolean existsByEmail(VolunteerEmail email); } diff --git a/src/main/java/com/clova/anifriends/domain/volunteer/service/VolunteerService.java b/src/main/java/com/clova/anifriends/domain/volunteer/service/VolunteerService.java index 54415796c..d352fbde2 100644 --- a/src/main/java/com/clova/anifriends/domain/volunteer/service/VolunteerService.java +++ b/src/main/java/com/clova/anifriends/domain/volunteer/service/VolunteerService.java @@ -1,10 +1,12 @@ package com.clova.anifriends.domain.volunteer.service; import com.clova.anifriends.domain.volunteer.Volunteer; +import com.clova.anifriends.domain.volunteer.dto.response.CheckDuplicateVolunteerEmailResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerMyPageResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerProfileResponse; import com.clova.anifriends.domain.volunteer.exception.VolunteerNotFoundException; import com.clova.anifriends.domain.volunteer.repository.VolunteerRepository; +import com.clova.anifriends.domain.volunteer.wrapper.VolunteerEmail; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +17,12 @@ public class VolunteerService { private final VolunteerRepository volunteerRepository; + @Transactional(readOnly = true) + public CheckDuplicateVolunteerEmailResponse checkDuplicateVolunteerEmail(String email) { + boolean isDuplicated = volunteerRepository.existsByEmail(new VolunteerEmail(email)); + return CheckDuplicateVolunteerEmailResponse.from(isDuplicated); + } + @Transactional public Long registerVolunteer( String email, diff --git a/src/main/java/com/clova/anifriends/global/config/SecurityConfig.java b/src/main/java/com/clova/anifriends/global/config/SecurityConfig.java index 46908a779..363975e22 100644 --- a/src/main/java/com/clova/anifriends/global/config/SecurityConfig.java +++ b/src/main/java/com/clova/anifriends/global/config/SecurityConfig.java @@ -50,6 +50,8 @@ public SecurityFilterChain filterChain( .requestMatchers(HttpMethod.GET, "/api/volunteers/*/recruitments/completed").permitAll() .requestMatchers(HttpMethod.GET, "/api/shelters/*/recruitments").permitAll() .requestMatchers(HttpMethod.GET, "/api/volunteers/*/reviews").permitAll() + .requestMatchers(HttpMethod.POST, "/api/volunteers/email").permitAll() + .requestMatchers(HttpMethod.POST, "/api/shelters/email").permitAll() .requestMatchers(HttpMethod.POST, "/api/volunteers").permitAll() .requestMatchers(HttpMethod.POST, "/api/shelters").permitAll() .requestMatchers("/api/shelters/**").hasRole(ROLE_SHELTER) diff --git a/src/test/java/com/clova/anifriends/domain/shelter/controller/ShelterControllerTest.java b/src/test/java/com/clova/anifriends/domain/shelter/controller/ShelterControllerTest.java index 8a2cc0c82..9818226ca 100644 --- a/src/test/java/com/clova/anifriends/domain/shelter/controller/ShelterControllerTest.java +++ b/src/test/java/com/clova/anifriends/domain/shelter/controller/ShelterControllerTest.java @@ -18,6 +18,8 @@ import com.clova.anifriends.base.BaseControllerTest; import com.clova.anifriends.docs.format.DocumentationFormatGenerator; import com.clova.anifriends.domain.shelter.Shelter; +import com.clova.anifriends.domain.shelter.dto.CheckDuplicateShelterEmailRequest; +import com.clova.anifriends.domain.shelter.dto.CheckDuplicateShelterResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterDetailResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterMyPageResponse; import com.clova.anifriends.domain.shelter.support.ShelterFixture; @@ -30,6 +32,36 @@ class ShelterControllerTest extends BaseControllerTest { + @Test + @DisplayName("보호소 이메일 중복 확인 api 호출 시") + void checkDuplicateShelterEmail() throws Exception { + //given + CheckDuplicateShelterEmailRequest checkDuplicateShelterEmailRequest + = new CheckDuplicateShelterEmailRequest("email@email.com"); + CheckDuplicateShelterResponse checkDuplicateShelterResponse + = new CheckDuplicateShelterResponse(true); + + given(shelterService.checkDuplicateEmail(anyString())).willReturn( + checkDuplicateShelterResponse); + + //when + ResultActions resultActions = mockMvc.perform(post("/api/shelters/email") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(checkDuplicateShelterEmailRequest))); + + //then + resultActions.andExpect(status().isOk()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("email").type(JsonFieldType.STRING).description("보호소 이메일") + ), + responseFields( + fieldWithPath("isDuplicated").type(JsonFieldType.BOOLEAN) + .description("이메일 중복 여부") + ) + )); + } + @Test @DisplayName("보호소 회원가입 api 호출 시") void registerShelter() throws Exception { @@ -66,13 +98,16 @@ void registerShelter() throws Exception { .attributes(DocumentationFormatGenerator.getConstraint("1자 이상, 20자 이하")), fieldWithPath("address").type(JsonFieldType.STRING).description("보호소 주소") .attributes(DocumentationFormatGenerator.getConstraint("1자 이상, 100자 이하")), - fieldWithPath("addressDetail").type(JsonFieldType.STRING).description("보호소 상세 주소") + fieldWithPath("addressDetail").type(JsonFieldType.STRING) + .description("보호소 상세 주소") .attributes(DocumentationFormatGenerator.getConstraint("1자 이상, 100자 이하")), fieldWithPath("phoneNumber").type(JsonFieldType.STRING).description("보호소 전화번호") .attributes(DocumentationFormatGenerator.getConstraint("- 포함, 전화번호 형식 준수")), - fieldWithPath("sparePhoneNumber").type(JsonFieldType.STRING).description("보호소 임시 전화번호") + fieldWithPath("sparePhoneNumber").type(JsonFieldType.STRING) + .description("보호소 임시 전화번호") .attributes(DocumentationFormatGenerator.getConstraint("- 포함, 전화번호 형식 준수")), - fieldWithPath("isOpenedAddress").type(JsonFieldType.BOOLEAN).description("보호소 주소 공개 여부") + fieldWithPath("isOpenedAddress").type(JsonFieldType.BOOLEAN) + .description("보호소 주소 공개 여부") ), responseHeaders( headerWithName("Location").description("생성된 리소스 접근 가능 위치") diff --git a/src/test/java/com/clova/anifriends/domain/shelter/service/ShelterServiceTest.java b/src/test/java/com/clova/anifriends/domain/shelter/service/ShelterServiceTest.java index e302e959a..735c396f4 100644 --- a/src/test/java/com/clova/anifriends/domain/shelter/service/ShelterServiceTest.java +++ b/src/test/java/com/clova/anifriends/domain/shelter/service/ShelterServiceTest.java @@ -9,6 +9,7 @@ import com.clova.anifriends.domain.shelter.Shelter; import com.clova.anifriends.domain.shelter.ShelterImage; +import com.clova.anifriends.domain.shelter.dto.CheckDuplicateShelterResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterDetailResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterMyPageResponse; import com.clova.anifriends.domain.shelter.exception.ShelterBadRequestException; @@ -54,6 +55,28 @@ public boolean matches(CharSequence rawPassword, String encodedPassword) { Shelter givenShelter; ShelterImage givenShelterImage; + @Nested + @DisplayName("checkDuplicateEmail 실행 시") + class CheckDuplicateEmailTest { + + @Test + @DisplayName("성공") + void checkDuplicateEmail() { + //given + String email = "email@email.com"; + + given(shelterRepository.existsByEmail(any())).willReturn(true); + + //when + CheckDuplicateShelterResponse response + = shelterService.checkDuplicateEmail(email); + + //then + assertThat(response.isDuplicated()).isTrue(); + } + + } + @Nested @DisplayName("registerShelter 실행 시") class RegisterShelterTest { diff --git a/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java b/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java index 95ba6a515..7dfad009f 100644 --- a/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java +++ b/src/test/java/com/clova/anifriends/domain/volunteer/controller/VolunteerControllerTest.java @@ -2,11 +2,13 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.payload.JsonFieldType.BOOLEAN; import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; import static org.springframework.restdocs.payload.JsonFieldType.STRING; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; @@ -18,9 +20,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.clova.anifriends.base.BaseControllerTest; +import com.clova.anifriends.docs.format.DocumentationFormatGenerator; import com.clova.anifriends.domain.applicant.wrapper.ApplicantStatus; import com.clova.anifriends.domain.volunteer.Volunteer; +import com.clova.anifriends.domain.volunteer.dto.request.CheckDuplicateVolunteerEmailRequest; import com.clova.anifriends.domain.volunteer.dto.request.RegisterVolunteerRequest; +import com.clova.anifriends.domain.volunteer.dto.response.CheckDuplicateVolunteerEmailResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerMyPageResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerProfileResponse; import com.clova.anifriends.domain.volunteer.support.VolunteerDtoFixture; @@ -33,6 +38,36 @@ class VolunteerControllerTest extends BaseControllerTest { + @Test + @DisplayName("봉사자 이메일 중복 확인 API 호출 시") + void checkDuplicateVolunteerEmail() throws Exception { + //given + CheckDuplicateVolunteerEmailRequest checkDuplicateVolunteerEmailRequest + = VolunteerDtoFixture.checkDuplicateVolunteerEmailRequest(); + CheckDuplicateVolunteerEmailResponse checkDuplicateVolunteerEmailResponse + = new CheckDuplicateVolunteerEmailResponse(false); + + given(volunteerService.checkDuplicateVolunteerEmail(anyString())) + .willReturn(checkDuplicateVolunteerEmailResponse); + + //when + ResultActions resultActions = mockMvc.perform(post("/api/volunteers/email") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(checkDuplicateVolunteerEmailRequest))); + + //then + resultActions.andExpect(status().isOk()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("email").type(STRING).description("사용자 이메일") + .attributes(DocumentationFormatGenerator.getConstraint("@를 포함한 이메일 형식")) + ), + responseFields( + fieldWithPath("isDuplicated").type(BOOLEAN).description("이메일 중복 여부") + ) + )); + } + @Test @DisplayName("봉사자 회원가입 API 호출 시") void registerVolunteer() throws Exception { diff --git a/src/test/java/com/clova/anifriends/domain/volunteer/service/VolunteerServiceTest.java b/src/test/java/com/clova/anifriends/domain/volunteer/service/VolunteerServiceTest.java index 4f20f6057..cde4251a6 100644 --- a/src/test/java/com/clova/anifriends/domain/volunteer/service/VolunteerServiceTest.java +++ b/src/test/java/com/clova/anifriends/domain/volunteer/service/VolunteerServiceTest.java @@ -11,6 +11,7 @@ import com.clova.anifriends.domain.volunteer.Volunteer; import com.clova.anifriends.domain.volunteer.VolunteerImage; import com.clova.anifriends.domain.volunteer.dto.request.RegisterVolunteerRequest; +import com.clova.anifriends.domain.volunteer.dto.response.CheckDuplicateVolunteerEmailResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerMyPageResponse; import com.clova.anifriends.domain.volunteer.dto.response.FindVolunteerProfileResponse; import com.clova.anifriends.domain.volunteer.repository.VolunteerRepository; @@ -34,6 +35,27 @@ class VolunteerServiceTest { @Mock VolunteerRepository volunteerRepository; + @Nested + @DisplayName("checkDuplicateVolunteerEmail 메서드 실행 시") + class CheckDuplicateVolunteerEmailTest { + + @Test + @DisplayName("성공") + void checkDuplicateVolunteerEmail() { + //given + String email = "email@email.com"; + + given(volunteerRepository.existsByEmail(any())).willReturn(true); + + //when + CheckDuplicateVolunteerEmailResponse response + = volunteerService.checkDuplicateVolunteerEmail(email); + + //then + assertThat(response.isDuplicated()).isTrue(); + } + } + @Nested @DisplayName("registerVolunteer 메서드 실행 시") class RegisterVolunteerTest { diff --git a/src/test/java/com/clova/anifriends/domain/volunteer/support/VolunteerDtoFixture.java b/src/test/java/com/clova/anifriends/domain/volunteer/support/VolunteerDtoFixture.java index b8a1ac3e7..32515f730 100644 --- a/src/test/java/com/clova/anifriends/domain/volunteer/support/VolunteerDtoFixture.java +++ b/src/test/java/com/clova/anifriends/domain/volunteer/support/VolunteerDtoFixture.java @@ -2,6 +2,7 @@ import com.clova.anifriends.domain.volunteer.Volunteer; import com.clova.anifriends.domain.volunteer.VolunteerImage; +import com.clova.anifriends.domain.volunteer.dto.request.CheckDuplicateVolunteerEmailRequest; import com.clova.anifriends.domain.volunteer.dto.request.RegisterVolunteerRequest; import com.clova.anifriends.domain.volunteer.wrapper.VolunteerGender; @@ -25,5 +26,9 @@ public static RegisterVolunteerRequest registerVolunteerRequest() { return new RegisterVolunteerRequest(EMAIL, PASSWORD, NAME, BIRTH_DATE, PHONE_NUMBER, GENDER); } + + public static CheckDuplicateVolunteerEmailRequest checkDuplicateVolunteerEmailRequest() { + return new CheckDuplicateVolunteerEmailRequest(EMAIL); + } }