diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt index cc2e4b58..5090147a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt @@ -4,7 +4,6 @@ import com.amazonaws.services.s3.model.ObjectMetadata import com.fasterxml.jackson.databind.ObjectMapper 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.dto.ChatCharacterBannerListPageResponse 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.ChatCharacterBannerUpdateRequest @@ -59,17 +58,7 @@ class AdminChatBannerController( @RequestParam(defaultValue = "20") size: Int ) = run { val pageable = adminCharacterService.createDefaultPageRequest(page, size) - val banners = bannerService.getActiveBanners(pageable) - val response = ChatCharacterBannerListPageResponse( - totalCount = banners.totalElements, - content = banners.content.map { - ChatCharacterBannerResponse.from( - banner = it, - imageHost = imageHost, - appendLanguageToCharacterName = true - ) - } - ) + val response = bannerService.getActiveBanners(pageable, imageHost) ApiResponse.ok(response) } diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerIntegrationTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerIntegrationTest.kt new file mode 100644 index 00000000..959a4f2c --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerIntegrationTest.kt @@ -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() + } + } +} diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt index 19a37eea..cbe64582 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt @@ -14,8 +14,6 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import org.mockito.Mockito -import org.springframework.data.domain.PageImpl -import org.springframework.data.domain.PageRequest import org.springframework.mock.web.MockMultipartFile import java.net.URL @@ -109,21 +107,6 @@ class AdminChatBannerControllerTest { 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 { val character = ChatCharacter( characterUUID = "character-$id",