diff --git a/src/main/java/me/nettee/board/application/service/BoardQueryService.java b/src/main/java/me/nettee/board/application/service/BoardQueryService.java index 3f73ce6..24ef227 100644 --- a/src/main/java/me/nettee/board/application/service/BoardQueryService.java +++ b/src/main/java/me/nettee/board/application/service/BoardQueryService.java @@ -12,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import static me.nettee.board.application.exception.BoardQueryErrorCode.BOARD_FORBIDDEN; import static me.nettee.board.application.exception.BoardQueryErrorCode.BOARD_NOT_FOUND; @Service @@ -22,12 +23,26 @@ public class BoardQueryService implements BoardReadUseCase, BoardReadByStatusesU @Override public BoardDetail getBoard(Long id) { - return boardQueryPort.findById(id) + BoardDetail boardDetail = boardQueryPort.findById(id) .orElseThrow(BOARD_NOT_FOUND::exception); + + if (boardDetail.status() == BoardStatus.SUSPENDED) { + throw BOARD_FORBIDDEN.exception(); + } + + return boardDetail; } @Override public Page findByStatuses(Set statuses, Pageable pageable) { - return boardQueryPort.findByStatusesList(statuses, pageable); + var boardPage = boardQueryPort.findByStatusesList(statuses, pageable); + + var filterBoardPage = boardPage.map(board -> + board.status() == BoardStatus.SUSPENDED + ? new BoardSummary(board.id(), null, board.status(), board.createdAt(), board.updatedAt()) + : board + ); + + return filterBoardPage; } } diff --git a/src/test/kotlin/me/nettee/board/application/service/BoardQueryServiceTest.kt b/src/test/kotlin/me/nettee/board/application/service/BoardQueryServiceTest.kt index ca19d39..a5b66aa 100644 --- a/src/test/kotlin/me/nettee/board/application/service/BoardQueryServiceTest.kt +++ b/src/test/kotlin/me/nettee/board/application/service/BoardQueryServiceTest.kt @@ -3,12 +3,14 @@ package me.nettee.board.application.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.FreeSpec import io.kotest.matchers.shouldBe +import io.mockk.clearMocks import io.mockk.every import io.mockk.mockk import io.mockk.verify import me.nettee.board.application.domain.type.BoardStatus -import me.nettee.board.application.exception.BoardCommandErrorCode.BOARD_NOT_FOUND -import me.nettee.board.application.exception.BoardCommandException +import me.nettee.board.application.exception.BoardQueryErrorCode.BOARD_FORBIDDEN +import me.nettee.board.application.exception.BoardQueryErrorCode.BOARD_NOT_FOUND +import me.nettee.board.application.exception.BoardQueryException import me.nettee.board.application.model.BoardQueryModels.BoardDetail import me.nettee.board.application.model.BoardQueryModels.BoardSummary import me.nettee.board.application.port.BoardQueryPort @@ -23,6 +25,10 @@ class BoardQueryServiceTest : FreeSpec({ val boardQueryPort = mockk() // mocking val boardQueryService = BoardQueryService(boardQueryPort) // 주입 + beforeTest { + clearMocks(boardQueryPort) + } + "BoardQueryService" - { "getBoard" - { "board detail 조회 by board id" { @@ -52,6 +58,35 @@ class BoardQueryServiceTest : FreeSpec({ verify(exactly = 1) { boardQueryPort.findById(boardId) } } + "[예외] boardDetail status가 suspended 일 때 Exception 발생" { + // given + val boardId = 1L + val now = Instant.now() + + val expectedDetail = BoardDetail( + boardId, + "Test Title", + "test Content", + BoardStatus.SUSPENDED, + now, + now + ) + + every { + boardQueryPort.findById(boardId) + } returns Optional.of(expectedDetail) + + // when + val exception = shouldThrow { + boardQueryService.getBoard(boardId) + } + + // then + exception.errorCode shouldBe BOARD_FORBIDDEN + + verify(exactly = 1) { boardQueryPort.findById(boardId) } + } + "board id에 해당하는 게시판이 없으면 예외 반환" { // given val boardId = 999L @@ -60,7 +95,7 @@ class BoardQueryServiceTest : FreeSpec({ } returns Optional.empty() // when & then - val exception = shouldThrow { + val exception = shouldThrow { boardQueryService.getBoard(boardId) } exception.errorCode shouldBe BOARD_NOT_FOUND @@ -87,7 +122,7 @@ class BoardQueryServiceTest : FreeSpec({ ), BoardSummary( 2L, - "Suspended Board", + null, BoardStatus.SUSPENDED, now, now