From 0a580d4977be983fbb07febac75839a9aff7f748 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 16:39:56 +0900 Subject: [PATCH 01/26] =?UTF-8?q?refactor:=20NoticeFixture=20->=20NoticeTe?= =?UTF-8?q?stFixture=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F?= =?UTF-8?q?=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/usecase/NoticeUsecaseImplTest.java | 8 ++++---- .../domain/repository/NoticeRepositoryTest.java | 8 ++++---- .../fixture/NoticeTestFixture.java} | 13 +++++++++++-- 3 files changed, 19 insertions(+), 10 deletions(-) rename src/test/java/leets/weeth/domain/board/{domain/test/fixture/NoticeFixture.java => test/fixture/NoticeTestFixture.java} (63%) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java index f03100a9..da61c9ef 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java @@ -3,7 +3,7 @@ import leets.weeth.domain.board.application.dto.NoticeDTO; import leets.weeth.domain.board.application.mapper.NoticeMapper; import leets.weeth.domain.board.domain.entity.Notice; -import leets.weeth.domain.board.domain.test.fixture.NoticeFixture; +import leets.weeth.domain.board.test.fixture.NoticeTestFixture; import leets.weeth.domain.board.domain.service.NoticeFindService; import leets.weeth.domain.file.domain.entity.File; import leets.weeth.domain.file.domain.service.FileGetService; @@ -54,7 +54,7 @@ class NoticeUsecaseImplTest { List notices = new ArrayList<>(); for(int i = 0; i<5; i++){ - Notice notice = NoticeFixture.createNotice("공지" + i, user); + Notice notice = NoticeTestFixture.createNotice("공지" + i, user); ReflectionTestUtils.setField(notice, "id", (long) i + 1); notices.add(notice); } @@ -114,12 +114,12 @@ class NoticeUsecaseImplTest { List notices = new ArrayList<>(); for(int i = 0; i<3; i++){ - Notice notice = NoticeFixture.createNotice("공지" + i, user); + Notice notice = NoticeTestFixture.createNotice("공지" + i, user); ReflectionTestUtils.setField(notice, "id", (long) i + 1); notices.add(notice); } for(int i = 3; i<6; i++){ - Notice notice = NoticeFixture.createNotice("검색" + i, user); + Notice notice = NoticeTestFixture.createNotice("검색" + i, user); ReflectionTestUtils.setField(notice, "id", (long) i + 1); notices.add(notice); } diff --git a/src/test/java/leets/weeth/domain/board/domain/repository/NoticeRepositoryTest.java b/src/test/java/leets/weeth/domain/board/domain/repository/NoticeRepositoryTest.java index 2c017a48..9a2a5fbb 100644 --- a/src/test/java/leets/weeth/domain/board/domain/repository/NoticeRepositoryTest.java +++ b/src/test/java/leets/weeth/domain/board/domain/repository/NoticeRepositoryTest.java @@ -2,7 +2,7 @@ import leets.weeth.config.TestContainersConfig; import leets.weeth.domain.board.domain.entity.Notice; -import leets.weeth.domain.board.domain.test.fixture.NoticeFixture; +import leets.weeth.domain.board.test.fixture.NoticeTestFixture; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; @@ -31,7 +31,7 @@ class NoticeRepositoryTest { // given List notices = new ArrayList<>(); for(int i = 0; i<5; i++){ - Notice notice = NoticeFixture.createNotice("공지" + i); + Notice notice = NoticeTestFixture.createNotice("공지" + i); notices.add(notice); } @@ -60,9 +60,9 @@ class NoticeRepositoryTest { for(int i = 0; i<6; i++){ Notice notice; if(i % 2 == 0){ - notice = NoticeFixture.createNotice("공지" + i); + notice = NoticeTestFixture.createNotice("공지" + i); } else{ - notice = NoticeFixture.createNotice("검색" + i); + notice = NoticeTestFixture.createNotice("검색" + i); } notices.add(notice); } diff --git a/src/test/java/leets/weeth/domain/board/domain/test/fixture/NoticeFixture.java b/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java similarity index 63% rename from src/test/java/leets/weeth/domain/board/domain/test/fixture/NoticeFixture.java rename to src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java index 5bd9e00e..c13bbf9d 100644 --- a/src/test/java/leets/weeth/domain/board/domain/test/fixture/NoticeFixture.java +++ b/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java @@ -1,9 +1,9 @@ -package leets.weeth.domain.board.domain.test.fixture; +package leets.weeth.domain.board.test.fixture; import leets.weeth.domain.board.domain.entity.Notice; import leets.weeth.domain.user.domain.entity.User; -public class NoticeFixture { +public class NoticeTestFixture { public static Notice createNotice(String title, User user){ return Notice.builder() .title(title) @@ -13,6 +13,15 @@ public static Notice createNotice(String title, User user){ .build(); } + public static Notice createNotice(Long id, String title){ + return Notice.builder() + .id(id) + .title(title) + .content("내용") + .commentCount(0) + .build(); + } + public static Notice createNotice(String title){ return Notice.builder() .title(title) From 4c6552528c8aa9849ed3f0d4b9de7eda07f8f700 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 16:40:23 +0900 Subject: [PATCH 02/26] =?UTF-8?q?test:=20CommentTestFixture=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/test/fixture/CommentTestFixture.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java diff --git a/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java b/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java new file mode 100644 index 00000000..1324735c --- /dev/null +++ b/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java @@ -0,0 +1,16 @@ +package leets.weeth.domain.comment.test.fixture; + +import leets.weeth.domain.board.domain.entity.Notice; +import leets.weeth.domain.comment.domain.entity.Comment; +import leets.weeth.domain.user.domain.entity.User; + +public class CommentTestFixture { + public static Comment createComment(String content, User user, Notice noice){ + return Comment.builder() + .content(content) + .notice(noice) + .user(user) + .isDeleted(Boolean.FALSE) + .build(); + } +} From facba80814a61cc23fc08fff568e75a5ae05597e Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 16:40:49 +0900 Subject: [PATCH 03/26] =?UTF-8?q?test:=20=EB=B6=80=EB=AA=A8=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B3=B5=EC=A7=80?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/NoticeCommentUsecaseImplTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java new file mode 100644 index 00000000..971fef3f --- /dev/null +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -0,0 +1,89 @@ +package leets.weeth.domain.comment.application.usecase; + +import leets.weeth.domain.board.domain.entity.Notice; +import leets.weeth.domain.board.domain.service.NoticeFindService; +import leets.weeth.domain.board.test.fixture.NoticeTestFixture; +import leets.weeth.domain.comment.application.dto.CommentDTO; +import leets.weeth.domain.comment.application.mapper.CommentMapper; +import leets.weeth.domain.comment.domain.entity.Comment; +import leets.weeth.domain.comment.domain.service.CommentDeleteService; +import leets.weeth.domain.comment.domain.service.CommentFindService; +import leets.weeth.domain.comment.domain.service.CommentSaveService; +import leets.weeth.domain.comment.test.fixture.CommentTestFixture; +import leets.weeth.domain.file.application.mapper.FileMapper; +import leets.weeth.domain.file.domain.service.FileDeleteService; +import leets.weeth.domain.file.domain.service.FileGetService; +import leets.weeth.domain.file.domain.service.FileSaveService; +import leets.weeth.domain.user.domain.entity.User; +import leets.weeth.domain.user.domain.service.UserGetService; +import leets.weeth.domain.user.test.fixture.UserTestFixture; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.mockito.BDDMockito.*; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@ExtendWith(MockitoExtension.class) +class NoticeCommentUsecaseImplTest { + @Mock NoticeCommentUsecaseImpl noticeCommentUsecase; + + @Mock CommentSaveService commentSaveService; + @Mock CommentFindService commentFindService; + @Mock CommentDeleteService commentDeleteService; + + @Mock FileSaveService fileSaveService; + @Mock FileGetService fileGetService; + @Mock FileDeleteService fileDeleteService; + @Mock FileMapper fileMapper; + + @Mock NoticeFindService noticeFindService; + + @Mock UserGetService userGetService; + @Mock CommentMapper commentMapper; + + @Test + @DisplayName("부모 댓글이 없는 공지사항 댓글 작성") + void saveNoticeComment() { + Long userId = 1L; + Long noticeId = 1L; + // given + User user = UserTestFixture.createActiveUser1(1L); + Notice notice = NoticeTestFixture.createNotice(noticeId, "제목1"); + + CommentDTO.Save dto = new CommentDTO.Save(null, "댓글1", List.of()); + + Comment comment = CommentTestFixture.createComment(dto.content(), user, notice); + + given(commentMapper.fromCommentDto(dto, notice, user, null)).willReturn(comment); + given(userGetService.find(user.getId())).willReturn(user); + given(noticeFindService.find(notice.getId())).willReturn(notice); + given(fileMapper.toFileList(dto.files(), comment)).willReturn(List.of()); + + // when + noticeCommentUsecase.saveNoticeComment(dto, noticeId, userId); + + // then + verify(userGetService).find(userId); + verify(noticeFindService).find(noticeId); + verify(commentSaveService).save(comment); + verify(fileSaveService).save(List.of()); + verify(commentMapper).fromCommentDto(dto, notice, user, null); + + assertThat(notice.getComments()).contains(comment); + + + } + + @Test + void updateNoticeComment() { + } + + @Test + void deleteNoticeComment() { + } +} From 8fc30452dc617f6f07979704595f29d4c0611e08 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 17:03:36 +0900 Subject: [PATCH 04/26] =?UTF-8?q?refactor:=20Notice=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=8B=9C=20comments=20=EC=B4=88=EA=B8=B0=ED=99=94=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/board/test/fixture/NoticeTestFixture.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java b/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java index c13bbf9d..85a261bc 100644 --- a/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java +++ b/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java @@ -3,12 +3,15 @@ import leets.weeth.domain.board.domain.entity.Notice; import leets.weeth.domain.user.domain.entity.User; +import java.util.ArrayList; + public class NoticeTestFixture { public static Notice createNotice(String title, User user){ return Notice.builder() .title(title) .content("내용") .user(user) + .comments(new ArrayList<>()) .commentCount(0) .build(); } @@ -18,6 +21,7 @@ public static Notice createNotice(Long id, String title){ .id(id) .title(title) .content("내용") + .comments(new ArrayList<>()) .commentCount(0) .build(); } @@ -26,6 +30,7 @@ public static Notice createNotice(String title){ return Notice.builder() .title(title) .content("내용") + .comments(new ArrayList<>()) .commentCount(0) .build(); } From e222177bc4ea2442c5974d87f425b2106d23f4fd Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 17:10:18 +0900 Subject: [PATCH 05/26] =?UTF-8?q?refactor:=20NoticeCommentUsecaseImpl=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=97=90=EC=84=9C=20@Mock=20->=20@I?= =?UTF-8?q?njectMocks=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/usecase/NoticeCommentUsecaseImplTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java index 971fef3f..0432d9ea 100644 --- a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -20,6 +20,7 @@ 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; @@ -30,7 +31,7 @@ @ExtendWith(MockitoExtension.class) class NoticeCommentUsecaseImplTest { - @Mock NoticeCommentUsecaseImpl noticeCommentUsecase; + @InjectMocks NoticeCommentUsecaseImpl noticeCommentUsecase; @Mock CommentSaveService commentSaveService; @Mock CommentFindService commentFindService; @@ -76,7 +77,6 @@ void saveNoticeComment() { assertThat(notice.getComments()).contains(comment); - } @Test From bb68f68dedbcc2cc9c479e901fb96eb6bef2583d Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 18:02:39 +0900 Subject: [PATCH 06/26] =?UTF-8?q?test:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=8C=93=EA=B8=80=20=EC=88=98=EC=A0=95=20=EC=8B=9C?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=EC=9E=90=EC=99=80=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=9E=90=EA=B0=80=20=EB=8B=A4=EB=A5=BC=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EB=B0=9C=EC=83=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/NoticeCommentUsecaseImplTest.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java index 0432d9ea..70b582de 100644 --- a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -14,6 +14,7 @@ import leets.weeth.domain.file.domain.service.FileDeleteService; import leets.weeth.domain.file.domain.service.FileGetService; import leets.weeth.domain.file.domain.service.FileSaveService; +import leets.weeth.domain.user.application.exception.UserNotMatchException; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.service.UserGetService; import leets.weeth.domain.user.test.fixture.UserTestFixture; @@ -26,6 +27,7 @@ import java.util.List; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.BDDMockito.*; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @@ -46,7 +48,7 @@ class NoticeCommentUsecaseImplTest { @Mock UserGetService userGetService; @Mock CommentMapper commentMapper; - + @Test @DisplayName("부모 댓글이 없는 공지사항 댓글 작성") void saveNoticeComment() { @@ -80,7 +82,28 @@ void saveNoticeComment() { } @Test - void updateNoticeComment() { + @DisplayName("공지사항 댓글 수정 시 작성자와 수정 요청자가 다르면 예외가 발생한다") + void updateNoticeComment_throwsException_whenUserIsNotOwner() { + Long userId = 1L; + Long different = 2L; + Long noticeId = 1L; + // given + User user = UserTestFixture.createActiveUser1(1L); + User user2 = UserTestFixture.createActiveUser1(2L); + Notice notice = NoticeTestFixture.createNotice(noticeId, "제목1"); + + CommentDTO.Update dto = new CommentDTO.Update("수정 완료", List.of()); + + Comment comment = CommentTestFixture.createComment(dto.content(), user, notice); + + given(userGetService.find(user2.getId())).willReturn(user2); + given(noticeFindService.find(notice.getId())).willReturn(notice); + given(commentFindService.find(comment.getId())).willReturn(comment); + + // when & then + assertThrows(UserNotMatchException.class, () -> + noticeCommentUsecase.updateNoticeComment(dto, noticeId, comment.getId(), different) + ); } @Test From 9924556329f451d5258c7873bd01660ce1ad6068 Mon Sep 17 00:00:00 2001 From: jj Date: Wed, 5 Nov 2025 23:27:45 +0900 Subject: [PATCH 07/26] =?UTF-8?q?test:=20CommentTestFixture=EC=9D=98=20cre?= =?UTF-8?q?ateComment=20=EB=A9=94=EC=86=8C=EB=93=9C=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=EC=97=90=20id=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weeth/domain/comment/test/fixture/CommentTestFixture.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java b/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java index 1324735c..36873446 100644 --- a/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java +++ b/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java @@ -5,8 +5,9 @@ import leets.weeth.domain.user.domain.entity.User; public class CommentTestFixture { - public static Comment createComment(String content, User user, Notice noice){ + public static Comment createComment(Long id, String content, User user, Notice noice){ return Comment.builder() + .id(id) .content(content) .notice(noice) .user(user) From b5cadb9af0e488b6bf1ded9a7092e8365421a1d9 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 14:14:11 +0900 Subject: [PATCH 08/26] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EC=84=9C=20commentId=20=EC=83=81=EC=88=98=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/usecase/NoticeCommentUsecaseImplTest.java | 5 +++-- .../domain/comment/test/fixture/CommentTestFixture.java | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java index 70b582de..e9997c08 100644 --- a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -54,13 +54,14 @@ class NoticeCommentUsecaseImplTest { void saveNoticeComment() { Long userId = 1L; Long noticeId = 1L; + Long commentId = 1L; // given User user = UserTestFixture.createActiveUser1(1L); Notice notice = NoticeTestFixture.createNotice(noticeId, "제목1"); CommentDTO.Save dto = new CommentDTO.Save(null, "댓글1", List.of()); - Comment comment = CommentTestFixture.createComment(dto.content(), user, notice); + Comment comment = CommentTestFixture.createComment(commentId, dto.content(), user, notice); given(commentMapper.fromCommentDto(dto, notice, user, null)).willReturn(comment); given(userGetService.find(user.getId())).willReturn(user); @@ -94,7 +95,7 @@ void updateNoticeComment_throwsException_whenUserIsNotOwner() { CommentDTO.Update dto = new CommentDTO.Update("수정 완료", List.of()); - Comment comment = CommentTestFixture.createComment(dto.content(), user, notice); + Comment comment = CommentTestFixture.createComment(commentId, dto.content(), user, notice); given(userGetService.find(user2.getId())).willReturn(user2); given(noticeFindService.find(notice.getId())).willReturn(notice); diff --git a/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java b/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java index 36873446..30e3e2fc 100644 --- a/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java +++ b/src/test/java/leets/weeth/domain/comment/test/fixture/CommentTestFixture.java @@ -4,6 +4,8 @@ import leets.weeth.domain.comment.domain.entity.Comment; import leets.weeth.domain.user.domain.entity.User; +import java.util.ArrayList; + public class CommentTestFixture { public static Comment createComment(Long id, String content, User user, Notice noice){ return Comment.builder() @@ -11,6 +13,7 @@ public static Comment createComment(Long id, String content, User user, Notice n .content(content) .notice(noice) .user(user) + .children(new ArrayList<>()) .isDeleted(Boolean.FALSE) .build(); } From 85c5431eb1ec92d504f2be6bcee917c7960d3359 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 14:14:58 +0900 Subject: [PATCH 09/26] =?UTF-8?q?test:=20=EB=B6=80=EB=AA=A8=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=EC=9D=B4=20=EC=9E=88=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EA=B3=B5=EC=A7=80=EC=82=AC=ED=95=AD=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- .../usecase/NoticeCommentUsecaseImplTest.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java index e9997c08..9648e667 100644 --- a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -82,12 +82,44 @@ void saveNoticeComment() { } + @Test + @DisplayName("부모 댓글이 있는 경우 공지사항 댓글 작성") + void saveChildNoticeComment() { + Long userId = 1L; + Long noticeId = 1L; + Long parentCommentId = 1L; + Long childCommentId = 2L; + // given + User user = UserTestFixture.createActiveUser1(parentCommentId); + Notice notice = NoticeTestFixture.createNotice(noticeId, "제목1"); + + Comment parentComment = CommentTestFixture.createComment(parentCommentId, "부모 댓글", user, notice); + + CommentDTO.Save childCommentDTO = new CommentDTO.Save(parentCommentId, "자식 댓글", List.of()); + Comment childComment = CommentTestFixture.createComment(childCommentId, childCommentDTO.content(), user, notice); + + given(commentMapper.fromCommentDto(childCommentDTO, notice, user, parentComment)).willReturn(childComment); + given(userGetService.find(user.getId())).willReturn(user); + given(commentFindService.find(parentComment.getId())).willReturn(parentComment); + given(noticeFindService.find(notice.getId())).willReturn(notice); + given(fileMapper.toFileList(childCommentDTO.files(), childComment)).willReturn(List.of()); + + // when + noticeCommentUsecase.saveNoticeComment(childCommentDTO, noticeId, userId); + + // then + verify(commentFindService).find(parentComment.getId()); + verify(commentSaveService).save(childComment); + verify(fileSaveService).save(List.of()); + assertThat(parentComment.getChildren()).contains(childComment); + } + @Test @DisplayName("공지사항 댓글 수정 시 작성자와 수정 요청자가 다르면 예외가 발생한다") void updateNoticeComment_throwsException_whenUserIsNotOwner() { - Long userId = 1L; Long different = 2L; Long noticeId = 1L; + Long commentId = 1L; // given User user = UserTestFixture.createActiveUser1(1L); User user2 = UserTestFixture.createActiveUser1(2L); From f8a734770546165f57421a409db1f7edb7f17a99 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 14:19:32 +0900 Subject: [PATCH 10/26] =?UTF-8?q?style:=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/NoticeCommentUsecaseImplTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java index 9648e667..df95e6e3 100644 --- a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -6,13 +6,10 @@ import leets.weeth.domain.comment.application.dto.CommentDTO; import leets.weeth.domain.comment.application.mapper.CommentMapper; import leets.weeth.domain.comment.domain.entity.Comment; -import leets.weeth.domain.comment.domain.service.CommentDeleteService; import leets.weeth.domain.comment.domain.service.CommentFindService; import leets.weeth.domain.comment.domain.service.CommentSaveService; import leets.weeth.domain.comment.test.fixture.CommentTestFixture; import leets.weeth.domain.file.application.mapper.FileMapper; -import leets.weeth.domain.file.domain.service.FileDeleteService; -import leets.weeth.domain.file.domain.service.FileGetService; import leets.weeth.domain.file.domain.service.FileSaveService; import leets.weeth.domain.user.application.exception.UserNotMatchException; import leets.weeth.domain.user.domain.entity.User; @@ -37,11 +34,8 @@ class NoticeCommentUsecaseImplTest { @Mock CommentSaveService commentSaveService; @Mock CommentFindService commentFindService; - @Mock CommentDeleteService commentDeleteService; @Mock FileSaveService fileSaveService; - @Mock FileGetService fileGetService; - @Mock FileDeleteService fileDeleteService; @Mock FileMapper fileMapper; @Mock NoticeFindService noticeFindService; @@ -138,8 +132,4 @@ void updateNoticeComment_throwsException_whenUserIsNotOwner() { noticeCommentUsecase.updateNoticeComment(dto, noticeId, comment.getId(), different) ); } - - @Test - void deleteNoticeComment() { - } } From a6722a05733599767716f139b8e236752a9aa971 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 14:48:50 +0900 Subject: [PATCH 11/26] =?UTF-8?q?test:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=ED=94=BD=EC=8A=A4=EC=B3=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/test/fixture/PostTestFixture.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java diff --git a/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java b/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java new file mode 100644 index 00000000..c9ff3a16 --- /dev/null +++ b/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java @@ -0,0 +1,20 @@ +package leets.weeth.domain.board.test.fixture; + +import leets.weeth.domain.board.domain.entity.Post; +import leets.weeth.domain.board.domain.entity.enums.Category; + +import java.util.ArrayList; + +public class PostTestFixture { + public static Post createPost(Long id, String title, Category category){ + return Post.builder() + .id(id) + .title(title) + .content("내용") + .comments(new ArrayList<>()) + .commentCount(0) + .category(category) + .build(); + } + +} From 93260abfc283806b1e523862242e8f7b7601d052 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 15:17:45 +0900 Subject: [PATCH 12/26] =?UTF-8?q?test:=20=EA=B5=90=EC=9C=A1=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=97=86=EB=8A=94=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/PostUseCaseImplTest.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java new file mode 100644 index 00000000..e253aa02 --- /dev/null +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -0,0 +1,130 @@ +package leets.weeth.domain.board.application.usecase; + +import leets.weeth.domain.board.application.dto.PostDTO; +import leets.weeth.domain.board.application.exception.CategoryAccessDeniedException; +import leets.weeth.domain.board.application.mapper.PostMapper; +import leets.weeth.domain.board.domain.entity.Post; +import leets.weeth.domain.board.domain.entity.enums.Category; +import leets.weeth.domain.board.domain.entity.enums.Part; +import leets.weeth.domain.board.domain.service.PostDeleteService; +import leets.weeth.domain.board.domain.service.PostFindService; +import leets.weeth.domain.board.domain.service.PostSaveService; +import leets.weeth.domain.board.domain.service.PostUpdateService; +import leets.weeth.domain.board.test.fixture.PostTestFixture; +import leets.weeth.domain.comment.application.mapper.CommentMapper; +import leets.weeth.domain.file.application.mapper.FileMapper; +import leets.weeth.domain.file.domain.service.FileDeleteService; +import leets.weeth.domain.file.domain.service.FileGetService; +import leets.weeth.domain.file.domain.service.FileSaveService; +import leets.weeth.domain.user.domain.entity.Cardinal; +import leets.weeth.domain.user.domain.entity.User; +import leets.weeth.domain.user.domain.service.CardinalGetService; +import leets.weeth.domain.user.domain.service.UserCardinalGetService; +import leets.weeth.domain.user.domain.service.UserGetService; +import leets.weeth.domain.user.test.fixture.CardinalTestFixture; +import leets.weeth.domain.user.test.fixture.UserTestFixture; +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 static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.BDDMockito.*; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@ExtendWith(MockitoExtension.class) +class PostUseCaseImplTest { + + @InjectMocks private PostUseCaseImpl postUseCase; + + @Mock private PostSaveService postSaveService; + @Mock private PostFindService postFindService; + @Mock private PostUpdateService postUpdateService; + @Mock private PostDeleteService postDeleteService; + + @Mock private UserGetService userGetService; + @Mock private UserCardinalGetService userCardinalGetService; + @Mock private CardinalGetService cardinalGetService; + + @Mock private FileSaveService fileSaveService; + @Mock private FileGetService fileGetService; + @Mock private FileDeleteService fileDeleteService; + + @Mock private PostMapper mapper; + @Mock private FileMapper fileMapper; + @Mock private CommentMapper commentMapper; + + + @Test + @DisplayName("교육 게시글 저장 성공") + void saveEducation() { + Long userId = 1L; + long postId = 1L; + // given + PostDTO.SaveEducation request = new PostDTO.SaveEducation("제목1", "내용", + List.of(Part.BE), 1, List.of()); + + User user = UserTestFixture.createActiveUser1(1L); + Post post = PostTestFixture.createPost(postId, "제목1", Category.Education); + + given(userGetService.find(userId)).willReturn(user); + given(mapper.fromEducationDto(request, user)).willReturn(post); + given(postSaveService.save(post)).willReturn(post); + given(fileMapper.toFileList(request.files(), post)).willReturn(List.of()); + given(mapper.toSaveResponse(post)).willReturn(new PostDTO.SaveResponse(postId)); + + // when + PostDTO.SaveResponse response = postUseCase.saveEducation(request, userId); + + // then + assertThat(response.id()).isEqualTo(postId); + verify(userGetService).find(userId); + verify(postSaveService).save(post); + verify(mapper).toSaveResponse(post); + + } + + @Test + @DisplayName("관리자 권한이 없는 사용자가 교육 게시글 생성 시 예외를 던진다") + void saveEducation_unauthorizedUser_throwsException(){ + Long userId = 1L; + PostDTO.Save request = new PostDTO.Save("제목", "내용", Category.Education, + null, 1, Part.BE, 1, List.of()); + User user = UserTestFixture.createActiveUser1(1L); + + given(userGetService.find(userId)).willReturn(user); + + // when & then + assertThrows(CategoryAccessDeniedException.class, () -> postUseCase.save(request, userId)); + + } + + @Test + void findPartPosts() { + + } + + @Test + void findEducationPosts() { + } + + @Test + void findStudyNames() { + } + + @Test + void searchEducation() { + } + + @Test + void updateEducation() { + } + + @Test + void checkFileExistsByPost() { + } +} \ No newline at end of file From 35c89c4ea561589d1f0aa784484cf374087f63e2 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 15:53:21 +0900 Subject: [PATCH 13/26] =?UTF-8?q?test:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=ED=94=BD=EC=8A=A4=EC=B3=90=20createEducationPost=EC=99=80=20cr?= =?UTF-8?q?eateResponseAll=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/test/fixture/PostTestFixture.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java b/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java index c9ff3a16..de8ed801 100644 --- a/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java +++ b/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java @@ -1,9 +1,14 @@ package leets.weeth.domain.board.test.fixture; +import leets.weeth.domain.board.application.dto.PostDTO; import leets.weeth.domain.board.domain.entity.Post; import leets.weeth.domain.board.domain.entity.enums.Category; +import leets.weeth.domain.board.domain.entity.enums.Part; +import leets.weeth.domain.user.domain.entity.enums.Role; +import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.List; public class PostTestFixture { public static Post createPost(Long id, String title, Category category){ @@ -17,4 +22,35 @@ public static Post createPost(Long id, String title, Category category){ .build(); } + public static Post createEducationPost(Long id, String title, Category category, List parts, + int cardinalNumber, int week){ + return Post.builder() + .id(id) + .title(title) + .content("내용") + .parts(parts) + .cardinalNumber(cardinalNumber) + .week(week) + .commentCount(0) + .category(Category.Education) + .comments(new ArrayList<>()) + .build(); + } + + public static PostDTO.ResponseAll createResponseAll(Post post){ + return PostDTO.ResponseAll.builder() + .id(post.getId()) + .part(post.getPart()) + .role(Role.USER) + .title(post.getTitle()) + .content(post.getContent()) + .studyName(post.getStudyName()) + .week(post.getWeek()) + .time(LocalDateTime.now()) + .commentCount(post.getCommentCount()) + .hasFile(false) + .isNew(false) + .build(); + } + } From e63fb11f185bdfa39bdc336859f5c80ea2145eea Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 15:54:08 +0900 Subject: [PATCH 14/26] =?UTF-8?q?test:=20=ED=8C=8C=ED=8A=B8=EC=99=80=20?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EC=A1=B0=EA=B1=B4=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- .../usecase/PostUseCaseImplTest.java | 63 ++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index e253aa02..ac5f36f2 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -1,5 +1,6 @@ package leets.weeth.domain.board.application.usecase; +import leets.weeth.domain.board.application.dto.PartPostDTO; import leets.weeth.domain.board.application.dto.PostDTO; import leets.weeth.domain.board.application.exception.CategoryAccessDeniedException; import leets.weeth.domain.board.application.mapper.PostMapper; @@ -16,12 +17,10 @@ import leets.weeth.domain.file.domain.service.FileDeleteService; import leets.weeth.domain.file.domain.service.FileGetService; import leets.weeth.domain.file.domain.service.FileSaveService; -import leets.weeth.domain.user.domain.entity.Cardinal; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.service.CardinalGetService; import leets.weeth.domain.user.domain.service.UserCardinalGetService; import leets.weeth.domain.user.domain.service.UserGetService; -import leets.weeth.domain.user.test.fixture.CardinalTestFixture; import leets.weeth.domain.user.test.fixture.UserTestFixture; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,6 +28,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; +import org.springframework.data.domain.Sort; import java.util.List; @@ -104,8 +107,62 @@ void saveEducation_unauthorizedUser_throwsException(){ } @Test - void findPartPosts() { + @DisplayName("특정 파트와 주차 조건으로 게시글 목록 조회 성공") + void findPartPosts_success() { + // given + PartPostDTO dto = new PartPostDTO( + Part.BE, + Category.Education, + 1, + 2, + "스터디1" + ); + + int pageNumber = 0; + int pageSize = 5; + + Post post1 = PostTestFixture.createEducationPost(1L, "게시글1", Category.Education, List.of(Part.BE), + 1, 1); + Post post2 = PostTestFixture.createEducationPost(2L, "게시글2", Category.Education, List.of(Part.BE), + 1, 2); + + List postList = List.of(post2); + Slice postSlice = new SliceImpl<>(postList); + + PostDTO.ResponseAll response2 = PostTestFixture.createResponseAll(post2); + + given(postFindService.findByPartAndOptionalFilters( + dto.part(), + dto.category(), + dto.cardinalNumber(), + dto.studyName(), + dto.week(), + PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")) + )).willReturn(postSlice); + + given(mapper.toAll(post2, postUseCase.checkFileExistsByPost(post2.getId()))).willReturn(response2); + + // when + Slice result = postUseCase.findPartPosts(dto, pageNumber, pageSize); + // then + // 2주차 게시글만 포함되어 있어야 함 + assertThat(result).isNotNull(); + assertThat(result.getContent()).hasSize(1); + + PostDTO.ResponseAll first = result.getContent().get(0); + + assertThat(first.title()).isEqualTo("게시글2"); + assertThat(first.hasFile()).isFalse(); + + verify(postFindService).findByPartAndOptionalFilters( + dto.part(), + dto.category(), + dto.cardinalNumber(), + dto.studyName(), + dto.week(), + PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")) + ); } @Test From 850be7cceed95edee124e534d06aea7a9cfde2e8 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 16:07:21 +0900 Subject: [PATCH 15/26] =?UTF-8?q?test:=20PostTestFixture.createEducationPo?= =?UTF-8?q?st=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=EC=97=90=20User=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B5=90=EC=9C=A1=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EC=84=B1=EA=B3=B5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/PostUseCaseImplTest.java | 45 +++++++++++++++++-- .../board/test/fixture/PostTestFixture.java | 21 ++++++++- .../user/test/fixture/UserTestFixture.java | 10 +++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index ac5f36f2..4575d733 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -120,10 +120,11 @@ void findPartPosts_success() { int pageNumber = 0; int pageSize = 5; + User user = UserTestFixture.createActiveUser1(); - Post post1 = PostTestFixture.createEducationPost(1L, "게시글1", Category.Education, List.of(Part.BE), + Post post1 = PostTestFixture.createEducationPost(1L, user, "게시글1", Category.Education, List.of(Part.BE), 1, 1); - Post post2 = PostTestFixture.createEducationPost(2L, "게시글2", Category.Education, List.of(Part.BE), + Post post2 = PostTestFixture.createEducationPost(2L, user, "게시글2", Category.Education, List.of(Part.BE), 1, 2); List postList = List.of(post2); @@ -166,7 +167,45 @@ void findPartPosts_success() { } @Test - void findEducationPosts() { + @DisplayName("관리자 권한 사용자가 교육 게시글 목록 조회 시 성공적으로 반환한다") + void findEducationPosts_success_adminUser() { + // given + Long userId = 1L; + Part part = Part.BE; + Integer cardinalNumber = 1; + int pageNumber = 0; + int pageSize = 5; + + User adminUser = UserTestFixture.createAdmin(userId); + + Post post1 = PostTestFixture.createEducationPost(1L, adminUser, "교육글1", Category.Education, List.of(Part.BE), 1, 1); + Post post2 = PostTestFixture.createEducationPost(2L, adminUser, "교육글2", Category.Education, List.of(Part.BE), 1, 2); + List postList = List.of(post1, post2); + Slice postSlice = new SliceImpl<>(postList); + + PostDTO.ResponseEducationAll response1 = PostTestFixture.createResponseEducationAll(post1, false); + PostDTO.ResponseEducationAll response2 = PostTestFixture.createResponseEducationAll(post2, false); + + given(userGetService.find(userId)).willReturn(adminUser); + given(postFindService.findByCategory(part, Category.Education, cardinalNumber, pageNumber, pageSize)) + .willReturn(postSlice); + given(mapper.toEducationAll(post1, postUseCase.checkFileExistsByPost(post1.getId()))).willReturn(response1); + given(mapper.toEducationAll(post2, postUseCase.checkFileExistsByPost(post2.getId()))).willReturn(response2); + + // when + Slice result = + postUseCase.findEducationPosts(userId, part, cardinalNumber, pageNumber, pageSize); + + // then + assertThat(result).isNotNull(); + assertThat(result.getContent()).hasSize(2); + assertThat(result.getContent()) + .extracting(PostDTO.ResponseEducationAll::title) + .containsExactly("교육글1", "교육글2"); + + verify(postFindService).findByCategory(part, Category.Education, cardinalNumber, pageNumber, pageSize); + verify(mapper).toEducationAll(post1, postUseCase.checkFileExistsByPost(post1.getId())); + verify(mapper).toEducationAll(post2, postUseCase.checkFileExistsByPost(post2.getId())); } @Test diff --git a/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java b/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java index de8ed801..996d8bdb 100644 --- a/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java +++ b/src/test/java/leets/weeth/domain/board/test/fixture/PostTestFixture.java @@ -4,6 +4,7 @@ import leets.weeth.domain.board.domain.entity.Post; import leets.weeth.domain.board.domain.entity.enums.Category; import leets.weeth.domain.board.domain.entity.enums.Part; +import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.entity.enums.Role; import java.time.LocalDateTime; @@ -22,10 +23,11 @@ public static Post createPost(Long id, String title, Category category){ .build(); } - public static Post createEducationPost(Long id, String title, Category category, List parts, + public static Post createEducationPost(Long id, User user, String title, Category category, List parts, int cardinalNumber, int week){ return Post.builder() .id(id) + .user(user) .title(title) .content("내용") .parts(parts) @@ -53,4 +55,21 @@ public static PostDTO.ResponseAll createResponseAll(Post post){ .build(); } + public static PostDTO.ResponseEducationAll createResponseEducationAll(Post post, boolean fileExists) { + return PostDTO.ResponseEducationAll.builder() + .id(post.getId()) + .name(post.getUser().getName()) + .parts(post.getParts()) + .position(post.getUser().getPosition()) + .role(post.getUser().getRole()) + .title(post.getTitle()) + .content(post.getContent()) + .time(post.getCreatedAt()) + .commentCount(post.getCommentCount()) + .hasFile(fileExists) + .isNew(false) + .build(); + } + + } diff --git a/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java b/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java index 20009210..6de5df53 100644 --- a/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java +++ b/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java @@ -1,6 +1,7 @@ package leets.weeth.domain.user.test.fixture; import leets.weeth.domain.user.domain.entity.User; +import leets.weeth.domain.user.domain.entity.enums.Role; import leets.weeth.domain.user.domain.entity.enums.Status; public class UserTestFixture { @@ -73,4 +74,13 @@ public static User createWaitingUser2(Long id) { .build(); } + public static User createAdmin(Long id) { + return User.builder() + .name("적순") + .email("admin@test.com") + .status(Status.ACTIVE) + .role(Role.ADMIN) + .build(); + } + } From ad0351177603412680102afa0907052a6b586216 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 16:10:46 +0900 Subject: [PATCH 16/26] =?UTF-8?q?test:=20=EC=8A=A4=ED=84=B0=EB=94=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=86=EC=9D=84=20=EC=8B=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EA=B0=80=20=EB=B0=9C=EC=83=9D=ED=95=98=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/PostUseCaseImplTest.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index 4575d733..e346a4d6 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -35,6 +35,7 @@ import java.util.List; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.BDDMockito.*; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @@ -209,7 +210,22 @@ void findEducationPosts_success_adminUser() { } @Test - void findStudyNames() { + @DisplayName("스터디가 없을 시 예외가 발생하지 않는다") + void findStudyNames_noStudies_doesNotThrowException() { + Part part = Part.BE; + List emptyNames = List.of(); + + PostDTO.ResponseStudyNames expectedResponse = new PostDTO.ResponseStudyNames(emptyNames); + + given(postFindService.findByPart(part)).willReturn(emptyNames); + given(mapper.toStudyNames(emptyNames)).willReturn(expectedResponse); + + // when & then + assertThatCode(() -> postUseCase.findStudyNames(part)) + .doesNotThrowAnyException(); + + verify(postFindService).findByPart(part); + verify(mapper).toStudyNames(emptyNames); } @Test From 6f690e96d5b29de978f60db6954c6543473434fc Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 18:58:08 +0900 Subject: [PATCH 17/26] =?UTF-8?q?test:=20=EB=B3=B8=EC=9D=B8=EC=9D=B4=20?= =?UTF-8?q?=EC=86=8D=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EA=B5=90?= =?UTF-8?q?=EC=9C=A1=20=EC=9E=90=EB=A3=8C=EB=A5=BC=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=ED=95=98=EB=A9=B4=20=EB=B9=88=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/PostUseCaseImplTest.java | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index e346a4d6..564de1f3 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -17,10 +17,12 @@ import leets.weeth.domain.file.domain.service.FileDeleteService; import leets.weeth.domain.file.domain.service.FileGetService; import leets.weeth.domain.file.domain.service.FileSaveService; +import leets.weeth.domain.user.domain.entity.Cardinal; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.service.CardinalGetService; import leets.weeth.domain.user.domain.service.UserCardinalGetService; import leets.weeth.domain.user.domain.service.UserGetService; +import leets.weeth.domain.user.test.fixture.CardinalTestFixture; import leets.weeth.domain.user.test.fixture.UserTestFixture; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -28,10 +30,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Slice; -import org.springframework.data.domain.SliceImpl; -import org.springframework.data.domain.Sort; +import org.springframework.data.domain.*; import java.util.List; @@ -229,11 +228,37 @@ void findStudyNames_noStudies_doesNotThrowException() { } @Test - void searchEducation() { - } + @DisplayName("본인이 속하지 않은 교육 자료를 검색하면 빈 리스트를 반환한다") + void findEducationPosts_whenUserNotInCardinal_returnsEmptyList() { + // given + Long userId = 1L; + Part part = Part.BE; + Integer cardinalNumber = 3; + int pageNumber = 0; + int pageSize = 5; - @Test - void updateEducation() { + User user = UserTestFixture.createActiveUser1(userId); + + Cardinal cardinal = CardinalTestFixture.createCardinal(1, 2025, 1); + + given(userGetService.find(userId)).willReturn(user); + given(cardinalGetService.findByUserSide(cardinalNumber)).willReturn(cardinal); + given(userCardinalGetService.notContains(user, cardinal)).willReturn(true); + + // when + Slice result = + postUseCase.findEducationPosts(userId, part, cardinalNumber, pageNumber, pageSize); + + // then + assertThat(result).isNotNull(); + assertThat(result.getContent()).isEmpty(); + assertThat(result.hasNext()).isFalse(); + + verify(userGetService).find(userId); + verify(cardinalGetService).findByUserSide(cardinalNumber); + verify(userCardinalGetService).notContains(user, cardinal); + + verify(postFindService, never()).findEducationByCardinal(any(), anyInt(), any(Pageable.class)); } @Test From 2224e67c86dedfade265cf59a12171ede11d4ff1 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 19:18:37 +0900 Subject: [PATCH 18/26] =?UTF-8?q?test:=20=ED=8C=8C=EC=9D=BC=20=ED=94=BD?= =?UTF-8?q?=EC=8A=A4=EC=B3=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/file/test/fixture/FileTestFixture.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java diff --git a/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java b/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java new file mode 100644 index 00000000..61bd1575 --- /dev/null +++ b/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java @@ -0,0 +1,15 @@ +package leets.weeth.domain.file.test.fixture; + +import leets.weeth.domain.board.domain.entity.Post; +import leets.weeth.domain.file.domain.entity.File; + +public class FileTestFixture { + public static File createFile(Long id, String fileName, String fileUrl, Post post){ + return File.builder() + .id(id) + .fileName(fileName) + .fileUrl(fileUrl) + .post(post) + .build(); + } +} From c81fb5e3436076886bec8a053d2e580a83c139ee Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 19:19:11 +0900 Subject: [PATCH 19/26] =?UTF-8?q?test:=20=ED=8C=8C=EC=9D=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20che?= =?UTF-8?q?ckFileExistsByPost()=20=EB=B0=98=ED=99=98=EC=9D=B4=20true?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/PostUseCaseImplTest.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index 564de1f3..dea2a4bb 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -14,9 +14,11 @@ import leets.weeth.domain.board.test.fixture.PostTestFixture; import leets.weeth.domain.comment.application.mapper.CommentMapper; import leets.weeth.domain.file.application.mapper.FileMapper; +import leets.weeth.domain.file.domain.entity.File; import leets.weeth.domain.file.domain.service.FileDeleteService; import leets.weeth.domain.file.domain.service.FileGetService; import leets.weeth.domain.file.domain.service.FileSaveService; +import leets.weeth.domain.file.test.fixture.FileTestFixture; import leets.weeth.domain.user.domain.entity.Cardinal; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.service.CardinalGetService; @@ -262,6 +264,18 @@ void findEducationPosts_whenUserNotInCardinal_returnsEmptyList() { } @Test - void checkFileExistsByPost() { + @DisplayName("파일이 존재하는 경우 true를 반환한다") + void fileExists_returnsTrue() { + // given + Long postId = 1L; + File file = FileTestFixture.createFile(postId, "파일1", "url1", null); + + given(fileGetService.findAllByPost(postId)).willReturn(List.of(file)); + // when + boolean fileExists = postUseCase.checkFileExistsByPost(postId); + + // then + assertThat(fileExists).isTrue(); + verify(fileGetService).findAllByPost(postId); } -} \ No newline at end of file +} From 3e1fe9ad44b3391f05f729ff0db0249849bd608b Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 19:48:51 +0900 Subject: [PATCH 20/26] =?UTF-8?q?test:=20=ED=8C=8C=EC=9D=BC=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B3=B5=EC=A7=80=EC=82=AC=ED=95=AD=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=94=BD=EC=8A=A4=EC=B3=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/test/fixture/NoticeTestFixture.java | 11 +++++++++++ .../domain/file/test/fixture/FileTestFixture.java | 14 +++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java b/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java index 85a261bc..870a626d 100644 --- a/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java +++ b/src/test/java/leets/weeth/domain/board/test/fixture/NoticeTestFixture.java @@ -26,6 +26,17 @@ public static Notice createNotice(Long id, String title){ .build(); } + public static Notice createNotice(Long id, String title, User user){ + return Notice.builder() + .id(id) + .title(title) + .content("내용") + .user(user) + .comments(new ArrayList<>()) + .commentCount(0) + .build(); + } + public static Notice createNotice(String title){ return Notice.builder() .title(title) diff --git a/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java b/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java index 61bd1575..18e08c0e 100644 --- a/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java +++ b/src/test/java/leets/weeth/domain/file/test/fixture/FileTestFixture.java @@ -1,15 +1,23 @@ package leets.weeth.domain.file.test.fixture; -import leets.weeth.domain.board.domain.entity.Post; +import leets.weeth.domain.board.domain.entity.Notice; import leets.weeth.domain.file.domain.entity.File; public class FileTestFixture { - public static File createFile(Long id, String fileName, String fileUrl, Post post){ + public static File createFile(Long id, String fileName, String fileUrl){ return File.builder() .id(id) .fileName(fileName) .fileUrl(fileUrl) - .post(post) + .build(); + } + + public static File createFile(Long id, String fileName, String fileUrl, Notice notice){ + return File.builder() + .id(id) + .fileName(fileName) + .fileUrl(fileUrl) + .notice(notice) .build(); } } From 596883af9e876b590e47293b6ef87d37933bbce0 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 19:50:17 +0900 Subject: [PATCH 21/26] =?UTF-8?q?test:=20FileTestFixture.createFile()?= =?UTF-8?q?=EC=9D=98=20Post=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/board/application/usecase/PostUseCaseImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index dea2a4bb..20c8d12b 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -268,7 +268,7 @@ void findEducationPosts_whenUserNotInCardinal_returnsEmptyList() { void fileExists_returnsTrue() { // given Long postId = 1L; - File file = FileTestFixture.createFile(postId, "파일1", "url1", null); + File file = FileTestFixture.createFile(postId, "파일1", "url1"); given(fileGetService.findAllByPost(postId)).willReturn(List.of(file)); // when From 81df671f88d59149edaf67b3dcc0db39dd2981f6 Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 19:51:45 +0900 Subject: [PATCH 22/26] =?UTF-8?q?test:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=88=98=EC=A0=95=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=97=94=ED=8B=B0=ED=8B=B0=20update()=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=EC=8B=9C=20=EC=88=98=EC=A0=95=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/NoticeUsecaseImplTest.java | 82 ++++++++++++++++--- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java index da61c9ef..16749ee0 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java @@ -3,15 +3,22 @@ import leets.weeth.domain.board.application.dto.NoticeDTO; import leets.weeth.domain.board.application.mapper.NoticeMapper; import leets.weeth.domain.board.domain.entity.Notice; +import leets.weeth.domain.board.domain.service.NoticeUpdateService; import leets.weeth.domain.board.test.fixture.NoticeTestFixture; import leets.weeth.domain.board.domain.service.NoticeFindService; +import leets.weeth.domain.file.application.dto.request.FileSaveRequest; +import leets.weeth.domain.file.application.mapper.FileMapper; import leets.weeth.domain.file.domain.entity.File; +import leets.weeth.domain.file.domain.service.FileDeleteService; import leets.weeth.domain.file.domain.service.FileGetService; +import leets.weeth.domain.file.domain.service.FileSaveService; +import leets.weeth.domain.file.test.fixture.FileTestFixture; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.entity.enums.Department; import leets.weeth.domain.user.domain.entity.enums.Position; import leets.weeth.domain.user.domain.entity.enums.Role; -import org.junit.jupiter.api.Disabled; +import leets.weeth.domain.user.test.fixture.UserTestFixture; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -29,17 +36,18 @@ @ExtendWith(MockitoExtension.class) class NoticeUsecaseImplTest { - @Mock - private NoticeFindService noticeFindService; + @InjectMocks private NoticeUsecaseImpl noticeUsecase; - @Mock - private FileGetService fileGetService; + @Mock private NoticeFindService noticeFindService; + @Mock private NoticeUpdateService noticeUpdateService; - @InjectMocks - private NoticeUsecaseImpl noticeUsecase; + @Mock private FileSaveService fileSaveService; + @Mock private FileGetService fileGetService; + @Mock private FileDeleteService fileDeleteService; + + @Mock private NoticeMapper noticeMapper; + @Mock private FileMapper fileMapper; - @Mock - private NoticeMapper noticeMapper; @Test void 공지사항이_최신순으로_정렬되는지() { @@ -182,13 +190,61 @@ class NoticeUsecaseImplTest { verify(noticeFindService, times(1)).search("검색", pageable); } - @Disabled("TODO: update 기능 테스트 구현 필요") @Test - void update() { + @DisplayName("공지사항 수정 시 기존 파일 삭제 후 새 파일로 업데이트된다") + void update_replacesOldFilesWithNewFiles() { + // given + Long noticeId = 1L; + Long userId = 1L; + + User user = UserTestFixture.createActiveUser1(userId); + Notice notice = NoticeTestFixture.createNotice(noticeId, "기존 제목", user); + + File oldFile = FileTestFixture.createFile(1L, "old.pdf", "https://example.com/old.pdf", notice); + List oldFiles = List.of(oldFile); + + NoticeDTO.Update dto = new NoticeDTO.Update("수정된 제목", "수정된 내용", + List.of(new FileSaveRequest("new.pdf", "https://example.com/new.pdf"))); + + File newFile = FileTestFixture.createFile(2L, "new.pdf", "https://example.com/new.pdf", notice); + List newFiles = List.of(newFile); + + NoticeDTO.SaveResponse expectedResponse = new NoticeDTO.SaveResponse(noticeId); + + given(noticeFindService.find(noticeId)).willReturn(notice); + given(fileGetService.findAllByNotice(noticeId)).willReturn(oldFiles); + given(fileMapper.toFileList(dto.files(), notice)).willReturn(newFiles); + given(noticeMapper.toSaveResponse(notice)).willReturn(expectedResponse); + + // when + NoticeDTO.SaveResponse response = noticeUsecase.update(noticeId, dto, userId); + + // then + assertThat(response).isEqualTo(expectedResponse); + + verify(noticeFindService).find(noticeId); + verify(fileGetService).findAllByNotice(noticeId); + verify(fileDeleteService).delete(oldFiles); + verify(fileMapper).toFileList(dto.files(), notice); + verify(fileSaveService).save(newFiles); + verify(noticeUpdateService).update(notice, dto); + verify(noticeMapper).toSaveResponse(notice); } - @Disabled("TODO: delete 기능 테스트 구현 필요") @Test - void delete() { + @DisplayName("공지사항 엔티티 update() 호출 시 제목과 내용이 변경된다") + void update_updatesTitleAndContent() { + // given + Long userId = 1L; + User user = UserTestFixture.createActiveUser1(userId); + Notice notice = NoticeTestFixture.createNotice(1L, "기존 제목", user); + NoticeDTO.Update dto = new NoticeDTO.Update("수정된 제목", "수정된 내용", List.of()); + + // when + notice.update(dto); + + // then + assertThat(notice.getTitle()).isEqualTo(dto.title()); + assertThat(notice.getContent()).isEqualTo(dto.content()); } } From f0432d7d1f3cff81bd6865f9714715b14fd90d7e Mon Sep 17 00:00:00 2001 From: jj Date: Tue, 11 Nov 2025 20:07:26 +0900 Subject: [PATCH 23/26] =?UTF-8?q?test:=20=EC=9C=A0=EC=A0=80=20=ED=94=BD?= =?UTF-8?q?=EC=8A=A4=EC=B2=98=20createAdmin()=EC=97=90=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=EB=90=9C=20id=20=EB=B9=8C=EB=8D=94=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 --- .../leets/weeth/domain/user/test/fixture/UserTestFixture.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java b/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java index 6de5df53..a3668645 100644 --- a/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java +++ b/src/test/java/leets/weeth/domain/user/test/fixture/UserTestFixture.java @@ -76,6 +76,7 @@ public static User createWaitingUser2(Long id) { public static User createAdmin(Long id) { return User.builder() + .id(id) .name("적순") .email("admin@test.com") .status(Status.ACTIVE) From e15b3ef7e30d2a1df13a208af6d5fc328862f366 Mon Sep 17 00:00:00 2001 From: jj Date: Sun, 30 Nov 2025 21:24:29 +0900 Subject: [PATCH 24/26] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B0=9C=ED=96=89=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/board/application/usecase/PostUseCaseImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index 20c8d12b..3fa11f71 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -259,7 +259,6 @@ void findEducationPosts_whenUserNotInCardinal_returnsEmptyList() { verify(userGetService).find(userId); verify(cardinalGetService).findByUserSide(cardinalNumber); verify(userCardinalGetService).notContains(user, cardinal); - verify(postFindService, never()).findEducationByCardinal(any(), anyInt(), any(Pageable.class)); } From 561e00ffad56f699f0fb4c19a769725a13e11645 Mon Sep 17 00:00:00 2001 From: jj Date: Sun, 30 Nov 2025 21:25:10 +0900 Subject: [PATCH 25/26] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20verify=20=EA=B5=AC=EB=AC=B8=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?-=20=ED=95=B5=EC=8B=AC=20=EB=A1=9C=EC=A7=81=20=EC=99=B8=20verif?= =?UTF-8?q?y=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/application/usecase/NoticeUsecaseImplTest.java | 2 -- .../application/usecase/NoticeCommentUsecaseImplTest.java | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java index 16749ee0..16634ecc 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImplTest.java @@ -106,7 +106,6 @@ class NoticeUsecaseImplTest { assertThat(noticeResponses.hasNext()).isTrue(); verify(noticeFindService, times(1)).findRecentNotices(pageable); - } @Test @@ -228,7 +227,6 @@ void update_replacesOldFilesWithNewFiles() { verify(fileMapper).toFileList(dto.files(), notice); verify(fileSaveService).save(newFiles); verify(noticeUpdateService).update(notice, dto); - verify(noticeMapper).toSaveResponse(notice); } @Test diff --git a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java index df95e6e3..3b146690 100644 --- a/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java +++ b/src/test/java/leets/weeth/domain/comment/application/usecase/NoticeCommentUsecaseImplTest.java @@ -69,8 +69,6 @@ void saveNoticeComment() { verify(userGetService).find(userId); verify(noticeFindService).find(noticeId); verify(commentSaveService).save(comment); - verify(fileSaveService).save(List.of()); - verify(commentMapper).fromCommentDto(dto, notice, user, null); assertThat(notice.getComments()).contains(comment); @@ -104,7 +102,7 @@ void saveChildNoticeComment() { // then verify(commentFindService).find(parentComment.getId()); verify(commentSaveService).save(childComment); - verify(fileSaveService).save(List.of()); + assertThat(parentComment.getChildren()).contains(childComment); } From 08eff0c918b353b27f9bbd58c74fd9a2b40a9482 Mon Sep 17 00:00:00 2001 From: jj Date: Sun, 30 Nov 2025 21:47:36 +0900 Subject: [PATCH 26/26] =?UTF-8?q?test:=20given=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=82=B4=20=EC=8B=A4=EC=A0=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/application/usecase/PostUseCaseImplTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java index 3fa11f71..b7612d9a 100644 --- a/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java +++ b/src/test/java/leets/weeth/domain/board/application/usecase/PostUseCaseImplTest.java @@ -143,7 +143,7 @@ void findPartPosts_success() { PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")) )).willReturn(postSlice); - given(mapper.toAll(post2, postUseCase.checkFileExistsByPost(post2.getId()))).willReturn(response2); + given(mapper.toAll(post2, false)).willReturn(response2); // when Slice result = postUseCase.findPartPosts(dto, pageNumber, pageSize); @@ -191,8 +191,8 @@ void findEducationPosts_success_adminUser() { given(userGetService.find(userId)).willReturn(adminUser); given(postFindService.findByCategory(part, Category.Education, cardinalNumber, pageNumber, pageSize)) .willReturn(postSlice); - given(mapper.toEducationAll(post1, postUseCase.checkFileExistsByPost(post1.getId()))).willReturn(response1); - given(mapper.toEducationAll(post2, postUseCase.checkFileExistsByPost(post2.getId()))).willReturn(response2); + given(mapper.toEducationAll(post1, false)).willReturn(response1); + given(mapper.toEducationAll(post2, false)).willReturn(response2); // when Slice result = @@ -206,8 +206,8 @@ void findEducationPosts_success_adminUser() { .containsExactly("교육글1", "교육글2"); verify(postFindService).findByCategory(part, Category.Education, cardinalNumber, pageNumber, pageSize); - verify(mapper).toEducationAll(post1, postUseCase.checkFileExistsByPost(post1.getId())); - verify(mapper).toEducationAll(post2, postUseCase.checkFileExistsByPost(post2.getId())); + verify(mapper).toEducationAll(post1, false); + verify(mapper).toEducationAll(post2, false); } @Test