From d2f32a8ceaa0dca19025faa9d2b36d3c32f5af7e Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:06:14 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20BoardFixture=EC=97=90=20Board=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20=EC=A7=80=EC=97=B0=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=EB=A5=BC=20=EB=B0=A9=EC=A7=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20Board=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C=20fetch=20join=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/board/fixture/BoardFixture.java | 39 +++++++++++++++++++ .../board/fixture/BoardFixtureBuilder.java | 31 +++++++++++++++ .../repository/BoardRepositoryForTest.java | 14 +++++++ 3 files changed, 84 insertions(+) create mode 100644 src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java create mode 100644 src/test/java/com/example/solidconnection/community/board/fixture/BoardFixtureBuilder.java create mode 100644 src/test/java/com/example/solidconnection/community/board/repository/BoardRepositoryForTest.java diff --git a/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java b/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java new file mode 100644 index 000000000..98eb4c202 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java @@ -0,0 +1,39 @@ +package com.example.solidconnection.community.board.fixture; + +import com.example.solidconnection.community.board.domain.Board; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +import static com.example.solidconnection.community.board.domain.BoardCode.AMERICAS; +import static com.example.solidconnection.community.board.domain.BoardCode.FREE; + +@TestComponent +@RequiredArgsConstructor +public class BoardFixture { + + private final BoardFixtureBuilder boardFixtureBuilder; + + public Board 미주권() { + return boardFixtureBuilder.code(AMERICAS.name()) + .koreanName("미주권") + .findOrCreate(); + } + + public Board 아시아권() { + return boardFixtureBuilder.code("ASIA") + .koreanName("아시아권") + .findOrCreate(); + } + + public Board 유럽권() { + return boardFixtureBuilder.code("EUROPE") + .koreanName("유럽권") + .findOrCreate(); + } + + public Board 자유게시판() { + return boardFixtureBuilder.code(FREE.name()) + .koreanName("자유게시판") + .findOrCreate(); + } +} diff --git a/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixtureBuilder.java b/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixtureBuilder.java new file mode 100644 index 000000000..1b7eff6ba --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixtureBuilder.java @@ -0,0 +1,31 @@ +package com.example.solidconnection.community.board.fixture; + +import com.example.solidconnection.community.board.domain.Board; +import com.example.solidconnection.community.board.repository.BoardRepositoryForTest; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class BoardFixtureBuilder { + + private final BoardRepositoryForTest boardRepositoryForTest; + + private String code; + private String koreanName; + + public BoardFixtureBuilder code(String code) { + this.code = code; + return this; + } + + public BoardFixtureBuilder koreanName(String koreanName) { + this.koreanName = koreanName; + return this; + } + + public Board findOrCreate() { + return boardRepositoryForTest.findByCodeWithPosts(code) + .orElseGet(() -> boardRepositoryForTest.save(new Board(code, koreanName))); + } +} diff --git a/src/test/java/com/example/solidconnection/community/board/repository/BoardRepositoryForTest.java b/src/test/java/com/example/solidconnection/community/board/repository/BoardRepositoryForTest.java new file mode 100644 index 000000000..0d94e8d41 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/board/repository/BoardRepositoryForTest.java @@ -0,0 +1,14 @@ +package com.example.solidconnection.community.board.repository; + +import com.example.solidconnection.community.board.domain.Board; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +public interface BoardRepositoryForTest extends JpaRepository { + + @Query("SELECT b FROM Board b LEFT JOIN FETCH b.postList WHERE b.code = :code") + Optional findByCodeWithPosts(@Param("code") String code); +} From bfee8967cf75c0714758b216fde024dfda7c88f9 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:06:46 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20PostFixture=EC=97=90=20Post=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/post/fixture/PostFixture.java | 35 +++++++++ .../post/fixture/PostFixtureBuilder.java | 77 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 src/test/java/com/example/solidconnection/community/post/fixture/PostFixture.java create mode 100644 src/test/java/com/example/solidconnection/community/post/fixture/PostFixtureBuilder.java diff --git a/src/test/java/com/example/solidconnection/community/post/fixture/PostFixture.java b/src/test/java/com/example/solidconnection/community/post/fixture/PostFixture.java new file mode 100644 index 000000000..92fa64a37 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/post/fixture/PostFixture.java @@ -0,0 +1,35 @@ +package com.example.solidconnection.community.post.fixture; + +import com.example.solidconnection.community.board.domain.Board; +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostCategory; +import com.example.solidconnection.siteuser.domain.SiteUser; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class PostFixture { + + private final PostFixtureBuilder postFixtureBuilder; + + public Post 게시글( + String title, + String content, + Boolean isQuestion, + PostCategory postCategory, + Board board, + SiteUser siteUser + ) { + return postFixtureBuilder + .title(title) + .content(content) + .isQuestion(isQuestion) + .likeCount(0L) + .viewCount(0L) + .postCategory(postCategory) + .board(board) + .siteUser(siteUser) + .create(); + } +} diff --git a/src/test/java/com/example/solidconnection/community/post/fixture/PostFixtureBuilder.java b/src/test/java/com/example/solidconnection/community/post/fixture/PostFixtureBuilder.java new file mode 100644 index 000000000..ac3440b42 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/post/fixture/PostFixtureBuilder.java @@ -0,0 +1,77 @@ +package com.example.solidconnection.community.post.fixture; + +import com.example.solidconnection.community.board.domain.Board; +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostCategory; +import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.siteuser.domain.SiteUser; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class PostFixtureBuilder { + + private final PostRepository postRepository; + + private String title; + private String content; + private Boolean isQuestion; + private Long likeCount; + private Long viewCount; + private PostCategory postCategory; + private Board board; + private SiteUser siteUser; + + public PostFixtureBuilder title(String title) { + this.title = title; + return this; + } + + public PostFixtureBuilder content(String content) { + this.content = content; + return this; + } + + public PostFixtureBuilder isQuestion(Boolean isQuestion) { + this.isQuestion = isQuestion; + return this; + } + + public PostFixtureBuilder likeCount(Long likeCount) { + this.likeCount = likeCount; + return this; + } + + public PostFixtureBuilder viewCount(Long viewCount) { + this.viewCount = viewCount; + return this; + } + + public PostFixtureBuilder postCategory(PostCategory postCategory) { + this.postCategory = postCategory; + return this; + } + + public PostFixtureBuilder board(Board board) { + this.board = board; + return this; + } + + public PostFixtureBuilder siteUser(SiteUser siteUser) { + this.siteUser = siteUser; + return this; + } + + public Post create() { + Post post = new Post( + title, + content, + isQuestion, + likeCount, + viewCount, + postCategory); + post.setBoardAndSiteUser(board, siteUser); + return postRepository.save(post); + } +} From 6ce2ee96976466dbba667a47e7c95bfd6c83726d Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:07:12 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20PostImageFixture=EC=97=90=20PostIma?= =?UTF-8?q?ge=20=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/fixture/PostImageFixture.java | 20 +++++++++++ .../post/fixture/PostImageFixtureBuilder.java | 33 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixture.java create mode 100644 src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixtureBuilder.java diff --git a/src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixture.java b/src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixture.java new file mode 100644 index 000000000..565f9fde0 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixture.java @@ -0,0 +1,20 @@ +package com.example.solidconnection.community.post.fixture; + +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostImage; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class PostImageFixture { + + private final PostImageFixtureBuilder postImageFixtureBuilder; + + public PostImage 게시글_이미지(String url, Post post) { + return postImageFixtureBuilder + .url(url) + .post(post) + .create(); + } +} diff --git a/src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixtureBuilder.java b/src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixtureBuilder.java new file mode 100644 index 000000000..e12e0f0a0 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/post/fixture/PostImageFixtureBuilder.java @@ -0,0 +1,33 @@ +package com.example.solidconnection.community.post.fixture; + +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostImage; +import com.example.solidconnection.community.post.repository.PostImageRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class PostImageFixtureBuilder { + + private final PostImageRepository postImageRepository; + + private String url; + private Post post; + + public PostImageFixtureBuilder url(String url) { + this.url = url; + return this; + } + + public PostImageFixtureBuilder post(Post post) { + this.post = post; + return this; + } + + public PostImage create() { + PostImage postImage = new PostImage(url); + postImage.setPost(post); + return postImageRepository.save(postImage); + } +} From b14d582addb70bc9dd36579d1f8a01c8c3dd4356 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:07:45 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20CommentFixture=EC=97=90=20Comment?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/fixture/CommentFixture.java | 35 ++++++++++++ .../fixture/CommentFixtureBuilder.java | 53 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixture.java create mode 100644 src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixtureBuilder.java diff --git a/src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixture.java b/src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixture.java new file mode 100644 index 000000000..4d0f3b438 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixture.java @@ -0,0 +1,35 @@ +package com.example.solidconnection.community.comment.fixture; + +import com.example.solidconnection.community.comment.domain.Comment; +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.siteuser.domain.SiteUser; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class CommentFixture { + + private final CommentFixtureBuilder commentFixtureBuilder; + + public Comment 부모_댓글(String content, Post post, SiteUser siteUser) { + return commentFixtureBuilder + .content(content) + .post(post) + .siteUser(siteUser) + .createParent(); + } + + public Comment 자식_댓글( + String content, + Post post, + SiteUser siteUser, + Comment parentComment) { + return commentFixtureBuilder + .content(content) + .post(post) + .siteUser(siteUser) + .parentComment(parentComment) + .createChild(); + } +} diff --git a/src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixtureBuilder.java b/src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixtureBuilder.java new file mode 100644 index 000000000..f5dc10ac2 --- /dev/null +++ b/src/test/java/com/example/solidconnection/community/comment/fixture/CommentFixtureBuilder.java @@ -0,0 +1,53 @@ +package com.example.solidconnection.community.comment.fixture; + +import com.example.solidconnection.community.comment.domain.Comment; +import com.example.solidconnection.community.comment.repository.CommentRepository; +import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.siteuser.domain.SiteUser; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class CommentFixtureBuilder { + + private final CommentRepository commentRepository; + + private String content; + private Post post; + private SiteUser siteUser; + private Comment parentComment; + + public CommentFixtureBuilder content(String content) { + this.content = content; + return this; + } + + public CommentFixtureBuilder post(Post post) { + this.post = post; + return this; + } + + public CommentFixtureBuilder siteUser(SiteUser siteUser) { + this.siteUser = siteUser; + return this; + } + + public CommentFixtureBuilder parentComment(Comment parentComment) { + this.parentComment = parentComment; + return this; + } + + public Comment createParent() { + Comment comment = new Comment(content); + comment.setPostAndSiteUser(post, siteUser); + return commentRepository.save(comment); + } + + public Comment createChild() { + Comment comment = new Comment(content); + comment.setPostAndSiteUser(post, siteUser); + comment.setParentCommentAndPostAndSiteUser(parentComment, post, siteUser); + return commentRepository.save(comment); + } +} From d01e41a8465ce1d24aa6c6238050b469a1ac0076 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:09:17 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20Community=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20fixture=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/service/CommentServiceTest.java | 221 +++++++----------- .../post/service/PostCommandServiceTest.java | 123 ++++------ .../post/service/PostLikeServiceTest.java | 68 +++--- .../post/service/PostQueryServiceTest.java | 150 ++++++------ 4 files changed, 226 insertions(+), 336 deletions(-) diff --git a/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java b/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java index 17309e100..8e5e5c995 100644 --- a/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java @@ -1,7 +1,7 @@ package com.example.solidconnection.community.comment.service; import com.example.solidconnection.common.exception.CustomException; -import com.example.solidconnection.community.board.domain.Board; +import com.example.solidconnection.community.board.fixture.BoardFixture; import com.example.solidconnection.community.comment.domain.Comment; import com.example.solidconnection.community.comment.dto.CommentCreateRequest; import com.example.solidconnection.community.comment.dto.CommentCreateResponse; @@ -9,13 +9,16 @@ import com.example.solidconnection.community.comment.dto.CommentUpdateRequest; import com.example.solidconnection.community.comment.dto.CommentUpdateResponse; import com.example.solidconnection.community.comment.dto.PostFindCommentResponse; +import com.example.solidconnection.community.comment.fixture.CommentFixture; import com.example.solidconnection.community.comment.repository.CommentRepository; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.domain.PostCategory; -import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.community.post.fixture.PostFixture; import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.siteuser.fixture.SiteUserFixture; +import com.example.solidconnection.support.TestContainerSpringBootTest; import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -31,8 +34,9 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; +@TestContainerSpringBootTest @DisplayName("댓글 서비스 테스트") -class CommentServiceTest extends BaseIntegrationTest { +class CommentServiceTest { @Autowired private CommentService commentService; @@ -41,7 +45,34 @@ class CommentServiceTest extends BaseIntegrationTest { private CommentRepository commentRepository; @Autowired - private PostRepository postRepository; + private SiteUserFixture siteUserFixture; + + @Autowired + private BoardFixture boardFixture; + + @Autowired + private PostFixture postFixture; + + @Autowired + private CommentFixture commentFixture; + + private SiteUser user1; + private SiteUser user2; + private Post post; + + @BeforeEach + void setUp() { + user1 = siteUserFixture.사용자(1, "test1"); + user2 = siteUserFixture.사용자(2, "test2"); + post = postFixture.게시글( + "제목1", + "내용1", + false, + PostCategory.자유, + boardFixture.자유게시판(), + user1 + ); + } @Nested class 댓글_조회_테스트 { @@ -49,16 +80,12 @@ class 댓글_조회_테스트 { @Test void 게시글의_모든_댓글을_조회한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); - Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); + Comment parentComment = commentFixture.부모_댓글("부모 댓글", post, user1); + Comment childComment = commentFixture.자식_댓글("자식 댓글 1", post, user2, parentComment); List comments = List.of(parentComment, childComment); // when - List responses = commentService.findCommentsByPostId( - 테스트유저_1, - testPost.getId() - ); + List responses = commentService.findCommentsByPostId(user1, post.getId()); // then assertAll( @@ -69,17 +96,7 @@ class 댓글_조회_테스트 { .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(response.isOwner()).isTrue() )), () -> assertThat(responses) .filteredOn(response -> response.id().equals(childComment.getId())) @@ -87,17 +104,7 @@ class 댓글_조회_테스트 { .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()) + () -> assertThat(response.isOwner()).isFalse() )) ); } @@ -109,14 +116,10 @@ class 댓글_생성_테스트 { @Test void 댓글을_성공적으로_생성한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 댓글", null); + CommentCreateRequest request = new CommentCreateRequest(post.getId(),"댓글", null); // when - CommentCreateResponse response = commentService.createComment( - 테스트유저_1, - request - ); + CommentCreateResponse response = commentService.createComment(user1, request); // then Comment savedComment = commentRepository.findById(response.id()).orElseThrow(); @@ -124,23 +127,19 @@ class 댓글_생성_테스트 { () -> 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()) + () -> assertThat(savedComment.getPost().getId()).isEqualTo(post.getId()), + () -> assertThat(savedComment.getSiteUser().getId()).isEqualTo(user1.getId()) ); } @Test void 대댓글을_성공적으로_생성한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); - CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 대댓글", parentComment.getId()); + Comment parentComment = commentFixture.부모_댓글("부모 댓글", post, user1); + CommentCreateRequest request = new CommentCreateRequest(post.getId(), "자식 댓글", parentComment.getId()); // when - CommentCreateResponse response = commentService.createComment( - 테스트유저_2, - request - ); + CommentCreateResponse response = commentService.createComment(user2, request); // then Comment savedComment = commentRepository.findById(response.id()).orElseThrow(); @@ -148,23 +147,22 @@ class 댓글_생성_테스트 { () -> 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()) + () -> assertThat(savedComment.getPost().getId()).isEqualTo(post.getId()), + () -> assertThat(savedComment.getSiteUser().getId()).isEqualTo(user2.getId()) ); } @Test void 대대댓글_생성_시도하면_예외_응답을_반환한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); - Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); - CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 대대댓글", childComment.getId()); + Comment parentComment = commentFixture.부모_댓글("부모 댓글", post, user1); + Comment childComment = commentFixture.자식_댓글("자식 댓글", post, user2, parentComment); + CommentCreateRequest request = new CommentCreateRequest(post.getId(), "대대댓글", childComment.getId()); // when & then assertThatThrownBy(() -> commentService.createComment( - 테스트유저_1, + user1, request )) .isInstanceOf(CustomException.class) @@ -174,14 +172,13 @@ class 댓글_생성_테스트 { @Test void 존재하지_않는_부모댓글로_대댓글_작성시_예외를_반환한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); long invalidCommentId = 9999L; - CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 대댓글", invalidCommentId); + CommentCreateRequest request = new CommentCreateRequest(post.getId(), "자식 댓글", invalidCommentId); // when & then assertThatThrownBy(() -> commentService.createComment( - 테스트유저_1, + user1, request )) .isInstanceOf(CustomException.class) @@ -195,16 +192,11 @@ class 댓글_수정_테스트 { @Test void 댓글을_성공적으로_수정한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment comment = createComment(testPost, 테스트유저_1, "원본 댓글"); + Comment comment = commentFixture.부모_댓글("원본 댓글", post, user1); CommentUpdateRequest request = new CommentUpdateRequest("수정된 댓글"); // when - CommentUpdateResponse response = commentService.updateComment( - 테스트유저_1, - comment.getId(), - request - ); + CommentUpdateResponse response = commentService.updateComment(user1, comment.getId(), request); // then Comment updatedComment = commentRepository.findById(response.id()).orElseThrow(); @@ -212,22 +204,21 @@ class 댓글_수정_테스트 { () -> 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()) + () -> assertThat(updatedComment.getPost().getId()).isEqualTo(post.getId()), + () -> assertThat(updatedComment.getSiteUser().getId()).isEqualTo(user1.getId()) ); } @Test void 다른_사용자의_댓글을_수정하면_예외_응답을_반환한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment comment = createComment(testPost, 테스트유저_1, "원본 댓글"); + Comment comment = commentFixture.부모_댓글("원본 댓글", post, user1); CommentUpdateRequest request = new CommentUpdateRequest("수정된 댓글"); // when & then assertThatThrownBy(() -> commentService.updateComment( - 테스트유저_2, + user2, comment.getId(), request )) @@ -238,14 +229,13 @@ class 댓글_수정_테스트 { @Test void 삭제된_댓글을_수정하면_예외_응답을_반환한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment comment = createComment(testPost, 테스트유저_1, null); + Comment comment = commentFixture.부모_댓글(null, post, user1); CommentUpdateRequest request = new CommentUpdateRequest("수정된 댓글"); // when & then assertThatThrownBy(() -> commentService.updateComment( - 테스트유저_1, + user1, comment.getId(), request )) @@ -261,22 +251,18 @@ class 댓글_삭제_테스트 { @Transactional void 대댓글이_없는_댓글을_삭제한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment comment = createComment(testPost, 테스트유저_1, "테스트 댓글"); - List comments = testPost.getCommentList(); + Comment comment = commentFixture.부모_댓글("부모 댓글", post, user1); + List comments = post.getCommentList(); int expectedCommentsCount = comments.size() - 1; // when - CommentDeleteResponse response = commentService.deleteCommentById( - 테스트유저_1, - comment.getId() - ); + CommentDeleteResponse response = commentService.deleteCommentById(user1, comment.getId()); // then assertAll( () -> assertThat(response.id()).isEqualTo(comment.getId()), () -> assertThat(commentRepository.findById(comment.getId())).isEmpty(), - () -> assertThat(testPost.getCommentList()).hasSize(expectedCommentsCount) + () -> assertThat(post.getCommentList()).hasSize(expectedCommentsCount) ); } @@ -284,17 +270,13 @@ class 댓글_삭제_테스트 { @Transactional void 대댓글이_있는_댓글을_삭제하면_내용만_삭제된다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); - Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); - List comments = testPost.getCommentList(); + Comment parentComment = commentFixture.부모_댓글("부모 댓글", post, user1); + Comment childComment = commentFixture.자식_댓글("자식 댓글", post, user2, parentComment); + List comments = post.getCommentList(); List childComments = parentComment.getCommentList(); // when - CommentDeleteResponse response = commentService.deleteCommentById( - 테스트유저_1, - parentComment.getId() - ); + CommentDeleteResponse response = commentService.deleteCommentById(user1, parentComment.getId()); // then Comment deletedComment = commentRepository.findById(response.id()).orElseThrow(); @@ -303,7 +285,7 @@ class 댓글_삭제_테스트 { () -> assertThat(deletedComment.getCommentList()) .extracting(Comment::getId) .containsExactlyInAnyOrder(childComment.getId()), - () -> assertThat(testPost.getCommentList()).hasSize(comments.size()), + () -> assertThat(post.getCommentList()).hasSize(comments.size()), () -> assertThat(deletedComment.getCommentList()).hasSize(childComments.size()) ); } @@ -312,18 +294,14 @@ class 댓글_삭제_테스트 { @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"); + Comment parentComment = commentFixture.부모_댓글("부모 댓글", post, user1); + Comment childComment1 = commentFixture.자식_댓글("자식 댓글1", post, user2, parentComment); + Comment childComment2 = commentFixture.자식_댓글("자식 댓글2", post, user2, parentComment); List childComments = parentComment.getCommentList(); int expectedChildCommentsCount = childComments.size() - 1; // when - CommentDeleteResponse response = commentService.deleteCommentById( - 테스트유저_2, - childComment1.getId() - ); + CommentDeleteResponse response = commentService.deleteCommentById(user2, childComment1.getId()); // then Comment remainingParentComment = commentRepository.findById(parentComment.getId()).orElseThrow(); @@ -342,67 +320,36 @@ class 댓글_삭제_테스트 { @Transactional void 대댓글을_삭제하고_부모댓글이_삭제된_상태면_부모댓글도_삭제된다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); - Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); - List comments = testPost.getCommentList(); + Comment parentComment = commentFixture.부모_댓글("부모 댓글", post, user1); + Comment childComment = commentFixture.자식_댓글("자식 댓글", post, user2, parentComment); + List comments = post.getCommentList(); int expectedCommentsCount = comments.size() - 2; parentComment.deprecateComment(); // when - CommentDeleteResponse response = commentService.deleteCommentById( - 테스트유저_2, - childComment.getId() - ); + CommentDeleteResponse response = commentService.deleteCommentById(user2, childComment.getId()); // then assertAll( () -> assertThat(commentRepository.findById(response.id())).isEmpty(), () -> assertThat(commentRepository.findById(parentComment.getId())).isEmpty(), - () -> assertThat(testPost.getCommentList()).hasSize(expectedCommentsCount) + () -> assertThat(post.getCommentList()).hasSize(expectedCommentsCount) ); } @Test void 다른_사용자의_댓글을_삭제하면_예외_응답을_반환한다() { // given - Post testPost = createPost(자유게시판, 테스트유저_1); - Comment comment = createComment(testPost, 테스트유저_1, "테스트 댓글"); + Comment comment = commentFixture.부모_댓글("부모 댓글", post, user1); // when & then assertThatThrownBy(() -> commentService.deleteCommentById( - 테스트유저_2, + user2, 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/community/post/service/PostCommandServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java index 2656b2858..2cf253cf7 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java @@ -1,7 +1,7 @@ package com.example.solidconnection.community.post.service; import com.example.solidconnection.common.exception.CustomException; -import com.example.solidconnection.community.board.domain.Board; +import com.example.solidconnection.community.board.fixture.BoardFixture; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.domain.PostCategory; import com.example.solidconnection.community.post.domain.PostImage; @@ -10,14 +10,15 @@ import com.example.solidconnection.community.post.dto.PostDeleteResponse; import com.example.solidconnection.community.post.dto.PostUpdateRequest; import com.example.solidconnection.community.post.dto.PostUpdateResponse; -import com.example.solidconnection.community.post.repository.PostImageRepository; +import com.example.solidconnection.community.post.fixture.PostFixture; +import com.example.solidconnection.community.post.fixture.PostImageFixture; import com.example.solidconnection.community.post.repository.PostRepository; import com.example.solidconnection.s3.domain.ImgType; import com.example.solidconnection.s3.dto.UploadedFileUrlResponse; import com.example.solidconnection.s3.service.S3Service; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; -import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.support.TestContainerSpringBootTest; import com.example.solidconnection.util.RedisUtils; import jakarta.transaction.Transactional; import org.junit.jupiter.api.BeforeEach; @@ -43,8 +44,9 @@ import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; +@TestContainerSpringBootTest @DisplayName("게시글 생성/수정/삭제 서비스 테스트") -class PostCommandServiceTest extends BaseIntegrationTest { +class PostCommandServiceTest { @Autowired private PostCommandService postCommandService; @@ -62,16 +64,40 @@ class PostCommandServiceTest extends BaseIntegrationTest { private PostRepository postRepository; @Autowired - private PostImageRepository postImageRepository; + private SiteUserFixture siteUserFixture; @Autowired - private SiteUserFixture siteUserFixture; + private BoardFixture boardFixture; + + @Autowired + private PostFixture postFixture; + + @Autowired + private PostImageFixture postImageFixture; private SiteUser user1; + private Post post; + private Post questionPost; @BeforeEach void setUp() { user1 = siteUserFixture.사용자(1, "test1"); + post = postFixture.게시글( + "제목", + "내용", + false, + PostCategory.자유, + boardFixture.자유게시판(), + user1 + ); + questionPost = postFixture.게시글( + "제목", + "내용", + true, + PostCategory.질문, + boardFixture.자유게시판(), + user1 + ); } @Nested @@ -88,21 +114,12 @@ class 게시글_생성_테스트 { .willReturn(List.of(new UploadedFileUrlResponse(expectedImageUrl))); // when - PostCreateResponse response = postCommandService.createPost( - user1, - request, - imageFiles - ); + PostCreateResponse response = postCommandService.createPost(user1, request, imageFiles); // then Post savedPost = postRepository.findById(response.id()).orElseThrow(); assertAll( () -> assertThat(response.id()).isEqualTo(savedPost.getId()), - () -> assertThat(savedPost.getTitle()).isEqualTo(request.title()), - () -> assertThat(savedPost.getContent()).isEqualTo(request.content()), - () -> assertThat(savedPost.getIsQuestion()).isEqualTo(request.isQuestion()), - () -> assertThat(savedPost.getCategory().name()).isEqualTo(request.postCategory()), - () -> assertThat(savedPost.getBoard().getCode()).isEqualTo(자유게시판.getCode()), () -> assertThat(savedPost.getPostImageList()).hasSize(imageFiles.size()), () -> assertThat(savedPost.getPostImageList()) .extracting(PostImage::getUrl) @@ -158,8 +175,8 @@ class 게시글_수정_테스트 { void 게시글을_성공적으로_수정한다() { // given String originImageUrl = "origin-image-url"; + postImageFixture.게시글_이미지(originImageUrl, post); String expectedImageUrl = "update-image-url"; - Post testPost = createPost(자유게시판, user1, originImageUrl); PostUpdateRequest request = createPostUpdateRequest(); List imageFiles = List.of(createImageFile()); @@ -169,7 +186,7 @@ class 게시글_수정_테스트 { // when PostUpdateResponse response = postCommandService.updatePost( user1, - testPost.getId(), + post.getId(), request, imageFiles ); @@ -177,9 +194,7 @@ class 게시글_수정_테스트 { // then Post updatedPost = postRepository.findById(response.id()).orElseThrow(); assertAll( - () -> assertThat(updatedPost.getTitle()).isEqualTo(request.title()), - () -> assertThat(updatedPost.getContent()).isEqualTo(request.content()), - () -> assertThat(updatedPost.getCategory().name()).isEqualTo(request.postCategory()), + () -> assertThat(response.id()).isEqualTo(updatedPost.getId()), () -> assertThat(updatedPost.getPostImageList()).hasSize(imageFiles.size()), () -> assertThat(updatedPost.getPostImageList()) .extracting(PostImage::getUrl) @@ -192,7 +207,6 @@ class 게시글_수정_테스트 { void 다른_사용자의_게시글을_수정하면_예외_응답을_반환한다() { // given SiteUser user2 = siteUserFixture.사용자(2, "test2"); - Post testPost = createPost(자유게시판, user1, "origin-image-url"); PostUpdateRequest request = createPostUpdateRequest(); List imageFiles = List.of(); @@ -200,7 +214,7 @@ class 게시글_수정_테스트 { assertThatThrownBy(() -> postCommandService.updatePost( user2, - testPost.getId(), + post.getId(), request, imageFiles )) @@ -211,7 +225,6 @@ class 게시글_수정_테스트 { @Test void 질문_게시글을_수정하면_예외_응답을_반환한다() { // given - Post testPost = createQuestionPost(자유게시판, user1, "origin-image-url"); PostUpdateRequest request = createPostUpdateRequest(); List imageFiles = List.of(); @@ -219,7 +232,7 @@ class 게시글_수정_테스트 { assertThatThrownBy(() -> postCommandService.updatePost( user1, - testPost.getId(), + questionPost.getId(), request, imageFiles )) @@ -230,7 +243,6 @@ class 게시글_수정_테스트 { @Test void 이미지를_5개_초과하여_수정하면_예외_응답을_반환한다() { // given - Post testPost = createPost(자유게시판, user1, "origin-image-url"); PostUpdateRequest request = createPostUpdateRequest(); List imageFiles = createSixImageFiles(); @@ -238,7 +250,7 @@ class 게시글_수정_테스트 { assertThatThrownBy(() -> postCommandService.updatePost( user1, - testPost.getId(), + post.getId(), request, imageFiles )) @@ -254,20 +266,17 @@ class 게시글_삭제_테스트 { void 게시글을_성공적으로_삭제한다() { // given String originImageUrl = "origin-image-url"; - Post testPost = createPost(자유게시판, user1, originImageUrl); - String viewCountKey = redisUtils.getPostViewCountRedisKey(testPost.getId()); + postImageFixture.게시글_이미지(originImageUrl, post); + String viewCountKey = redisUtils.getPostViewCountRedisKey(post.getId()); redisService.increaseViewCount(viewCountKey); // when - PostDeleteResponse response = postCommandService.deletePostById( - user1, - testPost.getId() - ); + PostDeleteResponse response = postCommandService.deletePostById(user1, post.getId()); // then assertAll( - () -> assertThat(response.id()).isEqualTo(testPost.getId()), - () -> assertThat(postRepository.findById(testPost.getId())).isEmpty(), + () -> assertThat(response.id()).isEqualTo(post.getId()), + () -> assertThat(postRepository.findById(post.getId())).isEmpty(), () -> assertThat(redisService.isKeyExists(viewCountKey)).isFalse() ); then(s3Service).should().deletePostImage(originImageUrl); @@ -277,13 +286,12 @@ class 게시글_삭제_테스트 { void 다른_사용자의_게시글을_삭제하면_예외_응답을_반환한다() { // given SiteUser user2 = siteUserFixture.사용자(2, "test2"); - Post testPost = createPost(자유게시판, user1, "origin-image-url"); // when & then assertThatThrownBy(() -> postCommandService.deletePostById( user2, - testPost.getId() + post.getId() )) .isInstanceOf(CustomException.class) .hasMessage(INVALID_POST_ACCESS.getMessage()); @@ -291,14 +299,11 @@ class 게시글_삭제_테스트 { @Test void 질문_게시글을_삭제하면_예외_응답을_반환한다() { - // given - Post testPost = createQuestionPost(자유게시판, user1, "origin-image-url"); - // when & then assertThatThrownBy(() -> postCommandService.deletePostById( user1, - testPost.getId() + questionPost.getId() )) .isInstanceOf(CustomException.class) .hasMessage(CAN_NOT_DELETE_OR_UPDATE_QUESTION.getMessage()); @@ -307,7 +312,7 @@ class 게시글_삭제_테스트 { private PostCreateRequest createPostCreateRequest(String category) { return new PostCreateRequest( - 자유게시판.getCode(), + boardFixture.자유게시판().getCode(), category, "테스트 제목", "테스트 내용", @@ -335,40 +340,6 @@ private List createSixImageFiles() { ); } - private Post createPost(Board board, SiteUser siteUser, String originImageUrl) { - Post post = new Post( - "원본 제목", - "원본 내용", - false, - 0L, - 0L, - PostCategory.자유 - ); - post.setBoardAndSiteUser(board, siteUser); - Post savedPost = postRepository.save(post); - PostImage postImage = new PostImage(originImageUrl); - postImage.setPost(savedPost); - postImageRepository.save(postImage); - return savedPost; - } - - private Post createQuestionPost(Board board, SiteUser siteUser, String originImageUrl) { - Post post = new Post( - "질문 제목", - "질문 내용", - true, - 0L, - 0L, - PostCategory.질문 - ); - post.setBoardAndSiteUser(board, siteUser); - Post savedPost = postRepository.save(post); - PostImage postImage = new PostImage(originImageUrl); - postImage.setPost(savedPost); - postImageRepository.save(postImage); - return savedPost; - } - private PostUpdateRequest createPostUpdateRequest() { return new PostUpdateRequest( PostCategory.자유.name(), diff --git a/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java index 4205019b7..9e36edeb9 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java @@ -1,16 +1,17 @@ package com.example.solidconnection.community.post.service; import com.example.solidconnection.common.exception.CustomException; -import com.example.solidconnection.community.board.domain.Board; +import com.example.solidconnection.community.board.fixture.BoardFixture; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.domain.PostCategory; import com.example.solidconnection.community.post.dto.PostDislikeResponse; import com.example.solidconnection.community.post.dto.PostLikeResponse; +import com.example.solidconnection.community.post.fixture.PostFixture; import com.example.solidconnection.community.post.repository.PostLikeRepository; import com.example.solidconnection.community.post.repository.PostRepository; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; -import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.support.TestContainerSpringBootTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -23,8 +24,9 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; +@TestContainerSpringBootTest @DisplayName("게시글 좋아요 서비스 테스트") -class PostLikeServiceTest extends BaseIntegrationTest { +class PostLikeServiceTest { @Autowired private PostLikeService postLikeService; @@ -38,11 +40,26 @@ class PostLikeServiceTest extends BaseIntegrationTest { @Autowired private SiteUserFixture siteUserFixture; + @Autowired + private BoardFixture boardFixture; + + @Autowired + private PostFixture postFixture; + private SiteUser user; + private Post post; @BeforeEach void setUp() { - user = siteUserFixture.사용자(1, "test1"); + user = siteUserFixture.사용자(); + post = postFixture.게시글( + "제목1", + "내용1", + false, + PostCategory.자유, + boardFixture.자유게시판(), + user + ); } @Nested @@ -51,17 +68,13 @@ class 게시글_좋아요_테스트 { @Test void 게시글을_성공적으로_좋아요한다() { // given - Post testPost = createPost(자유게시판, user); - long beforeLikeCount = testPost.getLikeCount(); + long beforeLikeCount = post.getLikeCount(); // when - PostLikeResponse response = postLikeService.likePost( - user, - testPost.getId() - ); + PostLikeResponse response = postLikeService.likePost(user, post.getId()); // then - Post likedPost = postRepository.findById(testPost.getId()).orElseThrow(); + Post likedPost = postRepository.findById(post.getId()).orElseThrow(); assertAll( () -> assertThat(response.likeCount()).isEqualTo(beforeLikeCount + 1), () -> assertThat(response.isLiked()).isTrue(), @@ -73,14 +86,13 @@ class 게시글_좋아요_테스트 { @Test void 이미_좋아요한_게시글을_다시_좋아요하면_예외_응답을_반환한다() { // given - Post testPost = createPost(자유게시판, user); - postLikeService.likePost(user, testPost.getId()); + postLikeService.likePost(user, post.getId()); // when & then assertThatThrownBy(() -> postLikeService.likePost( user, - testPost.getId() + post.getId() )) .isInstanceOf(CustomException.class) .hasMessage(DUPLICATE_POST_LIKE.getMessage()); @@ -93,18 +105,14 @@ class 게시글_좋아요_취소_테스트 { @Test void 게시글_좋아요를_성공적으로_취소한다() { // given - Post testPost = createPost(자유게시판, user); - PostLikeResponse beforeResponse = postLikeService.likePost(user, testPost.getId()); + PostLikeResponse beforeResponse = postLikeService.likePost(user, post.getId()); long beforeLikeCount = beforeResponse.likeCount(); // when - PostDislikeResponse response = postLikeService.dislikePost( - user, - testPost.getId() - ); + PostDislikeResponse response = postLikeService.dislikePost(user, post.getId()); // then - Post unlikedPost = postRepository.findById(testPost.getId()).orElseThrow(); + Post unlikedPost = postRepository.findById(post.getId()).orElseThrow(); assertAll( () -> assertThat(response.likeCount()).isEqualTo(beforeLikeCount - 1), () -> assertThat(response.isLiked()).isFalse(), @@ -115,30 +123,14 @@ class 게시글_좋아요_취소_테스트 { @Test void 좋아요하지_않은_게시글을_좋아요_취소하면_예외_응답을_반환한다() { - // given - Post testPost = createPost(자유게시판, user); - // when & then assertThatThrownBy(() -> postLikeService.dislikePost( user, - testPost.getId() + post.getId() )) .isInstanceOf(CustomException.class) .hasMessage(INVALID_POST_LIKE.getMessage()); } } - - private Post createPost(Board board, SiteUser siteUser) { - Post post = new Post( - "테스트 제목", - "테스트 내용", - false, - 0L, - 0L, - PostCategory.자유 - ); - post.setBoardAndSiteUser(board, siteUser); - return postRepository.save(post); - } } diff --git a/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java index 13a942ef7..dc1e80746 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java @@ -1,21 +1,18 @@ package com.example.solidconnection.community.post.service; -import com.example.solidconnection.community.board.domain.Board; import com.example.solidconnection.community.board.domain.BoardCode; +import com.example.solidconnection.community.board.fixture.BoardFixture; import com.example.solidconnection.community.comment.domain.Comment; -import com.example.solidconnection.community.comment.dto.PostFindCommentResponse; -import com.example.solidconnection.community.comment.repository.CommentRepository; +import com.example.solidconnection.community.comment.fixture.CommentFixture; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.domain.PostCategory; -import com.example.solidconnection.community.post.domain.PostImage; -import com.example.solidconnection.community.post.dto.PostFindPostImageResponse; import com.example.solidconnection.community.post.dto.PostFindResponse; import com.example.solidconnection.community.post.dto.PostListResponse; -import com.example.solidconnection.community.post.repository.PostImageRepository; -import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.community.post.fixture.PostFixture; +import com.example.solidconnection.community.post.fixture.PostImageFixture; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; -import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.support.TestContainerSpringBootTest; import com.example.solidconnection.util.RedisUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -28,8 +25,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +@TestContainerSpringBootTest @DisplayName("게시글 조회 서비스 테스트") -class PostQueryServiceTest extends BaseIntegrationTest { +class PostQueryServiceTest { @Autowired private PostQueryService postQueryService; @@ -41,33 +39,61 @@ class PostQueryServiceTest extends BaseIntegrationTest { private RedisUtils redisUtils; @Autowired - private PostRepository postRepository; + private SiteUserFixture siteUserFixture; @Autowired - private CommentRepository commentRepository; + private BoardFixture boardFixture; @Autowired - private PostImageRepository postImageRepository; + private PostFixture postFixture; @Autowired - private SiteUserFixture siteUserFixture; + private PostImageFixture postImageFixture; + + @Autowired + private CommentFixture commentFixture; private SiteUser user; + private Post post1; + private Post post2; + private Post post3; @BeforeEach void setUp() { - user = siteUserFixture.사용자(1, "test1"); + user = siteUserFixture.사용자(); + post1 = postFixture.게시글( + "제목1", + "내용1", + false, + PostCategory.자유, + boardFixture.자유게시판(), + user + ); + post2 = postFixture.게시글( + "제목2", + "내용2", + false, + PostCategory.자유, + boardFixture.미주권(), + user + ); + post3 = postFixture.게시글( + "제목3", + "내용3", + true, + PostCategory.질문, + boardFixture.자유게시판(), + user + ); } @Test void 게시판_코드와_카테고리로_게시글_목록을_조회한다() { // given - List posts = List.of( - 미주권_자유게시글, 아시아권_자유게시글, 유럽권_자유게시글, 자유게시판_자유게시글, - 미주권_질문게시글, 아시아권_질문게시글, 유럽권_질문게시글, 자유게시판_질문게시글 - ); + List posts = List.of(post1, post2, post3); List expectedPosts = posts.stream() - .filter(post -> post.getCategory().equals(PostCategory.자유) && post.getBoard().getCode().equals(BoardCode.FREE.name())) + .filter(post -> post.getCategory().equals(PostCategory.자유) + && post.getBoard().getCode().equals(BoardCode.FREE.name())) .toList(); List expectedResponses = PostListResponse.from(expectedPosts); @@ -87,10 +113,7 @@ void setUp() { @Test void 전체_카테고리로_조회시_해당_게시판의_모든_게시글을_조회한다() { // given - List posts = List.of( - 미주권_자유게시글, 아시아권_자유게시글, 유럽권_자유게시글, 자유게시판_자유게시글, - 미주권_질문게시글, 아시아권_질문게시글, 유럽권_질문게시글, 자유게시판_질문게시글 - ); + List posts = List.of(post1, post2, post3); List expectedPosts = posts.stream() .filter(post -> post.getBoard().getCode().equals(BoardCode.FREE.name())) .toList(); @@ -114,77 +137,34 @@ void setUp() { // given String expectedImageUrl = "test-image-url"; List imageUrls = List.of(expectedImageUrl); - Post testPost = createPost(자유게시판, user, expectedImageUrl); - List comments = createComments(testPost, user, List.of("첫번째 댓글", "두번째 댓글")); + Post post = postFixture.게시글( + "제목", + "내용", + false, + PostCategory.자유, + boardFixture.자유게시판(), + user + ); + postImageFixture.게시글_이미지(expectedImageUrl, post); + Comment comment1 = commentFixture.부모_댓글("댓글1", post, user); + Comment comment2 = commentFixture.부모_댓글("댓글2", post, user); + List comments = List.of(comment1, comment2); - String validateKey = redisUtils.getValidatePostViewCountRedisKey(user.getId(), testPost.getId()); - String viewCountKey = redisUtils.getPostViewCountRedisKey(testPost.getId()); + String validateKey = redisUtils.getValidatePostViewCountRedisKey(user.getId(), post.getId()); + String viewCountKey = redisUtils.getPostViewCountRedisKey(post.getId()); // when - PostFindResponse response = postQueryService.findPostById( - user, - testPost.getId() - ); + PostFindResponse response = postQueryService.findPostById(user, post.getId()); // then assertAll( - () -> assertThat(response.id()).isEqualTo(testPost.getId()), - () -> assertThat(response.title()).isEqualTo(testPost.getTitle()), - () -> assertThat(response.content()).isEqualTo(testPost.getContent()), - () -> assertThat(response.isQuestion()).isEqualTo(testPost.getIsQuestion()), - () -> assertThat(response.likeCount()).isEqualTo(testPost.getLikeCount()), - () -> assertThat(response.viewCount()).isEqualTo(testPost.getViewCount()), - () -> assertThat(response.postCategory()).isEqualTo(String.valueOf(testPost.getCategory())), - - () -> assertThat(response.postFindBoardResponse().code()).isEqualTo(자유게시판.getCode()), - () -> assertThat(response.postFindBoardResponse().koreanName()).isEqualTo(자유게시판.getKoreanName()), - + () -> assertThat(response.id()).isEqualTo(post.getId()), + () -> assertThat(response.postFindBoardResponse().code()).isEqualTo(boardFixture.자유게시판().getCode()), () -> assertThat(response.postFindSiteUserResponse().id()).isEqualTo(user.getId()), - () -> assertThat(response.postFindSiteUserResponse().nickname()).isEqualTo(user.getNickname()), - () -> assertThat(response.postFindSiteUserResponse().profileImageUrl()).isEqualTo(user.getProfileImageUrl()), - - () -> assertThat(response.postFindPostImageResponses()) - .hasSize(imageUrls.size()) - .extracting(PostFindPostImageResponse::url) - .containsExactlyElementsOf(imageUrls), - - () -> assertThat(response.postFindCommentResponses()) - .hasSize(comments.size()) - .extracting(PostFindCommentResponse::content) - .containsExactlyElementsOf(comments.stream().map(Comment::getContent).toList()), - - () -> assertThat(response.isOwner()).isTrue(), - () -> assertThat(response.isLiked()).isFalse(), - + () -> assertThat(response.postFindPostImageResponses()).hasSize(imageUrls.size()), + () -> assertThat(response.postFindCommentResponses()).hasSize(comments.size()), () -> assertThat(redisService.isKeyExists(viewCountKey)).isTrue(), () -> assertThat(redisService.isKeyExists(validateKey)).isTrue() ); } - - private Post createPost(Board board, SiteUser siteUser, String originImageUrl) { - Post post = new Post( - "원본 제목", - "원본 내용", - false, - 0L, - 0L, - PostCategory.자유 - ); - post.setBoardAndSiteUser(board, siteUser); - Post savedPost = postRepository.save(post); - PostImage postImage = new PostImage(originImageUrl); - postImage.setPost(savedPost); - postImageRepository.save(postImage); - return savedPost; - } - - private List createComments(Post post, SiteUser siteUser, List contents) { - return contents.stream() - .map(content -> { - Comment comment = new Comment(content); - comment.setPostAndSiteUser(post, siteUser); - return commentRepository.save(comment); - }) - .toList(); - } } From 00ea71161f55cdc45fa9b6d8db6668704c5de1ae Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:09:46 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20BaseIntegrationTest=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/BaseIntegrationTest.java | 527 ------------------ 1 file changed, 527 deletions(-) delete mode 100644 src/test/java/com/example/solidconnection/support/integration/BaseIntegrationTest.java diff --git a/src/test/java/com/example/solidconnection/support/integration/BaseIntegrationTest.java b/src/test/java/com/example/solidconnection/support/integration/BaseIntegrationTest.java deleted file mode 100644 index ae449641f..000000000 --- a/src/test/java/com/example/solidconnection/support/integration/BaseIntegrationTest.java +++ /dev/null @@ -1,527 +0,0 @@ -package com.example.solidconnection.support.integration; - -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.domain.VerifyStatus; -import com.example.solidconnection.application.repository.ApplicationRepository; -import com.example.solidconnection.community.board.domain.Board; -import com.example.solidconnection.community.board.repository.BoardRepository; -import com.example.solidconnection.community.post.domain.Post; -import com.example.solidconnection.community.post.domain.PostCategory; -import com.example.solidconnection.community.post.domain.PostImage; -import com.example.solidconnection.community.post.repository.PostImageRepository; -import com.example.solidconnection.community.post.repository.PostRepository; -import com.example.solidconnection.location.country.domain.Country; -import com.example.solidconnection.location.country.repository.CountryRepository; -import com.example.solidconnection.location.region.domain.Region; -import com.example.solidconnection.location.region.repository.RegionRepository; -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.PreparationStatus; -import com.example.solidconnection.siteuser.domain.Role; -import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.support.DatabaseClearExtension; -import com.example.solidconnection.support.TestContainerSpringBootTest; -import com.example.solidconnection.university.domain.LanguageRequirement; -import com.example.solidconnection.university.domain.LanguageTestType; -import com.example.solidconnection.university.domain.University; -import com.example.solidconnection.university.domain.UniversityInfoForApply; -import com.example.solidconnection.university.repository.LanguageRequirementRepository; -import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; -import com.example.solidconnection.university.repository.UniversityRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; - -import java.util.HashSet; -import java.util.List; - -import static com.example.solidconnection.community.board.domain.BoardCode.AMERICAS; -import static com.example.solidconnection.community.board.domain.BoardCode.ASIA; -import static com.example.solidconnection.community.board.domain.BoardCode.EUROPE; -import static com.example.solidconnection.community.board.domain.BoardCode.FREE; -import static com.example.solidconnection.university.domain.SemesterAvailableForDispatch.ONE_SEMESTER; -import static com.example.solidconnection.university.domain.TuitionFeeType.HOME_UNIVERSITY_PAYMENT; - -@TestContainerSpringBootTest -@ExtendWith(DatabaseClearExtension.class) -public abstract class BaseIntegrationTest { - - public static SiteUser 테스트유저_1; - public static SiteUser 테스트유저_2; - public static SiteUser 테스트유저_3; - public static SiteUser 테스트유저_4; - public static SiteUser 테스트유저_5; - public static SiteUser 테스트유저_6; - public static SiteUser 테스트유저_7; - public static SiteUser 이전학기_지원자; - - public static Region 영미권; - public static Region 유럽; - public static Region 아시아; - public static Country 미국; - public static Country 캐나다; - public static Country 덴마크; - public static Country 오스트리아; - public static Country 일본; - - public static University 영미권_미국_괌대학; - public static University 영미권_미국_네바다주립대학_라스베이거스; - public static University 영미권_캐나다_메모리얼대학_세인트존스; - public static University 유럽_덴마크_서던덴마크대학교; - public static University 유럽_덴마크_코펜하겐IT대학; - public static University 유럽_오스트리아_그라츠대학; - public static University 유럽_오스트리아_그라츠공과대학; - public static University 유럽_오스트리아_린츠_카톨릭대학; - public static University 아시아_일본_메이지대학; - - public static UniversityInfoForApply 괌대학_A_지원_정보; - public static UniversityInfoForApply 괌대학_B_지원_정보; - public static UniversityInfoForApply 네바다주립대학_라스베이거스_지원_정보; - public static UniversityInfoForApply 메모리얼대학_세인트존스_A_지원_정보; - public static UniversityInfoForApply 서던덴마크대학교_지원_정보; - public static UniversityInfoForApply 코펜하겐IT대학_지원_정보; - public static UniversityInfoForApply 그라츠대학_지원_정보; - public static UniversityInfoForApply 그라츠공과대학_지원_정보; - public static UniversityInfoForApply 린츠_카톨릭대학_지원_정보; - public static UniversityInfoForApply 메이지대학_지원_정보; - - public static Application 테스트유저_2_괌대학_B_괌대학_A_린츠_카톨릭대학_지원서; - public static Application 테스트유저_3_괌대학_A_괌대학_B_그라츠공과대학_지원서; - public static Application 테스트유저_4_메이지대학_그라츠대학_서던덴마크대학_지원서; - public static Application 테스트유저_5_네바다주립대학_그라츠공과대학_메이지대학_지원서; - public static Application 테스트유저_6_X_X_X_지원서; - public static Application 테스트유저_7_코펜하겐IT대학_X_X_지원서; - public static Application 이전학기_지원서; - - public static Board 미주권; - public static Board 아시아권; - public static Board 유럽권; - public static Board 자유게시판; - - public static Post 미주권_자유게시글; - public static Post 아시아권_자유게시글; - public static Post 유럽권_자유게시글; - public static Post 자유게시판_자유게시글; - public static Post 미주권_질문게시글; - public static Post 아시아권_질문게시글; - public static Post 유럽권_질문게시글; - public static Post 자유게시판_질문게시글; - - @Autowired - private SiteUserRepository siteUserRepository; - - @Autowired - private RegionRepository regionRepository; - - @Autowired - private CountryRepository countryRepository; - - @Autowired - private UniversityRepository universityRepository; - - @Autowired - private UniversityInfoForApplyRepository universityInfoForApplyRepository; - - @Autowired - private LanguageRequirementRepository languageRequirementRepository; - - @Autowired - private ApplicationRepository applicationRepository; - - @Autowired - private GpaScoreRepository gpaScoreRepository; - - @Autowired - private LanguageTestScoreRepository languageTestScoreRepository; - - @Autowired - private BoardRepository boardRepository; - - @Autowired - private PostRepository postRepository; - - @Autowired - private PostImageRepository postImageRepository; - - @Value("${university.term}") - public String term; - - @BeforeEach - public void setUpBaseData() { - setUpSiteUsers(); - setUpRegions(); - setUpCountries(); - setUpUniversities(); - setUpUniversityInfos(); - setUpLanguageRequirements(); - setUpApplications(); - setUpBoards(); - setUpPosts(); - } - - private void setUpSiteUsers() { - 테스트유저_1 = siteUserRepository.save(new SiteUser( - "test1@example.com", - "nickname1", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 테스트유저_2 = siteUserRepository.save(new SiteUser( - "test2@example.com", - "nickname2", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 테스트유저_3 = siteUserRepository.save(new SiteUser( - "test3@example.com", - "nickname3", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 테스트유저_4 = siteUserRepository.save(new SiteUser( - "test4@example.com", - "nickname4", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 테스트유저_5 = siteUserRepository.save(new SiteUser( - "test5@example.com", - "nickname5", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 테스트유저_6 = siteUserRepository.save(new SiteUser( - "test6@example.com", - "nickname6", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 테스트유저_7 = siteUserRepository.save(new SiteUser( - "test7@example.com", - "nickname7", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - - 이전학기_지원자 = siteUserRepository.save(new SiteUser( - "old@example.com", - "oldNickname", - "profileImageUrl", - PreparationStatus.CONSIDERING, - Role.MENTEE)); - } - - private void setUpRegions() { - 영미권 = regionRepository.save(new Region("AMERICAS", "영미권")); - 유럽 = regionRepository.save(new Region("EUROPE", "유럽")); - 아시아 = regionRepository.save(new Region("ASIA", "아시아")); - } - - private void setUpCountries() { - 미국 = countryRepository.save(new Country("US", "미국", 영미권)); - 캐나다 = countryRepository.save(new Country("CA", "캐나다", 영미권)); - 덴마크 = countryRepository.save(new Country("DK", "덴마크", 유럽)); - 오스트리아 = countryRepository.save(new Country("AT", "오스트리아", 유럽)); - 일본 = countryRepository.save(new Country("JP", "일본", 아시아)); - } - - private void setUpUniversities() { - 영미권_미국_괌대학 = universityRepository.save(new University( - null, "괌대학", "University of Guam", "university_of_guam", - "https://www.uog.edu/admissions/international-students", - "https://www.uog.edu/admissions/course-schedule", - "https://www.uog.edu/life-at-uog/residence-halls/", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_guam/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_guam/1.png", - null, 미국, 영미권 - )); - - 영미권_미국_네바다주립대학_라스베이거스 = universityRepository.save(new University( - null, "네바다주립대학 라스베이거스", "University of Nevada, Las Vegas", "university_of_nevada_las_vegas", - "https://www.unlv.edu/engineering/eip", - "https://www.unlv.edu/engineering/academic-programs", - "https://www.unlv.edu/housing", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_nevada_las_vegas/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_nevada_las_vegas/1.png", - null, 미국, 영미권 - )); - - 영미권_캐나다_메모리얼대학_세인트존스 = universityRepository.save(new University( - null, "메모리얼 대학 세인트존스", "Memorial University of Newfoundland St. John's", "memorial_university_of_newfoundland_st_johns", - "https://mun.ca/goabroad/visiting-students-inbound/", - "https://www.unlv.edu/engineering/academic-programs", - "https://www.mun.ca/residences/", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/memorial_university_of_newfoundland_st_johns/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/memorial_university_of_newfoundland_st_johns/1.png", - null, 캐나다, 영미권 - )); - - 유럽_덴마크_서던덴마크대학교 = universityRepository.save(new University( - null, "서던덴마크대학교", "University of Southern Denmark", "university_of_southern_denmark", - "https://www.sdu.dk/en", - "https://www.sdu.dk/en", - "https://www.sdu.dk/en/uddannelse/information_for_international_students/studenthousing", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_southern_denmark/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_southern_denmark/1.png", - null, 덴마크, 유럽 - )); - - 유럽_덴마크_코펜하겐IT대학 = universityRepository.save(new University( - null, "코펜하겐 IT대학", "IT University of Copenhagen", "it_university_of_copenhagen", - "https://en.itu.dk/", null, - "https://en.itu.dk/Programmes/Student-Life/Practical-information-for-international-students", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/it_university_of_copenhagen/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/it_university_of_copenhagen/1.png", - null, 덴마크, 유럽 - )); - - 유럽_오스트리아_그라츠대학 = universityRepository.save(new University( - null, "그라츠 대학", "University of Graz", "university_of_graz", - "https://www.uni-graz.at/en/", - "https://static.uni-graz.at/fileadmin/veranstaltungen/orientation/documents/incstud_application-courses.pdf", - "https://orientation.uni-graz.at/de/planning-the-arrival/accommodation/", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_graz/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/university_of_graz/1.png", - null, 오스트리아, 유럽 - )); - - 유럽_오스트리아_그라츠공과대학 = universityRepository.save(new University( - null, "그라츠공과대학", "Graz University of Technology", "graz_university_of_technology", - "https://www.tugraz.at/en/home", null, - "https://www.tugraz.at/en/studying-and-teaching/studying-internationally/incoming-students-exchange-at-tu-graz/your-stay-at-tu-graz/preparation#c75033", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/graz_university_of_technology/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/graz_university_of_technology/1.png", - null, 오스트리아, 유럽 - )); - - 유럽_오스트리아_린츠_카톨릭대학 = universityRepository.save(new University( - null, "린츠 카톨릭 대학교", "Catholic Private University Linz", "catholic_private_university_linz", - "https://ku-linz.at/en", null, - "https://ku-linz.at/en/ku_international/incomings/kulis", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/catholic_private_university_linz/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/catholic_private_university_linz/1.png", - null, 오스트리아, 유럽 - )); - - 아시아_일본_메이지대학 = universityRepository.save(new University( - null, "메이지대학", "Meiji University", "meiji_university", - "https://www.meiji.ac.jp/cip/english/admissions/co7mm90000000461-att/co7mm900000004fa.pdf", null, - "https://www.meiji.ac.jp/cip/english/admissions/co7mm90000000461-att/co7mm900000004fa.pdf", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/meiji_university/logo.png", - "https://solid-connection.s3.ap-northeast-2.amazonaws.com/original/meiji_university/1.png", - null, 일본, 아시아 - )); - } - - private void setUpUniversityInfos() { - 괌대학_A_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "괌대학(A형)", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 영미권_미국_괌대학 - )); - - 괌대학_B_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "괌대학(B형)", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 영미권_미국_괌대학 - )); - - 네바다주립대학_라스베이거스_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "네바다주립대학 라스베이거스(B형)", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 영미권_미국_네바다주립대학_라스베이거스 - )); - - 메모리얼대학_세인트존스_A_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "메모리얼 대학 세인트존스(A형)", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 영미권_캐나다_메모리얼대학_세인트존스 - )); - - 서던덴마크대학교_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "서던덴마크대학교", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 유럽_덴마크_서던덴마크대학교 - )); - - 코펜하겐IT대학_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "코펜하겐 IT대학", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 유럽_덴마크_코펜하겐IT대학 - )); - - 그라츠대학_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "그라츠 대학", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 유럽_오스트리아_그라츠대학 - )); - - 그라츠공과대학_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "그라츠공과대학", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 유럽_오스트리아_그라츠공과대학 - )); - - 린츠_카톨릭대학_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "린츠 카톨릭 대학교", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 유럽_오스트리아_린츠_카톨릭대학 - )); - - 메이지대학_지원_정보 = universityInfoForApplyRepository.save(new UniversityInfoForApply( - null, term, "메이지대학", 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, - "1", "detailsForLanguage", "gpaRequirement", - "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", - "detailsForAccommodation", "detailsForEnglishCourse", "details", - new HashSet<>(), 아시아_일본_메이지대학 - )); - } - - private void setUpLanguageRequirements() { - saveLanguageTestRequirement(괌대학_A_지원_정보, LanguageTestType.TOEFL_IBT, "80"); - saveLanguageTestRequirement(괌대학_A_지원_정보, LanguageTestType.TOEIC, "800"); - saveLanguageTestRequirement(괌대학_B_지원_정보, LanguageTestType.TOEFL_IBT, "70"); - saveLanguageTestRequirement(괌대학_B_지원_정보, LanguageTestType.TOEIC, "900"); - saveLanguageTestRequirement(네바다주립대학_라스베이거스_지원_정보, LanguageTestType.TOEIC, "800"); - saveLanguageTestRequirement(메모리얼대학_세인트존스_A_지원_정보, LanguageTestType.TOEIC, "800"); - saveLanguageTestRequirement(서던덴마크대학교_지원_정보, LanguageTestType.TOEFL_IBT, "70"); - saveLanguageTestRequirement(코펜하겐IT대학_지원_정보, LanguageTestType.TOEFL_IBT, "80"); - saveLanguageTestRequirement(그라츠대학_지원_정보, LanguageTestType.TOEFL_IBT, "80"); - saveLanguageTestRequirement(그라츠공과대학_지원_정보, LanguageTestType.TOEIC, "800"); - saveLanguageTestRequirement(린츠_카톨릭대학_지원_정보, LanguageTestType.TOEIC, "800"); - saveLanguageTestRequirement(메이지대학_지원_정보, LanguageTestType.JLPT, "N2"); - } - - private void setUpApplications() { - 테스트유저_2_괌대학_B_괌대학_A_린츠_카톨릭대학_지원서 = new Application(테스트유저_2, createApprovedGpaScore(테스트유저_2).getGpa(), createApprovedLanguageTestScore(테스트유저_2).getLanguageTest(), - term, 괌대학_B_지원_정보, 괌대학_A_지원_정보, 린츠_카톨릭대학_지원_정보, "user2_nickname"); - - 테스트유저_3_괌대학_A_괌대학_B_그라츠공과대학_지원서 = new Application(테스트유저_3, createApprovedGpaScore(테스트유저_3).getGpa(), createApprovedLanguageTestScore(테스트유저_3).getLanguageTest(), - term, 괌대학_A_지원_정보, 괌대학_B_지원_정보, 그라츠공과대학_지원_정보, "user3_nickname"); - - 테스트유저_4_메이지대학_그라츠대학_서던덴마크대학_지원서 = new Application(테스트유저_4, createApprovedGpaScore(테스트유저_4).getGpa(), createApprovedLanguageTestScore(테스트유저_4).getLanguageTest(), - term, 메이지대학_지원_정보, 그라츠대학_지원_정보, 서던덴마크대학교_지원_정보, "user4_nickname"); - - 테스트유저_5_네바다주립대학_그라츠공과대학_메이지대학_지원서 = new Application(테스트유저_5, createApprovedGpaScore(테스트유저_5).getGpa(), createApprovedLanguageTestScore(테스트유저_5).getLanguageTest(), - term, 네바다주립대학_라스베이거스_지원_정보, 그라츠공과대학_지원_정보, 메이지대학_지원_정보, "user5_nickname"); - - 테스트유저_6_X_X_X_지원서 = new Application(테스트유저_6, createApprovedGpaScore(테스트유저_6).getGpa(), createApprovedLanguageTestScore(테스트유저_6).getLanguageTest(), - term, null, null, null, "user6_nickname"); - - 테스트유저_7_코펜하겐IT대학_X_X_지원서 = new Application(테스트유저_7, createApprovedGpaScore(테스트유저_7).getGpa(), createApprovedLanguageTestScore(테스트유저_7).getLanguageTest(), - term, 코펜하겐IT대학_지원_정보, null, null, "user7_nickname"); - - 이전학기_지원서 = new Application(이전학기_지원자, createApprovedGpaScore(이전학기_지원자).getGpa(), createApprovedLanguageTestScore(이전학기_지원자).getLanguageTest(), - "1988-1", 네바다주립대학_라스베이거스_지원_정보, 그라츠공과대학_지원_정보, 메이지대학_지원_정보, "old_nickname"); - - 테스트유저_2_괌대학_B_괌대학_A_린츠_카톨릭대학_지원서.setVerifyStatus(VerifyStatus.APPROVED); - 테스트유저_3_괌대학_A_괌대학_B_그라츠공과대학_지원서.setVerifyStatus(VerifyStatus.APPROVED); - 테스트유저_4_메이지대학_그라츠대학_서던덴마크대학_지원서.setVerifyStatus(VerifyStatus.APPROVED); - 테스트유저_5_네바다주립대학_그라츠공과대학_메이지대학_지원서.setVerifyStatus(VerifyStatus.APPROVED); - 테스트유저_6_X_X_X_지원서.setVerifyStatus(VerifyStatus.APPROVED); - 테스트유저_7_코펜하겐IT대학_X_X_지원서.setVerifyStatus(VerifyStatus.APPROVED); - 이전학기_지원서.setVerifyStatus(VerifyStatus.APPROVED); - - applicationRepository.saveAll(List.of( - 테스트유저_2_괌대학_B_괌대학_A_린츠_카톨릭대학_지원서, 테스트유저_3_괌대학_A_괌대학_B_그라츠공과대학_지원서, 테스트유저_4_메이지대학_그라츠대학_서던덴마크대학_지원서, 테스트유저_5_네바다주립대학_그라츠공과대학_메이지대학_지원서, - 테스트유저_6_X_X_X_지원서, 테스트유저_7_코펜하겐IT대학_X_X_지원서, 이전학기_지원서)); - } - - private void setUpBoards() { - 미주권 = boardRepository.save(new Board(AMERICAS.name(), "미주권")); - 아시아권 = boardRepository.save(new Board(ASIA.name(), "아시아권")); - 유럽권 = boardRepository.save(new Board(EUROPE.name(), "유럽권")); - 자유게시판 = boardRepository.save(new Board(FREE.name(), "자유게시판")); - } - - private void setUpPosts() { - 미주권_자유게시글 = createPost(미주권, 테스트유저_1, "미주권 자유게시글", "미주권 자유게시글 내용", PostCategory.자유); - 아시아권_자유게시글 = createPost(아시아권, 테스트유저_2, "아시아권 자유게시글", "아시아권 자유게시글 내용", PostCategory.자유); - 유럽권_자유게시글 = createPost(유럽권, 테스트유저_1, "유럽권 자유게시글", "유럽권 자유게시글 내용", PostCategory.자유); - 자유게시판_자유게시글 = createPost(자유게시판, 테스트유저_2, "자유게시판 자유게시글", "자유게시판 자유게시글 내용", PostCategory.자유); - 미주권_질문게시글 = createPost(미주권, 테스트유저_1, "미주권 질문게시글", "미주권 질문게시글 내용", PostCategory.질문); - 아시아권_질문게시글 = createPost(아시아권, 테스트유저_2, "아시아권 질문게시글", "아시아권 질문게시글 내용", PostCategory.질문); - 유럽권_질문게시글 = createPost(유럽권, 테스트유저_1, "유럽권 질문게시글", "유럽권 질문게시글 내용", PostCategory.질문); - 자유게시판_질문게시글 = createPost(자유게시판, 테스트유저_2, "자유게시판 질문게시글", "자유게시판 질문게시글 내용", PostCategory.질문); - } - - private void saveLanguageTestRequirement( - UniversityInfoForApply universityInfoForApply, - LanguageTestType testType, - String minScore - ) { - LanguageRequirement languageRequirement = new LanguageRequirement( - null, - testType, - minScore, - universityInfoForApply); - universityInfoForApply.addLanguageRequirements(languageRequirement); - universityInfoForApplyRepository.save(universityInfoForApply); - languageRequirementRepository.save(languageRequirement); - } - - private GpaScore createApprovedGpaScore(SiteUser siteUser) { - GpaScore gpaScore = new GpaScore( - new Gpa(4.0, 4.5, "/gpa-report.pdf"), - siteUser - ); - gpaScore.setVerifyStatus(VerifyStatus.APPROVED); - return gpaScoreRepository.save(gpaScore); - } - - private LanguageTestScore createApprovedLanguageTestScore(SiteUser siteUser) { - LanguageTestScore languageTestScore = new LanguageTestScore( - new LanguageTest(LanguageTestType.TOEIC, "100", "/gpa-report.pdf"), - siteUser - ); - languageTestScore.setVerifyStatus(VerifyStatus.APPROVED); - return languageTestScoreRepository.save(languageTestScore); - } - - private Post createPost(Board board, SiteUser siteUser, String title, String content, PostCategory category) { - Post post = new Post( - title, - content, - false, - 0L, - 0L, - category - ); - post.setBoardAndSiteUser(board, siteUser); - Post savedPost = postRepository.save(post); - PostImage postImage = new PostImage("imageUrl"); - postImage.setPost(savedPost); - postImageRepository.save(postImage); - return savedPost; - } -} From 6c344f823c655398ed2371f572c822d033937c91 Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 <126947828+Gyuhyeok99@users.noreply.github.com> Date: Sat, 7 Jun 2025 22:18:36 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20BoardFixture=EC=97=90=EC=84=9C?= =?UTF-8?q?=20BoardCode=20enum=20=EC=83=81=EC=88=98=20=EC=9D=BC=EA=B4=80?= =?UTF-8?q?=EB=90=98=EA=B2=8C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/board/fixture/BoardFixture.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java b/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java index 98eb4c202..16dc920d2 100644 --- a/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java +++ b/src/test/java/com/example/solidconnection/community/board/fixture/BoardFixture.java @@ -5,6 +5,8 @@ import org.springframework.boot.test.context.TestComponent; import static com.example.solidconnection.community.board.domain.BoardCode.AMERICAS; +import static com.example.solidconnection.community.board.domain.BoardCode.ASIA; +import static com.example.solidconnection.community.board.domain.BoardCode.EUROPE; import static com.example.solidconnection.community.board.domain.BoardCode.FREE; @TestComponent @@ -20,13 +22,13 @@ public class BoardFixture { } public Board 아시아권() { - return boardFixtureBuilder.code("ASIA") + return boardFixtureBuilder.code(ASIA.name()) .koreanName("아시아권") .findOrCreate(); } public Board 유럽권() { - return boardFixtureBuilder.code("EUROPE") + return boardFixtureBuilder.code(EUROPE.name()) .koreanName("유럽권") .findOrCreate(); }