From b32c9556db8336f896d865a54b20af335f80863b Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 30 Jul 2024 13:14:05 +0100 Subject: [PATCH] MS-591 Fix for incorrect subject pool sync behavior after device rotation --- .../screen/ValidateSubjectPoolViewModel.kt | 6 ++++++ .../ValidateSubjectPoolViewModelTest.kt | 21 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/feature/validate-subject-pool/src/main/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModel.kt b/feature/validate-subject-pool/src/main/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModel.kt index 5e6f1aaad5..e0f53c8463 100644 --- a/feature/validate-subject-pool/src/main/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModel.kt +++ b/feature/validate-subject-pool/src/main/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModel.kt @@ -26,8 +26,12 @@ internal class ValidateSubjectPoolViewModel @Inject constructor( val state: LiveData> get() = _state private var _state = MutableLiveData>() + private var isSyncing: Boolean = false fun checkIdentificationPool(subjectQuery: SubjectQuery) = viewModelScope.launch { + if (isSyncing) { + return@launch + } _state.send(ValidateSubjectPoolState.Validating) val validationState = when { @@ -43,7 +47,9 @@ internal class ValidateSubjectPoolViewModel @Inject constructor( fun syncAndRetry(subjectQuery: SubjectQuery) = viewModelScope.launch { _state.send(ValidateSubjectPoolState.SyncInProgress) + isSyncing = true runBlockingSync() + isSyncing = false checkIdentificationPool(subjectQuery) } diff --git a/feature/validate-subject-pool/src/test/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModelTest.kt b/feature/validate-subject-pool/src/test/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModelTest.kt index a20399ebf2..449ca73517 100644 --- a/feature/validate-subject-pool/src/test/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModelTest.kt +++ b/feature/validate-subject-pool/src/test/java/com/simprints/feature/validatepool/screen/ValidateSubjectPoolViewModelTest.kt @@ -3,7 +3,6 @@ package com.simprints.feature.validatepool.screen import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth.assertThat import com.jraska.livedata.test -import com.simprints.core.livedata.LiveDataEventWithContent import com.simprints.feature.validatepool.usecase.HasRecordsUseCase import com.simprints.feature.validatepool.usecase.IsModuleIdNotSyncedUseCase import com.simprints.feature.validatepool.usecase.RunBlockingEventSyncUseCase @@ -15,7 +14,9 @@ import io.mockk.coEvery import io.mockk.coJustRun import io.mockk.coVerify import io.mockk.impl.annotations.MockK -import io.mockk.justRun +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay +import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule @@ -186,4 +187,20 @@ class ValidateSubjectPoolViewModelTest { ) coVerify(exactly = 1) { runBlockingSync() } } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `checkIdentificationPool not re-validating another time when sync in progress`() = runTest { + val subjectQuery = SubjectQuery(projectId = "projectId") + coEvery { hasRecordsUseCase(subjectQuery) } returns true + coEvery { runBlockingSync() } coAnswers { + delay(1000) + } + viewModel.syncAndRetry(subjectQuery) + + viewModel.checkIdentificationPool(subjectQuery) + + advanceUntilIdle() + coVerify(exactly = 1) { hasRecordsUseCase(any()) } + } }