diff --git a/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt b/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt index 2fc45b1ef9..fa86d5a068 100644 --- a/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt +++ b/feature/matcher/src/main/java/com/simprints/matcher/screen/MatchViewModel.kt @@ -33,6 +33,8 @@ internal class MatchViewModel @Inject constructor( private val configManager: ConfigManager, private val timeHelper: TimeHelper, ) : ViewModel() { + var isMatcherRunning = false + private set var isInitialized = false private set private var candidatesLoaded = 0 @@ -48,6 +50,8 @@ internal class MatchViewModel @Inject constructor( private val _matchResponse = MutableLiveData>() fun setupMatch(params: MatchParams) = viewModelScope.launch { + if (isMatcherRunning) return@launch + isMatcherRunning = true isInitialized = true val startTime = timeHelper.now() diff --git a/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt b/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt index 7e4ffd3f99..67e2573625 100644 --- a/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt +++ b/feature/matcher/src/test/java/com/simprints/matcher/screen/MatchViewModelTest.kt @@ -355,6 +355,43 @@ internal class MatchViewModelTest { ) } + @Test + fun `setupMatch does not continue when isMatcherRunning is true`() = runTest { + // Seting up a matcher runs in background + coEvery { faceMatcherUseCase.invoke(any(), any()) } returns flow { + emit(MatcherUseCase.MatcherState.LoadingStarted(1)) + emit(MatcherUseCase.MatcherState.CandidateLoaded) + emit( + MatcherUseCase.MatcherState.Success( + matchResultItems = listOf(FaceMatchResult.Item("1", 90f)), + totalCandidates = 1, + matcherName = MATCHER_NAME, + matchBatches = emptyList(), + ), + ) + } + coJustRun { saveMatchEvent.invoke(any(), any(), any(), any(), any(), any(), any()) } + + val states = viewModel.matchState.test() + val matchParams = MatchParams( + probeReferenceId = "referenceId", + probeFaceSamples = listOf(getFaceSample()), + faceSDK = FaceConfiguration.BioSdk.RANK_ONE, + flowType = FlowType.ENROL, + queryForCandidates = mockk {}, + biometricDataSource = BiometricDataSource.Simprints, + ) + + viewModel.setupMatch(matchParams) + assertThat(viewModel.isMatcherRunning).isTrue() + viewModel.setupMatch(matchParams) + advanceUntilIdle() + + coVerify(exactly = 1) { faceMatcherUseCase.invoke(any(), any()) } + // Checking that no new states were emitted. History = (NotStarted, LoadingCandidates LoadingCandidates, Finished) + assertThat(states.valueHistory()).hasSize(4) + } + private fun getFaceSample(): MatchParams.FaceSample = MatchParams.FaceSample(UUID.randomUUID().toString(), Random.nextBytes(20)) private fun getFingerprintSample(): MatchParams.FingerprintSample = MatchParams.FingerprintSample(