Skip to content

Commit d6971d2

Browse files
authored
fix: Set outdated flag in resolvable import (tolgee#2442)
- Update the translation state when the base is changed upon import from Figma. - Test the new behavior. Also, I discovered that there is no problem with autotranslation of keys upon Figma imports.
1 parent cadcfa4 commit d6971d2

File tree

4 files changed

+121
-12
lines changed

4 files changed

+121
-12
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.tolgee.api.v2.controllers.v2KeyController
2+
3+
import io.tolgee.development.testDataBuilder.data.ResolvableImportTestData
4+
import io.tolgee.fixtures.MachineTranslationTest
5+
import io.tolgee.fixtures.andIsOk
6+
import io.tolgee.fixtures.waitForNotThrowing
7+
import io.tolgee.testing.annotations.ProjectJWTAuthTestMethod
8+
import org.assertj.core.api.Assertions
9+
import org.junit.jupiter.api.BeforeEach
10+
import org.junit.jupiter.api.Test
11+
12+
class KeyControllerResolvableImportAutomationsTest : MachineTranslationTest() {
13+
companion object {
14+
private const val INITIAL_BUCKET_CREDITS = 150000L
15+
private const val TRANSLATED_WITH_GOOGLE_RESPONSE = "changed translated with GOOGLE from en to de"
16+
}
17+
18+
lateinit var testData: ResolvableImportTestData
19+
20+
@BeforeEach
21+
fun setup() {
22+
testData = ResolvableImportTestData()
23+
initMachineTranslationMocks()
24+
initMachineTranslationProperties(INITIAL_BUCKET_CREDITS)
25+
this.projectSupplier = { testData.projectBuilder.self }
26+
}
27+
28+
@Test
29+
@ProjectJWTAuthTestMethod
30+
fun `auto translates on import`() {
31+
val keyName = "test"
32+
saveTestData()
33+
doImport(keyName)
34+
assertThatKeyAutoTranslated(keyName)
35+
}
36+
37+
@Test
38+
@ProjectJWTAuthTestMethod
39+
fun `sets outdated flag on base changed`() {
40+
val keyName = "keyWith2Translations"
41+
saveTestData()
42+
doImport(keyName)
43+
val translation =
44+
keyService.get(testData.projectBuilder.self.id, keyName, null)
45+
.getLangTranslation(testData.secondLanguage)
46+
Assertions.assertThat(translation.outdated).isTrue
47+
}
48+
49+
private fun assertThatKeyAutoTranslated(keyName: String) {
50+
waitForNotThrowing(timeout = 3_000) {
51+
transactionTemplate.execute {
52+
val translatedText =
53+
keyService.get(testData.projectBuilder.self.id, keyName, null)
54+
.getLangTranslation(testData.secondLanguage).text
55+
56+
Assertions.assertThat(
57+
translatedText,
58+
).isEqualTo(TRANSLATED_WITH_GOOGLE_RESPONSE)
59+
}
60+
}
61+
}
62+
63+
fun saveTestData() {
64+
testDataService.saveTestData(testData.root)
65+
userAccount = testData.user
66+
}
67+
68+
fun doImport(keyName: String) {
69+
performProjectAuthPost(
70+
"keys/import-resolvable",
71+
mapOf(
72+
"keys" to
73+
listOf(
74+
mapOf(
75+
"name" to keyName,
76+
"translations" to
77+
mapOf(
78+
"en" to
79+
mapOf(
80+
"text" to "changed",
81+
"resolution" to "OVERRIDE",
82+
),
83+
),
84+
),
85+
),
86+
),
87+
).andIsOk
88+
}
89+
}

backend/data/src/main/kotlin/io/tolgee/development/testDataBuilder/data/ResolvableImportTestData.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package io.tolgee.development.testDataBuilder.data
22

3+
import io.tolgee.model.Language
34
import io.tolgee.model.Screenshot
45
import io.tolgee.model.UserAccount
56
import io.tolgee.model.enums.Scope
7+
import io.tolgee.model.enums.TranslationState
68

79
class ResolvableImportTestData : BaseTestData() {
810
lateinit var key1and2Screenshot: Screenshot
@@ -11,10 +13,11 @@ class ResolvableImportTestData : BaseTestData() {
1113
lateinit var viewOnlyUser: UserAccount
1214
lateinit var keyCreateOnlyUser: UserAccount
1315
lateinit var translateOnlyUser: UserAccount
16+
lateinit var secondLanguage: Language
1417

1518
init {
1619
projectBuilder.apply {
17-
addGerman()
20+
secondLanguage = addGerman().self
1821

1922
addKey("namespace-1", "key-1") {
2023
addTranslation("de", "existing translation")
@@ -35,6 +38,23 @@ class ResolvableImportTestData : BaseTestData() {
3538
addKey("test") {
3639
addTranslation("en", "existing translation")
3740
}
41+
42+
addKey("keyWith2Translations") {
43+
addTranslation("en", "existing translation")
44+
addTranslation {
45+
this.language = secondLanguage
46+
this.text = "existing translation"
47+
this.outdated = false
48+
this.state = TranslationState.REVIEWED
49+
}
50+
}
51+
52+
addAutoTranslationConfig {
53+
usingTm = true
54+
usingPrimaryMtService = true
55+
enableForImport = true
56+
targetLanguage = secondLanguage
57+
}
3858
}
3959

4060
root.addUserAccount {

backend/data/src/main/kotlin/io/tolgee/service/key/ResolvingKeyImporter.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ import io.tolgee.exceptions.NotFoundException
1111
import io.tolgee.exceptions.PermissionException
1212
import io.tolgee.formats.convertToIcuPlurals
1313
import io.tolgee.formats.convertToPluralIfAnyIsPlural
14-
import io.tolgee.model.Language
15-
import io.tolgee.model.Project
16-
import io.tolgee.model.Project_
17-
import io.tolgee.model.Screenshot
18-
import io.tolgee.model.UploadedImage
14+
import io.tolgee.model.*
1915
import io.tolgee.model.enums.Scope
2016
import io.tolgee.model.key.Key
2117
import io.tolgee.model.key.Key_
@@ -53,6 +49,7 @@ class ResolvingKeyImporter(
5349
private var importedKeys: List<Key> = emptyList()
5450
private val updatedTranslationIds = mutableListOf<Long>()
5551
private val isPluralChangedForKeys = mutableMapOf<Long, String>()
52+
private val outdatedKeys: MutableList<Long> = mutableListOf()
5653

5754
operator fun invoke(): KeyImportResolvableResult {
5855
importedKeys = tryImport()
@@ -84,6 +81,12 @@ class ResolvingKeyImporter(
8481

8582
if (validate(translationExists, resolvable, key, language.tag)) return@translations
8683

84+
if (language.base) {
85+
if (isNew || existingTranslation?.text != resolvable.text) {
86+
outdatedKeys.add(key.id)
87+
}
88+
}
89+
8790
if (isEmpty || (!isNew && resolvable.resolution == ImportTranslationResolution.OVERRIDE)) {
8891
translationsToModify.add(TranslationToModify(existingTranslation!!, resolvable.text, false))
8992
return@translations
@@ -143,6 +146,8 @@ class ResolvingKeyImporter(
143146
}
144147

145148
private fun List<TranslationToModify>.save() {
149+
translationService.setOutdatedBatch(outdatedKeys)
150+
146151
this.forEach {
147152
translationService.setTranslation(it.translation, it.text)
148153
updatedTranslationIds.add(it.translation.id)

backend/data/src/main/kotlin/io/tolgee/service/translation/TranslationService.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,7 @@ import io.tolgee.dtos.request.translation.TranslationFilters
88
import io.tolgee.events.OnTranslationsSet
99
import io.tolgee.exceptions.BadRequestException
1010
import io.tolgee.exceptions.NotFoundException
11-
import io.tolgee.formats.PluralForms
12-
import io.tolgee.formats.StringIsNotPluralException
13-
import io.tolgee.formats.convertToIcuPlural
14-
import io.tolgee.formats.getPluralForms
15-
import io.tolgee.formats.normalizePlurals
16-
import io.tolgee.formats.optimizePluralForms
11+
import io.tolgee.formats.*
1712
import io.tolgee.helpers.TextHelper
1813
import io.tolgee.model.ILanguage
1914
import io.tolgee.model.Language

0 commit comments

Comments
 (0)