Merge pull request 'fix(i18n): 지원하지 않는 원문 언어 번역 작업을 제외한다' (#422) from test into main
Reviewed-on: #422
This commit is contained in:
18
docs/20260507_번역작업원문언어제한.md
Normal file
18
docs/20260507_번역작업원문언어제한.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# 번역 작업 원문 언어 제한
|
||||
|
||||
## 작업 항목
|
||||
- [x] `TranslationJobSchedulerTest`에 지원하지 않는 `sourceLanguage` 입력 시 `TranslationJob`을 저장하지 않는 RED 테스트를 추가한다.
|
||||
- [x] `TranslationJobScheduler`에서 `sourceLanguage`를 소문자 정규화한 뒤 `ko`, `en`, `ja`가 아니면 등록을 중단한다.
|
||||
- [x] focused test와 관련 검증 명령을 실행해 변경 결과를 확인한다.
|
||||
|
||||
## 설계
|
||||
- `TranslationJob` 등록의 최종 방어선인 `TranslationJobScheduler.scheduleMissingTranslation()`에서 검증한다.
|
||||
- 허용값은 현재 번역 지원 언어와 동일하게 `ko`, `en`, `ja`로 제한한다.
|
||||
- 지원하지 않는 원문 언어는 예외를 던지지 않고 기존 early return 흐름처럼 job 등록만 생략한다.
|
||||
|
||||
## 검증 기록
|
||||
- 2026-05-07: RED 확인: `./gradlew test --tests 'kr.co.vividnext.sodalive.i18n.translation.TranslationJobSchedulerTest.shouldNotCreateJobWhenSourceLanguageIsUnsupported'` 실행 시 `TranslationJobSchedulerTest.kt:102`의 `verifyNoInteractions` 검증 실패로 unsupported `sourceLanguage`가 repository 호출까지 진행됨을 확인했다.
|
||||
- 2026-05-07: GREEN 확인: 동일 focused test가 `BUILD SUCCESSFUL`로 통과해 unsupported `sourceLanguage`가 등록되지 않음을 확인했다.
|
||||
- 2026-05-07: 회귀 확인: `./gradlew test --tests 'kr.co.vividnext.sodalive.i18n.translation.TranslationJobSchedulerTest'`가 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-05-07: 스타일 확인: `./gradlew ktlintCheck`가 `BUILD SUCCESSFUL`로 통과했다.
|
||||
- 2026-05-07: Kotlin LSP는 현재 환경에 `.kt` 서버가 설정되어 있지 않아 `lsp_diagnostics` 실행이 불가했다. 대신 Gradle 컴파일 포함 focused/class test와 ktlint로 검증했다.
|
||||
@@ -21,6 +21,8 @@ class TranslationJobScheduler(
|
||||
if (normalizedText.isBlank()) return
|
||||
|
||||
val normalizedSourceLanguage = sourceLanguage.lowercase()
|
||||
if (!SUPPORTED_SOURCE_LANGUAGE_CODES.contains(normalizedSourceLanguage)) return
|
||||
|
||||
val normalizedTargetLanguage = targetLanguage.lowercase()
|
||||
if (normalizedSourceLanguage == normalizedTargetLanguage) return
|
||||
|
||||
@@ -47,4 +49,8 @@ class TranslationJobScheduler(
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val SUPPORTED_SOURCE_LANGUAGE_CODES = setOf("ko", "en", "ja")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,4 +84,21 @@ class TranslationJobSchedulerTest {
|
||||
|
||||
Mockito.verify(jobRepository, Mockito.never()).save(Mockito.any(TranslationJob::class.java))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun shouldNotCreateJobWhenSourceLanguageIsUnsupported() {
|
||||
val jobRepository = Mockito.mock(TranslationJobRepository::class.java)
|
||||
val scheduler = TranslationJobScheduler(jobRepository)
|
||||
|
||||
scheduler.scheduleMissingTranslation(
|
||||
resourceType = LanguageTranslationTargetType.CONTENT,
|
||||
resourceId = 10L,
|
||||
fieldKey = "title",
|
||||
sourceText = "제목",
|
||||
sourceLanguage = "fr",
|
||||
targetLanguage = "en"
|
||||
)
|
||||
|
||||
Mockito.verifyNoInteractions(jobRepository)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user