feat(content-banner): 오디오 콘텐츠 배너를 언어별로 등록하고 노출한다

This commit is contained in:
2026-04-02 17:55:20 +09:00
parent 3c32559c5d
commit 7f1606a8aa
11 changed files with 508 additions and 6 deletions
@@ -0,0 +1,78 @@
package kr.co.vividnext.sodalive.admin.content.banner
import com.amazonaws.services.s3.AmazonS3Client
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import kr.co.vividnext.sodalive.admin.content.series.AdminContentSeriesRepository
import kr.co.vividnext.sodalive.admin.content.tab.AdminContentMainTabRepository
import kr.co.vividnext.sodalive.aws.s3.S3Uploader
import kr.co.vividnext.sodalive.content.main.banner.AudioContentBanner
import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerType
import kr.co.vividnext.sodalive.event.EventRepository
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.member.MemberRepository
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito
import org.springframework.mock.web.MockMultipartFile
import java.net.URL
class AdminContentBannerServiceTest {
private lateinit var amazonS3Client: AmazonS3Client
private lateinit var s3Uploader: S3Uploader
private lateinit var repository: AdminContentBannerRepository
private lateinit var memberRepository: MemberRepository
private lateinit var seriesRepository: AdminContentSeriesRepository
private lateinit var eventRepository: EventRepository
private lateinit var contentMainTabRepository: AdminContentMainTabRepository
private lateinit var service: AdminContentBannerService
@BeforeEach
fun setUp() {
amazonS3Client = Mockito.mock(AmazonS3Client::class.java)
s3Uploader = S3Uploader(amazonS3Client)
repository = Mockito.mock(AdminContentBannerRepository::class.java)
memberRepository = Mockito.mock(MemberRepository::class.java)
seriesRepository = Mockito.mock(AdminContentSeriesRepository::class.java)
eventRepository = Mockito.mock(EventRepository::class.java)
contentMainTabRepository = Mockito.mock(AdminContentMainTabRepository::class.java)
service = AdminContentBannerService(
s3Uploader = s3Uploader,
repository = repository,
memberRepository = memberRepository,
seriesRepository = seriesRepository,
eventRepository = eventRepository,
contentMainTabRepository = contentMainTabRepository,
objectMapper = jacksonObjectMapper(),
bucket = "test-bucket"
)
}
@Test
@DisplayName("배너 등록 요청의 lang 값을 저장한다")
fun shouldSaveRequestedLangWhenCreatingBanner() {
val image = MockMultipartFile("image", "banner.png", "image/png", "image".toByteArray())
val requestString = """
{"type":"LINK","lang":"ja","tabId":null,"eventId":null,"creatorId":null,"seriesId":null,"link":"https://example.com","isAdult":false}
""".trimIndent()
val savedBannerCaptor = ArgumentCaptor.forClass(AudioContentBanner::class.java)
Mockito.`when`(repository.save(Mockito.any(AudioContentBanner::class.java)))
.thenAnswer {
(it.arguments[0] as AudioContentBanner).also { banner ->
banner.id = 1L
}
}
Mockito.doAnswer { URL("https://cdn.test/${it.arguments[1]}") }
.`when`(amazonS3Client)
.getUrl(Mockito.eq("test-bucket"), Mockito.anyString())
service.createAudioContentMainBanner(image, requestString)
Mockito.verify(repository).save(savedBannerCaptor.capture())
assertEquals(AudioContentBannerType.LINK, savedBannerCaptor.value.type)
assertEquals(Lang.JA, savedBannerCaptor.value.lang)
}
}