fix(chat-banner): 관리자 배너 목록에 언어 표기를 추가한다
This commit is contained in:
10
docs/20260402_관리자채팅배너목록언어표기추가.md
Normal file
10
docs/20260402_관리자채팅배너목록언어표기추가.md
Normal file
@@ -0,0 +1,10 @@
|
||||
- [x] 배너 목록 조회 응답 생성 경로와 언어 정보 위치를 확인한다.
|
||||
- [x] 배너 목록 응답의 연결 캐릭터 이름에 배너 등록 언어를 `(언어)` 형식으로 추가한다.
|
||||
- [x] 변경 파일 기준으로 검증을 수행하고 결과를 기록한다.
|
||||
|
||||
## 검증 기록
|
||||
|
||||
### 1차 구현
|
||||
- 무엇을: 관리자 배너 목록 조회 응답에서 연결 캐릭터 이름 뒤에 배너 등록 언어를 `(언어)` 형식으로 붙이도록 수정했다.
|
||||
- 왜: 같은 이름과 같은 이미지의 배너라도 등록 언어가 다르면 관리자 페이지에서 즉시 구분할 수 있어야 하기 때문이다.
|
||||
- 어떻게: `./gradlew test --tests "kr.co.vividnext.sodalive.admin.chat.AdminChatBannerControllerTest"` 실행으로 컨트롤러 테스트를 검증했고, 새 테스트에서 목록 조회 응답 이름이 `character-12 (일본어)`로 반환되는 것을 확인했다. 결과는 `BUILD SUCCESSFUL`이다.
|
||||
@@ -62,7 +62,13 @@ class AdminChatBannerController(
|
||||
val banners = bannerService.getActiveBanners(pageable)
|
||||
val response = ChatCharacterBannerListPageResponse(
|
||||
totalCount = banners.totalElements,
|
||||
content = banners.content.map { ChatCharacterBannerResponse.from(it, imageHost) }
|
||||
content = banners.content.map {
|
||||
ChatCharacterBannerResponse.from(
|
||||
banner = it,
|
||||
imageHost = imageHost,
|
||||
appendLanguageToCharacterName = true
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
ApiResponse.ok(response)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package kr.co.vividnext.sodalive.admin.chat.dto
|
||||
|
||||
import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
|
||||
/**
|
||||
* 캐릭터 배너 응답 DTO
|
||||
@@ -12,14 +13,30 @@ data class ChatCharacterBannerResponse(
|
||||
val characterName: String
|
||||
) {
|
||||
companion object {
|
||||
fun from(banner: ChatCharacterBanner, imageHost: String): ChatCharacterBannerResponse {
|
||||
fun from(
|
||||
banner: ChatCharacterBanner,
|
||||
imageHost: String,
|
||||
appendLanguageToCharacterName: Boolean = false
|
||||
): ChatCharacterBannerResponse {
|
||||
return ChatCharacterBannerResponse(
|
||||
id = banner.id!!,
|
||||
imagePath = "$imageHost/${banner.imagePath}",
|
||||
characterId = banner.chatCharacter.id!!,
|
||||
characterName = banner.chatCharacter.name
|
||||
characterName = if (appendLanguageToCharacterName) {
|
||||
"${banner.chatCharacter.name} (${getLanguageLabel(banner.lang)})"
|
||||
} else {
|
||||
banner.chatCharacter.name
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private fun getLanguageLabel(lang: Lang): String {
|
||||
return when (lang) {
|
||||
Lang.KO -> "한국어"
|
||||
Lang.EN -> "영어"
|
||||
Lang.JA -> "일본어"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ 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
|
||||
|
||||
@@ -107,6 +109,21 @@ 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",
|
||||
|
||||
Reference in New Issue
Block a user