diff --git a/src/main/java/com/ohdab/member/service/WithdrawlService.java b/src/main/java/com/ohdab/member/service/WithdrawlService.java index eb8df379..53ecd4f9 100644 --- a/src/main/java/com/ohdab/member/service/WithdrawlService.java +++ b/src/main/java/com/ohdab/member/service/WithdrawlService.java @@ -1,5 +1,9 @@ package com.ohdab.member.service; +import static com.ohdab.member.service.helper.MemberHelperService.findExistingMemberById; + +import com.ohdab.member.domain.Member; +import com.ohdab.member.repository.MemberRepository; import com.ohdab.member.service.usecase.WithdrawlUsecase; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -10,6 +14,11 @@ @Transactional public class WithdrawlService implements WithdrawlUsecase { + private final MemberRepository memberRepository; + @Override - public void withdrawl(long memberId) {} + public void withdrawl(long memberId) { + Member member = findExistingMemberById(memberRepository, memberId); + member.withdrawal(); + } } diff --git a/src/test/java/com/ohdab/member/repository/MemberRepositoryTest.java b/src/test/java/com/ohdab/member/repository/MemberRepositoryTest.java index 6ddcecbc..f01c011f 100644 --- a/src/test/java/com/ohdab/member/repository/MemberRepositoryTest.java +++ b/src/test/java/com/ohdab/member/repository/MemberRepositoryTest.java @@ -7,7 +7,6 @@ import com.ohdab.member.domain.Authority; import com.ohdab.member.domain.Member; import com.ohdab.member.domain.memberinfo.MemberInfo; -import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import org.junit.jupiter.api.DisplayName; @@ -19,7 +18,7 @@ class MemberRepositoryTest { @Autowired private MemberRepository memberRepository; - @Autowired private EntityManager entityManager; + @Autowired private EntityManager em; @Test @DisplayName("선생님 목록 조회 성공 테스트") @@ -31,8 +30,8 @@ class MemberRepositoryTest { Member teacher2 = memberRepository.save(createMember("선생님2", "tjstodsla2", teacher)); Member teacher3 = memberRepository.save(createMember("선생님3", "tjstodsla3", teacher)); Member student1 = memberRepository.save(createMember("학생", "gkrtod", student)); - entityManager.flush(); - entityManager.clear(); + em.flush(); + em.clear(); // when List results = memberRepository.findByAuthoritiesContaining(teacher); @@ -112,9 +111,24 @@ class MemberRepositoryTest { .containsExactly(member.getId(), INACTIVE); } - private Member createMember(String name, String password, Authority role) { - List authorities = new ArrayList<>(); - authorities.add(role); + @DisplayName("회원탈퇴") + @Test + void 회원탈퇴() { + // given + Member member = + createMember("갑", "1234", new Authority("TEACHER"), new Authority("STUDENT")); + + // when + memberRepository.save(member); + member.withdrawal(); + em.flush(); + + // then + assertThat(member.getStatus()).isEqualTo(INACTIVE); + } + + private Member createMember(String name, String password, Authority... role) { + List authorities = List.of(role); return Member.builder() .memberInfo(MemberInfo.builder().name(name).password(password).build()) .authorities(authorities) diff --git a/src/test/java/com/ohdab/member/service/WithdrawlServiceTest.java b/src/test/java/com/ohdab/member/service/WithdrawlServiceTest.java new file mode 100644 index 00000000..6d3f98b4 --- /dev/null +++ b/src/test/java/com/ohdab/member/service/WithdrawlServiceTest.java @@ -0,0 +1,127 @@ +package com.ohdab.member.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; + +import com.ohdab.member.domain.Authority; +import com.ohdab.member.domain.Member; +import com.ohdab.member.domain.MemberStatus; +import com.ohdab.member.domain.memberinfo.MemberInfo; +import com.ohdab.member.exception.AlreadyWithdrawlException; +import com.ohdab.member.exception.NoMemberException; +import com.ohdab.member.repository.MemberRepository; +import com.ohdab.member.service.usecase.WithdrawlUsecase; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = {WithdrawlService.class}) +class WithdrawlServiceTest { + + @Autowired private WithdrawlUsecase withdrawlUsecase; + @MockBean private MemberRepository memberRepository; + + @DisplayName("withdrawl 메서드는") + @Nested + class withdrawlMethod { + + @DisplayName("해당 회원이 존재하고") + @Nested + class isExitsMember { + + @DisplayName("탈퇴하지 않았다면") + @Nested + class isActiveMember { + + @DisplayName("탈퇴처리한다.") + @Test + void withdrawl() { + // given + final long memberId = 1L; + final Member member = + Member.builder() + .memberInfo( + MemberInfo.builder().name("갑").password("1234").build()) + .authorities( + List.of( + new Authority("STUDENT"), + new Authority("TEACHER"))) + .build(); + + // when + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + withdrawlUsecase.withdrawl(memberId); + + // then + assertThat(member.getStatus()).isEqualTo(MemberStatus.INACTIVE); + } + } + + @DisplayName("이미 탈퇴했다면") + @Nested + class alreadyWithdrawl { + + @DisplayName("AlreadyWithdrawlException 예외를 던진다.") + @Test + void throwAlreadyWithdrawlException() { + // given + final long memberId = 1L; + final Member member = + Member.builder() + .memberInfo( + MemberInfo.builder().name("갑").password("1234").build()) + .authorities( + List.of( + new Authority("STUDENT"), + new Authority("TEACHER"))) + .build(); + member.withdrawal(); + + // when + when(memberRepository.findById(anyLong())) + .thenReturn(Optional.ofNullable(member)); + + // then + assertThatThrownBy(() -> withdrawlUsecase.withdrawl(memberId)) + .isInstanceOf(AlreadyWithdrawlException.class); + } + } + } + + @DisplayName("해당 회원이 존재하지 않는다면") + @Nested + class isNotExistMember { + + @DisplayName("NoMemberException 예외를 던진다.") + @Test + void throwNoMemberException() { + // given + final long memberId = 1L; + final Member member = + Member.builder() + .memberInfo(MemberInfo.builder().name("갑").password("1234").build()) + .authorities( + List.of(new Authority("STUDENT"), new Authority("TEACHER"))) + .build(); + + // when + when(memberRepository.findById(anyLong())).thenReturn(Optional.empty()); + + // then + assertThatThrownBy(() -> withdrawlUsecase.withdrawl(memberId)) + .isInstanceOf(NoMemberException.class); + } + } + } +}