feat(content-all): 전체 탭 조회 서비스를 추가한다
This commit is contained in:
+254
@@ -0,0 +1,254 @@
|
||||
package kr.co.vividnext.sodalive.v2.content.all.application
|
||||
|
||||
import kr.co.vividnext.sodalive.creator.admin.content.series.SeriesPublishedDaysOfWeek
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.i18n.LangContext
|
||||
import kr.co.vividnext.sodalive.member.Member
|
||||
import kr.co.vividnext.sodalive.member.MemberRole
|
||||
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
|
||||
import kr.co.vividnext.sodalive.v2.common.domain.ContentSort
|
||||
import kr.co.vividnext.sodalive.v2.content.all.domain.MainContentAllAudio
|
||||
import kr.co.vividnext.sodalive.v2.content.all.domain.MainContentAllQueryPolicy
|
||||
import kr.co.vividnext.sodalive.v2.content.all.domain.MainContentAllSeries
|
||||
import kr.co.vividnext.sodalive.v2.content.all.domain.MainContentAllType
|
||||
import kr.co.vividnext.sodalive.v2.content.all.port.out.MainContentAllQueryPort
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertFalse
|
||||
import org.junit.jupiter.api.Assertions.assertTrue
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mockito
|
||||
import java.time.LocalDateTime
|
||||
|
||||
class MainContentAllQueryServiceTest {
|
||||
@Test
|
||||
@DisplayName("AUDIO 타입은 audio port를 기본 필터로 호출한다")
|
||||
fun shouldQueryAudiosForAudioType() {
|
||||
val port = FakeMainContentAllQueryPort()
|
||||
val service = createService(port)
|
||||
|
||||
val tab = service.getContents(type = "AUDIO", sort = "POPULAR", dayOfWeek = "MON", page = 1, size = 20, member = null)
|
||||
|
||||
assertEquals(MainContentAllType.AUDIO, tab.type)
|
||||
assertEquals("audio", port.lastListKind)
|
||||
assertEquals(ContentSort.POPULAR, port.lastSort)
|
||||
assertEquals(20L, port.lastOffset)
|
||||
assertEquals(21, port.lastLimit)
|
||||
assertFalse(port.lastOnlyFree)
|
||||
assertFalse(port.lastOnlyPointAvailable)
|
||||
assertEquals(20, tab.audios.size)
|
||||
assertTrue(tab.hasNext)
|
||||
assertEquals(emptyList<MainContentAllSeries>(), tab.series)
|
||||
assertEquals(null, tab.dayOfWeek)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("FREE 타입은 audio port를 무료 필터로 호출한다")
|
||||
fun shouldQueryAudiosForFreeType() {
|
||||
val port = FakeMainContentAllQueryPort()
|
||||
val service = createService(port)
|
||||
|
||||
val tab = service.getContents(type = "FREE", sort = "LATEST", dayOfWeek = null, page = 0, size = 20, member = null)
|
||||
|
||||
assertEquals(MainContentAllType.FREE, tab.type)
|
||||
assertEquals("audio", port.lastListKind)
|
||||
assertTrue(port.lastOnlyFree)
|
||||
assertFalse(port.lastOnlyPointAvailable)
|
||||
assertEquals(21, port.lastLimit)
|
||||
assertEquals(20, tab.audios.size)
|
||||
assertTrue(tab.hasNext)
|
||||
assertEquals(emptyList<MainContentAllSeries>(), tab.series)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("POINT 타입은 audio port를 포인트 사용 가능 필터로 호출한다")
|
||||
fun shouldQueryAudiosForPointType() {
|
||||
val port = FakeMainContentAllQueryPort()
|
||||
val service = createService(port)
|
||||
|
||||
val tab = service.getContents(type = "POINT", sort = "PRICE_LOW", dayOfWeek = null, page = 0, size = 20, member = null)
|
||||
|
||||
assertEquals(MainContentAllType.POINT, tab.type)
|
||||
assertEquals("audio", port.lastListKind)
|
||||
assertEquals(ContentSort.PRICE_LOW, port.lastSort)
|
||||
assertFalse(port.lastOnlyFree)
|
||||
assertTrue(port.lastOnlyPointAvailable)
|
||||
assertEquals(21, port.lastLimit)
|
||||
assertEquals(20, tab.audios.size)
|
||||
assertTrue(tab.hasNext)
|
||||
assertEquals(emptyList<MainContentAllSeries>(), tab.series)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("SERIES는 요일을 전달하고 ORIGINAL은 original 필터와 dayOfWeek null을 전달한다")
|
||||
fun shouldQuerySeriesByType() {
|
||||
val seriesPort = FakeMainContentAllQueryPort()
|
||||
val service = createService(seriesPort, lang = Lang.JA)
|
||||
|
||||
val seriesTab = service.getContents("SERIES", "POPULAR", "MON", 0, 20, null)
|
||||
|
||||
assertEquals(MainContentAllType.SERIES, seriesTab.type)
|
||||
assertEquals("series", seriesPort.lastListKind)
|
||||
assertEquals(SeriesPublishedDaysOfWeek.MON, seriesPort.lastDayOfWeek)
|
||||
assertEquals("ja", seriesPort.lastLocale)
|
||||
assertFalse(seriesPort.lastOnlyOriginal)
|
||||
|
||||
val originalPort = FakeMainContentAllQueryPort()
|
||||
val originalService = createService(originalPort)
|
||||
|
||||
val originalTab = originalService.getContents("ORIGINAL", "POPULAR", "MON", 0, 20, null)
|
||||
|
||||
assertEquals(MainContentAllType.ORIGINAL, originalTab.type)
|
||||
assertEquals("series", originalPort.lastListKind)
|
||||
assertEquals(null, originalPort.lastDayOfWeek)
|
||||
assertTrue(originalPort.lastOnlyOriginal)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("비회원은 성인 콘텐츠 비노출로 조회하고 회원은 preference 결과를 전달한다")
|
||||
fun shouldPassAdultVisibilityByMember() {
|
||||
val anonymousPort = FakeMainContentAllQueryPort()
|
||||
createService(anonymousPort).getContents("AUDIO", null, null, null, null, null)
|
||||
|
||||
assertEquals(null, anonymousPort.lastMemberId)
|
||||
assertFalse(anonymousPort.lastCanViewAdultContent)
|
||||
|
||||
val member = Member(
|
||||
email = "viewer@test.com",
|
||||
password = "password",
|
||||
nickname = "viewer",
|
||||
role = MemberRole.USER
|
||||
).apply { id = 10L }
|
||||
val memberPort = FakeMainContentAllQueryPort()
|
||||
val preferenceService = Mockito.mock(MemberContentPreferenceService::class.java)
|
||||
Mockito.doReturn(true).`when`(preferenceService).canViewAdultContent(member)
|
||||
|
||||
createService(memberPort, preferenceService).getContents("AUDIO", null, null, null, null, member)
|
||||
|
||||
assertEquals(10L, memberPort.lastMemberId)
|
||||
assertTrue(memberPort.lastCanViewAdultContent)
|
||||
Mockito.verify(preferenceService).canViewAdultContent(member)
|
||||
}
|
||||
|
||||
private fun createService(
|
||||
port: MainContentAllQueryPort,
|
||||
preferenceService: MemberContentPreferenceService = Mockito.mock(MemberContentPreferenceService::class.java),
|
||||
lang: Lang = Lang.EN
|
||||
): MainContentAllQueryService {
|
||||
val langContext = LangContext()
|
||||
langContext.setLang(lang)
|
||||
return MainContentAllQueryService(
|
||||
queryPort = port,
|
||||
memberContentPreferenceService = preferenceService,
|
||||
queryPolicy = MainContentAllQueryPolicy(),
|
||||
langContext = langContext
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private class FakeMainContentAllQueryPort : MainContentAllQueryPort {
|
||||
var lastListKind: String? = null
|
||||
var lastMemberId: Long? = null
|
||||
var lastCanViewAdultContent: Boolean = false
|
||||
var lastSort: ContentSort? = null
|
||||
var lastOffset: Long? = null
|
||||
var lastLimit: Int? = null
|
||||
var lastOnlyFree: Boolean = false
|
||||
var lastOnlyPointAvailable: Boolean = false
|
||||
var lastOnlyOriginal: Boolean = false
|
||||
var lastDayOfWeek: SeriesPublishedDaysOfWeek? = null
|
||||
var lastLocale: String? = null
|
||||
|
||||
override fun countAudios(
|
||||
memberId: Long?,
|
||||
canViewAdultContent: Boolean,
|
||||
now: LocalDateTime,
|
||||
onlyFree: Boolean,
|
||||
onlyPointAvailable: Boolean
|
||||
): Int {
|
||||
lastMemberId = memberId
|
||||
lastCanViewAdultContent = canViewAdultContent
|
||||
lastOnlyFree = onlyFree
|
||||
lastOnlyPointAvailable = onlyPointAvailable
|
||||
return 30
|
||||
}
|
||||
|
||||
override fun findAudios(
|
||||
memberId: Long?,
|
||||
canViewAdultContent: Boolean,
|
||||
now: LocalDateTime,
|
||||
sort: ContentSort,
|
||||
offset: Long,
|
||||
limit: Int,
|
||||
onlyFree: Boolean,
|
||||
onlyPointAvailable: Boolean
|
||||
): List<MainContentAllAudio> {
|
||||
lastListKind = "audio"
|
||||
lastMemberId = memberId
|
||||
lastCanViewAdultContent = canViewAdultContent
|
||||
lastSort = sort
|
||||
lastOffset = offset
|
||||
lastLimit = limit
|
||||
lastOnlyFree = onlyFree
|
||||
lastOnlyPointAvailable = onlyPointAvailable
|
||||
return (1L..limit.toLong()).map { id ->
|
||||
MainContentAllAudio(
|
||||
audioContentId = id,
|
||||
title = "audio-$id",
|
||||
imageUrl = null,
|
||||
price = 0,
|
||||
isAdult = false,
|
||||
isPointAvailable = true,
|
||||
isFirstContent = id == 1L,
|
||||
isOriginalSeries = false,
|
||||
creatorNickname = "creator"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun countSeries(
|
||||
memberId: Long?,
|
||||
canViewAdultContent: Boolean,
|
||||
now: LocalDateTime,
|
||||
onlyOriginal: Boolean,
|
||||
dayOfWeek: SeriesPublishedDaysOfWeek?
|
||||
): Int {
|
||||
lastMemberId = memberId
|
||||
lastCanViewAdultContent = canViewAdultContent
|
||||
lastOnlyOriginal = onlyOriginal
|
||||
lastDayOfWeek = dayOfWeek
|
||||
return 10
|
||||
}
|
||||
|
||||
override fun findSeries(
|
||||
memberId: Long?,
|
||||
canViewAdultContent: Boolean,
|
||||
now: LocalDateTime,
|
||||
sort: ContentSort,
|
||||
offset: Long,
|
||||
limit: Int,
|
||||
onlyOriginal: Boolean,
|
||||
dayOfWeek: SeriesPublishedDaysOfWeek?,
|
||||
locale: String
|
||||
): List<MainContentAllSeries> {
|
||||
lastListKind = "series"
|
||||
lastMemberId = memberId
|
||||
lastCanViewAdultContent = canViewAdultContent
|
||||
lastSort = sort
|
||||
lastOffset = offset
|
||||
lastLimit = limit
|
||||
lastOnlyOriginal = onlyOriginal
|
||||
lastDayOfWeek = dayOfWeek
|
||||
lastLocale = locale
|
||||
return listOf(
|
||||
MainContentAllSeries(
|
||||
seriesId = 1L,
|
||||
title = "series",
|
||||
coverImageUrl = null,
|
||||
creatorNickname = "creator",
|
||||
isOriginal = onlyOriginal,
|
||||
isAdult = false
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user