diff --git a/universal_components/src/main/java/com/auth0/universalcomponents/di/UniversalComponentsModule.kt b/universal_components/src/main/java/com/auth0/universalcomponents/di/UniversalComponentsModule.kt index 7f74d03..7c9ec17 100644 --- a/universal_components/src/main/java/com/auth0/universalcomponents/di/UniversalComponentsModule.kt +++ b/universal_components/src/main/java/com/auth0/universalcomponents/di/UniversalComponentsModule.kt @@ -9,7 +9,6 @@ import com.auth0.universalcomponents.di.viewmodelfactory.AuthenticatorMethodView import com.auth0.universalcomponents.di.viewmodelfactory.EnrollmentViewModelFactory import com.auth0.universalcomponents.di.viewmodelfactory.MFAEnrolledItemViewModelFactory import com.auth0.universalcomponents.di.viewmodelfactory.PasskeyViewModelFactory -import com.auth0.universalcomponents.domain.DispatcherProvider import com.auth0.universalcomponents.domain.model.AuthenticatorType import com.auth0.universalcomponents.domain.repository.MyAccountRepository import com.auth0.universalcomponents.domain.repository.UserRepository @@ -19,7 +18,6 @@ import com.auth0.universalcomponents.domain.usecase.GetEnabledAuthenticatorMetho import com.auth0.universalcomponents.domain.usecase.GetEnrolledAuthenticatorsUseCase import com.auth0.universalcomponents.domain.usecase.GetUserInfoUseCase import com.auth0.universalcomponents.domain.usecase.VerifyAuthenticatorUseCase -import com.auth0.universalcomponents.helper.DispatcherProviderImpl object UniversalComponentsModule { @@ -63,36 +61,31 @@ object UniversalComponentsModule { private fun provideEnabledAuthenticatorMethodsUseCase(): GetEnabledAuthenticatorMethodsUseCase { return GetEnabledAuthenticatorMethodsUseCase( repository = provideMyAccountRepository(), - dispatcherProvider = provideDispatcherProvider(), ) } private fun provideGetEnrolledAuthenticatorsUseCase(): GetEnrolledAuthenticatorsUseCase { return GetEnrolledAuthenticatorsUseCase( - repository = provideMyAccountRepository(), - dispatcherProvider = provideDispatcherProvider() + repository = provideMyAccountRepository() ) } private fun provideDeleteAuthenticationMethodUseCase(): DeleteAuthenticationMethodUseCase { return DeleteAuthenticationMethodUseCase( - repository = provideMyAccountRepository(), - dispatcherProvider = provideDispatcherProvider() + repository = provideMyAccountRepository() ) } private fun provideEnrollAuthenticatorUseCase(): EnrollAuthenticatorUseCase { return EnrollAuthenticatorUseCase( - repository = provideMyAccountRepository(), - dispatcherProvider = provideDispatcherProvider() + repository = provideMyAccountRepository() ) } private fun provideVerifyAuthenticatorUseCase(): VerifyAuthenticatorUseCase { return VerifyAuthenticatorUseCase( - repository = provideMyAccountRepository(), - dispatcherProvider = provideDispatcherProvider() + repository = provideMyAccountRepository() ) } @@ -114,8 +107,4 @@ object UniversalComponentsModule { return TokenManager.getInstance() } - private fun provideDispatcherProvider(): DispatcherProvider { - return DispatcherProviderImpl() - } - } diff --git a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCase.kt b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCase.kt index 026cbc8..c08f30f 100644 --- a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCase.kt +++ b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCase.kt @@ -1,20 +1,17 @@ package com.auth0.universalcomponents.domain.usecase -import com.auth0.universalcomponents.domain.DispatcherProvider import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.network.EmptyResult import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.network.safeCall import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import kotlinx.coroutines.withContext /** * UseCase that handles deletion of an authentication method * Fetches token and calls repository to delete the specified authentication method */ class DeleteAuthenticationMethodUseCase( - private val repository: MyAccountRepository, - private val dispatcherProvider: DispatcherProvider + private val repository: MyAccountRepository ) { private companion object { private const val REQUIRED_SCOPES = "delete:me:authentication_methods" @@ -26,13 +23,11 @@ class DeleteAuthenticationMethodUseCase( * @return Result indicating success or error */ suspend operator fun invoke(authenticationMethodId: String): EmptyResult = - withContext(dispatcherProvider.io) { - safeCall { - repository.deleteAuthenticationMethod( - authenticationMethodId, - REQUIRED_SCOPES - ) - return@withContext Result.Success(Unit) - } + safeCall { + repository.deleteAuthenticationMethod( + authenticationMethodId, + REQUIRED_SCOPES + ) + Result.Success(Unit) } } diff --git a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCase.kt b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCase.kt index 5fb0eaa..7bde6b4 100644 --- a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCase.kt +++ b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCase.kt @@ -1,6 +1,5 @@ package com.auth0.universalcomponents.domain.usecase -import com.auth0.universalcomponents.domain.DispatcherProvider import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.AuthenticatorType import com.auth0.universalcomponents.domain.model.EnrollmentInput @@ -8,15 +7,13 @@ import com.auth0.universalcomponents.domain.model.EnrollmentResult import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.network.safeCall import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import kotlinx.coroutines.withContext /** * UseCase for enrolling authenticators * Handles TOTP, Push Notification, Recovery Code, Email, and Phone enrollments */ class EnrollAuthenticatorUseCase( - private val repository: MyAccountRepository, - private val dispatcherProvider: DispatcherProvider + private val repository: MyAccountRepository ) { private companion object { private const val REQUIRED_SCOPES = "create:me:authentication_methods" @@ -31,8 +28,7 @@ class EnrollAuthenticatorUseCase( suspend operator fun invoke( authenticatorType: AuthenticatorType, input: EnrollmentInput = EnrollmentInput.None - ): Result = withContext(dispatcherProvider.io) { - safeCall { + ): Result = safeCall { val result = when (authenticatorType) { AuthenticatorType.TOTP -> { val challenge = repository.enrollTotp(REQUIRED_SCOPES) @@ -95,5 +91,4 @@ class EnrollAuthenticatorUseCase( } result } - } } diff --git a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCase.kt b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCase.kt index 45898ac..8476219 100644 --- a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCase.kt +++ b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCase.kt @@ -3,7 +3,6 @@ package com.auth0.universalcomponents.domain.usecase import com.auth0.android.result.AuthenticationMethod import com.auth0.android.result.Factor import com.auth0.android.result.MfaAuthenticationMethod -import com.auth0.universalcomponents.domain.DispatcherProvider import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.AuthenticatorMethod import com.auth0.universalcomponents.domain.model.AuthenticatorType @@ -14,14 +13,12 @@ import com.auth0.universalcomponents.domain.network.safeCall import com.auth0.universalcomponents.domain.repository.MyAccountRepository import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.withContext /** * UseCase that fetches enabled primary and secondary authenticator methods */ class GetEnabledAuthenticatorMethodsUseCase( private val repository: MyAccountRepository, - private val dispatcherProvider: DispatcherProvider, ) { private companion object { private const val REQUIRED_SCOPES_FACTORS = "read:me:factors" @@ -29,22 +26,20 @@ class GetEnabledAuthenticatorMethodsUseCase( } suspend operator fun invoke(): Result = - withContext(dispatcherProvider.io) { - safeCall { - coroutineScope { - val factorsDeferred = async { - repository.getFactors(REQUIRED_SCOPES_FACTORS) - } - val authMethodsDeferred = async { - repository.getAuthenticatorMethods(REQUIRED_SCOPES_AUTHENTICATION) - } - - val (factors, authMethods) = Pair( - factorsDeferred.await(), - authMethodsDeferred.await() - ) - mapAuthenticatorMethods(factors, authMethods) + safeCall { + coroutineScope { + val factorsDeferred = async { + repository.getFactors(REQUIRED_SCOPES_FACTORS) } + val authMethodsDeferred = async { + repository.getAuthenticatorMethods(REQUIRED_SCOPES_AUTHENTICATION) + } + + val (factors, authMethods) = Pair( + factorsDeferred.await(), + authMethodsDeferred.await() + ) + mapAuthenticatorMethods(factors, authMethods) } } diff --git a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCase.kt b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCase.kt index 1dc392e..3bb48d8 100644 --- a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCase.kt +++ b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCase.kt @@ -7,22 +7,19 @@ import com.auth0.android.result.PasskeyAuthenticationMethod import com.auth0.android.result.PhoneAuthenticationMethod import com.auth0.android.result.PushNotificationAuthenticationMethod import com.auth0.android.result.TotpAuthenticationMethod -import com.auth0.universalcomponents.domain.DispatcherProvider import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.AuthenticatorType import com.auth0.universalcomponents.domain.model.EnrolledAuthenticationMethod import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.network.safeCall import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import kotlinx.coroutines.withContext /** * UseCase that fetches and filters authentication methods by type * Returns only confirmed methods for the specified authenticator type */ class GetEnrolledAuthenticatorsUseCase( - private val repository: MyAccountRepository, - private val dispatcherProvider: DispatcherProvider + private val repository: MyAccountRepository ) { private companion object { private const val REQUIRED_SCOPES = "read:me:authentication_methods" @@ -34,11 +31,9 @@ class GetEnrolledAuthenticatorsUseCase( * @return Result containing list of confirmed authentication methods */ suspend operator fun invoke(type: AuthenticatorType): Result, Auth0Error> = - withContext(dispatcherProvider.io) { - safeCall { - val authMethods = repository.getAuthenticatorMethods(REQUIRED_SCOPES) - filterEnrolledAuthenticationMethods(authMethods, type) - } + safeCall { + val authMethods = repository.getAuthenticatorMethods(REQUIRED_SCOPES) + filterEnrolledAuthenticationMethods(authMethods, type) } /** diff --git a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCase.kt b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCase.kt index 8917a53..4f6980d 100644 --- a/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCase.kt +++ b/universal_components/src/main/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCase.kt @@ -1,21 +1,18 @@ package com.auth0.universalcomponents.domain.usecase import com.auth0.android.result.AuthenticationMethod -import com.auth0.universalcomponents.domain.DispatcherProvider import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.VerificationInput import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.network.safeCall import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import kotlinx.coroutines.withContext /** * UseCase for verifying enrolled authenticators * Handles both OTP-based and non-OTP verifications */ class VerifyAuthenticatorUseCase( - private val repository: MyAccountRepository, - private val dispatcherProvider: DispatcherProvider + private val repository: MyAccountRepository ) { private companion object { private const val REQUIRED_SCOPES = "create:me:authentication_methods" @@ -28,8 +25,7 @@ class VerifyAuthenticatorUseCase( */ suspend operator fun invoke( input: VerificationInput - ): Result = withContext(dispatcherProvider.io) { - safeCall { + ): Result = safeCall { val authMethod = when (input) { is VerificationInput.WithOtp -> { @@ -51,5 +47,4 @@ class VerifyAuthenticatorUseCase( } authMethod } - } } diff --git a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCaseTest.kt b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCaseTest.kt index ec50594..1e3c855 100644 --- a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCaseTest.kt +++ b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/DeleteAuthenticationMethodUseCaseTest.kt @@ -3,45 +3,31 @@ package com.auth0.universalcomponents.domain.usecase import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import com.auth0.universalcomponents.helpers.TestDispatcherProvider import com.google.common.truth.Truth import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before import org.junit.Test -@OptIn(ExperimentalCoroutinesApi::class) class DeleteAuthenticationMethodUseCaseTest { private lateinit var repository: MyAccountRepository private lateinit var useCase: DeleteAuthenticationMethodUseCase - private val testDispatcher = StandardTestDispatcher() - private val dispatcherProvider = TestDispatcherProvider(testDispatcher) - @Before fun setup() { - Dispatchers.setMain(testDispatcher) - repository = mockk() useCase = DeleteAuthenticationMethodUseCase( - repository = repository, - dispatcherProvider = dispatcherProvider + repository = repository ) } @After fun tearDown() { - Dispatchers.resetMain() clearAllMocks() } diff --git a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCaseTest.kt b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCaseTest.kt index bdbcb27..8ece0e1 100644 --- a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCaseTest.kt +++ b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/EnrollAuthenticatorUseCaseTest.kt @@ -7,49 +7,35 @@ import com.auth0.universalcomponents.domain.model.EnrollmentInput import com.auth0.universalcomponents.domain.model.EnrollmentResult import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import com.auth0.universalcomponents.helpers.TestDispatcherProvider import com.google.common.truth.Truth import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test -@OptIn(ExperimentalCoroutinesApi::class) class EnrollAuthenticatorUseCaseTest { private lateinit var repository: MyAccountRepository private lateinit var useCase: EnrollAuthenticatorUseCase - private val testDispatcher = StandardTestDispatcher() - private val dispatcherProvider = TestDispatcherProvider(testDispatcher) - private val requiredScope = "create:me:authentication_methods" @Before fun setup() { - Dispatchers.setMain(testDispatcher) - repository = mockk() useCase = EnrollAuthenticatorUseCase( - repository = repository, - dispatcherProvider = dispatcherProvider + repository = repository ) } @After fun tearDown() { - Dispatchers.resetMain() clearAllMocks() } diff --git a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCaseTest.kt b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCaseTest.kt index 386b3a8..822f99d 100644 --- a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCaseTest.kt +++ b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnabledAuthenticatorMethodsUseCaseTest.kt @@ -7,47 +7,34 @@ import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.AuthenticatorType import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import com.auth0.universalcomponents.helpers.TestDispatcherProvider import com.google.common.truth.Truth import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before import org.junit.Test -@OptIn(ExperimentalCoroutinesApi::class) class GetEnabledAuthenticatorMethodsUseCaseTest { private lateinit var repository: MyAccountRepository private lateinit var useCase: GetEnabledAuthenticatorMethodsUseCase - private val testDispatcher = StandardTestDispatcher() - private val dispatcherProvider = TestDispatcherProvider(testDispatcher) - private val requiredScopesFactor = "read:me:factors" private val requiredScopesAuthentication = "read:me:authentication_methods" @Before fun setup() { - Dispatchers.setMain(testDispatcher) repository = mockk() useCase = GetEnabledAuthenticatorMethodsUseCase( repository = repository, - dispatcherProvider = dispatcherProvider ) } @After fun tearDown() { - Dispatchers.resetMain() clearAllMocks() } @@ -72,12 +59,14 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { // Assert on secondaryAuthenticators Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(2) - val phoneMethod = authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.PHONE } + val phoneMethod = + authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.PHONE } Truth.assertThat(phoneMethod).isNotNull() Truth.assertThat(phoneMethod?.confirmed).isTrue() Truth.assertThat(phoneMethod?.usage).containsExactly("primary") - val totpMethod = authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.TOTP } + val totpMethod = + authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.TOTP } Truth.assertThat(totpMethod).isNotNull() Truth.assertThat(totpMethod?.confirmed).isTrue() Truth.assertThat(totpMethod?.usage).containsExactly("secondary") @@ -107,10 +96,12 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(2) - val phoneMethod = authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.PHONE } + val phoneMethod = + authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.PHONE } Truth.assertThat(phoneMethod?.confirmed).isTrue() - val totpMethod = authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.TOTP } + val totpMethod = + authenticatorMethod.secondaryAuthenticators.find { it.type == AuthenticatorType.TOTP } Truth.assertThat(totpMethod?.confirmed).isFalse() coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } @@ -118,24 +109,25 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { } @Test - fun `invoke - empty factors with MFA auth methods - returns empty secondary authenticators list`() = runTest { - coEvery { repository.getFactors(any()) } returns emptyList() - coEvery { repository.getAuthenticatorMethods(any()) } returns listOf( - TestData.totpAuthMethod, - TestData.phoneAuthMethod - ) + fun `invoke - empty factors with MFA auth methods - returns empty secondary authenticators list`() = + runTest { + coEvery { repository.getFactors(any()) } returns emptyList() + coEvery { repository.getAuthenticatorMethods(any()) } returns listOf( + TestData.totpAuthMethod, + TestData.phoneAuthMethod + ) - val result = useCase.invoke() + val result = useCase.invoke() - Truth.assertThat(result).isInstanceOf(Result.Success::class.java) - val authenticatorMethod = (result as Result.Success).data + Truth.assertThat(result).isInstanceOf(Result.Success::class.java) + val authenticatorMethod = (result as Result.Success).data - Truth.assertThat(authenticatorMethod.secondaryAuthenticators).isEmpty() - Truth.assertThat(authenticatorMethod.primaryAuthenticators).isEmpty() + Truth.assertThat(authenticatorMethod.secondaryAuthenticators).isEmpty() + Truth.assertThat(authenticatorMethod.primaryAuthenticators).isEmpty() - coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } - coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } - } + coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } + coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } + } @Test fun `invoke - TOTP secondary factor with confirmed auth method - returns secondary TOTP authenticator with confirmed true`() = @@ -152,9 +144,11 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { val authenticatorMethod = (result as Result.Success).data Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type).isEqualTo(AuthenticatorType.TOTP) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) + .isEqualTo(AuthenticatorType.TOTP) Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isTrue() - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage).containsExactly("secondary") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage) + .containsExactly("secondary") coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } @@ -175,9 +169,11 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { val authenticatorMethod = (result as Result.Success).data Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type).isEqualTo(AuthenticatorType.PHONE) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) + .isEqualTo(AuthenticatorType.PHONE) Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isTrue() - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage).containsExactly("primary") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage) + .containsExactly("primary") coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } @@ -199,9 +195,11 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { val authenticatorMethod = (result as Result.Success).data Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type).isEqualTo(AuthenticatorType.EMAIL) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) + .isEqualTo(AuthenticatorType.EMAIL) Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isTrue() - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage).containsExactly("primary") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage) + .containsExactly("primary") coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } @@ -223,9 +221,11 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { val authenticatorMethod = (result as Result.Success).data Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type).isEqualTo(AuthenticatorType.PUSH) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) + .isEqualTo(AuthenticatorType.PUSH) Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isTrue() - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage).containsExactly("secondary") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage) + .containsExactly("secondary") coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } @@ -250,34 +250,38 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) .isEqualTo(AuthenticatorType.RECOVERY_CODE) Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isTrue() - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage).containsExactly("secondary") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage) + .containsExactly("secondary") coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } } @Test - fun `invoke - unknown secondary factor type - maps to TOTP as default in secondary authenticators`() = runTest { - val unknownFactor = Factor(type = "unknown-type", usage = listOf("secondary")) - val factors = listOf(unknownFactor) - val authMethods = emptyList() + fun `invoke - unknown secondary factor type - maps to TOTP as default in secondary authenticators`() = + runTest { + val unknownFactor = Factor(type = "unknown-type", usage = listOf("secondary")) + val factors = listOf(unknownFactor) + val authMethods = emptyList() - coEvery { repository.getFactors(any()) } returns factors - coEvery { repository.getAuthenticatorMethods(any()) } returns authMethods + coEvery { repository.getFactors(any()) } returns factors + coEvery { repository.getAuthenticatorMethods(any()) } returns authMethods - val result = useCase.invoke() + val result = useCase.invoke() - Truth.assertThat(result).isInstanceOf(Result.Success::class.java) - val authenticatorMethod = (result as Result.Success).data + Truth.assertThat(result).isInstanceOf(Result.Success::class.java) + val authenticatorMethod = (result as Result.Success).data - Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type).isEqualTo(AuthenticatorType.TOTP) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isFalse() - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage).containsExactly("secondary") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) + .isEqualTo(AuthenticatorType.TOTP) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isFalse() + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].usage) + .containsExactly("secondary") - coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } - coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } - } + coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } + coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } + } @Test @@ -296,8 +300,9 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { Truth.assertThat(authenticatorMethod.primaryAuthenticators).hasSize(1) Truth.assertThat(authenticatorMethod.primaryAuthenticators[0].type).isEqualTo("passkey") - Truth.assertThat(authenticatorMethod.primaryAuthenticators[0].id).isEqualTo("passkey_001") - + Truth.assertThat(authenticatorMethod.primaryAuthenticators[0].id) + .isEqualTo("passkey_001") + Truth.assertThat(authenticatorMethod.secondaryAuthenticators).isEmpty() coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } @@ -324,7 +329,7 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { Truth.assertThat(authenticatorMethod.primaryAuthenticators).hasSize(2) val ids = authenticatorMethod.primaryAuthenticators.map { it.id } Truth.assertThat(ids).containsExactly("passkey_001", "passkey_002") - + Truth.assertThat(authenticatorMethod.secondaryAuthenticators).isEmpty() coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } @@ -353,12 +358,14 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { // Verify primary authenticators (passkeys) Truth.assertThat(authenticatorMethod.primaryAuthenticators).hasSize(1) Truth.assertThat(authenticatorMethod.primaryAuthenticators[0].type).isEqualTo("passkey") - Truth.assertThat(authenticatorMethod.primaryAuthenticators[0].id).isEqualTo("passkey_001") + Truth.assertThat(authenticatorMethod.primaryAuthenticators[0].id) + .isEqualTo("passkey_001") // Verify secondary authenticators (MFA) Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(2) val secondaryTypes = authenticatorMethod.secondaryAuthenticators.map { it.type } - Truth.assertThat(secondaryTypes).containsExactly(AuthenticatorType.TOTP, AuthenticatorType.PHONE) + Truth.assertThat(secondaryTypes) + .containsExactly(AuthenticatorType.TOTP, AuthenticatorType.PHONE) coVerify(exactly = 1) { repository.getFactors(requiredScopesFactor) } coVerify(exactly = 1) { repository.getAuthenticatorMethods(requiredScopesAuthentication) } @@ -410,7 +417,8 @@ class GetEnabledAuthenticatorMethodsUseCaseTest { val authenticatorMethod = (result as Result.Success).data Truth.assertThat(authenticatorMethod.secondaryAuthenticators).hasSize(1) - Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type).isEqualTo(AuthenticatorType.TOTP) + Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].type) + .isEqualTo(AuthenticatorType.TOTP) Truth.assertThat(authenticatorMethod.secondaryAuthenticators[0].confirmed).isTrue() } diff --git a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCaseTest.kt b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCaseTest.kt index 67c21c3..5b26eb1 100644 --- a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCaseTest.kt +++ b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/GetEnrolledAuthenticatorsUseCaseTest.kt @@ -8,45 +8,31 @@ import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.AuthenticatorType import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import com.auth0.universalcomponents.helpers.TestDispatcherProvider import com.google.common.truth.Truth import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before import org.junit.Test -@OptIn(ExperimentalCoroutinesApi::class) class GetEnrolledAuthenticatorsUseCaseTest { private lateinit var repository: MyAccountRepository private lateinit var useCase: GetEnrolledAuthenticatorsUseCase - private val testDispatcher = StandardTestDispatcher() - private val dispatcherProvider = TestDispatcherProvider(testDispatcher) - @Before fun setup() { - Dispatchers.setMain(testDispatcher) - repository = mockk() useCase = GetEnrolledAuthenticatorsUseCase( - repository = repository, - dispatcherProvider = dispatcherProvider + repository = repository ) } @After fun tearDown() { - Dispatchers.resetMain() clearAllMocks() } diff --git a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCaseTest.kt b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCaseTest.kt index d5f166c..36ae798 100644 --- a/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCaseTest.kt +++ b/universal_components/src/test/java/com/auth0/universalcomponents/domain/usecase/VerifyAuthenticatorUseCaseTest.kt @@ -7,48 +7,34 @@ import com.auth0.universalcomponents.domain.error.Auth0Error import com.auth0.universalcomponents.domain.model.VerificationInput import com.auth0.universalcomponents.domain.network.Result import com.auth0.universalcomponents.domain.repository.MyAccountRepository -import com.auth0.universalcomponents.helpers.TestDispatcherProvider import com.google.common.truth.Truth import io.mockk.clearAllMocks import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.StandardTestDispatcher -import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before import org.junit.Test -@OptIn(ExperimentalCoroutinesApi::class) class VerifyAuthenticatorUseCaseTest { private lateinit var repository: MyAccountRepository private lateinit var useCase: VerifyAuthenticatorUseCase - private val testDispatcher = StandardTestDispatcher() - private val dispatcherProvider = TestDispatcherProvider(testDispatcher) - private val requiredScope = "create:me:authentication_methods" @Before fun setup() { - Dispatchers.setMain(testDispatcher) - repository = mockk() useCase = VerifyAuthenticatorUseCase( - repository = repository, - dispatcherProvider = dispatcherProvider + repository = repository ) } @After fun tearDown() { - Dispatchers.resetMain() clearAllMocks() }