Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[OMCT-265] Meber Implementation 단위테스트 추가 #221

Merged
merged 9 commits into from
Jan 8, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void append(
memberRepository.save(member);
}

public void append(
public Member append(
final String email,
final String encodedPassword,
final String nickname
Expand All @@ -32,6 +32,6 @@ public void append(
.role(Role.USER)
.build();

memberRepository.save(member);
return memberRepository.save(member);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.programmers.bucketback.domains.member.implementation;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import com.programmers.bucketback.domains.member.domain.Member;
import com.programmers.bucketback.domains.member.domain.vo.Role;
import com.programmers.bucketback.domains.member.repository.MemberRepository;

@ExtendWith(MockitoExtension.class)
class MemberAppenderTest {

@InjectMocks
private MemberAppender memberAppender;

@Mock
private MemberRepository memberRepository;

@Test
@DisplayName("이메일, 암호화된 비밀번호, 닉네임로 회원을 생성 후 저장한다.")
void appendTest() {
// given
final String email = "[email protected]";
final String encodedPassword = "$2b$12$9136HMSjeym7mmJ5OgvCPusoDmCmAN5w1caMkXN8s7OuklKr755y6";
final String nickname = "best_park";
final Member member = Member.builder()
.email(email)
.password(encodedPassword)
.nickname(nickname)
.role(Role.USER)
.build();

given(memberRepository.save(any(Member.class)))
.willReturn(member);

// when
final Member result = memberAppender.append(email, encodedPassword, nickname);

// then
assertThat(result).usingRecursiveComparison()
.isEqualTo(member);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.programmers.bucketback.domains.member.implementation;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.BDDMockito.*;

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.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import com.programmers.bucketback.domains.member.repository.MemberRepository;
import com.programmers.bucketback.error.BusinessException;

@ExtendWith(MockitoExtension.class)
class MemberCheckerTest {

@InjectMocks
private MemberChecker memberChecker;

@Mock
private MemberRepository memberRepository;

@Nested
@DisplayName("닉네임 중복 확인 테스트")
class CheckNicknameDuplicationTest {
@Test
@DisplayName("닉네임을 가진 회원이 없으면 아무일도 일어나지 않는다.")
void doNotDuplicateTest() {
// given
final String nickname = "best_park";

given(memberRepository.existsByNicknameNickname(anyString()))
.willReturn(false);

// when & then
assertDoesNotThrow(() -> memberChecker.checkNicknameDuplication(nickname));
}

@Test
@DisplayName("닉네임을 가진 회원이 있으면 예외가 발생한다.")
void occurExceptionIfDuplicateTest() {
// given
final String nickname = "best_park";

given(memberRepository.existsByNicknameNickname(anyString()))
.willReturn(true);

// when & then
assertThatThrownBy(
() -> memberChecker.checkNicknameDuplication(nickname)
)
.isInstanceOf(BusinessException.class);
}
}

@Nested
@DisplayName("이메일 중복 확인 테스트")
class CheckEmailDuplicationTest {
@Test
@DisplayName("이메일을 가진 회원이 없으면 아무일도 일어나지 않는다.")
void doNotDuplicateTest() {
// given
final String email = "[email protected]";

given(memberRepository.existsByLoginInfoEmail(anyString()))
.willReturn(false);

// when & then
assertDoesNotThrow(() -> memberChecker.checkEmailDuplication(email));
}

@Test
@DisplayName("이메일을 가진 회원이 있으면 예외가 발생한다.")
void occurExceptionIfDuplicateTest() {
// given
final String email = "[email protected]";

given(memberRepository.existsByLoginInfoEmail(anyString()))
.willReturn(true);

// when & then
assertThatThrownBy(
() -> memberChecker.checkEmailDuplication(email)
)
.isInstanceOf(BusinessException.class);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.programmers.bucketback.domains.member.implementation;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

import java.util.UUID;

import org.junit.jupiter.api.DisplayName;
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.junit.jupiter.MockitoExtension;

import com.programmers.bucketback.domains.member.domain.Member;
import com.programmers.bucketback.domains.member.domain.MemberBuilder;

@ExtendWith(MockitoExtension.class)
class MemberModifierTest {

@InjectMocks
private MemberModifier memberModifier;

@Mock
private MemberChecker memberChecker;

@ParameterizedTest
@CsvSource({"nickname, 0", "best_park, 1"})
@DisplayName("주어진 닉네임과 자기소개로 프로필을 수정한다.")
void modifyProfileTest(
final String nickname,
final int time
) {
// given
final Member member = MemberBuilder.build(1L);
final String introduction = "안녕하세요!";

// when
memberModifier.modifyProfile(member, nickname, introduction);

// then
assertThat(member.getNickname()).isEqualTo(nickname);
assertThat(member.getIntroduction()).isEqualTo(introduction);
then(memberChecker).should(times(time)).checkNicknameDuplication(nickname);
}

@Test
@DisplayName("비밀번호를 변경한다.")
void modifyPasswordTest() {
// given
final Member member = MemberBuilder.build(1L);
final String encodedPassword = "$2b$12$9136HMSjeym7mmJ5OgvCPusoDmCmAN5w1caMkXN8s7OuklKr755y6";

// when
memberModifier.modifyPassword(member, encodedPassword);

// then
assertThat(member.getPassword()).isEqualTo(encodedPassword);
}

@Test
@DisplayName("프로필 이미지를 변경한다.")
void modifyProfileImageTest() {
// given
final Member member = MemberBuilder.build(1L);
final String directory = "resized";
final String profileImage = UUID.randomUUID() + ".png";
final String IMAGE_BASE_PATH = "https://team-02-bucket.s3.ap-northeast-2.amazonaws.com/";
final String imagePath = IMAGE_BASE_PATH + directory + "/" + profileImage;

// when
memberModifier.modifyProfileImage(member, directory, profileImage);

// then
assertThat(member.getProfileImage()).isEqualTo(imagePath);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package com.programmers.bucketback.domains.member.implementation;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;

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.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import com.programmers.bucketback.domains.bucket.implementation.BucketReader;
import com.programmers.bucketback.domains.inventory.implementation.InventoryReader;
import com.programmers.bucketback.domains.member.domain.Member;
import com.programmers.bucketback.domains.member.domain.MemberBuilder;
import com.programmers.bucketback.domains.member.repository.MemberRepository;
import com.programmers.bucketback.error.EntityNotFoundException;

@ExtendWith(MockitoExtension.class)
class MemberReaderTest {

@InjectMocks
private MemberReader memberReader;

@Mock
private MemberRepository memberRepository;

@Mock
private BucketReader bucketReader;

@Mock
private InventoryReader inventoryReader;

@Nested
@DisplayName("memberId로 회원 조회 테스트")
class ReadTest {
@Test
@DisplayName("주어진 memberId를 가진 회원을 반환한다.")
void successTest() {
// given
final Long memberId = 1L;
final Member member = MemberBuilder.build(memberId);

given(memberRepository.findById(anyLong()))
.willReturn(Optional.ofNullable(member));

// when
final Member result = memberReader.read(memberId);

// then
assertThat(result).isEqualTo(member);
}

@Test
@DisplayName("주어진 memberId를 가진 회원이 없으면 예외가 발생한다.")
void occurExceptionIfNotExistTest() {
// given
final Long memberId = 1L;

given(memberRepository.findById(anyLong()))
.willReturn(Optional.empty());

// when & then
assertThatThrownBy(
() -> memberReader.read(memberId)
)
.isInstanceOf(EntityNotFoundException.class);
}
}

@Nested
@DisplayName("이메일로 회원 조회 테스트")
class ReadByEmailTest {
@Test
@DisplayName("주어진 이메일을 가진 회원을 반환한다.")
void successTest() {
// given
final String email = "[email protected]";
final Member member = MemberBuilder.build(1L);

given(memberRepository.findByLoginInfoEmail(anyString()))
.willReturn(Optional.ofNullable(member));

// when
final Member result = memberReader.readByEmail(email);

// then
assertThat(result).isEqualTo(member);
}

@Test
@DisplayName("주어진 이메일을 가진 회원이 없으면 예외가 발생한다.")
void occurExceptionIfNotExistTest() {
// given
final String email = "[email protected]";

given(memberRepository.findByLoginInfoEmail(anyString()))
.willReturn(Optional.empty());

// when & then
assertThatThrownBy(
() -> memberReader.readByEmail(email)
)
.isInstanceOf(EntityNotFoundException.class);
}
}

@Nested
@DisplayName("닉네임으로 회원 조회 테스트")
class ReadByNicknameTest {
@Test
@DisplayName("주어진 닉네임을 가진 회원을 반환한다.")
void successTest() {
// given
final String nickname = "nickname";
final Member member = MemberBuilder.build(1L);

given(memberRepository.findByNicknameNickname(anyString()))
.willReturn(Optional.ofNullable(member));

// when
final Member result = memberReader.readByNickname(nickname);

// then
assertThat(result).isEqualTo(member);
}

@Test
@DisplayName("주어진 닉네임을 가진 회원이 없으면 예외가 발생한다.")
void occurExceptionIfNotExistTest() {
// given
final String nickname = "nickname";

given(memberRepository.findByNicknameNickname(anyString()))
.willReturn(Optional.empty());

// when & then
assertThatThrownBy(
() -> memberReader.readByNickname(nickname)
)
.isInstanceOf(EntityNotFoundException.class);
}
}
}
Loading
Loading