diff --git a/src/main/java/com/example/solidconnection/report/domain/TargetType.java b/src/main/java/com/example/solidconnection/report/domain/TargetType.java index c48f50ac0..a3a6d68af 100644 --- a/src/main/java/com/example/solidconnection/report/domain/TargetType.java +++ b/src/main/java/com/example/solidconnection/report/domain/TargetType.java @@ -3,5 +3,6 @@ public enum TargetType { POST, + CHAT ; } diff --git a/src/main/java/com/example/solidconnection/report/service/ReportService.java b/src/main/java/com/example/solidconnection/report/service/ReportService.java index 3546861ea..205ca293d 100644 --- a/src/main/java/com/example/solidconnection/report/service/ReportService.java +++ b/src/main/java/com/example/solidconnection/report/service/ReportService.java @@ -1,5 +1,6 @@ package com.example.solidconnection.report.service; +import com.example.solidconnection.chat.repository.ChatMessageRepository; import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.common.exception.ErrorCode; import com.example.solidconnection.community.post.repository.PostRepository; @@ -19,6 +20,7 @@ public class ReportService { private final ReportRepository reportRepository; private final SiteUserRepository siteUserRepository; private final PostRepository postRepository; + private final ChatMessageRepository chatMessageRepository; @Transactional public void createReport(long reporterId, ReportRequest request) { @@ -37,7 +39,12 @@ private void validateReporterExists(long reporterId) { } private void validateTargetExists(TargetType targetType, long targetId) { - if (targetType == TargetType.POST && !postRepository.existsById(targetId)) { + boolean exists = switch (targetType) { + case POST -> postRepository.existsById(targetId); + case CHAT -> chatMessageRepository.existsById(targetId); + }; + + if (!exists) { throw new CustomException(ErrorCode.REPORT_TARGET_NOT_FOUND); } } diff --git a/src/test/java/com/example/solidconnection/report/service/ReportServiceTest.java b/src/test/java/com/example/solidconnection/report/service/ReportServiceTest.java index 23523ae34..cdc9b875f 100644 --- a/src/test/java/com/example/solidconnection/report/service/ReportServiceTest.java +++ b/src/test/java/com/example/solidconnection/report/service/ReportServiceTest.java @@ -3,6 +3,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +import com.example.solidconnection.chat.domain.ChatMessage; +import com.example.solidconnection.chat.domain.ChatRoom; +import com.example.solidconnection.chat.fixture.ChatMessageFixture; +import com.example.solidconnection.chat.fixture.ChatRoomFixture; import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.common.exception.ErrorCode; import com.example.solidconnection.community.board.domain.Board; @@ -45,18 +49,27 @@ class ReportServiceTest { @Autowired private ReportFixture reportFixture; + @Autowired + private ChatRoomFixture chatRoomFixture; + + @Autowired + private ChatMessageFixture chatMessageFixture; + private SiteUser siteUser; private Post post; + private ChatMessage chatMessage; @BeforeEach void setUp() { siteUser = siteUserFixture.사용자(); Board board = boardFixture.자유게시판(); post = postFixture.게시글(board, siteUser); + ChatRoom chatRoom = chatRoomFixture.채팅방(false); + chatMessage = chatMessageFixture.메시지("채팅", siteUser.getId(), chatRoom); } @Nested - class 신고_생성 { + class 포스트_신고 { @Test void 정상적으로_신고한다() { @@ -96,4 +109,47 @@ class 신고_생성 { .hasMessageContaining(ErrorCode.ALREADY_REPORTED_BY_CURRENT_USER.getMessage()); } } + + @Nested + class 채팅_신고 { + + @Test + void 정상적으로_신고한다() { + // given + ReportRequest request = new ReportRequest(ReportType.INSULT, TargetType.CHAT, chatMessage.getId()); + + // when + reportService.createReport(siteUser.getId(), request); + + // then + boolean isSaved = reportRepository.existsByReporterIdAndTargetTypeAndTargetId( + siteUser.getId(), TargetType.CHAT, chatMessage.getId()); + assertThat(isSaved).isTrue(); + } + + @Test + void 신고_대상이_존재하지_않으면_예외가_발생한다() { + // given + long notExistingId = 999L; + ReportRequest request = new ReportRequest(ReportType.SPAM, TargetType.CHAT, notExistingId); + + // when & then + assertThatCode(() -> reportService.createReport(siteUser.getId(), request)) + .isInstanceOf(CustomException.class) + .hasMessageContaining(ErrorCode.REPORT_TARGET_NOT_FOUND.getMessage()); + } + + @Test + void 이미_신고한_경우_예외가_발생한다() { + // given + reportFixture.신고(siteUser.getId(), TargetType.CHAT, chatMessage.getId()); + ReportRequest request = new ReportRequest(ReportType.INSULT, TargetType.CHAT, chatMessage.getId()); + + // when & then + assertThatCode(() -> reportService.createReport(siteUser.getId(), request)) + .isInstanceOf(CustomException.class) + .hasMessageContaining(ErrorCode.ALREADY_REPORTED_BY_CURRENT_USER.getMessage()); + } + } } +