Skip to content

Commit

Permalink
[BE] test: 도메인 연관관계 재설정 후 테스트 작성 (#101)
Browse files Browse the repository at this point in the history
* test: 리뷰어 그룹 테스트 작성

* refactor: 리뷰 작성 테스트를 `ReviewTest`로 이동

* test: 리뷰어 중복 추가 테스트

* refactor: Test Fixture 사용하도록 수정

* refactor: 예외 클래스명 통일

* style: 테스트 개행

* refactor: 테스트명 명확하게 수정

* refactor: 회원 도메인에서의 비교를 GithubId로 진행하도록 수정

* refactor: createdAt 사용하지 않고, deadline으로 수정

* refactor: 필드명 reviewerGithubIds로 통일

* test: 리뷰어 중복 생성 검증

* refactor: reviewer/reviewee 통일

* refactor: 리뷰어-리뷰이 github id를 명시

* refactor: 테스트에 하나의 검증만 진행되도록 수정
  • Loading branch information
donghoony authored Jul 25, 2024
1 parent 6cfa3dc commit 93e9022
Show file tree
Hide file tree
Showing 9 changed files with 214 additions and 20 deletions.
2 changes: 2 additions & 0 deletions backend/src/main/java/reviewme/member/domain/GithubId.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = "id")
@Getter
public class GithubId {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = "id")
@Getter
public class GithubIdReviewerGroup {

Expand Down
25 changes: 23 additions & 2 deletions backend/src/main/java/reviewme/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.util.Objects;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "member")
@EqualsAndHashCode(of = "id")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Member {
Expand All @@ -33,4 +32,26 @@ public Member(String name, long githubId) {
this.name = name;
this.githubId = new GithubId(githubId);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Member member)) {
return false;
}
if (id == null) {
return Objects.equals(githubId, member.githubId);
}
return Objects.equals(id, member.id);
}

