Skip to content

Commit eb2b3e4

Browse files
Merge pull request #9837 from rafaeltonholo/chore/exclude-outbox-folder-from-migration-90
chore(migration-v90): add extra where clause to ensure the outbox folder or local folder's won't change
2 parents 175c728 + 66e71e7 commit eb2b3e4

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

legacy/storage/src/main/java/com/fsck/k9/storage/migrations/MigrationTo90.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,10 @@ internal class MigrationTo90(
130130
|UPDATE folders
131131
| SET server_id = REPLACE(server_id, '$imapPrefix', '')
132132
|WHERE
133-
| server_id LIKE '$imapPrefix%'
133+
| server_id IS NOT NULL
134+
| AND server_id LIKE '$imapPrefix%'
135+
| AND type <> 'outbox'
136+
| AND local_only <> 1
134137
""".trimMargin()
135138
}
136139
}

legacy/storage/src/test/java/com/fsck/k9/storage/migrations/MigrationTo90Test.kt

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.fsck.k9.storage.migrations
33
import android.database.sqlite.SQLiteDatabase
44
import assertk.all
55
import assertk.assertThat
6+
import assertk.assertions.contains
67
import assertk.assertions.hasSize
78
import assertk.assertions.isEqualTo
89
import com.fsck.k9.mail.AuthType
@@ -187,6 +188,80 @@ class MigrationTo90Test : KoinTest {
187188
}
188189
}
189190

191+
@Test
192+
fun `given the server return an imap prefix - when folder's is local only - server_id must not be changed`() {
193+
// Arrange
194+
val prefix = "INBOX"
195+
val folderDelimiter = "."
196+
populateDatabase(serverIdPrefix = prefix, folderPathDelimiter = folderDelimiter)
197+
val localOnlyServerId = "$prefix${folderDelimiter}Local Only"
198+
199+
database.createFolder("Local Only", isLocalOnly = true, serverId = localOnlyServerId)
200+
201+
val imapStore = createImapStoreSpy(
202+
imapPrefix = prefix,
203+
folderPathDelimiter = folderDelimiter,
204+
)
205+
val incomingServerSettings = createIncomingServerSettings(pathPrefix = prefix, autoDetectNamespace = false)
206+
val account = createAccount(
207+
incomingServerSettings = incomingServerSettings,
208+
folderPathDelimiter = folderDelimiter,
209+
)
210+
val migrationHelper = createMigrationsHelper(account)
211+
val migration = MigrationTo90(
212+
db = database,
213+
migrationsHelper = migrationHelper,
214+
imapStoreFactory = createImapStoreFactory(imapStore),
215+
)
216+
217+
// Act
218+
migration.removeImapPrefixFromFolderServerId()
219+
val actual = database.readFolders().map { it.serverId }
220+
testLogger.dumpLogs()
221+
222+
// Assert
223+
verify(imapStore, times(1)).fetchImapPrefix()
224+
225+
assertThat(actual).contains(localOnlyServerId)
226+
}
227+
228+
@Test
229+
fun `given the server return an imap prefix - when folder's is an outbox - server_id must not be changed`() {
230+
// Arrange
231+
val prefix = "INBOX"
232+
val folderDelimiter = "."
233+
populateDatabase(serverIdPrefix = prefix, folderPathDelimiter = folderDelimiter)
234+
val outboxFolderServerId = "$prefix${folderDelimiter}Outbox"
235+
236+
database.createFolder("Outbox", isLocalOnly = true, serverId = outboxFolderServerId, type = "outbox")
237+
238+
val imapStore = createImapStoreSpy(
239+
imapPrefix = prefix,
240+
folderPathDelimiter = folderDelimiter,
241+
)
242+
val incomingServerSettings = createIncomingServerSettings(pathPrefix = prefix, autoDetectNamespace = false)
243+
val account = createAccount(
244+
incomingServerSettings = incomingServerSettings,
245+
folderPathDelimiter = folderDelimiter,
246+
)
247+
val migrationHelper = createMigrationsHelper(account)
248+
val migration = MigrationTo90(
249+
db = database,
250+
migrationsHelper = migrationHelper,
251+
imapStoreFactory = createImapStoreFactory(imapStore),
252+
)
253+
254+
// Act
255+
migration.removeImapPrefixFromFolderServerId()
256+
val actual = database.readFolders().map { it.serverId }
257+
testLogger.dumpLogs()
258+
259+
// Assert
260+
verify(imapStore, times(1)).fetchImapPrefix()
261+
262+
assertThat(actual).contains(outboxFolderServerId)
263+
}
264+
190265
@Test
191266
fun `given a non-imap account - when running the migration - server_id must keep the same value`() {
192267
// Arrange
@@ -403,6 +478,7 @@ class MigrationTo90Test : KoinTest {
403478
database.createFolder(
404479
name = folderName,
405480
serverId = serverIdPrefix?.let { prefix -> "$prefix$folderPathDelimiter$folderName" } ?: folderName,
481+
isLocalOnly = false,
406482
)
407483
}
408484
}

0 commit comments

Comments
 (0)