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 @@ -5,11 +5,12 @@ import com.simprints.core.tools.time.TimeHelper
import com.simprints.core.tools.utils.SimNetworkUtils
import com.simprints.infra.events.event.domain.models.ConnectivitySnapshotEvent
import com.simprints.infra.events.event.domain.models.SuspiciousIntentEvent
import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent
import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent
import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent
import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent
import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent
import com.simprints.infra.events.event.domain.models.callout.BiometricDataSource
import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3
import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3
import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3
import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3
import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3
import com.simprints.infra.events.session.SessionEventRepository
import com.simprints.infra.orchestration.data.ActionRequest
import com.simprints.infra.recent.user.activity.RecentUserActivityManager
Expand Down Expand Up @@ -52,18 +53,33 @@ internal class ReportActionRequestEventsUseCase @Inject constructor(
val startTime = timeHelper.now()
val event = with(request) {
when (this) {
is ActionRequest.EnrolActionRequest -> EnrolmentCalloutEvent(startTime, projectId, userId, moduleId, metadata)
is ActionRequest.IdentifyActionRequest -> IdentificationCalloutEvent(startTime, projectId, userId, moduleId, metadata)
is ActionRequest.VerifyActionRequest -> VerificationCalloutEvent(
is ActionRequest.EnrolActionRequest -> EnrolmentCalloutEventV3(
startTime,
projectId,
userId,
moduleId,
metadata,
BiometricDataSource.fromString(biometricDataSource),
)
is ActionRequest.IdentifyActionRequest -> IdentificationCalloutEventV3(
startTime,
projectId,
userId,
moduleId,
metadata,
BiometricDataSource.fromString(biometricDataSource),
)
is ActionRequest.VerifyActionRequest -> VerificationCalloutEventV3(
startTime,
projectId,
userId,
moduleId,
verifyGuid,
metadata,
BiometricDataSource.fromString(biometricDataSource),
)
is ActionRequest.ConfirmIdentityActionRequest -> ConfirmationCalloutEvent(startTime, projectId, selectedGuid, sessionId)
is ActionRequest.EnrolLastBiometricActionRequest -> EnrolmentLastBiometricsCalloutEvent(
is ActionRequest.ConfirmIdentityActionRequest -> ConfirmationCalloutEventV3(startTime, projectId, selectedGuid, sessionId)
is ActionRequest.EnrolLastBiometricActionRequest -> EnrolmentLastBiometricsCalloutEventV3(
startTime,
projectId,
userId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ internal class LoginCheckViewModelTest {

@Test
fun `Reports action event and extracts analytics for valid action`() = runTest {
viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

coVerify {
reportActionRequestEventsUseCase.invoke(any())
Expand All @@ -128,7 +128,7 @@ internal class LoginCheckViewModelTest {
fun `Triggers alert if mismatched project IDs`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.MISMATCHED_PROJECT_ID

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

viewModel.showAlert
.test()
Expand All @@ -139,7 +139,7 @@ internal class LoginCheckViewModelTest {
fun `Returns error response if not signed in and followup action`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFolowUpRequest())
viewModel.validateSignInAndProceed(ActionFactory.getConfirmationRequest())

viewModel.returnLoginNotComplete.test().assertHasValue()
}
Expand All @@ -148,8 +148,8 @@ internal class LoginCheckViewModelTest {
fun `Returns error response if there are several login attempts`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

viewModel.returnLoginNotComplete.test().assertHasValue()
}
Expand All @@ -158,22 +158,22 @@ internal class LoginCheckViewModelTest {
fun `Triggers login flow if not signed in and flow action`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

coVerify {
addAuthorizationEventUseCase.invoke(any(), eq(false))
syncOrchestrator.cancelBackgroundWork()
}
viewModel.showLoginFlow
.test()
.assertValue { it.peekContent() == ActionFactory.getFlowRequest() }
.assertValue { it.peekContent() == ActionFactory.getIdentifyRequest() }
}

@Test
fun `Returns error response if login attempt not complete`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(LoginResult(false, LoginError.LoginNotCompleted))

viewModel.returnLoginNotComplete.test().assertHasValue()
Expand All @@ -194,7 +194,7 @@ internal class LoginCheckViewModelTest {
fun `Triggers alert if login attempt failed with integrity error`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(LoginResult(false, LoginError.IntegrityServiceError))

viewModel.showAlert
Expand All @@ -206,7 +206,7 @@ internal class LoginCheckViewModelTest {
fun `Triggers alert if login attempt failed with missing play services`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(LoginResult(false, LoginError.MissingPlayServices))

viewModel.showAlert
Expand All @@ -218,7 +218,7 @@ internal class LoginCheckViewModelTest {
fun `Triggers alert if login attempt failed with outdated play services`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(LoginResult(false, LoginError.OutdatedPlayServices))

viewModel.showAlert
Expand All @@ -230,7 +230,7 @@ internal class LoginCheckViewModelTest {
fun `Triggers alert if login attempt failed with missing or outdated play services`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(
LoginResult(
false,
Expand All @@ -247,7 +247,7 @@ internal class LoginCheckViewModelTest {
fun `Triggers alert if login attempt failed with unknown error`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(LoginResult(false, LoginError.Unknown))

viewModel.showAlert
Expand All @@ -259,7 +259,7 @@ internal class LoginCheckViewModelTest {
fun `Correctly handles successful login attempt`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())
viewModel.handleLoginResult(LoginResult(true, null))

coVerify { configManager.getProject(any()) }
Expand All @@ -269,7 +269,7 @@ internal class LoginCheckViewModelTest {
fun `Correctly handles signed in users`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

coVerify { configManager.getProject(any()) }
}
Expand All @@ -279,7 +279,7 @@ internal class LoginCheckViewModelTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN
coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_PAUSED

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

viewModel.showAlert
.test()
Expand All @@ -291,7 +291,7 @@ internal class LoginCheckViewModelTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN
coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_ENDING

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

viewModel.showAlert
.test()
Expand All @@ -303,19 +303,19 @@ internal class LoginCheckViewModelTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN
coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_ENDED

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

viewModel.showLoginFlow
.test()
.assertValue { it.peekContent() == ActionFactory.getFlowRequest() }
.assertValue { it.peekContent() == ActionFactory.getIdentifyRequest() }
}

@Test
fun `Correctly handles if user signed in active project`() = runTest {
coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN
coEvery { configManager.getProject(any()).state } returns ProjectState.RUNNING

viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest())
viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest())

coVerify {
updateProjectStateUseCase.invoke()
Expand All @@ -329,6 +329,6 @@ internal class LoginCheckViewModelTest {

viewModel.proceedWithAction
.test()
.assertValue { it.peekContent() == ActionFactory.getFlowRequest() }
.assertValue { it.peekContent() == ActionFactory.getIdentifyRequest() }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.simprints.infra.orchestration.data.ActionRequest
import com.simprints.infra.orchestration.data.ActionRequestIdentifier

internal object ActionFactory {
fun getFlowRequest(extras: Map<String, Any> = emptyMap()) = ActionRequest.EnrolActionRequest(
fun getEnrolRequest(extras: Map<String, Any> = emptyMap()) = ActionRequest.EnrolActionRequest(
actionIdentifier = ActionRequestIdentifier(
packageName = "com.simprints.id",
actionName = ActionConstants.ACTION_ENROL,
Expand All @@ -22,7 +22,56 @@ internal object ActionFactory {
metadata = "",
)

fun getFolowUpRequest() = ActionRequest.ConfirmIdentityActionRequest(
fun getIdentifyRequest(extras: Map<String, Any> = emptyMap()) = ActionRequest.IdentifyActionRequest(
actionIdentifier = ActionRequestIdentifier(
packageName = "com.simprints.id",
actionName = ActionConstants.ACTION_IDENTIFY,
callerPackageName = "",
contractVersion = 1,
timestampMs = 0L,
),
projectId = MOCK_PROJECT_ID,
userId = MOCK_USER_ID,
moduleId = MOCK_MODULE_ID,
unknownExtras = extras,
biometricDataSource = MOCK_BIOMETRIC_DATA_SOURCE,
metadata = "",
)

fun getVerifyRequest(extras: Map<String, Any> = emptyMap()) = ActionRequest.VerifyActionRequest(
actionIdentifier = ActionRequestIdentifier(
packageName = "com.simprints.id",
actionName = ActionConstants.ACTION_VERIFY,
callerPackageName = "",
contractVersion = 1,
timestampMs = 0L,
),
projectId = MOCK_PROJECT_ID,
userId = MOCK_USER_ID,
moduleId = MOCK_MODULE_ID,
unknownExtras = extras,
biometricDataSource = MOCK_BIOMETRIC_DATA_SOURCE,
metadata = "",
verifyGuid = MOCK_GUID
)

fun getEnrolLastRequest() = ActionRequest.EnrolLastBiometricActionRequest(
actionIdentifier = ActionRequestIdentifier(
packageName = "com.simprints.id",
actionName = ActionConstants.ACTION_ENROL_LAST_BIOMETRICS,
callerPackageName = "",
contractVersion = 1,
timestampMs = 0L,
),
projectId = MOCK_PROJECT_ID,
userId = MOCK_USER_ID,
moduleId = MOCK_MODULE_ID,
sessionId = "sessionId",
metadata = "",
unknownExtras = emptyMap(),
)

fun getConfirmationRequest() = ActionRequest.ConfirmIdentityActionRequest(
actionIdentifier = ActionRequestIdentifier(
packageName = "com.simprints.id",
actionName = ActionConstants.ACTION_CONFIRM_IDENTITY,
Expand All @@ -42,4 +91,5 @@ internal object ActionFactory {
val MOCK_MODULE_ID = "moduleId".asTokenizableRaw()
const val MOCK_PROJECT_ID = "projectId"
private const val MOCK_BIOMETRIC_DATA_SOURCE = ""
private const val MOCK_GUID = "123e4567-e89b-12d3-a456-426614174000"
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class AddAuthorizationEventUseCaseTest {
@Test
fun `Adds not authorised event`() = runTest {
// When
useCase(ActionFactory.getFlowRequest(), false)
useCase(ActionFactory.getIdentifyRequest(), false)
// Then
coVerify {
coreEventRepository.addOrUpdateEvent(
Expand All @@ -52,7 +52,7 @@ class AddAuthorizationEventUseCaseTest {
@Test
fun `Adds authorised event`() = runTest {
// When
useCase(ActionFactory.getFlowRequest(), true)
useCase(ActionFactory.getIdentifyRequest(), true)
// Then
coVerify {
coreEventRepository.addOrUpdateEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class ExtractCrashKeysUseCaseTest {
}
every { authStore.signedInProjectId } returns "projectId"

useCase(ActionFactory.getFlowRequest())
useCase(ActionFactory.getIdentifyRequest())

verify {
Simber.setUserProperty(any(), "projectId")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal class ExtractParametersForAnalyticsUseCaseTest {

@Test
fun `Logs analytics keys in flow actions`() = runTest {
useCase(ActionFactory.getFlowRequest())
useCase(ActionFactory.getIdentifyRequest())

verify {
Simber.setUserProperty(any(), ActionFactory.MOCK_USER_ID.toString())
Expand All @@ -41,7 +41,7 @@ internal class ExtractParametersForAnalyticsUseCaseTest {

@Test
fun `Does not log analytics keys in follow up actions`() = runTest {
useCase(ActionFactory.getFolowUpRequest())
useCase(ActionFactory.getConfirmationRequest())

verify(exactly = 0) {
Simber.setUserProperty(any(), any())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ internal class IsUserSignedInUseCaseTest {

private lateinit var useCase: IsUserSignedInUseCase

private val request = ActionFactory.getFlowRequest()
private val request = ActionFactory.getIdentifyRequest()

@Before
fun setUp() {
Expand Down
Loading
Loading