Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ internal class EnrolLastBiometricViewModel @Inject constructor(
fun onViewCreated(params: EnrolLastBiometricParams) {
viewModelScope.launch {
params.scannedCredential?.let { scannedCredential ->
if (isCredentialLinkedToAnotherSubject(scannedCredential, params.projectId)) {
val guidToEnrol = getPreviousEnrolmentResult(params.steps)?.subjectId
if (isCredentialLinkedToAnotherSubject(scannedCredential, guidToEnrol = guidToEnrol, projectId = params.projectId)) {
displayAddCredentialDialog(scannedCredential, params.projectId)
return@launch
}
Expand Down Expand Up @@ -119,17 +120,18 @@ internal class EnrolLastBiometricViewModel @Inject constructor(

private suspend fun isCredentialLinkedToAnotherSubject(
scannedCredential: ScannedCredential?,
guidToEnrol: String?,
projectId: String,
): Boolean {
if (scannedCredential == null) return false
if (scannedCredential == null || guidToEnrol == null) return false

return enrolmentRecordRepository
.load(
SubjectQuery(
projectId = projectId,
externalCredential = scannedCredential.credential,
),
).isNotEmpty()
).any { it.subjectId != guidToEnrol }
}

private fun getPreviousEnrolmentResult(steps: List<EnrolLastBiometricStepResult>) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import com.simprints.infra.config.store.tokenization.TokenizationProcessor
import com.simprints.infra.config.sync.ConfigManager
import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository
import com.simprints.infra.enrolment.records.repository.domain.models.Subject
import com.simprints.infra.enrolment.records.repository.domain.models.SubjectQuery
import com.simprints.infra.events.event.domain.models.BiometricReferenceCreationEvent
import com.simprints.infra.events.event.domain.models.BiometricReferenceCreationEvent.BiometricReferenceCreationPayload
import com.simprints.infra.events.event.domain.models.EnrolmentEventV4
Expand Down Expand Up @@ -73,6 +72,7 @@ internal class EnrolLastBiometricViewModelTest {
lateinit var tokenizationProcessor: TokenizationProcessor

private lateinit var viewModel: EnrolLastBiometricViewModel
private val guidToEnrol = "guidToEnrol"

@Before
fun setUp() {
Expand All @@ -88,6 +88,8 @@ internal class EnrolLastBiometricViewModelTest {
mockk<PersonCreationEvent> { every { id } returns SESSION_ID },
)

every { subject.subjectId } returns guidToEnrol

viewModel = EnrolLastBiometricViewModel(
timeHelper = timeHelper,
configManager = configManager,
Expand Down Expand Up @@ -276,7 +278,13 @@ internal class EnrolLastBiometricViewModelTest {
)
} returns decryptedCredential

viewModel.onViewCreated(createParams(listOf()))
viewModel.onViewCreated(
createParams(
listOf(
EnrolLastBiometricStepResult.EnrolLastBiometricsResult(subjectId = "anotherSubjectId"),
),
),
)

val result = viewModel.showAddCredentialDialog
.test()
Expand All @@ -290,12 +298,80 @@ internal class EnrolLastBiometricViewModelTest {
coVerify(exactly = 0) { enrolmentRecordRepository.performActions(any(), any()) }
}

private fun createParams(steps: List<EnrolLastBiometricStepResult>) = EnrolLastBiometricParams(
@Test
fun `add credential dialog is not shown when there is no result`() = runTest {
val decryptedCredential = "decryptedCredential".asTokenizableRaw()
coEvery { enrolmentRecordRepository.load(any()) } returns listOf(subject)
coEvery { configManager.getProject(PROJECT_ID) } returns project
coEvery {
tokenizationProcessor.decrypt(
encrypted = scannedCredential.credential,
tokenKeyType = TokenKeyType.ExternalCredential,
project = project,
)
} returns decryptedCredential

viewModel.onViewCreated(createParams(steps = listOf()))

viewModel.showAddCredentialDialog.test().assertNoValue()
}

@Test
fun `add credential dialog is not shown when there are no credentials`() = runTest {
val decryptedCredential = "decryptedCredential".asTokenizableRaw()
coEvery { enrolmentRecordRepository.load(any()) } returns listOf(subject)
coEvery { configManager.getProject(PROJECT_ID) } returns project
coEvery {
tokenizationProcessor.decrypt(
encrypted = scannedCredential.credential,
tokenKeyType = TokenKeyType.ExternalCredential,
project = project,
)
} returns decryptedCredential

viewModel.onViewCreated(
createParams(
steps = listOf(EnrolLastBiometricStepResult.EnrolLastBiometricsResult(subjectId = subject.subjectId)),
credentials = null,
),
)

viewModel.showAddCredentialDialog.test().assertNoValue()
}

@Test
fun `add credential dialog is not shown when credential is already linked to same subject`() = runTest {
val decryptedCredential = "decryptedCredential".asTokenizableRaw()
coEvery { enrolmentRecordRepository.load(any()) } returns listOf(subject)
coEvery { configManager.getProject(PROJECT_ID) } returns project
coEvery {
tokenizationProcessor.decrypt(
encrypted = scannedCredential.credential,
tokenKeyType = TokenKeyType.ExternalCredential,
project = project,
)
} returns decryptedCredential

viewModel.onViewCreated(
createParams(
listOf(
EnrolLastBiometricStepResult.EnrolLastBiometricsResult(subjectId = subject.subjectId),
),
),
)

viewModel.showAddCredentialDialog.test().assertNoValue()
}

private fun createParams(
steps: List<EnrolLastBiometricStepResult>,
credentials: ScannedCredential? = scannedCredential,
) = EnrolLastBiometricParams(
projectId = PROJECT_ID,
userId = USER_ID,
moduleId = MODULE_ID,
steps = steps,
scannedCredential = scannedCredential,
scannedCredential = credentials,
)

companion object {
Expand Down