From 2c2607b6d082e4ec96e6274a7c3998437295be35 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 24 Jun 2026 12:35:26 +0900 Subject: [PATCH] =?UTF-8?q?feat(content-ranking):=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EB=9E=AD=ED=82=B9=20facade=EB=A5=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ranking/application/AudioRankingFacade.kt | 16 ++++++ .../application/AudioRankingQueryService.kt | 17 ++++++ .../application/AudioRankingFacadeTest.kt | 52 +++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacade.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/content/ranking/application/AudioRankingQueryService.kt create mode 100644 src/test/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacadeTest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacade.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacade.kt new file mode 100644 index 00000000..40333589 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacade.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.v2.api.content.ranking.application + +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.v2.api.content.ranking.dto.AudioRankingResponse +import kr.co.vividnext.sodalive.v2.content.ranking.application.AudioRankingQueryService +import kr.co.vividnext.sodalive.v2.content.ranking.domain.AudioRankingType +import org.springframework.stereotype.Component + +@Component +class AudioRankingFacade( + private val queryService: AudioRankingQueryService +) { + fun getRankings(type: AudioRankingType, member: Member?): AudioRankingResponse { + return AudioRankingResponse.from(queryService.getRankings(type, member)) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/ranking/application/AudioRankingQueryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/ranking/application/AudioRankingQueryService.kt new file mode 100644 index 00000000..144fcae2 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/ranking/application/AudioRankingQueryService.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.v2.content.ranking.application + +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.v2.content.ranking.domain.AudioRanking +import kr.co.vividnext.sodalive.v2.content.ranking.domain.AudioRankingType +import org.springframework.stereotype.Service + +@Service +class AudioRankingQueryService { + fun getRankings(type: AudioRankingType, member: Member?): AudioRanking { + return AudioRanking( + showRankChange = false, + type = type, + items = emptyList() + ) + } +} diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacadeTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacadeTest.kt new file mode 100644 index 00000000..85c5178c --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/api/content/ranking/application/AudioRankingFacadeTest.kt @@ -0,0 +1,52 @@ +package kr.co.vividnext.sodalive.v2.api.content.ranking.application + +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.v2.content.ranking.application.AudioRankingQueryService +import kr.co.vividnext.sodalive.v2.content.ranking.domain.AudioRanking +import kr.co.vividnext.sodalive.v2.content.ranking.domain.AudioRankingItem +import kr.co.vividnext.sodalive.v2.content.ranking.domain.AudioRankingType +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.mockito.Mockito + +class AudioRankingFacadeTest { + private val queryService = Mockito.mock(AudioRankingQueryService::class.java) + private val facade = AudioRankingFacade(queryService) + + @Test + @DisplayName("facade는 랭킹 타입과 회원을 쿼리 서비스에 그대로 전달하고 공개 응답으로 변환한다") + fun shouldDelegateTypeAndMemberAndConvertDomainRankingToResponse() { + val member = Mockito.mock(Member::class.java) + val ranking = AudioRanking( + showRankChange = true, + type = AudioRankingType.RISING, + items = listOf( + AudioRankingItem( + contentId = 1L, + title = "audio", + creatorNickname = "creator", + rank = 1, + rankChange = 2, + isNew = false, + coverImageUrl = "https://cdn.test/audio.png" + ) + ) + ) + Mockito.doReturn(ranking).`when`(queryService).getRankings(AudioRankingType.RISING, member) + + val response = facade.getRankings(AudioRankingType.RISING, member) + + Mockito.verify(queryService).getRankings(AudioRankingType.RISING, member) + assertEquals(true, response.showRankChange) + assertEquals(AudioRankingType.RISING, response.type) + assertEquals(1, response.items.size) + assertEquals(1L, response.items[0].contentId) + assertEquals("audio", response.items[0].title) + assertEquals("creator", response.items[0].creatorNickname) + assertEquals(1, response.items[0].rank) + assertEquals(2, response.items[0].rankChange) + assertEquals(false, response.items[0].isNew) + assertEquals("https://cdn.test/audio.png", response.items[0].coverImageUrl) + } +}