fix(admin-chat): 배너 목록 응답 위임을 적용한다
This commit is contained in:
@@ -4,7 +4,6 @@ import com.amazonaws.services.s3.model.ObjectMetadata
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
import kr.co.vividnext.sodalive.admin.chat.character.dto.ChatCharacterSearchListPageResponse
|
import kr.co.vividnext.sodalive.admin.chat.character.dto.ChatCharacterSearchListPageResponse
|
||||||
import kr.co.vividnext.sodalive.admin.chat.character.service.AdminChatCharacterService
|
import kr.co.vividnext.sodalive.admin.chat.character.service.AdminChatCharacterService
|
||||||
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerListPageResponse
|
|
||||||
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerRegisterRequest
|
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerRegisterRequest
|
||||||
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerResponse
|
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerResponse
|
||||||
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerUpdateRequest
|
import kr.co.vividnext.sodalive.admin.chat.dto.ChatCharacterBannerUpdateRequest
|
||||||
@@ -59,17 +58,7 @@ class AdminChatBannerController(
|
|||||||
@RequestParam(defaultValue = "20") size: Int
|
@RequestParam(defaultValue = "20") size: Int
|
||||||
) = run {
|
) = run {
|
||||||
val pageable = adminCharacterService.createDefaultPageRequest(page, size)
|
val pageable = adminCharacterService.createDefaultPageRequest(page, size)
|
||||||
val banners = bannerService.getActiveBanners(pageable)
|
val response = bannerService.getActiveBanners(pageable, imageHost)
|
||||||
val response = ChatCharacterBannerListPageResponse(
|
|
||||||
totalCount = banners.totalElements,
|
|
||||||
content = banners.content.map {
|
|
||||||
ChatCharacterBannerResponse.from(
|
|
||||||
banner = it,
|
|
||||||
imageHost = imageHost,
|
|
||||||
appendLanguageToCharacterName = true
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
ApiResponse.ok(response)
|
ApiResponse.ok(response)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
package kr.co.vividnext.sodalive.admin.chat
|
||||||
|
|
||||||
|
import kr.co.vividnext.sodalive.chat.character.ChatCharacter
|
||||||
|
import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner
|
||||||
|
import kr.co.vividnext.sodalive.i18n.Lang
|
||||||
|
import kr.co.vividnext.sodalive.member.Member
|
||||||
|
import kr.co.vividnext.sodalive.member.MemberRole
|
||||||
|
import kr.co.vividnext.sodalive.support.EmbeddedRedisInitializer
|
||||||
|
import org.junit.jupiter.api.DisplayName
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest
|
||||||
|
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user
|
||||||
|
import org.springframework.test.annotation.DirtiesContext
|
||||||
|
import org.springframework.test.context.ContextConfiguration
|
||||||
|
import org.springframework.test.web.servlet.MockMvc
|
||||||
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
|
||||||
|
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath
|
||||||
|
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
|
||||||
|
import org.springframework.transaction.support.TransactionTemplate
|
||||||
|
import javax.persistence.EntityManager
|
||||||
|
|
||||||
|
@SpringBootTest(
|
||||||
|
properties = [
|
||||||
|
"cloud.aws.cloud-front.host=https://cdn.test",
|
||||||
|
"spring.datasource.url=jdbc:h2:mem:admin-chat-banner-controller-integration;" +
|
||||||
|
"MODE=MySQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=VALUE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
@AutoConfigureMockMvc
|
||||||
|
@ContextConfiguration(initializers = [EmbeddedRedisInitializer::class])
|
||||||
|
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
|
||||||
|
class AdminChatBannerControllerIntegrationTest @Autowired constructor(
|
||||||
|
private val mockMvc: MockMvc,
|
||||||
|
private val entityManager: EntityManager,
|
||||||
|
private val transactionTemplate: TransactionTemplate
|
||||||
|
) {
|
||||||
|
@Test
|
||||||
|
@DisplayName("관리자 채팅 배너 목록 API는 OSIV off 환경에서 lazy 초기화 예외 없이 응답한다")
|
||||||
|
fun shouldReturnAdminChatBannerListWhenOpenInViewIsDisabled() {
|
||||||
|
createBannerFixture()
|
||||||
|
|
||||||
|
mockMvc.perform(
|
||||||
|
get("/admin/chat/banner/list")
|
||||||
|
.param("page", "0")
|
||||||
|
.param("size", "20")
|
||||||
|
.with(user("admin").roles("ADMIN"))
|
||||||
|
)
|
||||||
|
.andExpect(status().isOk)
|
||||||
|
.andExpect(jsonPath("$.success").value(true))
|
||||||
|
.andExpect(jsonPath("$.data.totalCount").value(1))
|
||||||
|
.andExpect(jsonPath("$.data.content[0].characterName").value("character-admin-banner (일본어)"))
|
||||||
|
.andExpect(jsonPath("$.data.content[0].imagePath").value("https://cdn.test/banner/jp.png"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createBannerFixture() {
|
||||||
|
transactionTemplate.execute {
|
||||||
|
val creator = Member(
|
||||||
|
email = "admin-chat-banner-controller@test.com",
|
||||||
|
password = "password",
|
||||||
|
nickname = "admin-chat-banner-creator",
|
||||||
|
role = MemberRole.CREATOR
|
||||||
|
)
|
||||||
|
entityManager.persist(creator)
|
||||||
|
|
||||||
|
val character = ChatCharacter(
|
||||||
|
characterUUID = "character-admin-banner-controller",
|
||||||
|
name = "character-admin-banner",
|
||||||
|
description = "description",
|
||||||
|
systemPrompt = "system-prompt"
|
||||||
|
).apply {
|
||||||
|
creatorMember = creator
|
||||||
|
}
|
||||||
|
entityManager.persist(character)
|
||||||
|
|
||||||
|
entityManager.persist(
|
||||||
|
ChatCharacterBanner(
|
||||||
|
imagePath = "banner/jp.png",
|
||||||
|
chatCharacter = character,
|
||||||
|
sortOrder = 1,
|
||||||
|
lang = Lang.JA
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
entityManager.flush()
|
||||||
|
entityManager.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,8 +14,6 @@ import org.junit.jupiter.api.Assertions.assertEquals
|
|||||||
import org.junit.jupiter.api.Assertions.assertTrue
|
import org.junit.jupiter.api.Assertions.assertTrue
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.mockito.Mockito
|
import org.mockito.Mockito
|
||||||
import org.springframework.data.domain.PageImpl
|
|
||||||
import org.springframework.data.domain.PageRequest
|
|
||||||
import org.springframework.mock.web.MockMultipartFile
|
import org.springframework.mock.web.MockMultipartFile
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
@@ -109,21 +107,6 @@ class AdminChatBannerControllerTest {
|
|||||||
Mockito.verify(bannerService).registerBanner(2L, "", null)
|
Mockito.verify(bannerService).registerBanner(2L, "", null)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun shouldAppendBannerLanguageToCharacterNameInBannerList() {
|
|
||||||
val pageable = PageRequest.of(0, 20)
|
|
||||||
val japaneseBanner = createBanner(id = 12L, lang = Lang.JA, imagePath = "banner/jp.png")
|
|
||||||
|
|
||||||
Mockito.`when`(adminCharacterService.createDefaultPageRequest(0, 20)).thenReturn(pageable)
|
|
||||||
Mockito.`when`(bannerService.getActiveBanners(pageable))
|
|
||||||
.thenReturn(PageImpl(listOf(japaneseBanner), pageable, 1))
|
|
||||||
|
|
||||||
val response = controller.getBannerList(page = 0, size = 20)
|
|
||||||
|
|
||||||
assertTrue(response.success)
|
|
||||||
assertEquals("character-12 (일본어)", response.data?.content?.first()?.characterName)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createBanner(id: Long, lang: Lang, imagePath: String): ChatCharacterBanner {
|
private fun createBanner(id: Long, lang: Lang, imagePath: String): ChatCharacterBanner {
|
||||||
val character = ChatCharacter(
|
val character = ChatCharacter(
|
||||||
characterUUID = "character-$id",
|
characterUUID = "character-$id",
|
||||||
|
|||||||
Reference in New Issue
Block a user