Skip to content

Commit

Permalink
Test : CommentService 테스트 코드 추가
Browse files Browse the repository at this point in the history
Related:#57
Ref:#58
  • Loading branch information
hgh1472 committed Oct 2, 2024
1 parent fec9943 commit 6d9edd8
Showing 1 changed file with 267 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
package core.application.movies.service;

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

import java.time.Instant;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import core.application.movies.constant.CommentSort;
import core.application.movies.constant.Genre;
import core.application.movies.models.dto.CommentRespDTO;
import core.application.movies.models.dto.CommentWriteReqDTO;
import core.application.movies.models.entities.CachedMovieEntity;
import core.application.movies.models.entities.CommentEntity;
import core.application.movies.repositories.CachedMovieRepository;
import core.application.movies.repositories.CommentRepository;
import core.application.users.models.entities.UserEntity;
import core.application.users.models.entities.UserRole;
import core.application.users.repositories.UserRepository;

@SpringBootTest
@Transactional
public class CommentServiceTest {

@Autowired
private CommentService commentService;
@Autowired
private CommentRepository commentRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private CachedMovieRepository movieRepository;
private List<UserEntity> users = new ArrayList<>();
private String movieId;

@BeforeEach
public void setUp() {
for (int i = 0; i < 10; i++) {
UserEntity testUser = UserEntity.builder()
.userEmail(String.valueOf(i))
.userPw("test")
.role(UserRole.USER)
.alias("nickname")
.phoneNum("phone")
.userName("test")
.build();
userRepository.saveNewUser(testUser);
users.add(userRepository.findByUserEmail(String.valueOf(i)).orElseThrow());
}

CachedMovieEntity movieEntity = new CachedMovieEntity(
"test",
"testTitle",
"posterUrl",
Genre.ACTION,
"2024-09-30",
"줄거리",
"122",
"마동석, 김무열",
"봉준호",
1L, 1L, 10L, 10L
);
CachedMovieEntity save = movieRepository.saveNewMovie(movieEntity);
movieId = save.getMovieId();
}

@Test
@DisplayName("한줄평을 작성한다.")
public void writeComment() {
// GIVEN
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO("한줄평 내용입니다.", 10);
UserEntity writer = users.get(0);

// WHEN
CommentRespDTO save = commentService.writeCommentOnMovie(writeReqDTO, writer.getUserId(), movieId);

// THEN
Optional<CommentEntity> find = commentRepository.findByCommentId(save.getCommentId());
assertThat(find).isPresent();
assertThat(find.get().getContent()).isEqualTo(writeReqDTO.getContent());
assertThat(find.get().getRating()).isEqualTo(writeReqDTO.getRating());
}

@Test
@DisplayName("영화의 한줄평을 최신순으로 불러온다.")
public void getLatestComments() throws InterruptedException {
// GIVEN
for (int i = 0; i < 10; i++) {
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO(i + "번째 한줄평", 10);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, users.get(i).getUserId(),
movieId);
}

// WHEN
List<CommentRespDTO> comments = commentService.getComments(movieId, 0, CommentSort.LATEST, null);

// THEN
assertThat(comments.size()).isEqualTo(10);
Instant later = comments.get(0).getCreatedAt();
for (int i = 1; i < comments.size(); i++) {
assertThat(later).isAfterOrEqualTo(comments.get(i).getCreatedAt());
later = comments.get(i).getCreatedAt();
}
}

@Test
@DisplayName("한줄평을 좋아요 순으로 불러온다.")
public void getMostLikedComments() {
// GIVEN
for (int i = 0; i < 10; i++) {
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO(i + "번째 한줄평", 10);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, users.get(i).getUserId(),
movieId);
for (int j = 0; j < i; j++) {
UserEntity user = users.get(j);
commentService.incrementCommentLike(commentRespDTO.getCommentId(), user.getUserId());
}
}

// WHEN
List<CommentRespDTO> comments = commentService.getComments(movieId, 0, CommentSort.LIKE, null);

// THEN
int like = comments.get(0).getLike();
for (int i = 1; i < comments.size(); i++) {
assertThat(like).isGreaterThanOrEqualTo(comments.get(i).getLike());
like = comments.get(i).getLike();
}
}

@Test
@DisplayName("한줄평을 싫어요 순으로 불러온다.")
public void getMostDislikedComments() {
// GIVEN
for (int i = 0; i < 10; i++) {
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO(i + "번째 한줄평", 10);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, users.get(i).getUserId(),
movieId);
for (int j = 0; j < i; j++) {
UserEntity user = users.get(j);
commentService.incrementCommentDislike(commentRespDTO.getCommentId(), user.getUserId());
}
}

