diff --git a/build.gradle b/build.gradle index db135f30..9f7ec49a 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-security' + testImplementation 'junit:junit:4.13.1' + testImplementation 'org.projectlombok:lombok:1.18.28' + testImplementation 'org.projectlombok:lombok:1.18.28' runtimeOnly 'com.h2database:h2' implementation 'org.postgresql:postgresql' compileOnly 'org.projectlombok:lombok' @@ -81,6 +84,12 @@ dependencies { // implementation "org.flywaydb:flyway-core" // implementation "org.springframework.boot:spring-boot-starter" + // testcontainers + testImplementation "org.testcontainers:testcontainers:1.17.2" + testImplementation "org.testcontainers:junit-jupiter:1.17.2" + testImplementation "org.testcontainers:postgresql:1.17.6" + + } tasks.named('test') { diff --git a/src/main/java/com/uspray/uspray/DTO/auth/request/FindIdDto.java b/src/main/java/com/uspray/uspray/DTO/auth/request/FindIdDto.java index 8d28d807..3c27a4c4 100644 --- a/src/main/java/com/uspray/uspray/DTO/auth/request/FindIdDto.java +++ b/src/main/java/com/uspray/uspray/DTO/auth/request/FindIdDto.java @@ -1,9 +1,11 @@ package com.uspray.uspray.DTO.auth.request; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; import lombok.Data; @Data +@Builder public class FindIdDto { @Schema(example = "이름") diff --git a/src/main/java/com/uspray/uspray/DTO/auth/request/FindPwDTO.java b/src/main/java/com/uspray/uspray/DTO/auth/request/FindPwDTO.java index fa7b706d..c32cba16 100644 --- a/src/main/java/com/uspray/uspray/DTO/auth/request/FindPwDTO.java +++ b/src/main/java/com/uspray/uspray/DTO/auth/request/FindPwDTO.java @@ -1,10 +1,13 @@ package com.uspray.uspray.DTO.auth.request; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; import lombok.Data; @Data +@Builder public class FindPwDTO { + @Schema(example = "test") String userId; @Schema(example = "01012345678") diff --git a/src/main/java/com/uspray/uspray/DTO/auth/request/MemberLoginRequestDto.java b/src/main/java/com/uspray/uspray/DTO/auth/request/MemberLoginRequestDto.java index d009de91..620c785c 100644 --- a/src/main/java/com/uspray/uspray/DTO/auth/request/MemberLoginRequestDto.java +++ b/src/main/java/com/uspray/uspray/DTO/auth/request/MemberLoginRequestDto.java @@ -1,16 +1,17 @@ package com.uspray.uspray.DTO.auth.request; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import javax.validation.constraints.NotBlank; - @Getter @AllArgsConstructor @NoArgsConstructor +@Builder public class MemberLoginRequestDto { @NotBlank diff --git a/src/main/java/com/uspray/uspray/DTO/auth/request/MemberRequestDto.java b/src/main/java/com/uspray/uspray/DTO/auth/request/MemberRequestDto.java index ce1d4dbd..0bead1b1 100644 --- a/src/main/java/com/uspray/uspray/DTO/auth/request/MemberRequestDto.java +++ b/src/main/java/com/uspray/uspray/DTO/auth/request/MemberRequestDto.java @@ -3,16 +3,21 @@ import com.uspray.uspray.Enums.Authority; import com.uspray.uspray.domain.Member; import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.NotBlank; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.validator.constraints.Length; import org.springframework.security.crypto.password.PasswordEncoder; -import javax.validation.constraints.NotBlank; - @Getter +@Setter @AllArgsConstructor @NoArgsConstructor +@Schema(description = "회원가입 요청") +@Builder public class MemberRequestDto { @NotBlank @@ -28,6 +33,7 @@ public class MemberRequestDto { private String name; @NotBlank + @Length(min = 11, max = 11) @Schema(description = "전화번호", example = "01012345678") private String phone; @@ -37,15 +43,16 @@ public class MemberRequestDto { @Schema(description = "성별", example = "female") private String gender; + public Member toMember(PasswordEncoder passwordEncoder) { return Member.builder() - .userId(userId) - .password(passwordEncoder.encode(password)) - .name(name) - .phone(phone) - .birth(birth) - .gender(gender) - .authority(Authority.ROLE_USER) - .build(); + .userId(userId) + .password(passwordEncoder.encode(password)) + .name(name) + .phone(phone) + .birth(birth) + .gender(gender) + .authority(Authority.ROLE_USER) + .build(); } } diff --git a/src/main/java/com/uspray/uspray/controller/AuthController.java b/src/main/java/com/uspray/uspray/controller/AuthController.java index cebe4b95..89e16e54 100644 --- a/src/main/java/com/uspray/uspray/controller/AuthController.java +++ b/src/main/java/com/uspray/uspray/controller/AuthController.java @@ -43,6 +43,7 @@ public class AuthController { private final AuthService authService; @PostMapping("/signup") + @Operation(summary = "회원가입") @ApiResponse( responseCode = "201", description = "회원가입 성공", @@ -103,7 +104,8 @@ public ApiResponseDto changePw(@RequestBody ChangePwDto changePwDto) { @GetMapping("/name") @Operation(summary = "회원 이름 조회") @SecurityRequirement(name = "JWT Auth") - public ApiResponseDto getName(@Parameter(hidden = true) @AuthenticationPrincipal User user) { + public ApiResponseDto getName( + @Parameter(hidden = true) @AuthenticationPrincipal User user) { return ApiResponseDto.success(SuccessStatus.GET_USER_NAME_SUCCESS, authService.getMemberName(user.getUsername())); } @@ -129,7 +131,9 @@ public ApiResponseDto dupCheck(@PathVariable("userId") Stri @GetMapping("/login-check") @Operation(summary = "사용한 로그인 방식 체크(일반, 소셜)") @SecurityRequirement(name = "JWT Auth") - public ApiResponseDto loginCheck (@Parameter(hidden = true) @AuthenticationPrincipal User user) { - return ApiResponseDto.success(SuccessStatus.LOGIN_CHECK_SUCCESS, authService.loginCheck(user.getUsername())); + public ApiResponseDto loginCheck( + @Parameter(hidden = true) @AuthenticationPrincipal User user) { + return ApiResponseDto.success(SuccessStatus.LOGIN_CHECK_SUCCESS, + authService.loginCheck(user.getUsername())); } } diff --git a/src/main/java/com/uspray/uspray/service/AuthService.java b/src/main/java/com/uspray/uspray/service/AuthService.java index 4e19e983..68338da7 100644 --- a/src/main/java/com/uspray/uspray/service/AuthService.java +++ b/src/main/java/com/uspray/uspray/service/AuthService.java @@ -45,8 +45,6 @@ public class AuthService { @Transactional public MemberResponseDto signup(MemberRequestDto memberRequestDto) { - // 핸드폰번호가 존재하거나 아이디가 존재하면 에러 - // 핸드폰 번호 또는 아이디가 이미 존재하는지 확인 if (memberRepository.existsByUserId(memberRequestDto.getUserId())) { throw new NotFoundException(ErrorStatus.ALREADY_EXIST_ID_EXCEPTION, ErrorStatus.ALREADY_EXIST_ID_EXCEPTION.getMessage()); diff --git a/src/test/java/com/uspray/uspray/UsprayApplicationTests.java b/src/test/java/com/uspray/uspray/UsprayApplicationTests.java index 50f2357a..12105a21 100644 --- a/src/test/java/com/uspray/uspray/UsprayApplicationTests.java +++ b/src/test/java/com/uspray/uspray/UsprayApplicationTests.java @@ -2,12 +2,15 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; -//@SpringBootTest +@SpringBootTest +@ActiveProfiles("test") +//@Testcontainers class UsprayApplicationTests { - @Test - void contextLoads() { - } + @Test + void contextLoads() { + } } diff --git a/src/test/java/com/uspray/uspray/common/MemberTest.java b/src/test/java/com/uspray/uspray/common/MemberTest.java new file mode 100644 index 00000000..52ae5be7 --- /dev/null +++ b/src/test/java/com/uspray/uspray/common/MemberTest.java @@ -0,0 +1,43 @@ +package com.uspray.uspray.common; + +import com.uspray.uspray.domain.Member; +import com.uspray.uspray.infrastructure.MemberRepository; +import com.uspray.uspray.service.AuthService; +import com.uspray.uspray.service.MemberService; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@Transactional +@ActiveProfiles("test") +public abstract class MemberTest { + + @Autowired + protected MemberService memberService; + @Autowired + protected AuthService authService; + @Autowired + protected MemberRepository memberRepository; + + @BeforeEach + void setUp() { + Member member = memberRepository.save(Member.builder() + .userId("leesunshin") + .password("test") + .name("이순신") + .phone("01011111111") + .gender("female") + .build()); + + Member member2 = memberRepository.save(Member.builder() + .userId("kimyushin") + .password("test2") + .name("김유신") + .phone("01022222222") + .gender("male") + .build()); + } +} diff --git a/src/test/java/com/uspray/uspray/repository/MemberRepositoryTest.java b/src/test/java/com/uspray/uspray/repository/MemberRepositoryTest.java new file mode 100644 index 00000000..9de6ad04 --- /dev/null +++ b/src/test/java/com/uspray/uspray/repository/MemberRepositoryTest.java @@ -0,0 +1,26 @@ +package com.uspray.uspray.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class MemberRepositoryTest extends RepositoryTest { + + @Test + @DisplayName("회원 아이디로 조회 시 존재하지 않는 아이디일 경우 예외를 던진다.") + void existsByUserId() { + // Given + String userId = "leesunshin"; + String notExistUserId = "unknown"; + + // When + boolean existsByUserId = memberRepository.existsByUserId(userId); + boolean notExistsByUserId = memberRepository.existsByUserId(notExistUserId); + + // Then + assertThat(existsByUserId).isTrue(); + assertThat(notExistsByUserId).isFalse(); + } + +} diff --git a/src/test/java/com/uspray/uspray/repository/RepositoryTest.java b/src/test/java/com/uspray/uspray/repository/RepositoryTest.java new file mode 100644 index 00000000..fb5c1232 --- /dev/null +++ b/src/test/java/com/uspray/uspray/repository/RepositoryTest.java @@ -0,0 +1,34 @@ +package com.uspray.uspray.repository; + +import com.uspray.uspray.domain.Member; +import com.uspray.uspray.infrastructure.CategoryRepository; +import com.uspray.uspray.infrastructure.MemberRepository; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +//@DataJpaTest +@Transactional +@SpringBootTest +@ActiveProfiles("test") +public abstract class RepositoryTest { + + @Autowired + protected MemberRepository memberRepository; + + @Autowired + protected CategoryRepository categoryRepository; + + @BeforeEach + void userSetup() { + Member member = memberRepository.save(Member.builder() + .userId("leesunshin") + .password("test") + .name("이순신") + .phone("01011111111") + .build()); + } + +} diff --git a/src/test/java/com/uspray/uspray/service/AuthServiceTest.java b/src/test/java/com/uspray/uspray/service/AuthServiceTest.java new file mode 100644 index 00000000..cc9a0a2b --- /dev/null +++ b/src/test/java/com/uspray/uspray/service/AuthServiceTest.java @@ -0,0 +1,129 @@ +package com.uspray.uspray.service; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import com.uspray.uspray.DTO.auth.request.FindIdDto; +import com.uspray.uspray.DTO.auth.request.FindPwDTO; +import com.uspray.uspray.DTO.auth.request.MemberLoginRequestDto; +import com.uspray.uspray.DTO.auth.request.MemberRequestDto; +import com.uspray.uspray.common.MemberTest; +import com.uspray.uspray.exception.model.NotFoundException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class AuthServiceTest extends MemberTest { + + @Test + @DisplayName("회원 가입 시 중복된 아이디가 있을 경우 예외를 던진다.") + void signUpWithDupId() { + // Given + String userId = "leesunshin"; + + // When + MemberRequestDto memberRequestDto = MemberRequestDto.builder() + .userId(userId) + .password("leesunshin") + .name("이순신") + .phone("01011111111") + .build(); + + // Then + assertThatThrownBy(() -> authService.signup(memberRequestDto)) + .isInstanceOf(NotFoundException.class); + + } + + @Test + @DisplayName("회원 가입 시 중복된 전화번호가 있을 경우 예외를 던진다.") + void signUpWithDupPhone() { + // Given + String phone = "01011111111"; + + // When + MemberRequestDto memberRequestDto = MemberRequestDto.builder() + .userId("test2") + .password("test2") + .name("김유신") + .phone(phone) + .build(); + + // Then + assertThatThrownBy(() -> authService.signup(memberRequestDto)) + .isInstanceOf(NotFoundException.class); + } + + @Test + @DisplayName("로그인 시 정보가 틀렸을 경우 예외를 던진다.") + void login() { + // Given + String userId = "unknown"; + String password = "unknown"; + + // When + MemberLoginRequestDto memberLoginRequestDto = MemberLoginRequestDto.builder() + .userId(userId) + .password(password) + .build(); + + // Then + assertThatThrownBy(() -> authService.login(memberLoginRequestDto)) + .isInstanceOf(NotFoundException.class); + } + + @Test + @DisplayName("이름과 전화번호로 아이디를 찾는다.") + void findId() { + // Given + String userid = "leesunshin"; + String name = "이순신"; + String phone = "01011111111"; + + // When + FindIdDto findIdDto = FindIdDto.builder() + .name(name) + .phone(phone) + .build(); + + // Then + assertThat(authService.findId(findIdDto)).isEqualTo(userid); + } + + @Test + @DisplayName("아이디과 전화번호로 회원여부를 확인한다.") + void findPw() { + // Given + String userid = "leesunshin"; + String phone = "01011111111"; + + // When + FindPwDTO findPwDTO = FindPwDTO.builder() + .userId(userid) + .phone(phone) + .build(); + + // Then + assertThat(authService.findPw(findPwDTO)).isInstanceOf(Long.class); + } + + @Test + @DisplayName("비밀번호를 변경한다.") + void changePw() { + } + + @Test + void getName() { + } + + @Test + void withdrawal() { + } + + @Test + void dupCheck() { + } + + @Test + void loginCheck() { + } +}