Browse Source

Do not perform any migration on fresh application installation.

pull/3413/head
Benoit Marty 2 weeks ago
parent
commit
54dc8e7c54
  1. 2
      features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt
  2. 6
      features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt
  3. 26
      features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt

2
features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/DefaultMigrationStore.kt

@ -46,7 +46,7 @@ class DefaultMigrationStore @Inject constructor( @@ -46,7 +46,7 @@ class DefaultMigrationStore @Inject constructor(
override fun applicationMigrationVersion(): Flow<Int> {
return store.data.map { prefs ->
prefs[applicationMigrationVersion] ?: 0
prefs[applicationMigrationVersion] ?: -1
}
}
}

6
features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt

@ -53,6 +53,12 @@ class MigrationPresenter @Inject constructor( @@ -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)

26
features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt

@ -35,6 +35,32 @@ class MigrationPresenterTest { @@ -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) }

Loading…
Cancel
Save