diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt index a0158061e2..3a0c211421 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt @@ -46,7 +46,7 @@ class DefaultMigrationStore @Inject constructor( override fun applicationMigrationVersion(): Flow { return store.data.map { prefs -> - prefs[applicationMigrationVersion] ?: 0 + prefs[applicationMigrationVersion] ?: -1 } } } diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt index d157566e24..4c452b688a 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt @@ -53,6 +53,12 @@ class MigrationPresenter @Inject constructor( LaunchedEffect(migrationStoreVersion) { val migrationValue = migrationStoreVersion ?: return@LaunchedEffect + if (migrationValue == -1) { + // Fresh install, no migration needed + Timber.d("Fresh install, no migration needed.") + migrationStore.setApplicationMigrationVersion(lastMigration) + return@LaunchedEffect + } if (migrationValue == lastMigration) { Timber.d("Current app migration version: $migrationValue. No migration needed.") migrationAction = AsyncData.Success(Unit) diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt index 29be8682e3..0e12c8ae26 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt @@ -35,6 +35,32 @@ class MigrationPresenterTest { @get:Rule val warmUpRule = WarmUpRule() + @Test + fun `present - no migration should occurs on fresh installation, and last version should be stored`() = runTest { + val migrations = (1..10).map { order -> + FakeAppMigration( + order = order, + migrateLambda = LambdaNoParamRecorder(ensureNeverCalled = true) { }, + ) + } + val store = InMemoryMigrationStore(initialApplicationMigrationVersion = -1) + val presenter = createPresenter( + migrationStore = store, + migrations = migrations.toSet(), + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.migrationAction).isEqualTo(AsyncData.Uninitialized) + skipItems(1) + awaitItem().also { state -> + assertThat(state.migrationAction).isEqualTo(AsyncData.Success(Unit)) + } + assertThat(store.applicationMigrationVersion().first()).isEqualTo(migrations.maxOf { it.order }) + } + } + @Test fun `present - no migration should occurs if ApplicationMigrationVersion is the last one`() = runTest { val migrations = (1..10).map { FakeAppMigration(it) }