Skip to content

Commit

Permalink
[Feature] - BE 테스트 개선 1단계 Test Fixture 운용 방식 통일 (Enum Fixture) (#614)
Browse files Browse the repository at this point in the history
* test: OauthUserFixture - Enum 기반의 Fixture로 전환

* test: MemberFixture - EnumFixture 컨벤션 통일 개선

* test: MemberFixture 속성을 가지는 Member를 만드는 Request 객체 생성하는 기능 추가

* test: MemberFixture 속성을 기반으로 Request 객체를 만들도록 테스트 코드 수정

* test: OauthUserFixture의 팩토리 메서드 이름 수정 (createXXX -> getXXX)

* test: MemberFixture의 팩토리 메서드 이름 수정 (createXXX -> getXXX)

* test: 사용되지 않는 Fixture 클래스 제거 개선

* test: Travelogue관련 Enum Fixture 컨벤션 통일 개

* test: TravelogueCountry, TravelogueDay 도메인 테스트 중복 데이터 셋팅 제거 개선

* test: Request 객체 생성 도메인 Fixture 내부로 응집

* test: 도메인 구성 시 연관관계를 직접 주입하도록 테스트 코드 수정

* test: CountryCode 패키지 위치 수정

* test: TraveloguePhotoTest 연관관계 도메인 주입을 셋업 코드로 이동 개선

* test: Fixture를 통한 도메인 생성 시 연관관계를 주입하도록 로직 수정

* test: 사용하지 않는 상수 제거 개선

* test: 반복되는 메서드 모킹 setUp으로 이동

* test: 반복되는 메서드 모킹 setUp으로 이동

* test: 연관 관계를 가지는 Fixture를 주입받아 Request객체를 생성하는 기능 추가

* test: TravelogueRequestBuilder 구현

* test: TravelogueRequestBuilder에서 DayBuilder 체크로직 제거

* test: 실패하는 테스트 수정

* test: RequestBuilder 객체 패키지 이동 fixture -> helper

* test: TravelPlan관련 fixture에 연관 도메인 관련 내용 제거

* test: TravelPlaceTodoFixture 구현

* test: Fixture를 통해서 Request 객체 만드는 기능 구현

* test: TravelPLanRequestBuilder 구현

* test: 과거 날짜 여행기 픽스쳐 추가

* test: Builder 클래스 개행 수정

* test: TravelPlanControllerTest에서 Request를 생성 시 RequestBuilder를 이용하도록 개선

* test: 사용하지 않는 테스트 상수 제거 개선

* test: TravelogueCountryTest 줄바꿈 컨벤션 적용

* test: TraveloguePlaceFixture 줄바꿈 컨벤션 적용 및 사용하지 않는 메서드 제거 개선

* test: TravelogueRequestBuilder와 TravelogueDayRequestBuilder 별도 클래스로 분리

* test: TravelPlanRequestBuilder와 PlanDayRequestBuilder 별도 클래스로 분리

* test: MemberFixture 이름 변경 DEFAULT_MEMBER -> TOUROOT_LOCAL_USER
  • Loading branch information
Libienz authored Dec 5, 2024
1 parent c7ab303 commit f922a95
Show file tree
Hide file tree
Showing 38 changed files with 1,008 additions and 433 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import kr.touroot.authentication.dto.request.TokenReissueRequest;
import kr.touroot.authentication.dto.response.OauthUserInformationResponse;
import kr.touroot.authentication.dto.response.TokenResponse;
import kr.touroot.authentication.fixture.OauthUserInformationFixture;
import kr.touroot.authentication.fixture.OauthUserFixture;
import kr.touroot.authentication.helper.LoginTestHelper;
import kr.touroot.authentication.infrastructure.JwtTokenProvider;
import kr.touroot.authentication.infrastructure.KakaoOauthProvider;
Expand Down Expand Up @@ -47,8 +48,9 @@ void setUp() {
@DisplayName("카카오 로그인 요청을 처리할 수 있다")
@Test
void loginTest() throws Exception {
OauthUserInformationResponse kakaoUserInformation = OauthUserFixture.KAKAO_USER.getOauthInformationResponse();
when(oauthProvider.getUserInformation(any(String.class), any(String.class)))
.thenReturn(OauthUserInformationFixture.USER_1_OAUTH_INFORMATION);
.thenReturn(kakaoUserInformation);

RestAssured.given().log().all()
.queryParam("code", "test")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kr.touroot.authentication.fixture;

import kr.touroot.authentication.dto.response.OauthUserInformationResponse;
import kr.touroot.authentication.dto.response.kakao.KakaoAccount;
import kr.touroot.authentication.dto.response.kakao.KakaoProfile;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public enum OauthUserFixture {

KAKAO_USER(1L, "test_nickname", "https://test_img_src.com");

private final Long socialLoginId;
private final String nickname;
private final String profileImagePath;

public OauthUserInformationResponse getOauthInformationResponse() {
KakaoProfile kakaoProfile = new KakaoProfile(nickname, profileImagePath);
KakaoAccount kakaoAccount = new KakaoAccount(kakaoProfile);
return new OauthUserInformationResponse(socialLoginId, kakaoAccount);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class LoginTestHelper {
private final MemberRepository memberRepository;

public Member initMemberTestData() {
Member member = MemberFixture.DEFAULT_MEMBER.build();
Member member = MemberFixture.TOUROOT_LOCAL_USER.getMember();
return memberRepository.save(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.util.Optional;
import kr.touroot.authentication.dto.response.LoginResponse;
import kr.touroot.authentication.dto.response.TokenResponse;
import kr.touroot.authentication.fixture.OauthUserInformationFixture;
import kr.touroot.authentication.fixture.OauthUserFixture;
import kr.touroot.authentication.infrastructure.JwtTokenProvider;
import kr.touroot.authentication.infrastructure.KakaoOauthProvider;
import kr.touroot.member.domain.Member;
Expand All @@ -28,7 +28,7 @@ class LoginServiceTest {

private static final String AUTHENTICATION_CODE = "test-authentication-code";
private static final String REDIRECT_URI = "http%3A%2F%2Flocalhost%3A8080%2Fapi%2Fv1%2Flogin%2Foauth%2Fkakao";
private static final Member MEMBER = MemberFixture.KAKAO_MEMBER.build();
private static final Member MEMBER = MemberFixture.KAKAO_MEMBER.getMember();

@InjectMocks
private LoginService loginService;
Expand All @@ -47,7 +47,7 @@ void existUserKakaoSocialLoginTest() {
String refreshToken = "bbb";

when(kakaoOauthProvider.getUserInformation(any(String.class), any(String.class)))
.thenReturn(OauthUserInformationFixture.USER_1_OAUTH_INFORMATION);
.thenReturn(OauthUserFixture.KAKAO_USER.getOauthInformationResponse());
when(memberRepository.findByKakaoId(any(Long.class)))
.thenReturn(Optional.of(MEMBER));
when(jwtTokenProvider.createToken(MEMBER.getId()))
Expand All @@ -69,7 +69,7 @@ void nonExistUserKakaoSocialLoginTest() {
String refreshToken = "bbb";

when(kakaoOauthProvider.getUserInformation(any(String.class), any(String.class)))
.thenReturn(OauthUserInformationFixture.USER_1_OAUTH_INFORMATION);
.thenReturn(OauthUserFixture.KAKAO_USER.getOauthInformationResponse());
when(memberRepository.findByKakaoId(any(Long.class)))
.thenReturn(Optional.empty());
when(memberRepository.save(any(Member.class)))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package kr.touroot.member.controller;

import static kr.touroot.member.fixture.MemberRequestFixture.EMPTY_EMAIL_MEMBER;
import static kr.touroot.member.fixture.MemberRequestFixture.EMPTY_NICKNAME_MEMBER;
import static kr.touroot.member.fixture.MemberRequestFixture.EMPTY_PASSWORD_MEMBER;
import static kr.touroot.member.fixture.MemberRequestFixture.EMPTY_PROFILE_IMAGE_URL_MEMBER;
import static kr.touroot.member.fixture.MemberRequestFixture.VALID_MEMBER;
import static org.hamcrest.Matchers.is;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import kr.touroot.global.AcceptanceTest;
import kr.touroot.member.dto.request.MemberRequest;
import kr.touroot.member.fixture.MemberFixture;
import kr.touroot.utils.DatabaseCleaner;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.web.server.LocalServerPort;

Expand Down Expand Up @@ -42,7 +40,7 @@ void setUp() {
@DisplayName("회원 가입을 한다.")
@Test
void createTravelogue() {
MemberRequest request = VALID_MEMBER.getRequest();
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequest();

RestAssured.given().log().all()
.contentType(ContentType.JSON)
Expand All @@ -56,7 +54,7 @@ void createTravelogue() {
@DisplayName("비어있는 이메일로 회원 가입하면 예외가 발생한다.")
@Test
void createTravelogueWithEmptyEmail() {
MemberRequest request = EMPTY_EMAIL_MEMBER.getRequest();
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequestWithEmail("");

RestAssured.given().log().all()
.contentType(ContentType.JSON)
Expand All @@ -68,9 +66,10 @@ void createTravelogueWithEmptyEmail() {
}

@DisplayName("비어있는 비밀번호로 회원 가입하면 예외가 발생한다.")
@Test
void createTravelogueWithEmptyPassword() {
MemberRequest request = EMPTY_PASSWORD_MEMBER.getRequest();
@ParameterizedTest
@ValueSource(strings = {"", "\t", "\n"})
void createTravelogueWithEmptyPassword(String emptyPassword) {
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequestWithPassword(emptyPassword);

RestAssured.given().log().all()
.contentType(ContentType.JSON)
Expand All @@ -82,9 +81,10 @@ void createTravelogueWithEmptyPassword() {
}

@DisplayName("비어있는 닉네임으로 회원 가입하면 예외가 발생한다.")
@Test
void createTravelogueWithEmptyNickname() {
MemberRequest request = EMPTY_NICKNAME_MEMBER.getRequest();
@ParameterizedTest
@ValueSource(strings = {"", "\t", "\n"})
void createTravelogueWithEmptyNickname(String emptyNickname) {
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequestWithNickname(emptyNickname);

RestAssured.given().log().all()
.contentType(ContentType.JSON)
Expand All @@ -96,9 +96,11 @@ void createTravelogueWithEmptyNickname() {
}

@DisplayName("비어있는 프로필 사진 경로로 회원 가입하면 예외가 발생한다.")
@Test
void createTravelogueWithEmptyProfileImageUrl() {
MemberRequest request = EMPTY_PROFILE_IMAGE_URL_MEMBER.getRequest();
@ParameterizedTest
@ValueSource(strings = {"", "\t", "\n"})
void createTravelogueWithEmptyProfileImageUrl(String emptyProfileImageUrl) {
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequestWithProfileImageUrl(
emptyProfileImageUrl);

RestAssured.given().log().all()
.contentType(ContentType.JSON)
Expand Down
48 changes: 43 additions & 5 deletions backend/src/test/java/kr/touroot/member/fixture/MemberFixture.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,31 @@

import kr.touroot.member.domain.LoginType;
import kr.touroot.member.domain.Member;
import kr.touroot.member.dto.request.MemberRequest;
import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum MemberFixture {

KAKAO_MEMBER(1L, null, null, "https://dev.touroot.kr/temporary/profile.png", "리비",
LoginType.KAKAO),
DEFAULT_MEMBER(null, "[email protected]", "password", "https://dev.touroot.kr/temporary/profile.png", "뚜리",
LoginType.DEFAULT);
KAKAO_MEMBER(
1L,
null,
null,
"https://dev.touroot.kr/temporary/profile.png",
"리비",
LoginType.KAKAO
),
TOUROOT_LOCAL_USER(
null,
"[email protected]",
"password",
"https://dev.touroot.kr/temporary/profile.png",
"뚜리",
LoginType.DEFAULT
),
;

private final Long socialId;
private final String email;
Expand All @@ -21,10 +35,34 @@ public enum MemberFixture {
private final String nickname;
private final LoginType loginType;

public Member build() {
public Member getMember() {
if (loginType == LoginType.KAKAO) {
return new Member(socialId, nickname, profileImageUrl, loginType);
}
return new Member(email, password, nickname, profileImageUrl, loginType);
}

public MemberRequest getCreateRequest() {
return new MemberRequest(email, password, nickname, profileImageUrl);
}

public MemberRequest getCreateRequestWithEmail(String email) {
return new MemberRequest(email, password, nickname, profileImageUrl);
}

public MemberRequest getCreateRequestWithPassword(String password) {
return new MemberRequest(email, password, nickname, profileImageUrl);
}

public MemberRequest getCreateRequestWithNickname(String nickname) {
return new MemberRequest(email, password, nickname, profileImageUrl);
}

public MemberRequest getCreateRequestWithProfileImageUrl(String profileImageUrl) {
return new MemberRequest(email, password, nickname, profileImageUrl);
}

public MemberRequest getCreateRequestWithEmailAndNickname(String email, String nickname) {
return new MemberRequest(email, password, nickname, profileImageUrl);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package kr.touroot.member.helper;

import static kr.touroot.member.fixture.MemberFixture.DEFAULT_MEMBER;
import static kr.touroot.member.fixture.MemberFixture.TOUROOT_LOCAL_USER;

import kr.touroot.member.domain.Member;
import kr.touroot.member.repository.MemberRepository;
Expand All @@ -18,7 +18,7 @@ public MemberTestHelper(MemberRepository memberRepository) {
}

public Member persistMember() {
Member member = DEFAULT_MEMBER.build();
Member member = TOUROOT_LOCAL_USER.getMember();
return memberRepository.save(member);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package kr.touroot.member.service;

import static kr.touroot.member.fixture.MemberRequestFixture.DUPLICATE_NICKNAME_MEMBER;
import static kr.touroot.member.fixture.MemberRequestFixture.VALID_MEMBER;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertAll;
Expand All @@ -17,6 +15,7 @@
import kr.touroot.member.domain.Member;
import kr.touroot.member.dto.request.MemberRequest;
import kr.touroot.member.dto.request.ProfileUpdateRequest;
import kr.touroot.member.fixture.MemberFixture;
import kr.touroot.member.helper.MemberTestHelper;
import kr.touroot.utils.DatabaseCleaner;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -75,7 +74,7 @@ void getByIdNotExist() {
@DisplayName("정상적인 값을 가진 요청이 주어지면 회원을 생성한다.")
@Test
void createMember() {
MemberRequest request = VALID_MEMBER.getRequest();
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequest();

Long id = memberService.createMember(request);

Expand All @@ -94,11 +93,16 @@ void createMemberWithDuplicatedEmail() {
.hasMessage("이미 회원 가입되어 있는 이메일입니다.");
}

@DisplayName("중복된 이메일을 가진 회원을 생성하려하면 예외가 발생한다.")
@DisplayName("중복된 닉네임을 가진 회원을 생성하려하면 예외가 발생한다.")
@Test
void createMemberWithDuplicatedNickname() {
testHelper.persistMember();
MemberRequest request = DUPLICATE_NICKNAME_MEMBER.getRequest();
Member persistedMember = testHelper.persistMember();
String nonDuplicatedEmail = "noDuplicate" + persistedMember.getEmail();
String duplicatedNickname = persistedMember.getNickname();
MemberRequest request = MemberFixture.TOUROOT_LOCAL_USER.getCreateRequestWithEmailAndNickname(
nonDuplicatedEmail,
duplicatedNickname
);

assertThatThrownBy(() -> memberService.createMember(request))
.isInstanceOf(BadRequestException.class)
Expand Down
Loading

0 comments on commit f922a95

Please sign in to comment.