test #428

Merged
klaus merged 8 commits from test into main 2026-06-29 08:06:51 +00:00
3 changed files with 91 additions and 29 deletions
Showing only changes of commit 235d0c8389 - Show all commits

View File

@@ -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)
} }

View File

@@ -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()
}
}
}

View File

@@ -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",