From b7a126108a209092584810e2ee6ef070e1af6e9b Mon Sep 17 00:00:00 2001 From: hseong3243 <48748265+hseong3243@users.noreply.github.com> Date: Wed, 8 Nov 2023 00:24:14 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85(?= =?UTF-8?q?=EB=B3=B4=ED=98=B8=EC=86=8C)=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(#140)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 보호소 회원가입 서비스 로직 추가 * refactor: 보호소 전화번호 검증 로직을 개선한다. * feat: 보호소 주소 검증 로직을 추가한다. * feat: 보호소 회원가입 api를 구현한다. * refactor: 상수를 이용해 예외 메시지를 관리하도록 개선한다. * style: 파일 마지막 개행을 추가한다. --- .../controller/RegisterShelterRequest.java | 25 ++++ .../shelter/controller/ShelterController.java | 20 +++ .../exception/ShelterBadRequestException.java | 4 + .../shelter/service/ShelterService.java | 51 ++++++++ .../shelter/wrapper/ShelterAddressInfo.java | 36 ++++++ .../shelter/wrapper/ShelterPassword.java | 22 ++-- .../wrapper/ShelterPhoneNumberInfo.java | 24 ++-- .../controller/ShelterControllerTest.java | 56 +++++++++ .../shelter/service/ShelterServiceTest.java | 79 ++++++++++++ .../wrapper/ShelterAddressInfoTest.java | 119 ++++++++++++++++++ .../shelter/wrapper/ShelterPasswordTest.java | 28 ----- .../wrapper/ShelterPhoneNumberInfoTest.java | 73 +++-------- 12 files changed, 431 insertions(+), 106 deletions(-) create mode 100644 src/main/java/com/clova/anifriends/domain/shelter/controller/RegisterShelterRequest.java create mode 100644 src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfoTest.java diff --git a/src/main/java/com/clova/anifriends/domain/shelter/controller/RegisterShelterRequest.java b/src/main/java/com/clova/anifriends/domain/shelter/controller/RegisterShelterRequest.java new file mode 100644 index 000000000..8855065b4 --- /dev/null +++ b/src/main/java/com/clova/anifriends/domain/shelter/controller/RegisterShelterRequest.java @@ -0,0 +1,25 @@ +package com.clova.anifriends.domain.shelter.controller; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public record RegisterShelterRequest( + @NotBlank(message = "이메일은 필수값입니다.") + String email, + @NotBlank(message = "패스워드는 필수값입니다.") + String password, + @NotBlank(message = "보호소 이름은 필수값입니다.") + String name, + @NotBlank(message = "보호소 주소는 필수값입니다.") + String address, + @NotBlank(message = "보호소 상세 주소는 필수값입니다.") + String addressDetail, + @NotBlank(message = "보호소 전화번호는 필수값입니다.") + String phoneNumber, + @NotBlank(message = "보호소 임시 전화번호는 필수값입니다.") + String sparePhoneNumber, + @NotNull(message = "보호소 주소 공개 여부는 필수값입니다.") + Boolean isOpenedAddress +) { + +} 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 813517210..88cee9e4b 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 @@ -4,10 +4,14 @@ import com.clova.anifriends.domain.shelter.dto.FindShelterDetailResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterMyPageResponse; import com.clova.anifriends.domain.shelter.service.ShelterService; +import jakarta.validation.Valid; +import java.net.URI; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,6 +22,22 @@ public class ShelterController { private final ShelterService shelterService; + @PostMapping("/shelters") + public ResponseEntity registerShelter( + @RequestBody @Valid RegisterShelterRequest registerShelterRequest) { + Long shelterId = shelterService.registerShelter( + registerShelterRequest.email(), + registerShelterRequest.password(), + registerShelterRequest.name(), + registerShelterRequest.address(), + registerShelterRequest.addressDetail(), + registerShelterRequest.phoneNumber(), + registerShelterRequest.sparePhoneNumber(), + registerShelterRequest.isOpenedAddress()); + URI location = URI.create("/api/shelters/" + shelterId); + return ResponseEntity.created(location).build(); + } + @GetMapping("/volunteers/shelters/{shelterId}/profile") public ResponseEntity findShelterDetail( @PathVariable Long shelterId diff --git a/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterBadRequestException.java b/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterBadRequestException.java index 45fafc51a..371298c5a 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterBadRequestException.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/exception/ShelterBadRequestException.java @@ -5,6 +5,10 @@ public class ShelterBadRequestException extends BadRequestException { + public ShelterBadRequestException(String message) { + super(ErrorCode.BAD_REQUEST, message); + } + public ShelterBadRequestException(ErrorCode errorCode, String message) { super(errorCode, message); 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 dcaef875c..4c785c664 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 @@ -3,9 +3,13 @@ import com.clova.anifriends.domain.shelter.Shelter; 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 java.text.MessageFormat; +import java.util.Objects; import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,7 +17,54 @@ @RequiredArgsConstructor public class ShelterService { + private static final int MIN_PASSWORD_LENGTH = 6; + private static final int MAX_PASSWORD_LENGTH = 16; + private final ShelterRepository shelterRepository; + private final PasswordEncoder passwordEncoder; + + @Transactional + public Long registerShelter( + String email, + String password, + String name, + String address, + String addressDetail, + String phoneNumber, + String sparePhoneNumber, + boolean isOpenedAddress) { + Shelter shelter = new Shelter( + email, + encodePassword(password), + address, + addressDetail, + name, + phoneNumber, + sparePhoneNumber, + isOpenedAddress); + shelterRepository.save(shelter); + return shelter.getShelterId(); + } + + private String encodePassword(String password) { + validatePasswordNotNull(password); + validatePasswordLength(password); + return passwordEncoder.encode(password); + } + + private void validatePasswordNotNull(String password) { + if(Objects.isNull(password)) { + throw new ShelterBadRequestException("패스워드는 필수값입니다."); + } + } + + private void validatePasswordLength(String password) { + 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 FindShelterDetailResponse findShelterDetail( diff --git a/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfo.java b/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfo.java index 8f7af554b..a0e88b517 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfo.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfo.java @@ -1,7 +1,10 @@ package com.clova.anifriends.domain.shelter.wrapper; +import com.clova.anifriends.domain.shelter.exception.ShelterBadRequestException; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; +import java.text.MessageFormat; +import java.util.Objects; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,6 +14,11 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ShelterAddressInfo { + private static final int MIN_ADDRESS_LENGTH = 1; + private static final int MIN_ADDRESS_DETAIL_LENGTH = 1; + private static final int MAX_ADDRESS_LENGTH = 100; + private static final int MAX_ADDRESS_DETAIL_LENGTH = 100; + @Column(name = "address") private String address; @@ -21,8 +29,36 @@ public class ShelterAddressInfo { private boolean isOpenedAddress; public ShelterAddressInfo(String address, String addressDetail, boolean isOpenedAddress) { + validateNotNull(address, addressDetail); + validateAddress(address); + validateAddressDetail(addressDetail); this.address = address; this.addressDetail = addressDetail; this.isOpenedAddress = isOpenedAddress; } + + private void validateNotNull(String address, String addressDetail) { + if (Objects.isNull(address)) { + throw new ShelterBadRequestException("보호소 주소는 필수값입니다."); + } + if (Objects.isNull(addressDetail)) { + throw new ShelterBadRequestException("보호소 상세 주소는 필수값입니다."); + } + } + + private void validateAddress(String address) { + if(address.isBlank() || address.length() > MAX_ADDRESS_LENGTH) { + throw new ShelterBadRequestException( + MessageFormat.format("보호소 주소는 {0}자 이상, {1}자 이하여야 합니다.", + MIN_ADDRESS_LENGTH, MAX_ADDRESS_LENGTH)); + } + } + + private void validateAddressDetail(String addressDetail) { + if(addressDetail.isBlank() || addressDetail.length() > MAX_ADDRESS_DETAIL_LENGTH) { + throw new ShelterBadRequestException( + MessageFormat.format("보호소 상세 주소는 {0}자 이상, {1}자 이하여야 합니다.", + MIN_ADDRESS_DETAIL_LENGTH, MAX_ADDRESS_DETAIL_LENGTH)); + } + } } diff --git a/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPassword.java b/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPassword.java index a717f87b8..9b6060b32 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPassword.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPassword.java @@ -3,10 +3,8 @@ import static java.util.Objects.isNull; import com.clova.anifriends.domain.shelter.exception.ShelterBadRequestException; -import com.clova.anifriends.global.exception.ErrorCode; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; -import java.text.MessageFormat; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -16,26 +14,24 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ShelterPassword { - private static final int MIN_PASSWORD_LENGTH = 6; - private static final int MAX_PASSWORD_LENGTH = 16; - @Column(name = "password") private String password; public ShelterPassword(String value) { - validateShelterPassword(value); + validateNotNull(value); + validateNotBlank(value); this.password = value; } - private void validateShelterPassword(String password) { - if (isNull(password) || password.isBlank()) { - throw new ShelterBadRequestException(ErrorCode.BAD_REQUEST, "비밀번호는 필수 항목입니다."); + private void validateNotNull(String password) { + if (isNull(password)) { + throw new ShelterBadRequestException("비밀번호는 필수 항목입니다."); } + } - if (password.length() < MIN_PASSWORD_LENGTH || password.length() > MAX_PASSWORD_LENGTH) { - throw new ShelterBadRequestException(ErrorCode.BAD_REQUEST, - MessageFormat.format("이름은 최소 {0}자, 최대 {1}자 입니다.", MIN_PASSWORD_LENGTH, - MAX_PASSWORD_LENGTH)); + private void validateNotBlank(String password) { + if (password.isBlank()) { + throw new ShelterBadRequestException("비밀번호는 필수 항목입니다."); } } } diff --git a/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfo.java b/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfo.java index d8845fed6..b5ebe5421 100644 --- a/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfo.java +++ b/src/main/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfo.java @@ -1,11 +1,10 @@ package com.clova.anifriends.domain.shelter.wrapper; -import static java.util.Objects.isNull; - import com.clova.anifriends.domain.shelter.exception.ShelterBadRequestException; import com.clova.anifriends.global.exception.ErrorCode; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; +import java.util.Objects; import java.util.regex.Pattern; import lombok.AccessLevel; import lombok.Getter; @@ -17,7 +16,7 @@ public class ShelterPhoneNumberInfo { private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile( - "010-[0-9]{4}-[0-9]{4}|0[1-9]{1,2}-[0-9]{3,4}-[0-9]{4}"); + "010-\\d{4}-\\d{4}|0[1-9]{1,2}-\\d{3,4}-\\d{4}"); @Column(name = "phone_number") private String phoneNumber; @@ -26,24 +25,25 @@ public class ShelterPhoneNumberInfo { private String sparePhoneNumber; public ShelterPhoneNumberInfo(String phoneNumber, String sparePhoneNumber) { - validatePhoneNumber(phoneNumber, sparePhoneNumber); + validateNotNull(phoneNumber, sparePhoneNumber); + validatePhoneNumberPattern(phoneNumber, sparePhoneNumber); this.phoneNumber = phoneNumber; this.sparePhoneNumber = sparePhoneNumber; } - private void validatePhoneNumber(String phoneNumber, String sparePhoneNumber) { - if (isNull(phoneNumber) || phoneNumber.isBlank()) { - throw new ShelterBadRequestException(ErrorCode.BAD_REQUEST, "전화번호는 필수 항목입니다."); + private void validateNotNull(String phoneNumber, String sparePhoneNumber) { + if(Objects.isNull(phoneNumber)) { + throw new ShelterBadRequestException("전화번호는 필수 항목입니다."); + } + if(Objects.isNull(sparePhoneNumber)) { + throw new ShelterBadRequestException("임시 전화번호는 필수 항목입니다."); } + } + private void validatePhoneNumberPattern(String phoneNumber, String sparePhoneNumber) { if (!PHONE_NUMBER_PATTERN.matcher(phoneNumber).matches()) { throw new ShelterBadRequestException(ErrorCode.BAD_REQUEST, "잘못된 전화번호 입력값입니다."); } - - if (isNull(sparePhoneNumber) || sparePhoneNumber.isBlank()) { - throw new ShelterBadRequestException(ErrorCode.BAD_REQUEST, "임시 전화번호는 필수 항목입니다."); - } - if (!PHONE_NUMBER_PATTERN.matcher(sparePhoneNumber).matches()) { throw new ShelterBadRequestException(ErrorCode.BAD_REQUEST, "잘못된 임시 전화번호 입력값입니다."); } 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 67378545a..8a2cc0c82 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 @@ -1,16 +1,22 @@ package com.clova.anifriends.domain.shelter.controller; +import static org.mockito.ArgumentMatchers.anyBoolean; +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.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; 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.shelter.Shelter; import com.clova.anifriends.domain.shelter.dto.FindShelterDetailResponse; import com.clova.anifriends.domain.shelter.dto.FindShelterMyPageResponse; @@ -24,6 +30,56 @@ class ShelterControllerTest extends BaseControllerTest { + @Test + @DisplayName("보호소 회원가입 api 호출 시") + void registerShelter() throws Exception { + //given + String email = "email@email.com"; + String password = "password123!"; + String name = "보호소 이름"; + String address = "보호소 주소"; + String addressDetail = "보호소 상세 주소"; + String phoneNumber = "보호소 전화번호"; + String sparePhoneNumber = "보호소 임시 전화번호"; + boolean isOpenedAddress = false; + RegisterShelterRequest registerShelterRequest = new RegisterShelterRequest(email, password, + name, address, addressDetail, phoneNumber, sparePhoneNumber, isOpenedAddress); + + given(shelterService.registerShelter(anyString(), anyString(), anyString(), anyString(), + anyString(), anyString(), anyString(), anyBoolean())) + .willReturn(1L); + + //when + ResultActions resultActions = mockMvc.perform(post("/api/shelters") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(registerShelterRequest))); + + //then + resultActions.andExpect(status().isCreated()) + .andDo(restDocs.document( + requestFields( + fieldWithPath("email").type(JsonFieldType.STRING).description("보호소 이메일") + .attributes(DocumentationFormatGenerator.getConstraint("@ 포함")), + fieldWithPath("password").type(JsonFieldType.STRING).description("보호소 패스워드") + .attributes(DocumentationFormatGenerator.getConstraint("6자 이상, 16자 이하")), + fieldWithPath("name").type(JsonFieldType.STRING).description("보호소 이름") + .attributes(DocumentationFormatGenerator.getConstraint("1자 이상, 20자 이하")), + fieldWithPath("address").type(JsonFieldType.STRING).description("보호소 주소") + .attributes(DocumentationFormatGenerator.getConstraint("1자 이상, 100자 이하")), + 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("보호소 임시 전화번호") + .attributes(DocumentationFormatGenerator.getConstraint("- 포함, 전화번호 형식 준수")), + fieldWithPath("isOpenedAddress").type(JsonFieldType.BOOLEAN).description("보호소 주소 공개 여부") + ), + responseHeaders( + headerWithName("Location").description("생성된 리소스 접근 가능 위치") + ) + )); + } + @Test @DisplayName("findShelterDetail 실행 시") void findShelterDetail() throws Exception { 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 4b7d1e9f3..e302e959a 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 @@ -2,13 +2,16 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchException; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; import com.clova.anifriends.domain.shelter.Shelter; import com.clova.anifriends.domain.shelter.ShelterImage; 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.support.ShelterFixture; @@ -18,9 +21,13 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.security.crypto.password.PasswordEncoder; @ExtendWith(MockitoExtension.class) class ShelterServiceTest { @@ -31,9 +38,81 @@ class ShelterServiceTest { @Mock private ShelterRepository shelterRepository; + @Spy + PasswordEncoder passwordEncoder = new PasswordEncoder() { + @Override + public String encode(CharSequence rawPassword) { + return new StringBuilder(rawPassword).reverse().toString(); + } + + @Override + public boolean matches(CharSequence rawPassword, String encodedPassword) { + return encode(rawPassword).equals(encodedPassword); + } + }; + Shelter givenShelter; ShelterImage givenShelterImage; + @Nested + @DisplayName("registerShelter 실행 시") + class RegisterShelterTest { + + String email = "email@email.com"; + String password = "12345678"; + String name = "보호소"; + String address = "주소1"; + String addressDetail = "주소2"; + String phoneNumber = "010-1234-5678"; + String sparePhoneNumber = "010-1234-5678"; + boolean isOpenedAddress = true; + + @Test + @DisplayName("성공") + void registerShelter() { + //given + //when + shelterService.registerShelter(email, password, name, address, addressDetail, + phoneNumber, sparePhoneNumber, isOpenedAddress); + + //then + then(shelterRepository).should().save(any()); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 패스워드가 null") + void exceptionWhenPasswordIsNull() { + //given + String nullPassword = null; + + //when + Exception exception = catchException( + () -> shelterService.registerShelter(email, nullPassword, name, address, + addressDetail, phoneNumber, sparePhoneNumber, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + + @ParameterizedTest + @CsvSource({ + "4", "5", "17", "18" + }) + @DisplayName("예외(ShelterBadRequestException): 패스워드가 6자 미만, 16자 초과") + void exceptionWhenPasswordOutOfLength(String passwordLength) { + //given + String passwordOutOfLength = "a".repeat(Integer.parseInt(passwordLength)); + + //when + Exception exception = catchException( + () -> shelterService.registerShelter(email, passwordOutOfLength, name, address, + addressDetail, phoneNumber, sparePhoneNumber, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + } + @Nested @DisplayName("findShelterDetail 실행 시") class FindShelterDetailTest { diff --git a/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfoTest.java b/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfoTest.java new file mode 100644 index 000000000..18b8d9044 --- /dev/null +++ b/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterAddressInfoTest.java @@ -0,0 +1,119 @@ +package com.clova.anifriends.domain.shelter.wrapper; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchException; + +import com.clova.anifriends.domain.shelter.exception.ShelterBadRequestException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class ShelterAddressInfoTest { + + @Nested + @DisplayName("ShelterAddressInfo 생성 시") + class NewShelterAddressInfoTest { + + String address = "address"; + String addressDetail = "addressDetail"; + boolean isOpenedAddress = false; + + @Test + @DisplayName("성공") + void newShelterAddressInfo() { + //given + //when + ShelterAddressInfo shelterAddressInfo = new ShelterAddressInfo(address, addressDetail, + isOpenedAddress); + + //then + assertThat(shelterAddressInfo.getAddress()).isEqualTo(address); + assertThat(shelterAddressInfo.getAddressDetail()).isEqualTo(addressDetail); + assertThat(shelterAddressInfo.isOpenedAddress()).isEqualTo(isOpenedAddress); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 보호소 주소가 null") + void exceptionWhenShelterAddressIsNull() { + //given + String nullAddress = null; + + //when + Exception exception = catchException( + () -> new ShelterAddressInfo(nullAddress, addressDetail, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 보호소 상세 주소가 null") + void exceptionWhenShelterAddressDetailIsNull() { + //given + String nullAddressDetail = null; + + //when + Exception exception = catchException( + () -> new ShelterAddressInfo(address, nullAddressDetail, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 보호소 주소가 공백") + void exceptionWhenShelterAddressIsBlank() { + //given + String blankAddress = ""; + + //when + Exception exception = catchException( + () -> new ShelterAddressInfo(blankAddress, addressDetail, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 보호소 상세 주소가 공백") + void exceptionWhenShelterAddressDetailIsBlank() { + //given + String blankAddressDetail = ""; + + //when + Exception exception = catchException( + () -> new ShelterAddressInfo(address, blankAddressDetail, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 보호소 주소가 100자 초과") + void exceptionWhenShelterAddressLengthOver100() { + //given + String addressLengthOver100 = "a".repeat(101); + + //then + Exception exception = catchException( + () -> new ShelterAddressInfo(addressLengthOver100, addressDetail, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + + @Test + @DisplayName("예외(ShelterBadRequestException): 보호소 상세 주소가 100자 초과") + void exceptionWhenShelterAddressDetailLengthOver100() { + //given + String addressDetailLengthOver100 = "a".repeat(101); + + //then + Exception exception = catchException( + () -> new ShelterAddressInfo(address, addressDetailLengthOver100, isOpenedAddress)); + + //then + assertThat(exception).isInstanceOf(ShelterBadRequestException.class); + } + } +} diff --git a/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPasswordTest.java b/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPasswordTest.java index 97d6ea50e..ffaaea67c 100644 --- a/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPasswordTest.java +++ b/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPasswordTest.java @@ -56,33 +56,5 @@ void throwExceptionWhenPasswordIsBlank() { // then assertThat(exception).isInstanceOf(ShelterBadRequestException.class); } - - @Test - @DisplayName("예외(ShelterBadRequestException): 비밀번호가 6자 미만인 경우") - void throwExceptionWhenPasswordIsLessThanSix() { - // given - password = "asdf"; - - // when - Exception exception = catchException( - () -> new ShelterPassword(password)); - - // then - assertThat(exception).isInstanceOf(ShelterBadRequestException.class); - } - - @Test - @DisplayName("예외(ShelterBadRequestException): 비밀번호가 16자 초과인 경우") - void throwExceptionWhenPasswordIsOverThanSixteen() { - // given - password = "asdfqwer123asdfqwer123"; - - // when - Exception exception = catchException( - () -> new ShelterPassword(password)); - - // then - assertThat(exception).isInstanceOf(ShelterBadRequestException.class); - } } } diff --git a/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfoTest.java b/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfoTest.java index 8f07a8d2a..74e8c2ef3 100644 --- a/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfoTest.java +++ b/src/test/java/com/clova/anifriends/domain/shelter/wrapper/ShelterPhoneNumberInfoTest.java @@ -7,6 +7,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; class ShelterPhoneNumberInfoTest { @@ -14,16 +16,13 @@ class ShelterPhoneNumberInfoTest { @DisplayName("ShelterPhoneNumber 생성 시") class NewShelterPhoneNumberTest { - String phoneNumber; - String sparePhoneNumber; + String phoneNumber = "010-1234-1234"; + String sparePhoneNumber = "010-1234-5678"; @Test @DisplayName("성공") void newShelterPhoneNumber() { // given - phoneNumber = "010-1234-1234"; - sparePhoneNumber = "010-1234-1253"; - // when ShelterPhoneNumberInfo shelterPhoneNumberInfo = new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber); @@ -37,12 +36,11 @@ void newShelterPhoneNumber() { @DisplayName("예외(ShelterNotFoundException): 전화번호가 null") void throwExceptionWhenPhoneNumberIsNull() { // given - phoneNumber = null; - sparePhoneNumber = "010-1234-1253"; + String nullPhoneNumber= null; // when Exception exception = catchException( - () -> new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber)); + () -> new ShelterPhoneNumberInfo(nullPhoneNumber, sparePhoneNumber)); // then assertThat(exception).isInstanceOf(ShelterBadRequestException.class); @@ -52,72 +50,41 @@ void throwExceptionWhenPhoneNumberIsNull() { @DisplayName("예외(ShelterNotFoundException): 임시 전화번호가 null") void throwExceptionWhenSparePhoneNumberIsNull() { // given - phoneNumber = "010-1234-1253"; - sparePhoneNumber = null; + String nullSparePhoneNumber = null; // when Exception exception = catchException( - () -> new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber)); + () -> new ShelterPhoneNumberInfo(phoneNumber, nullSparePhoneNumber)); // then assertThat(exception).isInstanceOf(ShelterBadRequestException.class); } - @Test - @DisplayName("예외(ShelterNotFoundException): 전화번호가 빈 칸") - void throwExceptionWhenPhoneNumberIsBlank() { - // given - phoneNumber = ""; - sparePhoneNumber = "010-1243-1234"; - - // when - Exception exception = catchException( - () -> new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber)); - - // then - assertThat(exception).isInstanceOf(ShelterBadRequestException.class); - } - - @Test - @DisplayName("예외(ShelterNotFoundException): 임시 전화번호가 빈 칸") - void throwExceptionWhenSparePhoneNumberIsBlank() { - // given - phoneNumber = "010-1243-1234"; - sparePhoneNumber = ""; - - // when - Exception exception = catchException( - () -> new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber)); - - // then - assertThat(exception).isInstanceOf(ShelterBadRequestException.class); - } - - @Test + @ParameterizedTest + @CsvSource({ + "01000-1234-5678", "010-123456-1234", "012-1234-123" + }) @DisplayName("예외(ShelterNotFoundException): 전화번호가 패턴에 맞지 않는 경우") - void throwExceptionWhenPhoneNumberIsNotPatternNumber() { + void throwExceptionWhenPhoneNumberIsNotPatternNumber(String invalidPhoneNumber) { // given - phoneNumber = "010-1243-12345"; - sparePhoneNumber = "010-2312-1232"; - // when Exception exception = catchException( - () -> new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber)); + () -> new ShelterPhoneNumberInfo(invalidPhoneNumber, sparePhoneNumber)); // then assertThat(exception).isInstanceOf(ShelterBadRequestException.class); } - @Test + @ParameterizedTest + @CsvSource({ + "01000-1234-5678", "010-123456-1234", "012-1234-123" + }) @DisplayName("예외(ShelterNotFoundException): 임시 전화번호가 패턴에 맞지 않는 경우") - void throwExceptionWhenSparePhoneNumberIsNotPatternNumber() { + void throwExceptionWhenSparePhoneNumberIsNotPatternNumber(String invalidSparePhoneNumber) { // given - phoneNumber = "010-1243-1235"; - sparePhoneNumber = "010-2312-12312"; - // when Exception exception = catchException( - () -> new ShelterPhoneNumberInfo(phoneNumber, sparePhoneNumber)); + () -> new ShelterPhoneNumberInfo(phoneNumber, invalidSparePhoneNumber)); // then assertThat(exception).isInstanceOf(ShelterBadRequestException.class);