diff --git a/src/test/java/com/example/solidconnection/comment/service/CommentServiceTest.java b/src/test/java/com/example/solidconnection/comment/service/CommentServiceTest.java new file mode 100644 index 000000000..418a04d8c --- /dev/null +++ b/src/test/java/com/example/solidconnection/comment/service/CommentServiceTest.java @@ -0,0 +1,420 @@ +package com.example.solidconnection.comment.service; + +import com.example.solidconnection.board.domain.Board; +import com.example.solidconnection.comment.domain.Comment; +import com.example.solidconnection.comment.dto.CommentCreateRequest; +import com.example.solidconnection.comment.dto.CommentCreateResponse; +import com.example.solidconnection.comment.dto.CommentDeleteResponse; +import com.example.solidconnection.comment.dto.CommentUpdateRequest; +import com.example.solidconnection.comment.dto.CommentUpdateResponse; +import com.example.solidconnection.comment.dto.PostFindCommentResponse; +import com.example.solidconnection.comment.repository.CommentRepository; +import com.example.solidconnection.custom.exception.CustomException; +import com.example.solidconnection.post.domain.Post; +import com.example.solidconnection.post.repository.PostRepository; +import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.type.PostCategory; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static com.example.solidconnection.custom.exception.ErrorCode.CAN_NOT_UPDATE_DEPRECATED_COMMENT; +import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_COMMENT_ID; +import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_COMMENT_LEVEL; +import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_ACCESS; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +@DisplayName("댓글 서비스 테스트") +class CommentServiceTest extends BaseIntegrationTest { + + @Autowired + private CommentService commentService; + + @Autowired + private CommentRepository commentRepository; + + @Autowired + private PostRepository postRepository; + + @Nested + class 댓글_조회_테스트 { + + @Test + void 게시글의_모든_댓글을_조회한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); + Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); + List comments = List.of(parentComment, childComment); + + // when + List responses = commentService.findCommentsByPostId( + 테스트유저_1.getEmail(), + testPost.getId() + ); + + // then + assertAll( + () -> assertThat(responses).hasSize(comments.size()), + () -> assertThat(responses) + .filteredOn(response -> response.id().equals(parentComment.getId())) + .singleElement() + .satisfies(response -> assertAll( + () -> assertThat(response.id()).isEqualTo(parentComment.getId()), + () -> assertThat(response.parentId()).isNull(), + () -> assertThat(response.content()).isEqualTo(parentComment.getContent()), + () -> assertThat(response.isOwner()).isTrue(), + () -> assertThat(response.createdAt()).isEqualTo(parentComment.getCreatedAt()), + () -> assertThat(response.updatedAt()).isEqualTo(parentComment.getUpdatedAt()), + + () -> assertThat(response.postFindSiteUserResponse().id()) + .isEqualTo(parentComment.getSiteUser().getId()), + () -> assertThat(response.postFindSiteUserResponse().nickname()) + .isEqualTo(parentComment.getSiteUser().getNickname()), + () -> assertThat(response.postFindSiteUserResponse().profileImageUrl()) + .isEqualTo(parentComment.getSiteUser().getProfileImageUrl()) + )), + () -> assertThat(responses) + .filteredOn(response -> response.id().equals(childComment.getId())) + .singleElement() + .satisfies(response -> assertAll( + () -> assertThat(response.id()).isEqualTo(childComment.getId()), + () -> assertThat(response.parentId()).isEqualTo(parentComment.getId()), + () -> assertThat(response.content()).isEqualTo(childComment.getContent()), + () -> assertThat(response.isOwner()).isFalse(), + () -> assertThat(response.createdAt()).isEqualTo(childComment.getCreatedAt()), + () -> assertThat(response.updatedAt()).isEqualTo(childComment.getUpdatedAt()), + + () -> assertThat(response.postFindSiteUserResponse().id()) + .isEqualTo(childComment.getSiteUser().getId()), + () -> assertThat(response.postFindSiteUserResponse().nickname()) + .isEqualTo(childComment.getSiteUser().getNickname()), + () -> assertThat(response.postFindSiteUserResponse().profileImageUrl()) + .isEqualTo(childComment.getSiteUser().getProfileImageUrl()) + )) + ); + } + } + + @Nested + class 댓글_생성_테스트 { + + @Test + void 댓글을_성공적으로_생성한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + CommentCreateRequest request = new CommentCreateRequest("테스트 댓글", null); + + // when + CommentCreateResponse response = commentService.createComment( + 테스트유저_1.getEmail(), + testPost.getId(), + request + ); + + // then + Comment savedComment = commentRepository.findById(response.id()).orElseThrow(); + assertAll( + () -> assertThat(savedComment.getId()).isEqualTo(response.id()), + () -> assertThat(savedComment.getContent()).isEqualTo(request.content()), + () -> assertThat(savedComment.getParentComment()).isNull(), + () -> assertThat(savedComment.getPost().getId()).isEqualTo(testPost.getId()), + () -> assertThat(savedComment.getSiteUser().getId()).isEqualTo(테스트유저_1.getId()) + ); + } + + @Test + void 대댓글을_성공적으로_생성한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); + CommentCreateRequest request = new CommentCreateRequest("테스트 대댓글", parentComment.getId()); + + // when + CommentCreateResponse response = commentService.createComment( + 테스트유저_2.getEmail(), + testPost.getId(), + request + ); + + // then + Comment savedComment = commentRepository.findById(response.id()).orElseThrow(); + assertAll( + () -> assertThat(savedComment.getId()).isEqualTo(response.id()), + () -> assertThat(savedComment.getContent()).isEqualTo(request.content()), + () -> assertThat(savedComment.getParentComment().getId()).isEqualTo(parentComment.getId()), + () -> assertThat(savedComment.getPost().getId()).isEqualTo(testPost.getId()), + () -> assertThat(savedComment.getSiteUser().getId()).isEqualTo(테스트유저_2.getId()) + ); + } + + @Test + void 대대댓글_생성_시도하면_예외_응답을_반환한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); + Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); + CommentCreateRequest request = new CommentCreateRequest("테스트 대대댓글", childComment.getId()); + + // when & then + assertThatThrownBy(() -> + commentService.createComment( + 테스트유저_1.getEmail(), + testPost.getId(), + request + )) + .isInstanceOf(CustomException.class) + .hasMessage(INVALID_COMMENT_LEVEL.getMessage()); + } + + @Test + void 존재하지_않는_부모댓글로_대댓글_작성시_예외를_반환한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + long invalidCommentId = 9999L; + CommentCreateRequest request = new CommentCreateRequest("테스트 대댓글", invalidCommentId); + + // when & then + assertThatThrownBy(() -> + commentService.createComment( + 테스트유저_1.getEmail(), + testPost.getId(), + request + )) + .isInstanceOf(CustomException.class) + .hasMessage(INVALID_COMMENT_ID.getMessage()); + } + } + + @Nested + class 댓글_수정_테스트 { + + @Test + void 댓글을_성공적으로_수정한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment comment = createComment(testPost, 테스트유저_1, "원본 댓글"); + CommentUpdateRequest request = new CommentUpdateRequest("수정된 댓글"); + + // when + CommentUpdateResponse response = commentService.updateComment( + 테스트유저_1.getEmail(), + testPost.getId(), + comment.getId(), + request + ); + + // then + Comment updatedComment = commentRepository.findById(response.id()).orElseThrow(); + assertAll( + () -> assertThat(updatedComment.getId()).isEqualTo(comment.getId()), + () -> assertThat(updatedComment.getContent()).isEqualTo(request.content()), + () -> assertThat(updatedComment.getParentComment()).isNull(), + () -> assertThat(updatedComment.getPost().getId()).isEqualTo(testPost.getId()), + () -> assertThat(updatedComment.getSiteUser().getId()).isEqualTo(테스트유저_1.getId()) + ); + } + + @Test + void 다른_사용자의_댓글을_수정하면_예외_응답을_반환한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment comment = createComment(testPost, 테스트유저_1, "원본 댓글"); + CommentUpdateRequest request = new CommentUpdateRequest("수정된 댓글"); + + // when & then + assertThatThrownBy(() -> + commentService.updateComment( + 테스트유저_2.getEmail(), + testPost.getId(), + comment.getId(), + request + )) + .isInstanceOf(CustomException.class) + .hasMessage(INVALID_POST_ACCESS.getMessage()); + } + + @Test + void 삭제된_댓글을_수정하면_예외_응답을_반환한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment comment = createComment(testPost, 테스트유저_1, null); + CommentUpdateRequest request = new CommentUpdateRequest("수정된 댓글"); + + // when & then + assertThatThrownBy(() -> + commentService.updateComment( + 테스트유저_1.getEmail(), + testPost.getId(), + comment.getId(), + request + )) + .isInstanceOf(CustomException.class) + .hasMessage(CAN_NOT_UPDATE_DEPRECATED_COMMENT.getMessage()); + } + } + + @Nested + class 댓글_삭제_테스트 { + + @Test + @Transactional + void 대댓글이_없는_댓글을_삭제한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment comment = createComment(testPost, 테스트유저_1, "테스트 댓글"); + List comments = testPost.getCommentList(); + int expectedCommentsCount = comments.size() - 1; + + // when + CommentDeleteResponse response = commentService.deleteCommentById( + 테스트유저_1.getEmail(), + testPost.getId(), + comment.getId() + ); + + // then + assertAll( + () -> assertThat(response.id()).isEqualTo(comment.getId()), + () -> assertThat(commentRepository.findById(comment.getId())).isEmpty(), + () -> assertThat(testPost.getCommentList()).hasSize(expectedCommentsCount) + ); + } + + @Test + @Transactional + void 대댓글이_있는_댓글을_삭제하면_내용만_삭제된다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); + Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); + List comments = testPost.getCommentList(); + List childComments = parentComment.getCommentList(); + + // when + CommentDeleteResponse response = commentService.deleteCommentById( + 테스트유저_1.getEmail(), + testPost.getId(), + parentComment.getId() + ); + + // then + Comment deletedComment = commentRepository.findById(response.id()).orElseThrow(); + assertAll( + () -> assertThat(deletedComment.getContent()).isNull(), + () -> assertThat(deletedComment.getCommentList()) + .extracting(Comment::getId) + .containsExactlyInAnyOrder(childComment.getId()), + () -> assertThat(testPost.getCommentList()).hasSize(comments.size()), + () -> assertThat(deletedComment.getCommentList()).hasSize(childComments.size()) + ); + } + + @Test + @Transactional + void 대댓글을_삭제하면_부모댓글이_삭제되지_않는다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); + Comment childComment1 = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글 1"); + Comment childComment2 = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글 2"); + List childComments = parentComment.getCommentList(); + int expectedChildCommentsCount = childComments.size() - 1; + + // when + CommentDeleteResponse response = commentService.deleteCommentById( + 테스트유저_2.getEmail(), + testPost.getId(), + childComment1.getId() + ); + + // then + Comment remainingParentComment = commentRepository.findById(parentComment.getId()).orElseThrow(); + List remainingChildComments = remainingParentComment.getCommentList(); + assertAll( + () -> assertThat(commentRepository.findById(response.id())).isEmpty(), + () -> assertThat(remainingParentComment.getContent()).isEqualTo(parentComment.getContent()), + () -> assertThat(remainingChildComments).hasSize(expectedChildCommentsCount), + () -> assertThat(remainingChildComments) + .extracting(Comment::getId) + .containsExactly(childComment2.getId()) + ); + } + + @Test + @Transactional + void 대댓글을_삭제하고_부모댓글이_삭제된_상태면_부모댓글도_삭제된다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); + Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); + List comments = testPost.getCommentList(); + int expectedCommentsCount = comments.size() - 2; + parentComment.deprecateComment(); + + // when + CommentDeleteResponse response = commentService.deleteCommentById( + 테스트유저_2.getEmail(), + testPost.getId(), + childComment.getId() + ); + + // then + assertAll( + () -> assertThat(commentRepository.findById(response.id())).isEmpty(), + () -> assertThat(commentRepository.findById(parentComment.getId())).isEmpty(), + () -> assertThat(testPost.getCommentList()).hasSize(expectedCommentsCount) + ); + } + + @Test + void 다른_사용자의_댓글을_삭제하면_예외_응답을_반환한다() { + // given + Post testPost = createPost(자유게시판, 테스트유저_1); + Comment comment = createComment(testPost, 테스트유저_1, "테스트 댓글"); + + // when & then + assertThatThrownBy(() -> + commentService.deleteCommentById( + 테스트유저_2.getEmail(), + testPost.getId(), + comment.getId() + )) + .isInstanceOf(CustomException.class) + .hasMessage(INVALID_POST_ACCESS.getMessage()); + } + } + + private Post createPost(Board board, SiteUser siteUser) { + Post post = new Post( + "테스트 제목", + "테스트 내용", + false, + 0L, + 0L, + PostCategory.자유 + ); + post.setBoardAndSiteUser(board, siteUser); + return postRepository.save(post); + } + + private Comment createComment(Post post, SiteUser siteUser, String content) { + Comment comment = new Comment(content); + comment.setPostAndSiteUser(post, siteUser); + return commentRepository.save(comment); + } + + private Comment createChildComment(Post post, SiteUser siteUser, Comment parentComment, String content) { + Comment comment = new Comment(content); + comment.setPostAndSiteUser(post, siteUser); + comment.setParentCommentAndPostAndSiteUser(parentComment, post, siteUser); + return commentRepository.save(comment); + } +} diff --git a/src/test/java/com/example/solidconnection/unit/repository/BoardRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/BoardRepositoryTest.java deleted file mode 100644 index 17e74d140..000000000 --- a/src/test/java/com/example/solidconnection/unit/repository/BoardRepositoryTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.example.solidconnection.unit.repository; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.board.repository.BoardRepository; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.repository.PostRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.TestContainerDataJpaTest; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.PostCategory; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -import jakarta.persistence.EntityManager; -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.transaction.annotation.Transactional; - -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_BOARD_CODE; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -@TestContainerDataJpaTest -@DisplayName("게시판 레포지토리 테스트") -class BoardRepositoryTest { - @Autowired - private PostRepository postRepository; - @Autowired - private BoardRepository boardRepository; - @Autowired - private SiteUserRepository siteUserRepository; - @Autowired - private EntityManager entityManager; - - private Board board; - private SiteUser siteUser; - private Post post; - - @BeforeEach - public void setUp() { - board = createBoard(); - boardRepository.save(board); - - siteUser = createSiteUser(); - siteUserRepository.save(siteUser); - - post = createPost(board, siteUser); - post = postRepository.save(post); - - entityManager.flush(); - entityManager.clear(); - } - - private Board createBoard() { - return new Board( - "FREE", "자유게시판"); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Post createPost(Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - post.setBoardAndSiteUser(board, siteUser); - return post; - } - - @Test - @Transactional - public void 게시판을_조회할_때_게시글은_즉시_로딩한다() { - // when - Board foundBoard = boardRepository.getByCodeUsingEntityGraph(board.getCode()); - foundBoard.getPostList().size(); // 추가쿼리 발생하지 않는다. - - // then - assertThat(foundBoard.getCode()).isEqualTo(board.getCode()); - } - - @Test - @Transactional - public void 게시판을_조회할_때_게시글은_즉시_로딩한다_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // given - String invalidCode = "INVALID_CODE"; - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - boardRepository.getByCodeUsingEntityGraph(invalidCode); - }); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - @Transactional - public void 게시판을_조회한다() { - // when - Board foundBoard = boardRepository.getByCode(board.getCode()); - - // then - assertEquals(board.getCode(), foundBoard.getCode()); - } - - @Test - @Transactional - public void 게시판을_조회할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // given - String invalidCode = "INVALID_CODE"; - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - boardRepository.getByCode(invalidCode); - }); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java deleted file mode 100644 index b57288725..000000000 --- a/src/test/java/com/example/solidconnection/unit/repository/CommentRepositoryTest.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.example.solidconnection.unit.repository; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.board.repository.BoardRepository; -import com.example.solidconnection.comment.domain.Comment; -import com.example.solidconnection.comment.repository.CommentRepository; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.repository.PostRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.TestContainerDataJpaTest; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.PostCategory; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -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.transaction.annotation.Transactional; - -import java.util.List; - -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_COMMENT_ID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@TestContainerDataJpaTest -@DisplayName("댓글 레포지토리 테스트") -class CommentRepositoryTest { - @Autowired - private PostRepository postRepository; - @Autowired - private BoardRepository boardRepository; - @Autowired - private SiteUserRepository siteUserRepository; - @Autowired - private CommentRepository commentRepository; - - private Board board; - private SiteUser siteUser; - private Post post; - private Comment parentComment; - private Comment childComment; - - @BeforeEach - public void setUp() { - board = createBoard(); - boardRepository.save(board); - - siteUser = createSiteUser(); - siteUserRepository.save(siteUser); - - post = createPost(board, siteUser); - post = postRepository.save(post); - - parentComment = createParentComment(); - childComment = createChildComment(); - commentRepository.save(parentComment); - commentRepository.save(childComment); - } - - private Board createBoard() { - return new Board( - "FREE", "자유게시판"); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Post createPost(Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - post.setBoardAndSiteUser(board, siteUser); - return post; - } - - private Comment createParentComment() { - Comment comment = new Comment( - "parent" - ); - comment.setPostAndSiteUser(post, siteUser); - return comment; - } - - private Comment createChildComment() { - Comment comment = new Comment( - "child" - ); - comment.setParentCommentAndPostAndSiteUser(parentComment, post, siteUser); - return comment; - } - - @Test - @Transactional - public void 재귀쿼리로_댓글트리를_조회한다() { - // when - List commentTreeByPostId = commentRepository.findCommentTreeByPostId(post.getId()); - - // then - List expectedResponse = List.of(parentComment, childComment); - assertEquals(commentTreeByPostId, expectedResponse); - } - - @Test - @Transactional - public void 댓글을_조회한다() { - // when - Comment foundComment = commentRepository.getById(parentComment.getId()); - - // then - assertEquals(parentComment, foundComment); - } - - @Test - @Transactional - public void 댓글을_조회할_때_유효한_댓글이_아니라면_예외_응답을_반환한다() { - // given - Long invalidId = -1L; - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - commentRepository.getById(invalidId); - }); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_COMMENT_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_COMMENT_ID.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/repository/GpaScoreRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/GpaScoreRepositoryTest.java deleted file mode 100644 index 3ec59a5c2..000000000 --- a/src/test/java/com/example/solidconnection/unit/repository/GpaScoreRepositoryTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.example.solidconnection.unit.repository; - -import com.example.solidconnection.application.domain.Gpa; -import com.example.solidconnection.score.domain.GpaScore; -import com.example.solidconnection.score.repository.GpaScoreRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.TestContainerDataJpaTest; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -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.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; - -@TestContainerDataJpaTest -@DisplayName("학점 레포지토리 테스트") -@Transactional -public class GpaScoreRepositoryTest { - @Autowired - private SiteUserRepository siteUserRepository; - @Autowired - private GpaScoreRepository gpaScoreRepository; - - private SiteUser siteUser; - - @BeforeEach - public void setUp() { - siteUser = createSiteUser(); - siteUserRepository.save(siteUser); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - @Test - public void 사용자의_학점을_조회한다_기존이력_없을_때() { - Optional gpaScoreBySiteUser = gpaScoreRepository.findGpaScoreBySiteUser(siteUser); - assertThat(gpaScoreBySiteUser).isEqualTo(Optional.empty()); - } - - @Test - public void 사용자의_학점을_조회한다_기존이력_있을_때() { - GpaScore gpaScore = new GpaScore( - new Gpa(4.5, 4.5, "http://example.com/gpa-report.pdf"), - siteUser, - LocalDate.of(2024, 10, 10) - ); - gpaScore.setSiteUser(siteUser); - gpaScoreRepository.save(gpaScore); - - Optional gpaScoreBySiteUser = gpaScoreRepository.findGpaScoreBySiteUser(siteUser); - assertThat(gpaScoreBySiteUser).isEqualTo(Optional.of(gpaScore)); - } - - @Test - public void 아이디와_사용자정보로_사용자의_학점을_조회한다_기존이력_없을_때() { - Optional gpaScoreBySiteUser = gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, 1L); - assertThat(gpaScoreBySiteUser).isEqualTo(Optional.empty()); - } - - @Test - public void 아이디와_사용자정보로_사용자의_학점을_조회한다_기존이력_있을_때() { - GpaScore gpaScore = new GpaScore( - new Gpa(4.5, 4.5, "http://example.com/gpa-report.pdf"), - siteUser, - LocalDate.of(2024, 10, 10) - ); - gpaScore.setSiteUser(siteUser); - gpaScoreRepository.save(gpaScore); - - Optional gpaScoreBySiteUser = gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScore.getId()); - assertThat(gpaScoreBySiteUser).isEqualTo(Optional.of(gpaScore)); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/repository/LanguageTestScoreRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/LanguageTestScoreRepositoryTest.java deleted file mode 100644 index 0090088c1..000000000 --- a/src/test/java/com/example/solidconnection/unit/repository/LanguageTestScoreRepositoryTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.example.solidconnection.unit.repository; - -import com.example.solidconnection.application.domain.LanguageTest; -import com.example.solidconnection.score.domain.LanguageTestScore; -import com.example.solidconnection.score.repository.LanguageTestScoreRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.TestContainerDataJpaTest; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.LanguageTestType; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -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.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; - -@TestContainerDataJpaTest -@DisplayName("어학성적 레포지토리 테스트") -@Transactional -public class LanguageTestScoreRepositoryTest { - @Autowired - private SiteUserRepository siteUserRepository; - @Autowired - private LanguageTestScoreRepository languageTestScoreRepository; - - private SiteUser siteUser; - - @BeforeEach - public void setUp() { - siteUser = createSiteUser(); - siteUserRepository.save(siteUser); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - @Test - public void 사용자의_어학성적을_조회한다_기존이력_없을_때() { - Optional languageTestScore = languageTestScoreRepository - .findLanguageTestScoreBySiteUserAndLanguageTest_LanguageTestType(siteUser, LanguageTestType.TOEIC); - assertThat(languageTestScore).isEqualTo(Optional.empty()); - } - - @Test - public void 사용자의_어학성적을_조회한다_기존이력_있을_때() { - LanguageTestScore languageTestScore = new LanguageTestScore( - new LanguageTest(LanguageTestType.TOEIC, "990", "http://example.com/gpa-report.pdf"), - LocalDate.of(2024, 10, 10), - siteUser - ); - languageTestScore.setSiteUser(siteUser); - languageTestScoreRepository.save(languageTestScore); - - Optional languageTestScore1 = languageTestScoreRepository - .findLanguageTestScoreBySiteUserAndLanguageTest_LanguageTestType(siteUser, LanguageTestType.TOEIC); - assertThat(languageTestScore1).isEqualTo(Optional.of(languageTestScore)); - } - - @Test - public void 아이디와_사용자정보로_사용자의_어학성적을_조회한다_기존이력_없을_때() { - Optional languageTestScore = languageTestScoreRepository - .findLanguageTestScoreBySiteUserAndId(siteUser, 1L); - assertThat(languageTestScore).isEqualTo(Optional.empty()); - } - - @Test - public void 아이디와_사용자정보로_사용자의_어학성적을_조회한다_기존이력_있을_때() { - LanguageTestScore languageTestScore = new LanguageTestScore( - new LanguageTest(LanguageTestType.TOEIC, "990", "http://example.com/gpa-report.pdf"), - LocalDate.of(2024, 10, 10), - siteUser - ); - languageTestScore.setSiteUser(siteUser); - languageTestScoreRepository.save(languageTestScore); - - Optional languageTestScore1 = languageTestScoreRepository - .findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScore.getId()); - assertThat(languageTestScore1).isEqualTo(Optional.of(languageTestScore)); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/repository/PostLikeRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/PostLikeRepositoryTest.java deleted file mode 100644 index 43ac210cb..000000000 --- a/src/test/java/com/example/solidconnection/unit/repository/PostLikeRepositoryTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.example.solidconnection.unit.repository; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.board.repository.BoardRepository; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.domain.PostLike; -import com.example.solidconnection.post.repository.PostLikeRepository; -import com.example.solidconnection.post.repository.PostRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.TestContainerDataJpaTest; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.PostCategory; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -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.transaction.annotation.Transactional; - -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_LIKE; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@TestContainerDataJpaTest -@DisplayName("게시글 좋아요 레포지토리 테스트") -class PostLikeRepositoryTest { - @Autowired - private PostRepository postRepository; - @Autowired - private BoardRepository boardRepository; - @Autowired - private SiteUserRepository siteUserRepository; - @Autowired - private PostLikeRepository postLikeRepository; - - private Post post; - private Board board; - private SiteUser siteUser; - private PostLike postLike; - - - @BeforeEach - void setUp() { - board = createBoard(); - boardRepository.save(board); - siteUser = createSiteUser(); - siteUserRepository.save(siteUser); - post = createPost(board, siteUser); - post = postRepository.save(post); - postLike = createPostLike(post, siteUser); - postLikeRepository.save(postLike); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Board createBoard() { - return new Board( - "FREE", "자유게시판"); - } - - private Post createPost(Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - post.setBoardAndSiteUser(board, siteUser); - return post; - } - - private PostLike createPostLike(Post post, SiteUser siteUser) { - PostLike postLike = new PostLike(); - postLike.setPostAndSiteUser(post, siteUser); - return postLike; - } - - @Test - @Transactional - void 게시글_좋아요를_조회한다() { - // when - PostLike foundPostLike = postLikeRepository.getByPostAndSiteUser(post, siteUser); - - // then - assertEquals(foundPostLike, postLike); - } - - @Test - @Transactional - void 게시글_좋아요를_조회할_때_유효한_좋아요가_아니라면_예외_응답을_반환한다() { - // given - postLike.resetPostAndSiteUser(); - postLikeRepository.delete(postLike); - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - postLikeRepository.getByPostAndSiteUser(post, siteUser); - }); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_LIKE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_LIKE.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/repository/PostRepositoryTest.java b/src/test/java/com/example/solidconnection/unit/repository/PostRepositoryTest.java deleted file mode 100644 index a37a0e6bf..000000000 --- a/src/test/java/com/example/solidconnection/unit/repository/PostRepositoryTest.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.example.solidconnection.unit.repository; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.board.repository.BoardRepository; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.entity.PostImage; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.repository.PostRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.TestContainerDataJpaTest; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.PostCategory; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -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 java.util.ArrayList; -import java.util.List; - -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_ID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@TestContainerDataJpaTest -@DisplayName("게시글 레포지토리 테스트") -class PostRepositoryTest { - - @Autowired - private PostRepository postRepository; - - @Autowired - private BoardRepository boardRepository; - - @Autowired - private SiteUserRepository siteUserRepository; - - private Post post; - private Board board; - private SiteUser siteUser; - - @BeforeEach - void setUp() { - board = createBoard(); - boardRepository.save(board); - siteUser = createSiteUser(); - siteUserRepository.save(siteUser); - post = createPostWithImages(board, siteUser); - post = postRepository.save(post); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Board createBoard() { - return new Board( - "FREE", "자유게시판"); - } - - private Post createPostWithImages(Board board, SiteUser siteUser) { - Post postWithImages = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - postWithImages.setBoardAndSiteUser(board, siteUser); - - List postImageList = new ArrayList<>(); - postImageList.add(new PostImage("https://s3.example.com/test1.png")); - postImageList.add(new PostImage("https://s3.example.com/test2.png")); - for (PostImage postImage : postImageList) { - postImage.setPost(postWithImages); - } - return postWithImages; - } - - @Test - void 게시글을_조회할_때_게시글_이미지는_즉시_로딩한다() { - Post foundPost = postRepository.getByIdUsingEntityGraph(post.getId()); - foundPost.getPostImageList().size(); // 추가쿼리 발생하지 않는다. - - assertThat(foundPost).isEqualTo(post); - } - - @Test - void 게시글을_조회할_때_게시글_이미지는_즉시_로딩한다_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // given - Long invalidId = -1L; - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - postRepository.getByIdUsingEntityGraph(invalidId); - }); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 게시글을_조회한다() { - Post foundPost = postRepository.getById(post.getId()); - - assertEquals(post, foundPost); - } - - @Test - void 게시글을_조회할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - Long invalidId = -1L; - - CustomException exception = assertThrows(CustomException.class, () -> { - postRepository.getById(invalidId); - }); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 게시글_좋아요를_등록한다() { - // given - Long likeCount = post.getLikeCount(); - - // when - postRepository.increaseLikeCount(post.getId()); - - // then - Post response = postRepository.getById(post.getId()); - assertEquals(response.getLikeCount(), likeCount + 1); - } - - @Test - void 게시글_좋아요를_삭제한다() { - // given - Long likeCount = post.getLikeCount(); - postRepository.increaseLikeCount(post.getId()); - - // when - postRepository.decreaseLikeCount(post.getId()); - - // then - Post response = postRepository.getById(post.getId()); - assertEquals(response.getLikeCount(), likeCount); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java deleted file mode 100644 index dd87a383f..000000000 --- a/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.example.solidconnection.unit.service; - -import com.example.solidconnection.application.domain.Application; -import com.example.solidconnection.application.domain.Gpa; -import com.example.solidconnection.application.domain.LanguageTest; -import com.example.solidconnection.application.dto.ApplyRequest; -import com.example.solidconnection.application.dto.UniversityChoiceRequest; -import com.example.solidconnection.application.repository.ApplicationRepository; -import com.example.solidconnection.application.service.ApplicationSubmissionService; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.custom.exception.ErrorCode; -import com.example.solidconnection.score.domain.GpaScore; -import com.example.solidconnection.score.domain.LanguageTestScore; -import com.example.solidconnection.score.repository.GpaScoreRepository; -import com.example.solidconnection.score.repository.LanguageTestScoreRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.type.*; -import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; -import org.junit.jupiter.api.BeforeEach; -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 org.springframework.beans.factory.annotation.Value; - -import java.time.LocalDate; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@DisplayName("지원 서비스 테스트") -public class ApplicationServiceTest { - @InjectMocks - ApplicationSubmissionService applicationSubmissionService; - @Mock - ApplicationRepository applicationRepository; - @Mock - UniversityInfoForApplyRepository universityInfoForApplyRepository; - @Mock - SiteUserRepository siteUserRepository; - @Mock - GpaScoreRepository gpaScoreRepository; - @Mock - LanguageTestScoreRepository languageTestScoreRepository; - - @Value("${university.term}") - private String term; - private SiteUser siteUser; - private GpaScore gpaScore; - private LanguageTestScore languageTestScore; - private final long gpaScoreId = 1L; - private final long languageTestScoreId = 1L; - private final long firstChoiceUniversityId = 1L; - private final long secondChoiceUniversityId = 2L; - private final long thirdChoiceUniversityId = 3L; - - @BeforeEach - void setUp() { - siteUser = new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - gpaScore = new GpaScore( - new Gpa(4.3, 4.5, "gpaScoreUrl"), - siteUser, - LocalDate.of(2024, 10, 30) - ); - languageTestScore = new LanguageTestScore( - new LanguageTest(LanguageTestType.TOEIC, "990", "languageTestScoreUrl"), - LocalDate.of(2024, 10, 30), - siteUser - ); - } - - @Test - void 지원한다_기존_이력_없음() { - // Given - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, secondChoiceUniversityId, thirdChoiceUniversityId) - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - gpaScore.setVerifyStatus(VerifyStatus.APPROVED); - when(gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScoreId)).thenReturn(Optional.of(gpaScore)); - languageTestScore.setVerifyStatus(VerifyStatus.APPROVED); - when(languageTestScoreRepository.findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScoreId)).thenReturn(Optional.of(languageTestScore)); - when(applicationRepository.findBySiteUserAndTerm(siteUser, term)).thenReturn(Optional.empty()); - - // When - boolean result = applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - - // Then - assertThat(result).isEqualTo(true); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(gpaScoreRepository, times(1)).findGpaScoreBySiteUserAndId(siteUser, gpaScoreId); - verify(languageTestScoreRepository, times(1)).findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScoreId); - verify(applicationRepository, times(1)).save(any(Application.class)); - } - - @Test - void 지원한다_기존_이력_있음() { - // Given - Application beforeApplication = new Application( - siteUser, - new Gpa(4.5, 4.5, "beforeGpaScoreUrl"), - new LanguageTest(LanguageTestType.TOEIC, "900", "beforeLanguageTestUrl"), - term - ); - beforeApplication.setVerifyStatus(VerifyStatus.APPROVED); - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, secondChoiceUniversityId, thirdChoiceUniversityId) - ); - - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - gpaScore.setVerifyStatus(VerifyStatus.APPROVED); - when(gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, 1L)).thenReturn(Optional.of(gpaScore)); - languageTestScore.setVerifyStatus(VerifyStatus.APPROVED); - when(languageTestScoreRepository.findLanguageTestScoreBySiteUserAndId(siteUser, 1L)).thenReturn(Optional.of(languageTestScore)); - when(applicationRepository.findBySiteUserAndTerm(siteUser, term)).thenReturn(Optional.of(beforeApplication)); - - // When - boolean result = applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - - // Then - assertThat(result).isEqualTo(true); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(gpaScoreRepository, times(1)).findGpaScoreBySiteUserAndId(siteUser, gpaScoreId); - verify(languageTestScoreRepository, times(1)).findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScoreId); - verify(applicationRepository, times(1)).findBySiteUserAndTerm(siteUser, term); - verify(universityInfoForApplyRepository, times(1)).getUniversityInfoForApplyByIdAndTerm(firstChoiceUniversityId, term); - verify(universityInfoForApplyRepository, times(1)).getUniversityInfoForApplyByIdAndTerm(secondChoiceUniversityId, term); - verify(universityInfoForApplyRepository, times(1)).getUniversityInfoForApplyByIdAndTerm(thirdChoiceUniversityId, term); - verify(applicationRepository, times(1)).save(any(Application.class)); - } - - @Test - void 지원할_때_존재하지_않는_학점이라면_예외_응답을_반환한다() { - // given - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, secondChoiceUniversityId, thirdChoiceUniversityId) - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScoreId)).thenReturn(Optional.empty()); - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.INVALID_GPA_SCORE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.INVALID_GPA_SCORE.getCode()); - } - - @Test - void 지원할_때_승인되지_않은_학점이라면_예외_응답을_반환한다() { - // given - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, secondChoiceUniversityId, thirdChoiceUniversityId) - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - gpaScore.setVerifyStatus(VerifyStatus.REJECTED); - when(gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScoreId)).thenReturn(Optional.of(gpaScore)); - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.INVALID_GPA_SCORE_STATUS.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.INVALID_GPA_SCORE_STATUS.getCode()); - } - - @Test - void 지원할_때_존재하지_않는_어학성적이라면_예외_응답을_반환한다() { - // given - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, secondChoiceUniversityId, thirdChoiceUniversityId) - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - gpaScore.setVerifyStatus(VerifyStatus.APPROVED); - when(gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScoreId)).thenReturn(Optional.of(gpaScore)); - when(languageTestScoreRepository.findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScoreId)).thenReturn(Optional.empty()); - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.INVALID_LANGUAGE_TEST_SCORE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.INVALID_LANGUAGE_TEST_SCORE.getCode()); - } - - @Test - void 지원할_때_승인되지_않은_어학성적이라면_예외_응답을_반환한다() { - // given - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, secondChoiceUniversityId, thirdChoiceUniversityId) - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - gpaScore.setVerifyStatus(VerifyStatus.APPROVED); - when(gpaScoreRepository.findGpaScoreBySiteUserAndId(siteUser, gpaScoreId)).thenReturn(Optional.of(gpaScore)); - languageTestScore.setVerifyStatus(VerifyStatus.REJECTED); - when(languageTestScoreRepository.findLanguageTestScoreBySiteUserAndId(siteUser, languageTestScoreId)).thenReturn(Optional.of(languageTestScore)); - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.INVALID_LANGUAGE_TEST_SCORE_STATUS.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.INVALID_LANGUAGE_TEST_SCORE_STATUS.getCode()); - } - - @Test - void 지원할_때_학교_선택이_중복되면_예외_응답을_반환한다() { - // given - ApplyRequest applyRequest = new ApplyRequest( - gpaScoreId, - languageTestScoreId, - new UniversityChoiceRequest(firstChoiceUniversityId, firstChoiceUniversityId, firstChoiceUniversityId) - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // when, then - CustomException exception = assertThrows(CustomException.class, () -> { - applicationSubmissionService.apply(siteUser.getEmail(), applyRequest); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.CANT_APPLY_FOR_SAME_UNIVERSITY.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.CANT_APPLY_FOR_SAME_UNIVERSITY.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/service/BoardServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/BoardServiceTest.java deleted file mode 100644 index 18c37b807..000000000 --- a/src/test/java/com/example/solidconnection/unit/service/BoardServiceTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.example.solidconnection.unit.service; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.board.repository.BoardRepository; -import com.example.solidconnection.board.service.BoardService; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.custom.exception.ErrorCode; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.dto.BoardFindPostResponse; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.type.*; -import org.junit.jupiter.api.BeforeEach; -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 java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - - -@ExtendWith(MockitoExtension.class) -@DisplayName("게시판 서비스 테스트") -class BoardServiceTest { - @InjectMocks - BoardService boardService; - @Mock - BoardRepository boardRepository; - - private SiteUser siteUser; - private Board board; - private List postList = new ArrayList<>(); - private List freePostList = new ArrayList<>(); - private List questionPostList = new ArrayList<>(); - - @BeforeEach - void setUp() { - siteUser = createSiteUser(); - board = createBoard("FREE", "자유게시판"); - - Post post_question_1 = createPost("질문", board, siteUser); - Post post_free_1 = createPost("자유", board, siteUser); - Post post_free_2 = createPost("자유", board, siteUser); - - postList.add(post_question_1); - postList.add(post_free_1); - postList.add(post_free_2); - questionPostList.add(post_question_1); - freePostList.add(post_free_1); - freePostList.add(post_free_2); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Board createBoard(String code, String koreanName) { - return new Board(code, koreanName); - } - - private Post createPost(String postCategory, Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf(postCategory) - ); - post.setBoardAndSiteUser(board, siteUser); - return post; - } - - @Test - void 게시판을_조회할_때_게시판_코드와_게시글_카테고리에_따라서_조회한다() { - // Given - String category = "자유"; - when(boardRepository.getByCodeUsingEntityGraph(board.getCode())).thenReturn(board); - - // When - List responses = boardService.findPostsByCodeAndPostCategory(board.getCode(), category); - - // Then - List expectedResponses = freePostList.stream() - .map(BoardFindPostResponse::from) - .toList(); - assertIterableEquals(expectedResponses, responses); - verify(boardRepository, times(1)).getByCodeUsingEntityGraph(board.getCode()); - } - - @Test - void 게시판을_조회할_때_카테고리가_전체라면_해당_게시판의_모든_게시글을_조회한다() { - // Given - String category = "전체"; - when(boardRepository.getByCodeUsingEntityGraph(board.getCode())).thenReturn(board); - - // When - List responses = boardService.findPostsByCodeAndPostCategory(board.getCode(), category); - - // Then - List expectedResponses = postList.stream() - .map(BoardFindPostResponse::from) - .toList(); - assertIterableEquals(expectedResponses, responses); - verify(boardRepository, times(1)).getByCodeUsingEntityGraph(board.getCode()); - } - - @Test - void 게시판을_조회할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - String invalidCode = "INVALID_CODE"; - String category = "자유"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> { - boardService.findPostsByCodeAndPostCategory(invalidCode, category); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시판을_조회할_때_유효한_카테고리가_아니라면_예외_응답을_반환한다() { - // Given - String invalidCategory = "INVALID_CATEGORY"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> { - boardService.findPostsByCodeAndPostCategory(board.getCode(), invalidCategory); - }); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.INVALID_POST_CATEGORY.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.INVALID_POST_CATEGORY.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/service/CommentServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/CommentServiceTest.java deleted file mode 100644 index 9ced8bcd8..000000000 --- a/src/test/java/com/example/solidconnection/unit/service/CommentServiceTest.java +++ /dev/null @@ -1,483 +0,0 @@ -package com.example.solidconnection.unit.service; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.comment.domain.Comment; -import com.example.solidconnection.comment.dto.*; -import com.example.solidconnection.comment.repository.CommentRepository; -import com.example.solidconnection.comment.service.CommentService; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.repository.PostRepository; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.type.*; -import org.junit.jupiter.api.BeforeEach; -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 java.util.List; -import java.util.stream.Collectors; - -import static com.example.solidconnection.custom.exception.ErrorCode.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@DisplayName("댓글 서비스 테스트") -class CommentServiceTest { - @InjectMocks - CommentService commentService; - @Mock - PostRepository postRepository; - @Mock - SiteUserRepository siteUserRepository; - @Mock - CommentRepository commentRepository; - - private SiteUser siteUser; - private Board board; - private Post post; - private Comment parentComment; - private Comment parentCommentWithNullContent; - private Comment childComment; - private Comment childCommentOfNullContentParent; - - - @BeforeEach - void setUp() { - siteUser = createSiteUser(); - board = createBoard(); - post = createPost(board, siteUser); - parentComment = createParentComment("parent"); - parentCommentWithNullContent = createParentComment(null); - childComment = createChildComment(parentComment); - childCommentOfNullContentParent = createChildComment(parentCommentWithNullContent); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Board createBoard() { - return new Board( - "FREE", "자유게시판"); - } - - private Post createPost(Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - post.setBoardAndSiteUser(board, siteUser); - return post; - } - - private Comment createParentComment(String content) { - Comment comment = new Comment( - content - ); - comment.setPostAndSiteUser(post, siteUser); - return comment; - } - - private Comment createChildComment(Comment parentComment) { - Comment comment = new Comment( - "child" - ); - comment.setParentCommentAndPostAndSiteUser(parentComment, post, siteUser); - return comment; - } - - /** - * 댓글 조회 - */ - - @Test - void 특정_게시글의_댓글들을_조회한다() { - // Given - List commentList = List.of(parentComment, childComment, parentCommentWithNullContent); - when(commentRepository.findCommentTreeByPostId(post.getId())).thenReturn(commentList); - - // When - List postFindCommentResponses = commentService.findCommentsByPostId( - siteUser.getEmail(), post.getId()); - - // Then - List expectedResponse = commentList.stream() - .map(comment -> PostFindCommentResponse.from(isOwner(comment, siteUser.getEmail()), comment)) - .collect(Collectors.toList()); - assertEquals(postFindCommentResponses, expectedResponse); - } - - private Boolean isOwner(Comment comment, String email) { - return comment.getSiteUser().getEmail().equals(email); - } - - /** - * 댓글 등록 - */ - @Test - void 부모_댓글을_등록한다() { - // Given - CommentCreateRequest commentCreateRequest = new CommentCreateRequest( - "parent", null - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.save(any(Comment.class))).thenReturn(parentComment); - - // When - CommentCreateResponse commentCreateResponse = commentService.createComment( - siteUser.getEmail(), post.getId(), commentCreateRequest); - - // Then - assertEquals(commentCreateResponse, CommentCreateResponse.from(parentComment)); - verify(commentRepository, times(0)) - .getById(any(Long.class)); - verify(commentRepository, times(1)) - .save(commentCreateRequest.toEntity(siteUser, post, parentComment)); - } - - @Test - void 자식_댓글을_등록한다() { - // Given - Long parentCommentId = 1L; - CommentCreateRequest commentCreateRequest = new CommentCreateRequest( - "child", parentCommentId - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(parentCommentId)).thenReturn(parentComment); - when(commentRepository.save(any(Comment.class))).thenReturn(childComment); - - // When - CommentCreateResponse commentCreateResponse = commentService.createComment( - siteUser.getEmail(), post.getId(), commentCreateRequest); - - // Then - assertEquals(commentCreateResponse, CommentCreateResponse.from(childComment)); - verify(commentRepository, times(1)) - .getById(parentCommentId); - verify(commentRepository, times(1)) - .save(commentCreateRequest.toEntity(siteUser, post, parentComment)); - } - - - @Test - void 댓글을_등록할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - CommentCreateRequest commentCreateRequest = new CommentCreateRequest( - "child", null - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.createComment(siteUser.getEmail(), invalidPostId, commentCreateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - verify(commentRepository, times(0)) - .save(any(Comment.class)); - } - - @Test - void 댓글을_등록할_때_유효한_부모_댓글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidParentCommentId = -1L; - CommentCreateRequest commentCreateRequest = new CommentCreateRequest( - "child", invalidParentCommentId - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(invalidParentCommentId)).thenThrow(new CustomException(INVALID_COMMENT_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.createComment(siteUser.getEmail(), post.getId(), commentCreateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_COMMENT_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_COMMENT_ID.getCode()); - verify(commentRepository, times(0)) - .save(any(Comment.class)); - } - - @Test - void 댓글을_등록할_때_대대댓글_부터는_예외_응답을_반환한다() { - // Given - Long childCommentId = 1L; - CommentCreateRequest commentCreateRequest = new CommentCreateRequest( - "child's child", childCommentId - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(childCommentId)).thenReturn(childComment); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.createComment(siteUser.getEmail(), post.getId(), commentCreateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_COMMENT_LEVEL.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_COMMENT_LEVEL.getCode()); - verify(commentRepository, times(0)) - .save(any(Comment.class)); - } - - /** - * 댓글 수정 - */ - @Test - void 댓글을_수정한다() { - // Given - CommentUpdateRequest commentUpdateRequest = new CommentUpdateRequest( - "update" - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(parentComment); - - // When - CommentUpdateResponse commentUpdateResponse = commentService.updateComment( - siteUser.getEmail(), post.getId(), parentComment.getId(), commentUpdateRequest); - - // Then - assertEquals(commentUpdateResponse.id(), parentComment.getId()); - } - - @Test - void 댓글을_수정할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - CommentUpdateRequest commentUpdateRequest = new CommentUpdateRequest( - "update" - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.updateComment(siteUser.getEmail(), invalidPostId, parentComment.getId(), commentUpdateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 댓글을_수정할_때_유효한_댓글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidCommentId = -1L; - CommentUpdateRequest commentUpdateRequest = new CommentUpdateRequest( - "update" - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(invalidCommentId)).thenThrow(new CustomException(INVALID_COMMENT_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.updateComment(siteUser.getEmail(), post.getId(), invalidCommentId, commentUpdateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_COMMENT_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_COMMENT_ID.getCode()); - } - - @Test - void 댓글을_수정할_때_이미_삭제된_댓글이라면_예외_응답을_반환한다() { - // Given - parentComment.deprecateComment(); - CommentUpdateRequest commentUpdateRequest = new CommentUpdateRequest( - "update" - ); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(parentComment); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.updateComment(siteUser.getEmail(), post.getId(), parentComment.getId(), commentUpdateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(CAN_NOT_UPDATE_DEPRECATED_COMMENT.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(CAN_NOT_UPDATE_DEPRECATED_COMMENT.getCode()); - } - - @Test - void 댓글을_수정할_때_자신의_댓글이_아니라면_예외_응답을_반환한다() { - // Given - String invalidEmail = "invalidEmail@test.com"; - CommentUpdateRequest commentUpdateRequest = new CommentUpdateRequest( - "update" - ); - when(siteUserRepository.getByEmail(invalidEmail)).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(parentComment); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.updateComment(invalidEmail, post.getId(), parentComment.getId(), commentUpdateRequest) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ACCESS.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ACCESS.getCode()); - } - - /** - * 댓글 삭제 - */ - - @Test - void 댓글을_삭제한다_자식댓글_있음() { - // Given - Long parentCommentId = 1L; - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(parentComment); - - // When - CommentDeleteResponse commentDeleteResponse = commentService.deleteCommentById( - siteUser.getEmail(), post.getId(), parentCommentId); - - // Then - assertEquals(parentComment.getContent(), null); - assertEquals(commentDeleteResponse.id(), parentCommentId); - verify(commentRepository, times(0)).deleteById(parentCommentId); - } - - @Test - void 댓글을_삭제한다_자식댓글_없음() { - // Given - Long childCommentId = 1L; - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(childComment); - - // When - CommentDeleteResponse commentDeleteResponse = commentService.deleteCommentById( - siteUser.getEmail(), post.getId(), childCommentId); - - // Then - assertEquals(commentDeleteResponse.id(), childCommentId); - verify(commentRepository, times(1)).deleteById(childCommentId); - } - - @Test - void 대댓글을_삭제한다_부모댓글_유효() { - // Given - Long childCommentId = 1L; - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(childComment); - - // When - CommentDeleteResponse commentDeleteResponse = commentService.deleteCommentById( - siteUser.getEmail(), post.getId(), childCommentId); - - // Then - assertEquals(commentDeleteResponse.id(), childCommentId); - verify(commentRepository, times(1)).deleteById(childCommentId); - } - - @Test - void 대댓글을_삭제한다_부모댓글_유효하지_않음() { - // Given - - Long childCommentId = 1L; - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(childCommentOfNullContentParent); - - // When - CommentDeleteResponse commentDeleteResponse = commentService.deleteCommentById( - siteUser.getEmail(), post.getId(), childCommentId); - - // Then - assertEquals(commentDeleteResponse.id(), childCommentId); - verify(commentRepository, times(2)).deleteById(any()); - } - - @Test - void 댓글을_삭제할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.deleteCommentById(siteUser.getEmail(), invalidPostId, parentComment.getId()) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 댓글을_삭제할_때_유효한_댓글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidCommentId = -1L; - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(invalidCommentId)).thenThrow(new CustomException(INVALID_COMMENT_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.deleteCommentById(siteUser.getEmail(), post.getId(), invalidCommentId) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_COMMENT_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_COMMENT_ID.getCode()); - } - - @Test - void 댓글을_삭제할_때_자신의_댓글이_아니라면_예외_응답을_반환한다() { - // Given - String invalidEmail = "invalidEmail@test.com"; - when(siteUserRepository.getByEmail(invalidEmail)).thenReturn(siteUser); - when(postRepository.getById(post.getId())).thenReturn(post); - when(commentRepository.getById(any())).thenReturn(parentComment); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - commentService.deleteCommentById(invalidEmail, post.getId(), parentComment.getId()) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ACCESS.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ACCESS.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/service/PostServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/PostServiceTest.java deleted file mode 100644 index afc899255..000000000 --- a/src/test/java/com/example/solidconnection/unit/service/PostServiceTest.java +++ /dev/null @@ -1,715 +0,0 @@ -package com.example.solidconnection.unit.service; - -import com.example.solidconnection.board.domain.Board; -import com.example.solidconnection.board.dto.PostFindBoardResponse; -import com.example.solidconnection.board.repository.BoardRepository; -import com.example.solidconnection.comment.dto.PostFindCommentResponse; -import com.example.solidconnection.comment.service.CommentService; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.custom.exception.ErrorCode; -import com.example.solidconnection.post.dto.PostFindPostImageResponse; -import com.example.solidconnection.entity.PostImage; -import com.example.solidconnection.post.domain.PostLike; -import com.example.solidconnection.post.repository.PostLikeRepository; -import com.example.solidconnection.post.domain.Post; -import com.example.solidconnection.post.dto.*; -import com.example.solidconnection.post.repository.PostRepository; -import com.example.solidconnection.post.service.PostCommandService; -import com.example.solidconnection.post.service.PostLikeService; -import com.example.solidconnection.post.service.PostQueryService; -import com.example.solidconnection.s3.S3Service; -import com.example.solidconnection.s3.UploadedFileUrlResponse; -import com.example.solidconnection.service.RedisService; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.dto.PostFindSiteUserResponse; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.type.*; -import com.example.solidconnection.util.RedisUtils; -import org.junit.jupiter.api.BeforeEach; -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 org.springframework.mock.web.MockMultipartFile; -import org.springframework.web.multipart.MultipartFile; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import static com.example.solidconnection.custom.exception.ErrorCode.CAN_NOT_DELETE_OR_UPDATE_QUESTION; -import static com.example.solidconnection.custom.exception.ErrorCode.CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_BOARD_CODE; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_ACCESS; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_CATEGORY; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_ID; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_LIKE; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -@DisplayName("게시글 서비스 테스트") -class PostServiceTest { - - @InjectMocks - PostQueryService postQueryService; - - @InjectMocks - PostCommandService postCommandService; - - @InjectMocks - PostLikeService postLikeService; - - @Mock - PostRepository postRepository; - @Mock - SiteUserRepository siteUserRepository; - @Mock - BoardRepository boardRepository; - @Mock - PostLikeRepository postLikeRepository; - @Mock - S3Service s3Service; - @Mock - CommentService commentService; - @Mock - RedisService redisService; - @Mock - RedisUtils redisUtils; - - private SiteUser siteUser; - private Board board; - private Post post; - private Post postWithImages; - private Post questionPost; - private PostLike postLike; - private List imageFiles; - private List imageFilesWithMoreThanFiveFiles; - private List uploadedFileUrlResponseList; - - @BeforeEach - void setUp() { - siteUser = createSiteUser(); - board = createBoard(); - imageFiles = createMockImageFiles(); - imageFilesWithMoreThanFiveFiles = createMockImageFilesWithMoreThanFiveFiles(); - uploadedFileUrlResponseList = createUploadedFileUrlResponses(); - post = createPost(board, siteUser); - postWithImages = createPostWithImages(board, siteUser); - questionPost = createQuestionPost(board, siteUser); - postLike = createPostLike(post, siteUser); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private Board createBoard() { - return new Board( - "FREE", "자유게시판"); - } - - private Post createPost(Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - post.setBoardAndSiteUser(board, siteUser); - - return post; - } - - private Post createPostWithImages(Board board, SiteUser siteUser) { - Post postWithImages = new Post( - "title", - "content", - false, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - postWithImages.setBoardAndSiteUser(board, siteUser); - - List postImageList = new ArrayList<>(); - postImageList.add(new PostImage("https://s3.example.com/test1.png")); - postImageList.add(new PostImage("https://s3.example.com/test2.png")); - for (PostImage postImage : postImageList) { - postImage.setPost(postWithImages); - } - return postWithImages; - } - - private Post createQuestionPost(Board board, SiteUser siteUser) { - Post post = new Post( - "title", - "content", - true, - 0L, - 0L, - PostCategory.valueOf("자유") - ); - post.setBoardAndSiteUser(board, siteUser); - return post; - } - - private PostLike createPostLike(Post post, SiteUser siteUser) { - PostLike postLike = new PostLike(); - postLike.setPostAndSiteUser(post, siteUser); - return postLike; - } - - private List createMockImageFiles() { - List multipartFileList = new ArrayList<>(); - multipartFileList.add(new MockMultipartFile("file1", "test1.png", - "image/png", "test image content 1".getBytes())); - multipartFileList.add(new MockMultipartFile("file2", "test1.png", - "image/png", "test image content 1".getBytes())); - return multipartFileList; - } - - private List createUploadedFileUrlResponses() { - return Arrays.asList( - new UploadedFileUrlResponse("https://s3.example.com/test1.png"), - new UploadedFileUrlResponse("https://s3.example.com/test2.png") - ); - } - - private List createMockImageFilesWithMoreThanFiveFiles() { - List multipartFileList = new ArrayList<>(); - multipartFileList.add(new MockMultipartFile("file1", "test1.png", - "image/png", "test image content 1".getBytes())); - multipartFileList.add(new MockMultipartFile("file2", "test1.png", - "image/png", "test image content 1".getBytes())); - multipartFileList.add(new MockMultipartFile("file3", "test1.png", - "image/png", "test image content 1".getBytes())); - multipartFileList.add(new MockMultipartFile("file4", "test1.png", - "image/png", "test image content 1".getBytes())); - multipartFileList.add(new MockMultipartFile("file5", "test1.png", - "image/png", "test image content 1".getBytes())); - multipartFileList.add(new MockMultipartFile("file6", "test1.png", - "image/png", "test image content 1".getBytes())); - return multipartFileList; - } - - /** - * 게시글 등록 - */ - @Test - void 게시글을_등록한다_이미지_있음() { - // Given - PostCreateRequest postCreateRequest = new PostCreateRequest( - "자유", "title", "content", false); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(boardRepository.getByCode(board.getCode())).thenReturn(board); - when(s3Service.uploadFiles(imageFiles, ImgType.COMMUNITY)).thenReturn(uploadedFileUrlResponseList); - when(postRepository.save(any(Post.class))).thenReturn(postWithImages); - - // When - PostCreateResponse postCreateResponse = postCommandService.createPost( - siteUser.getEmail(), board.getCode(), postCreateRequest, imageFiles); - - // Then - assertEquals(postCreateResponse, PostCreateResponse.from(postWithImages)); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(boardRepository, times(1)).getByCode(board.getCode()); - verify(s3Service, times(1)).uploadFiles(imageFiles, ImgType.COMMUNITY); - verify(postRepository, times(1)).save(any(Post.class)); - } - - @Test - void 게시글을_등록한다_이미지_없음() { - // Given - PostCreateRequest postCreateRequest = new PostCreateRequest( - "자유", "title", "content", false); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(boardRepository.getByCode(board.getCode())).thenReturn(board); - when(postRepository.save(postCreateRequest.toEntity(siteUser, board))).thenReturn(post); - - // When - PostCreateResponse postCreateResponse = postCommandService.createPost( - siteUser.getEmail(), board.getCode(), postCreateRequest, Collections.emptyList()); - - // Then - assertEquals(postCreateResponse, PostCreateResponse.from(post)); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(boardRepository, times(1)).getByCode(board.getCode()); - verify(postRepository, times(1)).save(postCreateRequest.toEntity(siteUser, board)); - } - - @Test - void 게시글을_등록할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - String invalidBoardCode = "INVALID_CODE"; - PostCreateRequest postCreateRequest = new PostCreateRequest( - "자유", "title", "content", false); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> postCommandService - .createPost(siteUser.getEmail(), invalidBoardCode, postCreateRequest, Collections.emptyList())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시글을_등록할_때_유효한_카테고리가_아니라면_예외_응답을_반환한다() { - // Given - String invalidPostCategory = "invalidPostCategory"; - PostCreateRequest postCreateRequest = new PostCreateRequest( - invalidPostCategory, "title", "content", false); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> postCommandService - .createPost(siteUser.getEmail(), board.getCode(), postCreateRequest, Collections.emptyList())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_CATEGORY.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_CATEGORY.getCode()); - } - - @Test - void 게시글을_등록할_때_파일_수가_5개를_넘는다면_예외_응답을_반환한다() { - // Given - PostCreateRequest postCreateRequest = new PostCreateRequest( - "자유", "title", "content", false); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> postCommandService - .createPost(siteUser.getEmail(), board.getCode(), postCreateRequest, imageFilesWithMoreThanFiveFiles)); - assertThat(exception.getMessage()) - .isEqualTo(CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES.getCode()); - } - - /** - * 게시글 수정 - */ - @Test - void 게시글을_수정한다_기존_사진_없음_수정_사진_없음() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("질문", "updateTitle", "updateContent"); - when(postRepository.getById(post.getId())).thenReturn(post); - - // When - PostUpdateResponse response = postCommandService.updatePost( - siteUser.getEmail(), board.getCode(), post.getId(), postUpdateRequest, Collections.emptyList()); - - // Then - assertEquals(response, PostUpdateResponse.from(post)); - verify(postRepository, times(1)).getById(post.getId()); - verify(s3Service, times(0)).deletePostImage(any(String.class)); - verify(s3Service, times(0)).uploadFiles(anyList(), any(ImgType.class)); - } - - @Test - void 게시글을_수정한다_기존_사진_있음_수정_사진_없음() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "updateTitle", "updateContent"); - when(postRepository.getById(postWithImages.getId())).thenReturn(postWithImages); - - // When - PostUpdateResponse response = postCommandService.updatePost( - siteUser.getEmail(), board.getCode(), postWithImages.getId(), postUpdateRequest, Collections.emptyList()); - - // Then - assertEquals(response, PostUpdateResponse.from(postWithImages)); - verify(postRepository, times(1)).getById(postWithImages.getId()); - verify(s3Service, times(imageFiles.size())).deletePostImage(any(String.class)); - verify(s3Service, times(0)).uploadFiles(anyList(), any(ImgType.class)); - } - - @Test - void 게시글을_수정한다_기존_사진_없음_수정_사진_있음() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "updateTitle", "updateContent"); - when(postRepository.getById(post.getId())).thenReturn(post); - when(s3Service.uploadFiles(imageFiles, ImgType.COMMUNITY)).thenReturn(uploadedFileUrlResponseList); - - // When - PostUpdateResponse response = postCommandService.updatePost( - siteUser.getEmail(), board.getCode(), post.getId(), postUpdateRequest, imageFiles); - - // Then - assertEquals(response, PostUpdateResponse.from(post)); - verify(postRepository, times(1)).getById(post.getId()); - verify(s3Service, times(0)).deletePostImage(any(String.class)); - verify(s3Service, times(1)).uploadFiles(imageFiles, ImgType.COMMUNITY); - } - - @Test - void 게시글을_수정한다_기존_사진_있음_수정_사진_있음() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "updateTitle", "updateContent"); - when(postRepository.getById(postWithImages.getId())).thenReturn(postWithImages); - when(s3Service.uploadFiles(imageFiles, ImgType.COMMUNITY)).thenReturn(uploadedFileUrlResponseList); - - // When - PostUpdateResponse response = postCommandService.updatePost( - siteUser.getEmail(), board.getCode(), postWithImages.getId(), postUpdateRequest, imageFiles); - - // Then - assertEquals(response, PostUpdateResponse.from(postWithImages)); - verify(postRepository, times(1)).getById(postWithImages.getId()); - verify(s3Service, times(imageFiles.size())).deletePostImage(any(String.class)); - verify(s3Service, times(1)).uploadFiles(imageFiles, ImgType.COMMUNITY); - } - - @Test - void 게시글을_수정할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "title", "content"); - String invalidBoardCode = "INVALID_CODE"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.updatePost(siteUser.getEmail(), invalidBoardCode, post.getId(), postUpdateRequest, imageFiles)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시글을_수정할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "title", "content"); - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.updatePost(siteUser.getEmail(), board.getCode(), invalidPostId, postUpdateRequest, imageFiles)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 게시글을_수정할_때_본인의_게시글이_아니라면_예외_응답을_반환한다() { - // Given - String invalidEmail = "invalidEmail@example.com"; - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "title", "content"); - when(postRepository.getById(post.getId())).thenReturn(post); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.updatePost(invalidEmail, board.getCode(), post.getId(), postUpdateRequest, imageFiles)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ACCESS.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ACCESS.getCode()); - } - - @Test - void 게시글을_수정할_때_질문글_이라면_예외_응답을_반환한다() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "title", "content"); - when(postRepository.getById(questionPost.getId())).thenReturn(questionPost); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.updatePost(siteUser.getEmail(), board.getCode(), questionPost.getId(), postUpdateRequest, imageFiles)); - assertThat(exception.getMessage()) - .isEqualTo(CAN_NOT_DELETE_OR_UPDATE_QUESTION.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(CAN_NOT_DELETE_OR_UPDATE_QUESTION.getCode()); - } - - @Test - void 게시글을_수정할_때_파일_수가_5개를_넘는다면_예외_응답을_반환한다() { - // Given - PostUpdateRequest postUpdateRequest = new PostUpdateRequest("자유", "title", "content"); - when(postRepository.getById(post.getId())).thenReturn(post); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.updatePost(siteUser.getEmail(), board.getCode(), post.getId(), postUpdateRequest, imageFilesWithMoreThanFiveFiles)); - assertThat(exception.getMessage()) - .isEqualTo(CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES.getCode()); - } - - /** - * 게시글 조회 - */ - @Test - void 게시글을_찾는다() { - // Given - List commentFindResultDTOList = new ArrayList<>(); - when(postRepository.getByIdUsingEntityGraph(post.getId())).thenReturn(post); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postLikeRepository.findPostLikeByPostAndSiteUser(post, siteUser)).thenReturn(Optional.empty()); - when(commentService.findCommentsByPostId(siteUser.getEmail(), post.getId())).thenReturn(commentFindResultDTOList); - - // When - PostFindResponse response = postQueryService.findPostById(siteUser.getEmail(), board.getCode(), post.getId()); - - // Then - PostFindResponse expectedResponse = PostFindResponse.from( - post, - true, - false, - PostFindBoardResponse.from(post.getBoard()), - PostFindSiteUserResponse.from(post.getSiteUser()), - commentFindResultDTOList, - PostFindPostImageResponse.from(post.getPostImageList()) - ); - assertEquals(expectedResponse, response); - verify(postRepository, times(1)).getByIdUsingEntityGraph(post.getId()); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(postLikeRepository, times(1)).findPostLikeByPostAndSiteUser(post, siteUser); - verify(commentService, times(1)).findCommentsByPostId(siteUser.getEmail(), post.getId()); - } - - @Test - void 게시글을_찾을_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - String invalidBoardCode = "INVALID_CODE"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postQueryService.findPostById(siteUser.getEmail(), invalidBoardCode, post.getId())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시글을_찾을_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - when(postRepository.getByIdUsingEntityGraph(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postQueryService.findPostById(siteUser.getEmail(), board.getCode(), invalidPostId)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - /** - * 게시글 삭제 - */ - @Test - void 게시글을_삭제한다() { - // Give - when(postRepository.getById(post.getId())).thenReturn(post); - - // When - PostDeleteResponse postDeleteResponse = postCommandService.deletePostById(siteUser.getEmail(), board.getCode(), post.getId()); - - // Then - assertEquals(postDeleteResponse.id(), post.getId()); - verify(postRepository, times(1)).getById(post.getId()); - verify(redisService, times(1)).deleteKey(redisUtils.getPostViewCountRedisKey(post.getId())); - verify(postRepository, times(1)).deleteById(post.getId()); - } - - @Test - void 게시글을_삭제할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - String invalidBoardCode = "INVALID_CODE"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.deletePostById(siteUser.getEmail(), invalidBoardCode, post.getId())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시글을_삭제할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.deletePostById(siteUser.getEmail(), board.getCode(), invalidPostId)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 게시글을_삭제할_때_자신의_게시글이_아니라면_예외_응답을_반환한다() { - // Given - String invalidEmail = "invalidEmail@example.com"; - when(postRepository.getById(post.getId())).thenReturn(post); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.deletePostById(invalidEmail, board.getCode(), post.getId()) - ); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ACCESS.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ACCESS.getCode()); - } - - @Test - void 게시글을_삭제할_때_질문글_이라면_예외_응답을_반환한다() { - when(postRepository.getById(questionPost.getId())).thenReturn(questionPost); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postCommandService.deletePostById(siteUser.getEmail(), board.getCode(), questionPost.getId())); - assertThat(exception.getMessage()) - .isEqualTo(CAN_NOT_DELETE_OR_UPDATE_QUESTION.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(CAN_NOT_DELETE_OR_UPDATE_QUESTION.getCode()); - } - - /** - * 게시글 좋아요 - */ - @Test - void 게시글_좋아요를_등록한다() { - // Given - when(postRepository.getById(post.getId())).thenReturn(post); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // When - PostLikeResponse postLikeResponse = postLikeService.likePost(siteUser.getEmail(), board.getCode(), post.getId()); - - // Then - assertEquals(postLikeResponse, PostLikeResponse.from(post)); - verify(postLikeRepository, times(1)).save(any(PostLike.class)); - } - - @Test - void 게시글_좋아요를_등록할_때_중복된_좋아요라면_예외_응답을_반환한다() { - when(postRepository.getById(post.getId())).thenReturn(post); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postLikeRepository.findPostLikeByPostAndSiteUser(post, siteUser)).thenReturn(Optional.of(postLike)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postLikeService.likePost(siteUser.getEmail(), board.getCode(), post.getId())); - assertThat(exception.getMessage()) - .isEqualTo(ErrorCode.DUPLICATE_POST_LIKE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(ErrorCode.DUPLICATE_POST_LIKE.getCode()); - } - - @Test - void 게시글_좋아요를_등록할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - String invalidBoardCode = "INVALID_CODE"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postLikeService.likePost(siteUser.getEmail(), invalidBoardCode, post.getId())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시글_좋아요를_등록할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postLikeService.likePost(siteUser.getEmail(), board.getCode(), invalidPostId)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } - - @Test - void 게시글_좋아요를_삭제한다() { - // Given - Long likeCount = post.getLikeCount(); - when(postRepository.getById(post.getId())).thenReturn(post); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postLikeRepository.getByPostAndSiteUser(post, siteUser)).thenReturn(postLike); - - // When - PostDislikeResponse postDislikeResponse = postLikeService.dislikePost(siteUser.getEmail(), board.getCode(), post.getId()); - - // Then - assertEquals(postDislikeResponse, PostDislikeResponse.from(post)); - verify(postLikeRepository, times(1)).deleteById(post.getId()); - } - - @Test - void 게시글_좋아요를_삭제할_때_존재하지_않는_좋아요라면_예외_응답을_반환한다() { - when(postRepository.getById(post.getId())).thenReturn(post); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(postLikeRepository.getByPostAndSiteUser(post, siteUser)).thenThrow(new CustomException(INVALID_POST_LIKE)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postLikeService.dislikePost(siteUser.getEmail(), board.getCode(), post.getId())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_LIKE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_LIKE.getCode()); - } - - @Test - void 게시글_좋아요를_삭제할_때_유효한_게시판이_아니라면_예외_응답을_반환한다() { - // Given - String invalidBoardCode = "INVALID_CODE"; - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postLikeService.dislikePost(siteUser.getEmail(), invalidBoardCode, post.getId())); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_BOARD_CODE.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_BOARD_CODE.getCode()); - } - - @Test - void 게시글_좋아요를_삭제할_때_유효한_게시글이_아니라면_예외_응답을_반환한다() { - // Given - Long invalidPostId = -1L; - when(postRepository.getById(invalidPostId)).thenThrow(new CustomException(INVALID_POST_ID)); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - postLikeService.dislikePost(siteUser.getEmail(), board.getCode(), invalidPostId)); - assertThat(exception.getMessage()) - .isEqualTo(INVALID_POST_ID.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(INVALID_POST_ID.getCode()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/service/ScoreServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/ScoreServiceTest.java deleted file mode 100644 index 39deadb54..000000000 --- a/src/test/java/com/example/solidconnection/unit/service/ScoreServiceTest.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.example.solidconnection.unit.service; - -import com.example.solidconnection.application.domain.Gpa; -import com.example.solidconnection.application.domain.LanguageTest; -import com.example.solidconnection.score.domain.GpaScore; -import com.example.solidconnection.score.domain.LanguageTestScore; -import com.example.solidconnection.score.dto.*; -import com.example.solidconnection.score.repository.GpaScoreRepository; -import com.example.solidconnection.score.repository.LanguageTestScoreRepository; -import com.example.solidconnection.score.service.ScoreService; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.LanguageTestType; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -import org.junit.jupiter.api.BeforeEach; -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 java.time.LocalDate; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@DisplayName("점수 서비스 테스트") -public class ScoreServiceTest { - @InjectMocks - ScoreService scoreService; - @Mock - GpaScoreRepository gpaScoreRepository; - @Mock - LanguageTestScoreRepository languageTestScoreRepository; - @Mock - SiteUserRepository siteUserRepository; - - private SiteUser siteUser; - private GpaScore beforeGpaScore; - private GpaScore beforeGpaScore2; - private LanguageTestScore beforeLanguageTestScore; - private LanguageTestScore beforeLanguageTestScore2; - - @BeforeEach - void setUp() { - siteUser = createSiteUser(); - beforeGpaScore = createBeforeGpaScore(siteUser, 4.5); - beforeGpaScore2 = createBeforeGpaScore(siteUser, 4.3); - beforeLanguageTestScore = createBeforeLanguageTestScore(siteUser); - beforeLanguageTestScore2 = createBeforeLanguageTestScore2(siteUser); - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private GpaScore createBeforeGpaScore(SiteUser siteUser, Double gpa) { - return new GpaScore( - new Gpa(gpa, 4.5, "http://example.com/gpa-report.pdf"), - siteUser, - LocalDate.of(2024, 10, 20) - ); - } - - private LanguageTestScore createBeforeLanguageTestScore(SiteUser siteUser) { - return new LanguageTestScore( - new LanguageTest(LanguageTestType.TOEIC, "900", "http://example.com/gpa-report.pdf"), - LocalDate.of(2024, 10, 30), - siteUser - ); - } - - private LanguageTestScore createBeforeLanguageTestScore2(SiteUser siteUser) { - return new LanguageTestScore( - new LanguageTest(LanguageTestType.TOEFL_IBT, "100", "http://example.com/gpa-report.pdf"), - LocalDate.of(2024, 10, 30), - siteUser - ); - } - - @Test - void 학점을_등록한다_기존이력이_없을_때() { - // Given - GpaScoreRequest gpaScoreRequest = new GpaScoreRequest( - 4.5, 4.5, LocalDate.of(2024, 10, 20), "http://example.com/gpa-report.pdf" - ); - GpaScore newGpaScore = new GpaScore(gpaScoreRequest.toGpa(), siteUser, gpaScoreRequest.issueDate()); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(gpaScoreRepository.save(newGpaScore)).thenReturn(newGpaScore); - - // 새로운 gpa 저장하게된다. - scoreService.submitGpaScore(siteUser.getEmail(), gpaScoreRequest); - - // Then - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(gpaScoreRepository, times(1)).save(any(GpaScore.class)); - } - - @Test - void 어학성적을_등록한다_기존이력이_없을_때() { - // Given - LanguageTestScoreRequest languageTestScoreRequest = new LanguageTestScoreRequest( - LanguageTestType.TOEIC, "900", - LocalDate.of(2024, 10, 30), "http://example.com/gpa-report.pdf" - ); - LanguageTest languageTest = languageTestScoreRequest.toLanguageTest(); - LanguageTestScore languageTestScore = new LanguageTestScore(languageTest, LocalDate.of(2024, 10, 30), siteUser); - - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(languageTestScoreRepository.save(any(LanguageTestScore.class))).thenReturn(languageTestScore); - - //when - scoreService.submitLanguageTestScore(siteUser.getEmail(), languageTestScoreRequest); - - // Then - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(languageTestScoreRepository, times(1)).save(any(LanguageTestScore.class)); - } - - @Test - void 학점이력을_조회한다_제출이력이_있을_때() { - // Given - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - beforeGpaScore.setSiteUser(siteUser); - beforeGpaScore2.setSiteUser(siteUser); - - // when - GpaScoreStatusResponse gpaScoreStatusResponse = scoreService.getGpaScoreStatus(siteUser.getEmail()); - - // Then - List expectedStatusList = List.of( - GpaScoreStatus.from(beforeGpaScore), - GpaScoreStatus.from(beforeGpaScore2) - ); - assertThat(gpaScoreStatusResponse.gpaScoreStatusList()) - .hasSize(2) - .containsExactlyElementsOf(expectedStatusList); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - } - - @Test - void 학점이력을_조회한다_제출이력이_없을_때() { - // Given - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // when - GpaScoreStatusResponse gpaScoreStatus = scoreService.getGpaScoreStatus(siteUser.getEmail()); - - // Then - assertThat(gpaScoreStatus.gpaScoreStatusList()).isEmpty(); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - } - - - @Test - void 어학이력을_조회한다_제출이력이_있을_때() { - // Given - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - beforeLanguageTestScore.setSiteUser(siteUser); - beforeLanguageTestScore2.setSiteUser(siteUser); - - // when - LanguageTestScoreStatusResponse languageTestScoreStatus = scoreService.getLanguageTestScoreStatus(siteUser.getEmail()); - - // Then - List expectedStatusList = List.of( - LanguageTestScoreStatus.from(beforeLanguageTestScore), - LanguageTestScoreStatus.from(beforeLanguageTestScore2) - ); - assertThat(languageTestScoreStatus.languageTestScoreStatusList()) - .hasSize(2) - .containsExactlyElementsOf(expectedStatusList); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - } - - @Test - void 어학이력을_조회한다_제출이력이_없을_때() { - // Given - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // when - LanguageTestScoreStatusResponse languageTestScoreStatus = scoreService.getLanguageTestScoreStatus(siteUser.getEmail()); - - // Then - assertThat(languageTestScoreStatus.languageTestScoreStatusList()).isEmpty(); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - } -} diff --git a/src/test/java/com/example/solidconnection/unit/service/SiteUserServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/SiteUserServiceTest.java deleted file mode 100644 index 860f76e11..000000000 --- a/src/test/java/com/example/solidconnection/unit/service/SiteUserServiceTest.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.example.solidconnection.unit.service; - -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.s3.S3Service; -import com.example.solidconnection.s3.UploadedFileUrlResponse; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.dto.NicknameUpdateRequest; -import com.example.solidconnection.siteuser.dto.NicknameUpdateResponse; -import com.example.solidconnection.siteuser.dto.ProfileImageUpdateResponse; -import com.example.solidconnection.siteuser.repository.LikedUniversityRepository; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.siteuser.service.SiteUserService; -import com.example.solidconnection.type.Gender; -import com.example.solidconnection.type.ImgType; -import com.example.solidconnection.type.PreparationStatus; -import com.example.solidconnection.type.Role; -import org.junit.jupiter.api.BeforeEach; -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 org.springframework.mock.web.MockMultipartFile; -import org.springframework.web.multipart.MultipartFile; - -import java.time.LocalDateTime; - -import static com.example.solidconnection.custom.exception.ErrorCode.*; -import static com.example.solidconnection.siteuser.service.SiteUserService.NICKNAME_LAST_CHANGE_DATE_FORMAT; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@DisplayName("유저 서비스 테스트") -public class SiteUserServiceTest { - @InjectMocks - SiteUserService siteUserService; - @Mock - SiteUserRepository siteUserRepository; - @Mock - LikedUniversityRepository likedUniversityRepository; - @Mock - S3Service s3Service; - - private SiteUser siteUser; - private MultipartFile imageFile; - private UploadedFileUrlResponse uploadedFileUrlResponse; - private final String defaultProfileImageUrl = "http://k.kakaocdn.net/dn/o2c5A/btsASaNh2Lr/Xum5kRyuErD8LIuLQEWfC0/img_640x640.jpg"; - - @BeforeEach - void setUp() { - siteUser = createSiteUser(); - imageFile = createMockImageFile(); - uploadedFileUrlResponse = createUploadedFileUrlResponse(); - - } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profile/fajwoiejoiewjfoi", - "1999-01-01", - PreparationStatus.CONSIDERING, - Role.MENTEE, - Gender.MALE - ); - } - - private MultipartFile createMockImageFile() { - return new MockMultipartFile("file1", "test1.png", - "image/png", "test image content 1".getBytes()); - - } - - private UploadedFileUrlResponse createUploadedFileUrlResponse() { - return new UploadedFileUrlResponse("profile/fajwoiejoiewjfoi"); - } - - @Test - void 초기_프로필_이미지를_수정한다_kakao() { - siteUser.setProfileImageUrl(defaultProfileImageUrl); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(s3Service.uploadFile(imageFile, ImgType.PROFILE)).thenReturn(uploadedFileUrlResponse); - - // When - ProfileImageUpdateResponse profileImageUpdateResponse = - siteUserService.updateProfileImage(siteUser.getEmail(), imageFile); - // Then - assertEquals(profileImageUpdateResponse, ProfileImageUpdateResponse.from(siteUser)); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(s3Service, times(0)).deleteExProfile(siteUser.getEmail()); - verify(s3Service, times(1)).uploadFile(imageFile, ImgType.PROFILE); - verify(siteUserRepository, times(1)).save(any(SiteUser.class)); - } - - @Test - void 초기_프로필_이미지를_수정한다_null() { - siteUser.setProfileImageUrl(null); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(s3Service.uploadFile(imageFile, ImgType.PROFILE)).thenReturn(uploadedFileUrlResponse); - - // When - ProfileImageUpdateResponse profileImageUpdateResponse = - siteUserService.updateProfileImage(siteUser.getEmail(), imageFile); - // Then - assertEquals(profileImageUpdateResponse, ProfileImageUpdateResponse.from(siteUser)); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(s3Service, times(0)).deleteExProfile(siteUser.getEmail()); - verify(s3Service, times(1)).uploadFile(imageFile, ImgType.PROFILE); - verify(siteUserRepository, times(1)).save(any(SiteUser.class)); - } - - @Test - void 프로필_이미지를_수정한다() { - // Given - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(s3Service.uploadFile(imageFile, ImgType.PROFILE)).thenReturn(uploadedFileUrlResponse); - - // When - ProfileImageUpdateResponse profileImageUpdateResponse = - siteUserService.updateProfileImage(siteUser.getEmail(), imageFile); - // Then - assertEquals(profileImageUpdateResponse, ProfileImageUpdateResponse.from(siteUser)); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(s3Service, times(1)).deleteExProfile(siteUser.getEmail()); - verify(s3Service, times(1)).uploadFile(imageFile, ImgType.PROFILE); - verify(siteUserRepository, times(1)).save(any(SiteUser.class)); - } - - @Test - void 프로필_이미지를_수정할_때_이미지가_없다면_예외_응답을_반환한다() { - // Given - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - siteUserService.updateProfileImage(siteUser.getEmail(), null)); - assertThat(exception.getMessage()) - .isEqualTo(PROFILE_IMAGE_NEEDED.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(PROFILE_IMAGE_NEEDED.getCode()); - } - - @Test - void 닉네임을_수정한다() { - // Given - NicknameUpdateRequest nicknameUpdateRequest = new NicknameUpdateRequest("newNickname"); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // When - NicknameUpdateResponse nicknameUpdateResponse - = siteUserService.updateNickname(siteUser.getEmail(), nicknameUpdateRequest); - // Then - assertEquals( nicknameUpdateResponse, NicknameUpdateResponse.from(siteUser)); - verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); - verify(siteUserRepository, times(1)).save(any(SiteUser.class)); - } - - @Test - void 닉네임을_수정할_때_중복된_닉네임이라면_예외_응답을_반환한다() { - // Given - NicknameUpdateRequest nicknameUpdateRequest = new NicknameUpdateRequest("newNickname"); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - when(siteUserRepository.existsByNickname(nicknameUpdateRequest.nickname())).thenReturn(true); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - siteUserService.updateNickname(siteUser.getEmail(), nicknameUpdateRequest)); - assertThat(exception.getMessage()) - .isEqualTo(NICKNAME_ALREADY_EXISTED.getMessage()); - assertThat(exception.getCode()) - .isEqualTo(NICKNAME_ALREADY_EXISTED.getCode()); - } - - @Test - void 닉네임을_수정할_때_변경_가능_기한이_지나지_않았다면_예외_응답을_반환한다() { - // Given - NicknameUpdateRequest nicknameUpdateRequest = new NicknameUpdateRequest("newNickname"); - siteUser.setNicknameModifiedAt(LocalDateTime.now()); - when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); - - // When & Then - CustomException exception = assertThrows(CustomException.class, () -> - siteUserService.updateNickname(siteUser.getEmail(), nicknameUpdateRequest)); - - String formatLastModifiedAt - = String.format("(마지막 수정 시간 : %s)", NICKNAME_LAST_CHANGE_DATE_FORMAT.format(siteUser.getNicknameModifiedAt())); - CustomException expectedException = new CustomException(CAN_NOT_CHANGE_NICKNAME_YET, formatLastModifiedAt); - assertThat(exception.getMessage()).isEqualTo(expectedException.getMessage()); - assertThat(exception.getCode()).isEqualTo(expectedException.getCode()); - } -}