From 5b202f54ce6dd05cdd421699da86c603c11d9195 Mon Sep 17 00:00:00 2001 From: Sergejs Luhmirins Date: Wed, 29 Oct 2025 17:06:25 +0200 Subject: [PATCH] MS-1225 Do not reset local data when sync frequency changes --- ...ResetLocalRecordsIfConfigChangedUseCase.kt | 9 +- ...tLocalRecordsIfConfigChangedUseCaseTest.kt | 132 +++++++++++++++++- 2 files changed, 137 insertions(+), 4 deletions(-) diff --git a/infra/sync/src/main/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCase.kt b/infra/sync/src/main/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCase.kt index 9a2b042fbd..cabc592266 100644 --- a/infra/sync/src/main/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCase.kt +++ b/infra/sync/src/main/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCase.kt @@ -23,10 +23,15 @@ internal class ResetLocalRecordsIfConfigChangedUseCase @Inject constructor( } } + // private fun hasPartitionTypeChanged( oldConfig: ProjectConfiguration, newConfig: ProjectConfiguration, ) = (oldConfig.synchronization.down.commCare != newConfig.synchronization.down.commCare) || - (oldConfig.synchronization.down.simprints != newConfig.synchronization.down.simprints) || - (oldConfig.synchronization.down.simprints?.partitionType != newConfig.synchronization.down.simprints?.partitionType) + // This also covers simprints changing from/to null since the partition will always be present if simprints is + ( + oldConfig.synchronization.down.simprints + ?.partitionType != newConfig.synchronization.down.simprints + ?.partitionType + ) } diff --git a/infra/sync/src/test/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCaseTest.kt b/infra/sync/src/test/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCaseTest.kt index 98acdd953e..79f8bc0443 100644 --- a/infra/sync/src/test/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCaseTest.kt +++ b/infra/sync/src/test/java/com/simprints/infra/sync/config/usecase/ResetLocalRecordsIfConfigChangedUseCaseTest.kt @@ -1,6 +1,8 @@ package com.simprints.infra.sync.config.usecase +import com.simprints.core.domain.tokenization.asTokenizableEncrypted import com.simprints.infra.config.store.models.DownSynchronizationConfiguration +import com.simprints.infra.config.store.models.Frequency import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository import com.simprints.infra.eventsync.EventSyncManager import com.simprints.infra.sync.SyncOrchestrator @@ -106,6 +108,7 @@ class ResetLocalRecordsIfConfigChangedUseCaseTest { simprints = synchronizationConfiguration.down.simprints?.copy( partitionType = DownSynchronizationConfiguration.PartitionType.PROJECT, ), + commCare = null, ), ), ), @@ -113,7 +116,7 @@ class ResetLocalRecordsIfConfigChangedUseCaseTest { synchronization = synchronizationConfiguration.copy( down = synchronizationConfiguration.down.copy( simprints = null, - commCare = DownSynchronizationConfiguration.CommCareDownSynchronizationConfiguration + commCare = DownSynchronizationConfiguration.CommCareDownSynchronizationConfiguration, ), ), ), @@ -134,7 +137,7 @@ class ResetLocalRecordsIfConfigChangedUseCaseTest { synchronization = synchronizationConfiguration.copy( down = synchronizationConfiguration.down.copy( simprints = null, - commCare = DownSynchronizationConfiguration.CommCareDownSynchronizationConfiguration + commCare = DownSynchronizationConfiguration.CommCareDownSynchronizationConfiguration, ), ), ), @@ -144,6 +147,7 @@ class ResetLocalRecordsIfConfigChangedUseCaseTest { simprints = synchronizationConfiguration.down.simprints?.copy( partitionType = DownSynchronizationConfiguration.PartitionType.PROJECT, ), + commCare = null, ), ), ), @@ -156,4 +160,128 @@ class ResetLocalRecordsIfConfigChangedUseCaseTest { enrolmentRecordRepository.deleteAll() } } + + @Test + fun `should not reset local records when sync frequency changes`() = runTest { + useCase( + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + frequency = Frequency.ONLY_PERIODICALLY_UP_SYNC, + ), + ), + ), + ), + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + frequency = Frequency.PERIODICALLY, + ), + ), + ), + ), + ) + + coVerify(exactly = 0) { + syncOrchestrator.cancelEventSync() + syncOrchestrator.rescheduleEventSync() + eventSyncManager.resetDownSyncInfo() + enrolmentRecordRepository.deleteAll() + } + } + + @Test + fun `should not reset local records when sync modules changes`() = runTest { + useCase( + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + moduleOptions = listOf("One".asTokenizableEncrypted(), "Two".asTokenizableEncrypted()), + ), + ), + ), + ), + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + moduleOptions = listOf("Three".asTokenizableEncrypted()), + ), + ), + ), + ), + ) + + coVerify(exactly = 0) { + syncOrchestrator.cancelEventSync() + syncOrchestrator.rescheduleEventSync() + eventSyncManager.resetDownSyncInfo() + enrolmentRecordRepository.deleteAll() + } + } + + @Test + fun `should not reset local records when sync max age changes`() = runTest { + useCase( + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + maxAge = "PT24H", + ), + ), + ), + ), + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + maxAge = "PT12H", + ), + ), + ), + ), + ) + + coVerify(exactly = 0) { + syncOrchestrator.cancelEventSync() + syncOrchestrator.rescheduleEventSync() + eventSyncManager.resetDownSyncInfo() + enrolmentRecordRepository.deleteAll() + } + } + + @Test + fun `should not reset local records when sync module count changes`() = runTest { + useCase( + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + maxNbOfModules = 2, + ), + ), + ), + ), + projectConfiguration.copy( + synchronization = synchronizationConfiguration.copy( + down = synchronizationConfiguration.down.copy( + simprints = synchronizationConfiguration.down.simprints?.copy( + maxNbOfModules = 5, + ), + ), + ), + ), + ) + + coVerify(exactly = 0) { + syncOrchestrator.cancelEventSync() + syncOrchestrator.rescheduleEventSync() + eventSyncManager.resetDownSyncInfo() + enrolmentRecordRepository.deleteAll() + } + } }