// WHEN
List<CommentRespDTO> comments = commentService.getComments(movieId, 0, CommentSort.DISLIKE, null);

// THEN
int dislike = comments.get(0).getDislike();
for (int i = 1; i < comments.size(); i++) {
assertThat(dislike).isGreaterThanOrEqualTo(comments.get(i).getDislike());
dislike = comments.get(i).getDislike();
}
}

@Test
@DisplayName("한줄평에 좋아요을 누른다.")
public void likeComment() {
// GIVEN
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO("한줄평입니다.", 10);
UserEntity writer = users.get(0);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, writer.getUserId(), movieId);

// WHEN
commentService.incrementCommentLike(commentRespDTO.getCommentId(), writer.getUserId());

// THEN
CommentEntity comment = commentRepository.findByCommentId(commentRespDTO.getCommentId())
.orElseThrow(() -> new RuntimeException("존재하지 않은 한줄평입니다."));
assertThat(comment.getLike()).isEqualTo(1);
}

@Test
@DisplayName("좋아요를 취소한다.")
public void cancelLikeComment() {
// GIVEN
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO("한줄평입니다.", 10);
UserEntity writer = users.get(0);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, writer.getUserId(),
movieId);
commentService.incrementCommentLike(commentRespDTO.getCommentId(), users.get(1).getUserId());

// WHEN
commentService.decrementCommentLike(commentRespDTO.getCommentId(), users.get(1).getUserId());

// THEN
CommentEntity comment = commentRepository.findByCommentId(commentRespDTO.getCommentId()).orElseThrow();
assertThat(comment.getLike()).isEqualTo(0);
}

@Test
@DisplayName("한줄평에 싫어요를 누른다.")
public void dislikeComment() {
// GIVEN
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO("한줄평입니다.", 10);
UserEntity writer = users.get(0);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, writer.getUserId(), movieId);

// WHEN
commentService.incrementCommentDislike(commentRespDTO.getCommentId(), writer.getUserId());

// THEN
CommentEntity comment = commentRepository.findByCommentId(commentRespDTO.getCommentId())
.orElseThrow(() -> new RuntimeException("존재하지 않은 한줄평입니다."));
assertThat(comment.getDislike()).isEqualTo(1);
}

@Test
@DisplayName("싫어요를 취소한다.")
public void cancelDislikeComment() {
// GIVEN
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO("한줄평입니다.", 10);
UserEntity writer = users.get(0);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, writer.getUserId(),
movieId);
commentService.incrementCommentDislike(commentRespDTO.getCommentId(), users.get(1).getUserId());

// WHEN
commentService.decrementCommentDislike(commentRespDTO.getCommentId(), users.get(1).getUserId());

// THEN
CommentEntity comment = commentRepository.findByCommentId(commentRespDTO.getCommentId()).orElseThrow();
assertThat(comment.getDislike()).isEqualTo(0);
}

@Test
@DisplayName("한줄평 조회 시, 좋아요와 싫어요를 누른 항목은 표시된다.")
public void displayTest() {
// GIVEN
Set<Long> reactionCommentIds = new HashSet<>();
UserEntity user = users.get(0);
for (int i = 0; i < 10; i++) {
CommentWriteReqDTO writeReqDTO = new CommentWriteReqDTO(i + "번째 한줄평", 10);
CommentRespDTO commentRespDTO = commentService.writeCommentOnMovie(writeReqDTO, users.get(i).getUserId(),
movieId);
if (i < 5) {
commentService.incrementCommentLike(commentRespDTO.getCommentId(), user.getUserId());
commentService.incrementCommentDislike(commentRespDTO.getCommentId(), user.getUserId());
reactionCommentIds.add(commentRespDTO.getCommentId());
}
}

// WHEN
List<CommentRespDTO> comments = commentService.getComments(movieId, 0, CommentSort.LIKE, user.getUserId());

// THEN
for (CommentRespDTO comment : comments) {
if (reactionCommentIds.contains(comment.getCommentId())) {
assertThat(comment.getIsLiked()).isTrue();
assertThat(comment.getIsDisliked()).isTrue();
} else {
assertThat(comment.getIsLiked()).isFalse();
assertThat(comment.getIsDisliked()).isFalse();
}
}
}
}

0 comments on commit 6d9edd8

Please sign in to comment.