@@ -3,6 +3,7 @@ package com.fsck.k9.storage.migrations
33import android.database.sqlite.SQLiteDatabase
44import assertk.all
55import assertk.assertThat
6+ import assertk.assertions.contains
67import assertk.assertions.hasSize
78import assertk.assertions.isEqualTo
89import 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