@Override
public int hashCode() {
if (id == null) {
return Objects.hash(githubId);
}
return Objects.hash(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import reviewme.member.domain.exception.DescriptionLengthExceededException;
import reviewme.member.domain.exception.InvalidDescriptionLengthException;
import reviewme.member.domain.exception.InvalidGroupNameLengthException;
import reviewme.member.domain.exception.SelfReviewException;
import reviewme.review.domain.Review;
Expand Down Expand Up @@ -68,7 +68,7 @@ public ReviewerGroup(Member reviewee, List<GithubId> reviewerGithubIds,
throw new InvalidGroupNameLengthException(MAX_GROUP_NAME_LENGTH);
}
if (description.length() > MAX_DESCRIPTION_LENGTH) {
throw new DescriptionLengthExceededException(MAX_DESCRIPTION_LENGTH);
throw new InvalidDescriptionLengthException(MAX_DESCRIPTION_LENGTH);
}
if (reviewerGithubIds.contains(reviewee.getGithubId())) {
throw new SelfReviewException();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import reviewme.global.exception.BadRequestException;

public class DescriptionLengthExceededException extends BadRequestException {
public class InvalidDescriptionLengthException extends BadRequestException {

public DescriptionLengthExceededException(int maxLength) {
public InvalidDescriptionLengthException(int maxLength) {
super("리뷰어 그룹 설명은 %d자 이하로 작성해야 합니다.".formatted(maxLength));
}
}
2 changes: 2 additions & 0 deletions backend/src/test/java/reviewme/fixture/MemberFixture.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public enum MemberFixture {

회원_산초("산초", 1L),
회원_아루("아루", 2L),
회원_커비("커비", 3L),
회원_테드("테드", 4L),
;

private final String name;
Expand Down
26 changes: 26 additions & 0 deletions backend/src/test/java/reviewme/fixture/ReviewerGroupFixture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package reviewme.fixture;

import java.time.LocalDateTime;
import java.util.List;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import reviewme.member.domain.GithubId;
import reviewme.member.domain.Member;
import reviewme.member.domain.ReviewerGroup;

@RequiredArgsConstructor
@Getter
public enum ReviewerGroupFixture {

데드라인_남은_그룹("데드라인 이전 그룹", "설명", LocalDateTime.now().plusDays(1)),
데드라인_지난_그룹("데드라인 지난 그룹", "설명", LocalDateTime.now().minusDays(1)),
;

private final String groupName;
private final String description;
private final LocalDateTime deadline;

public ReviewerGroup create(Member reviewee, List<GithubId> reviewerGithubIds) {
return new ReviewerGroup(reviewee, reviewerGithubIds, groupName, description, deadline);
}
}
99 changes: 86 additions & 13 deletions backend/src/test/java/reviewme/member/domain/ReviewerGroupTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,122 @@

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static reviewme.fixture.MemberFixture.회원_산초;
import static reviewme.fixture.MemberFixture.회원_커비;

import java.time.LocalDateTime;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import reviewme.member.domain.exception.DescriptionLengthExceededException;
import reviewme.member.domain.exception.DuplicateReviewerException;
import reviewme.member.domain.exception.EmptyReviewerException;
import reviewme.member.domain.exception.InvalidDescriptionLengthException;
import reviewme.member.domain.exception.InvalidGroupNameLengthException;
import reviewme.member.domain.exception.SelfReviewException;

class ReviewerGroupTest {

@Test
void 리뷰_그룹이_올바르게_생성된다() {
// given
Member sancho = new Member("산초", 1);
Member reviewee = 회원_산초.create();
String groupName = "a".repeat(100);
String description = "a".repeat(50);
LocalDateTime createdAt = LocalDateTime.of(2024, 7, 17, 12, 0);
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of(new GithubId(3));

// when, then
assertDoesNotThrow(() -> new ReviewerGroup(sancho, List.of(new GithubId(3)), groupName, description, createdAt));
assertDoesNotThrow(
() -> new ReviewerGroup(reviewee, reviewerGithubIds, groupName, description, deadline));
}

@ParameterizedTest
@ValueSource(ints = {0, 101})
void 리뷰_그룹_이름_길이_제한을_벗어나는_경우_예외를_발생한다(int length) {
void 리뷰_그룹_이름_길이_제한을_벗어날_수_없다(int length) {
// given
String groupName = "a".repeat(length);
Member sancho = new Member("산초", 1);
LocalDateTime createdAt = LocalDateTime.of(2024, 7, 17, 12, 0);
Member reviewee = 회원_산초.create();
Member reviewer = 회원_커비.create();
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of(reviewer.getGithubId());

// when, then
assertThatThrownBy(() -> new ReviewerGroup(sancho, List.of(), groupName, "설명", createdAt))
assertThatThrownBy(() -> new ReviewerGroup(reviewee, reviewerGithubIds, groupName, "설명", deadline))
.isInstanceOf(InvalidGroupNameLengthException.class);
}

@Test
void 리뷰_그룹_설명_길이_제한을_벗어나는_경우_예외를_발생한다() {
void 리뷰_그룹_설명_길이_제한을_벗어날_수_없다() {
// given
String description = "a".repeat(51);
Member sancho = new Member("산초", 1);
LocalDateTime createdAt = LocalDateTime.of(2024, 7, 17, 12, 0);
Member reviewee = 회원_산초.create();
Member reviewer = 회원_커비.create();
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of(reviewer.getGithubId());

// when, then
assertThatThrownBy(() -> new ReviewerGroup(reviewee, reviewerGithubIds, "그룹 이름", description, deadline))
.isInstanceOf(InvalidDescriptionLengthException.class);
}

@Test
void 리뷰어_목록에_리뷰이가_들어갈_수_없다() {
// given
Member reviewee = 회원_산초.create();
String groupName = "Group";
String description = "Description";
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of(reviewee.getGithubId());

// when, then
assertThatThrownBy(() -> new ReviewerGroup(reviewee, reviewerGithubIds, groupName, description, deadline))
.isInstanceOf(SelfReviewException.class);
}

@Test
void 리뷰어_목록이_비어있을_수_없다() {
Member reviewee = 회원_산초.create();
String groupName = "Group";
String description = "Description";
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of();

// when, then
assertThatThrownBy(() -> new ReviewerGroup(reviewee, reviewerGithubIds, groupName, description, deadline))
.isInstanceOf(EmptyReviewerException.class);
}

@Test
void 리뷰어를_중복으로_가지게_그룹을_생성할_수_없다() {
// given
Member reviewer = 회원_산초.create();
Member reviewee = 회원_커비.create();
String groupName = "Group";
String description = "Description";
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of(reviewer.getGithubId(), reviewer.getGithubId());

// when, then
assertThatThrownBy(() -> new ReviewerGroup(reviewee, reviewerGithubIds, groupName, description, deadline))
.isInstanceOf(DuplicateReviewerException.class);
}

@Test
void 리뷰어를_중복으로_추가할_수_없다() {
// given
Member reviewer = 회원_커비.create();
Member reviewee = 회원_산초.create();

String groupName = "Group";
String description = "Description";
LocalDateTime deadline = LocalDateTime.now().plusDays(1);
List<GithubId> reviewerGithubIds = List.of(reviewer.getGithubId());
ReviewerGroup reviewerGroup = new ReviewerGroup(reviewee, reviewerGithubIds, groupName, description, deadline);
GithubIdReviewerGroup githubIdReviewerGroup = new GithubIdReviewerGroup(reviewee.getGithubId(), reviewerGroup);

// when, then
assertThatThrownBy(() -> new ReviewerGroup(sancho, List.of(), "그룹 이름", description, createdAt))
.isInstanceOf(DescriptionLengthExceededException.class);
assertThatThrownBy(() -> reviewerGroup.addReviewerGithubId(githubIdReviewerGroup))
.isInstanceOf(DuplicateReviewerException.class);
}
}
70 changes: 69 additions & 1 deletion backend/src/test/java/reviewme/review/domain/ReviewTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,28 @@
import static reviewme.fixture.KeywordFixture.꼼꼼하게_기록해요;
import static reviewme.fixture.KeywordFixture.의견을_잘_조율해요;
import static reviewme.fixture.MemberFixture.회원_산초;
import static reviewme.fixture.MemberFixture.회원_아루;
import static reviewme.fixture.MemberFixture.회원_커비;
import static reviewme.fixture.ReviewerGroupFixture.데드라인_남은_그룹;
import static reviewme.fixture.ReviewerGroupFixture.데드라인_지난_그룹;

import java.time.LocalDateTime;
import java.util.List;
import org.junit.jupiter.api.Test;
import reviewme.keyword.domain.Keyword;
import reviewme.member.domain.GithubId;
import reviewme.member.domain.Member;
import reviewme.member.domain.ReviewerGroup;
import reviewme.review.domain.exception.DeadlineExpiredException;
import reviewme.review.domain.exception.IllegalReviewerException;
import reviewme.review.domain.exception.RevieweeMismatchException;
import reviewme.review.exception.GithubReviewerGroupUnAuthorizedException;
import reviewme.review.exception.ReviewAlreadySubmittedException;

class ReviewTest {

@Test
void 리뷰어와_리뷰이가_다른_경우_예외를_발생한다() {
void 리뷰어와_리뷰이가_같을_수_없다() {
// given
Member member = 회원_산초.create();
LocalDateTime createdAt = LocalDateTime.now();
Expand All @@ -25,4 +35,62 @@ class ReviewTest {
assertThatThrownBy(() -> new Review(member, member, null, keywords, createdAt))
.isInstanceOf(IllegalReviewerException.class);
}

@Test
void 마감_기한이_지난_그룹에_리뷰를_등록할_수_없다() {
// given
Member reviewer = 회원_산초.create();
Member reviewee = 회원_아루.create();
ReviewerGroup reviewerGroup = 데드라인_지난_그룹.create(reviewee, List.of(reviewer.getGithubId()));
LocalDateTime createdAt = LocalDateTime.now();
List<Keyword> keywords = List.of();

// when, then
assertThatThrownBy(() -> new Review(reviewer, reviewee, reviewerGroup, keywords, createdAt))
.isInstanceOf(DeadlineExpiredException.class);
}

@Test
void 하나의_리뷰_그룹에_중복으로_리뷰를_등록할_수_없다() {
// given
Member reviewer = 회원_산초.create();
Member reviewee = 회원_아루.create();
ReviewerGroup reviewerGroup = 데드라인_남은_그룹.create(reviewee, List.of(reviewer.getGithubId()));
new Review(reviewer, reviewee, reviewerGroup, List.of(), LocalDateTime.now());
LocalDateTime createdAt = LocalDateTime.now();
List<Keyword> keywords = List.of();

// when, then
assertThatThrownBy(() -> new Review(reviewer, reviewee, reviewerGroup, keywords, createdAt))
.isInstanceOf(ReviewAlreadySubmittedException.class);
}

@Test
void 리뷰어로_등록되지_않은_회원은_리뷰를_등록할_수_없다() {
// given
Member reviewer = new Member("reviewer", 1);
Member reviewee = new Member("reviewee", 2);
ReviewerGroup reviewerGroup = 데드라인_남은_그룹.create(reviewee, List.of(new GithubId(3)));
LocalDateTime createdAt = LocalDateTime.now();
List<Keyword> keywords = List.of();

// when, then
assertThatThrownBy(() -> new Review(reviewer, reviewee, reviewerGroup, keywords, createdAt))
.isInstanceOf(GithubReviewerGroupUnAuthorizedException.class);
}

@Test
void 그룹_내에서_그룹_밖으로_리뷰를_작성할_수_없다() {
// given
Member reviewer = 회원_산초.create();
Member reviewee = 회원_아루.create();
Member other = 회원_커비.create();
ReviewerGroup reviewerGroup = 데드라인_남은_그룹.create(reviewee, List.of(reviewer.getGithubId()));
LocalDateTime createdAt = LocalDateTime.now();
List<Keyword> keywords = List.of();

// when, then
assertThatThrownBy(() -> new Review(reviewer, other, reviewerGroup, keywords, createdAt))
.isInstanceOf(RevieweeMismatchException.class);
}
}

0 comments on commit 93e9022

Please sign in to comment.