feat(admin-content): 관리자 콘텐츠 개별 정산 요율 수정을 지원한다
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
package kr.co.vividnext.sodalive.admin.content
|
||||
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import kr.co.vividnext.sodalive.admin.content.curation.AdminContentCurationRepository
|
||||
import kr.co.vividnext.sodalive.admin.content.tab.AdminContentMainTabRepository
|
||||
import kr.co.vividnext.sodalive.admin.content.theme.AdminContentThemeRepository
|
||||
import kr.co.vividnext.sodalive.aws.cloudfront.AudioContentCloudFront
|
||||
import kr.co.vividnext.sodalive.aws.s3.S3Uploader
|
||||
import kr.co.vividnext.sodalive.common.SodaException
|
||||
import kr.co.vividnext.sodalive.content.AudioContent
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertNull
|
||||
import org.junit.jupiter.api.Assertions.assertThrows
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.Mockito
|
||||
import java.util.Optional
|
||||
|
||||
class AdminContentServiceTest {
|
||||
private lateinit var repository: AdminContentRepository
|
||||
private lateinit var themeRepository: AdminContentThemeRepository
|
||||
private lateinit var audioContentCloudFront: AudioContentCloudFront
|
||||
private lateinit var curationRepository: AdminContentCurationRepository
|
||||
private lateinit var contentMainTabRepository: AdminContentMainTabRepository
|
||||
private lateinit var s3Uploader: S3Uploader
|
||||
private lateinit var service: AdminContentService
|
||||
|
||||
@BeforeEach
|
||||
fun setup() {
|
||||
repository = Mockito.mock(AdminContentRepository::class.java)
|
||||
themeRepository = Mockito.mock(AdminContentThemeRepository::class.java)
|
||||
audioContentCloudFront = Mockito.mock(AudioContentCloudFront::class.java)
|
||||
curationRepository = Mockito.mock(AdminContentCurationRepository::class.java)
|
||||
contentMainTabRepository = Mockito.mock(AdminContentMainTabRepository::class.java)
|
||||
s3Uploader = Mockito.mock(S3Uploader::class.java)
|
||||
|
||||
service = AdminContentService(
|
||||
repository = repository,
|
||||
themeRepository = themeRepository,
|
||||
audioContentCloudFront = audioContentCloudFront,
|
||||
curationRepository = curationRepository,
|
||||
contentMainTabRepository = contentMainTabRepository,
|
||||
objectMapper = jacksonObjectMapper(),
|
||||
s3Uploader = s3Uploader,
|
||||
bucket = "test-bucket"
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 콘텐츠 수정은 유효한 개별 정산 요율을 저장한다")
|
||||
fun shouldUpdateSettlementRatioWhenValidValueIsProvided() {
|
||||
val audioContent = createAudioContent(settlementRatio = 70)
|
||||
Mockito.`when`(repository.findById(1L)).thenReturn(Optional.of(audioContent))
|
||||
|
||||
service.updateAudioContent(
|
||||
coverImage = null,
|
||||
requestString = """
|
||||
{"id":1,"isDefaultCoverImage":false,"settlementRatio":80}
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
assertEquals(80, audioContent.settlementRatio)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 콘텐츠 수정은 삭제 플래그로 개별 정산 요율을 삭제한다")
|
||||
fun shouldDeleteSettlementRatioWhenDeleteFlagIsTrue() {
|
||||
val audioContent = createAudioContent(settlementRatio = 70)
|
||||
Mockito.`when`(repository.findById(1L)).thenReturn(Optional.of(audioContent))
|
||||
|
||||
service.updateAudioContent(
|
||||
coverImage = null,
|
||||
requestString = """
|
||||
{"id":1,"isDefaultCoverImage":false,"isSettlementRatioDeleted":true}
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
assertNull(audioContent.settlementRatio)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 콘텐츠 수정은 삭제 플래그와 정산 요율을 함께 보내면 예외를 던진다")
|
||||
fun shouldThrowWhenDeleteFlagAndSettlementRatioAreProvidedTogether() {
|
||||
val audioContent = createAudioContent(settlementRatio = 70)
|
||||
Mockito.`when`(repository.findById(1L)).thenReturn(Optional.of(audioContent))
|
||||
|
||||
val exception = assertThrows(SodaException::class.java) {
|
||||
service.updateAudioContent(
|
||||
coverImage = null,
|
||||
requestString = """
|
||||
{"id":1,"isDefaultCoverImage":false,"settlementRatio":80,"isSettlementRatioDeleted":true}
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
assertEquals("common.error.invalid_request", exception.messageKey)
|
||||
assertEquals(70, audioContent.settlementRatio)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 콘텐츠 수정은 삭제 플래그와 null 정산 요율 키를 함께 보내도 예외를 던진다")
|
||||
fun shouldThrowWhenDeleteFlagAndNullSettlementRatioKeyAreProvidedTogether() {
|
||||
val audioContent = createAudioContent(settlementRatio = 70)
|
||||
Mockito.`when`(repository.findById(1L)).thenReturn(Optional.of(audioContent))
|
||||
|
||||
val exception = assertThrows(SodaException::class.java) {
|
||||
service.updateAudioContent(
|
||||
coverImage = null,
|
||||
requestString = """
|
||||
{"id":1,"isDefaultCoverImage":false,"settlementRatio":null,"isSettlementRatioDeleted":true}
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
assertEquals("common.error.invalid_request", exception.messageKey)
|
||||
assertEquals(70, audioContent.settlementRatio)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 콘텐츠 수정은 범위를 벗어난 정산 요율이면 예외를 던진다")
|
||||
fun shouldThrowWhenSettlementRatioIsOutOfRange() {
|
||||
val audioContent = createAudioContent(settlementRatio = 70)
|
||||
Mockito.`when`(repository.findById(1L)).thenReturn(Optional.of(audioContent))
|
||||
|
||||
val exception = assertThrows(SodaException::class.java) {
|
||||
service.updateAudioContent(
|
||||
coverImage = null,
|
||||
requestString = """
|
||||
{"id":1,"isDefaultCoverImage":false,"settlementRatio":101}
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
assertEquals("common.error.invalid_request", exception.messageKey)
|
||||
assertEquals(70, audioContent.settlementRatio)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("관리자 콘텐츠 수정은 삭제 플래그와 정산 요율이 없으면 기존 값을 유지한다")
|
||||
fun shouldKeepSettlementRatioWhenNoSettlementRatioFieldsAreProvided() {
|
||||
val audioContent = createAudioContent(settlementRatio = 70)
|
||||
Mockito.`when`(repository.findById(1L)).thenReturn(Optional.of(audioContent))
|
||||
|
||||
service.updateAudioContent(
|
||||
coverImage = null,
|
||||
requestString = """
|
||||
{"id":1,"isDefaultCoverImage":false}
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
assertEquals(70, audioContent.settlementRatio)
|
||||
}
|
||||
|
||||
private fun createAudioContent(settlementRatio: Int?): AudioContent {
|
||||
return AudioContent(
|
||||
title = "title",
|
||||
detail = "detail",
|
||||
languageCode = "ko",
|
||||
price = 100,
|
||||
settlementRatio = settlementRatio
|
||||
).apply {
|
||||
id = 1L
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user