diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneWelcomeWrapperErrors.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneWelcomeWrapperErrors.kt index 50ff048d..409b531b 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneWelcomeWrapperErrors.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneWelcomeWrapperErrors.kt @@ -17,7 +17,6 @@ enum class OneWelcomeWrapperErrors(val code: Int, val message: String) { NOT_IN_PROGRESS_AUTHENTICATION(8052, "Authentication is currently not in progress"), NOT_IN_PROGRESS_OTP_AUTHENTICATION(8053, "OTP Authentication is currently not in progress"), NOT_IN_PROGRESS_PIN_CREATION(8054, "Pin Creation is currently not in progress"), - NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION(8055, "Fingerprint Authentication is currently not in progress"), ACTION_NOT_ALLOWED_CUSTOM_REGISTRATION_CANCEL( 8057, "Canceling the Custom registration right now is not allowed." + @@ -31,7 +30,6 @@ enum class OneWelcomeWrapperErrors(val code: Int, val message: String) { CONFIG_ERROR(8059, "Something went wrong while setting the configuration"), // Android only BIOMETRIC_AUTHENTICATION_NOT_AVAILABLE(8060, "Biometric authentication is not supported on this device"), ID_TOKEN_NOT_AVAILABLE(8061, "Id Token not available"), - BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS(8062, "Biometric Authentication is currently not in progress"), // Android only // Only used for internal testing diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiSDK.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiSDK.kt index 66f65047..5889bad7 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiSDK.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiSDK.kt @@ -9,7 +9,6 @@ import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.ONEWELCOME_SDK_NOT import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.NOT_FOUND_SECURITY_CONTROLLER import com.onegini.mobile.sdk.flutter.errors.FlutterPluginException import com.onegini.mobile.sdk.flutter.handlers.BrowserRegistrationRequestHandler -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler import com.onegini.mobile.sdk.flutter.handlers.BiometricAuthenticationRequestHandler import com.onegini.mobile.sdk.flutter.handlers.MobileAuthOtpRequestHandler import com.onegini.mobile.sdk.flutter.handlers.PinAuthenticationRequestHandler @@ -29,7 +28,6 @@ import javax.inject.Singleton class OneginiSDK @Inject constructor( private val applicationContext: Context, private val browserRegistrationRequestHandler: BrowserRegistrationRequestHandler, - private val fingerprintRequestHandler: FingerprintAuthenticationRequestHandler, private val biometricRequestHandler: BiometricAuthenticationRequestHandler, private val pinAuthenticationRequestHandler: PinAuthenticationRequestHandler, private val createPinRequestHandler: PinRequestHandler, @@ -57,7 +55,6 @@ class OneginiSDK @Inject constructor( pinAuthenticationRequestHandler ) // handlers for optional functionalities .setBrowserRegistrationRequestHandler(browserRegistrationRequestHandler) - //.setFingerprintAuthenticationRequestHandler(fingerprintRequestHandler) .setBiometricAuthenticationRequestHandler(biometricRequestHandler) .setMobileAuthWithOtpRequestHandler(mobileAuthWithOtpRequestHandler) initProviders(clientBuilder, customIdentityProviderConfigs) diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt index 3176f1d6..b7687233 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt @@ -27,9 +27,6 @@ import com.onegini.mobile.sdk.flutter.useCases.ChangePinUseCase import com.onegini.mobile.sdk.flutter.useCases.DeregisterBiometricAuthenticatorUseCase import com.onegini.mobile.sdk.flutter.useCases.DeregisterUserUseCase import com.onegini.mobile.sdk.flutter.useCases.EnrollMobileAuthenticationUseCase -import com.onegini.mobile.sdk.flutter.useCases.FingerprintAuthenticationRequestAcceptUseCase -import com.onegini.mobile.sdk.flutter.useCases.FingerprintAuthenticationRequestDenyUseCase -import com.onegini.mobile.sdk.flutter.useCases.FingerprintFallbackToPinUseCase import com.onegini.mobile.sdk.flutter.useCases.GetAccessTokenUseCase import com.onegini.mobile.sdk.flutter.useCases.GetAppToWebSingleSignOnUseCase import com.onegini.mobile.sdk.flutter.useCases.GetAuthenticatedUserProfileUseCase @@ -143,15 +140,6 @@ open class PigeonInterface : UserClientApi, ResourceMethodApi { @Inject lateinit var pinRegistrationRequestDenyUseCase: PinRegistrationRequestDenyUseCase - @Inject - lateinit var fingerprintAuthenticationRequestDenyUseCase: FingerprintAuthenticationRequestDenyUseCase - - @Inject - lateinit var fingerprintAuthenticationRequestAcceptUseCase: FingerprintAuthenticationRequestAcceptUseCase - - @Inject - lateinit var fingerprintFallbackToPinUseCase: FingerprintFallbackToPinUseCase - @Inject lateinit var getBiometricAuthenticatorUseCase: GetBiometricAuthenticatorUseCase @@ -313,18 +301,6 @@ open class PigeonInterface : UserClientApi, ResourceMethodApi { callback(cancelCustomRegistrationActionUseCase(error)) } - override fun fingerprintFallbackToPin(callback: (Result) -> Unit) { - callback(fingerprintFallbackToPinUseCase()) - } - - override fun fingerprintDenyAuthenticationRequest(callback: (Result) -> Unit) { - callback(fingerprintAuthenticationRequestDenyUseCase()) - } - - override fun fingerprintAcceptAuthenticationRequest(callback: (Result) -> Unit) { - callback(fingerprintAuthenticationRequestAcceptUseCase()) - } - override fun otpDenyAuthenticationRequest(callback: (Result) -> Unit) { callback(otpDenyAuthenticationRequestUseCase()) } diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/FingerprintAuthenticationRequestHandler.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/FingerprintAuthenticationRequestHandler.kt deleted file mode 100644 index cca9364a..00000000 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/FingerprintAuthenticationRequestHandler.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.onegini.mobile.sdk.flutter.handlers - -import com.onegini.mobile.sdk.android.handlers.request.OneginiFingerprintAuthenticationRequestHandler -import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiFingerprintCallback -import com.onegini.mobile.sdk.android.model.entity.UserProfile -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION -import com.onegini.mobile.sdk.flutter.helpers.SdkError -import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class FingerprintAuthenticationRequestHandler @Inject constructor(private val nativeApi: NativeCallFlutterApi) : - OneginiFingerprintAuthenticationRequestHandler { - - private var fingerprintCallback: OneginiFingerprintCallback? = null - override fun startAuthentication(userProfile: UserProfile, oneginiFingerprintCallback: OneginiFingerprintCallback) { - fingerprintCallback = oneginiFingerprintCallback - nativeApi.n2fOpenFingerprintScreen { } - } - - override fun onNextAuthenticationAttempt() { - nativeApi.n2fNextFingerprintAuthenticationAttempt { } - } - - override fun onFingerprintCaptured() { - nativeApi.n2fShowScanningFingerprint { } - } - - override fun finishAuthentication() { - nativeApi.n2fCloseFingerprintScreen { } - } - - fun acceptAuthenticationRequest(): Result { - return fingerprintCallback?.let { - it.acceptAuthenticationRequest() - Result.success(Unit) - } ?: Result.failure(SdkError(NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION).pigeonError()) - } - - fun denyAuthenticationRequest(): Result { - return fingerprintCallback?.let { - it.denyAuthenticationRequest() - Result.success(Unit) - } ?: Result.failure(SdkError(NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION).pigeonError()) - } - - fun fallbackToPin(): Result { - return fingerprintCallback?.let { - it.fallbackToPin() - Result.success(Unit) - } ?: Result.failure(SdkError(NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION).pigeonError()) - } -} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.gen.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.gen.kt index e6943069..4c8b0c58 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.gen.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.gen.kt @@ -497,10 +497,6 @@ interface UserClientApi { /** Custom Registration Callbacks */ fun submitCustomRegistrationAction(data: String?, callback: (Result) -> Unit) fun cancelCustomRegistrationAction(error: String, callback: (Result) -> Unit) - /** Fingerprint Callbacks */ - fun fingerprintFallbackToPin(callback: (Result) -> Unit) - fun fingerprintDenyAuthenticationRequest(callback: (Result) -> Unit) - fun fingerprintAcceptAuthenticationRequest(callback: (Result) -> Unit) /** Biometric Callbacks */ fun showBiometricPrompt(messages: OWBiometricMessages, callback: (Result) -> Unit) fun biometricFallbackToPin(callback: (Result) -> Unit) @@ -1041,57 +1037,6 @@ interface UserClientApi { channel.setMessageHandler(null) } } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.UserClientApi.fingerprintFallbackToPin", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - api.fingerprintFallbackToPin() { result: Result -> - val error = result.exceptionOrNull() - if (error != null) { - reply.reply(wrapError(error)) - } else { - reply.reply(wrapResult(null)) - } - } - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.UserClientApi.fingerprintDenyAuthenticationRequest", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - api.fingerprintDenyAuthenticationRequest() { result: Result -> - val error = result.exceptionOrNull() - if (error != null) { - reply.reply(wrapError(error)) - } else { - reply.reply(wrapResult(null)) - } - } - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.UserClientApi.fingerprintAcceptAuthenticationRequest", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - api.fingerprintAcceptAuthenticationRequest() { result: Result -> - val error = result.exceptionOrNull() - if (error != null) { - reply.reply(wrapError(error)) - } else { - reply.reply(wrapResult(null)) - } - } - } - } else { - channel.setMessageHandler(null) - } - } run { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.UserClientApi.showBiometricPrompt", codec) if (api != null) { @@ -1474,34 +1419,6 @@ class NativeCallFlutterApi(private val binaryMessenger: BinaryMessenger) { callback() } } - /** Called to open fingerprint screen. */ - fun n2fOpenFingerprintScreen(callback: () -> Unit) { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.NativeCallFlutterApi.n2fOpenFingerprintScreen", codec) - channel.send(null) { - callback() - } - } - /** Called to close fingerprint screen. */ - fun n2fCloseFingerprintScreen(callback: () -> Unit) { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.NativeCallFlutterApi.n2fCloseFingerprintScreen", codec) - channel.send(null) { - callback() - } - } - /** Called to scan fingerprint. */ - fun n2fShowScanningFingerprint(callback: () -> Unit) { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.NativeCallFlutterApi.n2fShowScanningFingerprint", codec) - channel.send(null) { - callback() - } - } - /** Called when fingerprint was received. */ - fun n2fNextFingerprintAuthenticationAttempt(callback: () -> Unit) { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.NativeCallFlutterApi.n2fNextFingerprintAuthenticationAttempt", codec) - channel.send(null) { - callback() - } - } /** Called when new biometric authentication request is made. */ fun n2fStartBiometricAuthentication(callback: () -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.NativeCallFlutterApi.n2fStartBiometricAuthentication", codec) diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintAuthenticationRequestAcceptUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintAuthenticationRequestAcceptUseCase.kt deleted file mode 100644 index 9c21ea6a..00000000 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintAuthenticationRequestAcceptUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.onegini.mobile.sdk.flutter.useCases - -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class FingerprintAuthenticationRequestAcceptUseCase @Inject constructor(private val fingerprintAuthenticationRequestHandler: FingerprintAuthenticationRequestHandler) { - operator fun invoke(): Result { - return fingerprintAuthenticationRequestHandler.acceptAuthenticationRequest() - } -} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintAuthenticationRequestDenyUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintAuthenticationRequestDenyUseCase.kt deleted file mode 100644 index 94c3aa30..00000000 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintAuthenticationRequestDenyUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.onegini.mobile.sdk.flutter.useCases - -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class FingerprintAuthenticationRequestDenyUseCase @Inject constructor(private val fingerprintAuthenticationRequestHandler: FingerprintAuthenticationRequestHandler) { - operator fun invoke(): Result { - return fingerprintAuthenticationRequestHandler.denyAuthenticationRequest() - } -} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintFallbackToPinUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintFallbackToPinUseCase.kt deleted file mode 100644 index 03aac076..00000000 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/FingerprintFallbackToPinUseCase.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.onegini.mobile.sdk.flutter.useCases - -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class FingerprintFallbackToPinUseCase @Inject constructor(private val fingerprintAuthenticationRequestHandler: FingerprintAuthenticationRequestHandler) { - operator fun invoke(): Result { - return fingerprintAuthenticationRequestHandler.fallbackToPin() - } -} diff --git a/android/src/test/java/com/onegini/mobile/sdk/BiometricDenyAuthenticationRequestUseCaseTest.kt b/android/src/test/java/com/onegini/mobile/sdk/BiometricDenyAuthenticationRequestUseCaseTest.kt new file mode 100644 index 00000000..b1a202ab --- /dev/null +++ b/android/src/test/java/com/onegini/mobile/sdk/BiometricDenyAuthenticationRequestUseCaseTest.kt @@ -0,0 +1,84 @@ +package com.onegini.mobile.sdk + +import android.app.Activity +import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiBiometricCallback +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS +import com.onegini.mobile.sdk.flutter.SdkErrorAssert +import com.onegini.mobile.sdk.flutter.handlers.BiometricAuthenticationRequestHandler +import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi +import com.onegini.mobile.sdk.flutter.useCases.BiometricDenyAuthenticationRequestUseCase +import com.onegini.mobile.sdk.flutter.facade.BiometricPromptFacade +import androidx.biometric.BiometricPrompt +import com.onegini.mobile.sdk.android.model.entity.UserProfile +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.verify +import org.mockito.kotlin.* + +@RunWith(MockitoJUnitRunner::class) +class BiometricDenyAuthenticationRequestUseCaseTest { + @Mock + lateinit var oneginiBiometricCallbackMock: OneginiBiometricCallback + + @Mock + lateinit var cryptoObject: BiometricPrompt.CryptoObject + + @Mock + lateinit var nativeApi: NativeCallFlutterApi + + @Mock + lateinit var callbackMock: (Result) -> Unit + + @Mock + private lateinit var biometricPromptFacade: BiometricPromptFacade + + private lateinit var biometricDenyAuthenticationRequestUseCase: BiometricDenyAuthenticationRequestUseCase + + private lateinit var biometricAuthenticationRequestHandler: BiometricAuthenticationRequestHandler + + @Before + fun attach() { + biometricAuthenticationRequestHandler = BiometricAuthenticationRequestHandler(nativeApi) + biometricDenyAuthenticationRequestUseCase = BiometricDenyAuthenticationRequestUseCase(biometricAuthenticationRequestHandler, biometricPromptFacade) + } + + @Test + fun `When no biometric authentication callback is set, Then it should resolve with an error`() { + biometricDenyAuthenticationRequestUseCase(callbackMock) + + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + SdkErrorAssert.assertEquals(BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS, firstValue.exceptionOrNull()) + } + } + + @Test + fun `When biometric authentication callback is set, Then it should resolve successfully`() { + whenBiometricHasStarted() + + biometricDenyAuthenticationRequestUseCase(callbackMock) + + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + Assert.assertEquals(firstValue.getOrNull(), Unit) + } + } + + @Test + fun `When biometric authentication callback is set, Then it should call denyAuthenticationRequest on the sdk callback`() { + whenBiometricHasStarted() + + biometricDenyAuthenticationRequestUseCase(callbackMock) + + verify(oneginiBiometricCallbackMock).denyAuthenticationRequest() + } + + private fun whenBiometricHasStarted() { + biometricAuthenticationRequestHandler.startAuthentication(UserProfile("123456"), cryptoObject, oneginiBiometricCallbackMock) + } + +} \ No newline at end of file diff --git a/android/src/test/java/com/onegini/mobile/sdk/BiometricFallbackToPinUseCaseTest.kt b/android/src/test/java/com/onegini/mobile/sdk/BiometricFallbackToPinUseCaseTest.kt new file mode 100644 index 00000000..f56a2731 --- /dev/null +++ b/android/src/test/java/com/onegini/mobile/sdk/BiometricFallbackToPinUseCaseTest.kt @@ -0,0 +1,84 @@ +package com.onegini.mobile.sdk + +import android.app.Activity +import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiBiometricCallback +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS +import com.onegini.mobile.sdk.flutter.SdkErrorAssert +import com.onegini.mobile.sdk.flutter.handlers.BiometricAuthenticationRequestHandler +import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi +import com.onegini.mobile.sdk.flutter.useCases.BiometricFallbackToPinUseCase +import com.onegini.mobile.sdk.flutter.facade.BiometricPromptFacade +import androidx.biometric.BiometricPrompt +import com.onegini.mobile.sdk.android.model.entity.UserProfile +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.verify +import org.mockito.kotlin.* + +@RunWith(MockitoJUnitRunner::class) +class BiometricFallbackToPinUseCaseTest { + @Mock + lateinit var oneginiBiometricCallbackMock: OneginiBiometricCallback + + @Mock + lateinit var cryptoObject: BiometricPrompt.CryptoObject + + @Mock + lateinit var nativeApi: NativeCallFlutterApi + + @Mock + lateinit var callbackMock: (Result) -> Unit + + @Mock + private lateinit var biometricPromptFacade: BiometricPromptFacade + + private lateinit var biometricFallbackToPinUseCase: BiometricFallbackToPinUseCase + + private lateinit var biometricAuthenticationRequestHandler: BiometricAuthenticationRequestHandler + + @Before + fun attach() { + biometricAuthenticationRequestHandler = BiometricAuthenticationRequestHandler(nativeApi) + biometricFallbackToPinUseCase = BiometricFallbackToPinUseCase(biometricAuthenticationRequestHandler, biometricPromptFacade) + } + + @Test + fun `When no biometric authentication callback is set, Then it should resolve with an error`() { + biometricFallbackToPinUseCase(callbackMock) + + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + SdkErrorAssert.assertEquals(BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS, firstValue.exceptionOrNull()) + } + } + + @Test + fun `When biometric authentication callback is set, Then it should resolve successfully`() { + whenBiometricHasStarted() + + biometricFallbackToPinUseCase(callbackMock) + + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + Assert.assertEquals(firstValue.getOrNull(), Unit) + } + } + + @Test + fun `When biometric authentication callback is set, Then it should call fallbackToPin on the sdk callback`() { + whenBiometricHasStarted() + + biometricFallbackToPinUseCase(callbackMock) + + verify(oneginiBiometricCallbackMock).fallbackToPin() + } + + private fun whenBiometricHasStarted() { + biometricAuthenticationRequestHandler.startAuthentication(UserProfile("123456"), cryptoObject, oneginiBiometricCallbackMock) + } + +} \ No newline at end of file diff --git a/android/src/test/java/com/onegini/mobile/sdk/BiometricShowPromptUseCaseTest.kt b/android/src/test/java/com/onegini/mobile/sdk/BiometricShowPromptUseCaseTest.kt new file mode 100644 index 00000000..dd231cd7 --- /dev/null +++ b/android/src/test/java/com/onegini/mobile/sdk/BiometricShowPromptUseCaseTest.kt @@ -0,0 +1,79 @@ +package com.onegini.mobile.sdk + +import android.app.Activity +import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiBiometricCallback +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS +import com.onegini.mobile.sdk.flutter.SdkErrorAssert +import com.onegini.mobile.sdk.flutter.handlers.BiometricAuthenticationRequestHandler +import com.onegini.mobile.sdk.flutter.pigeonPlugin.OWBiometricMessages +import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi +import com.onegini.mobile.sdk.flutter.useCases.BiometricShowPromptUseCase +import com.onegini.mobile.sdk.flutter.facade.BiometricPromptFacade +import androidx.biometric.BiometricPrompt +import com.onegini.mobile.sdk.android.model.entity.UserProfile +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.verify +import org.mockito.kotlin.* + +@RunWith(MockitoJUnitRunner::class) +class BiometricShowPromptUseCaseTest { + @Mock + lateinit var oneginiBiometricCallbackMock: OneginiBiometricCallback + + @Mock + lateinit var cryptoObject: BiometricPrompt.CryptoObject + + @Mock + lateinit var nativeApi: NativeCallFlutterApi + + @Mock + lateinit var activity: Activity + + @Mock + lateinit var callbackMock: (Result) -> Unit + + @Mock + private lateinit var biometricPromptFacade: BiometricPromptFacade + + private lateinit var biometricShowPromptUseCase: BiometricShowPromptUseCase + + private lateinit var biometricAuthenticationRequestHandler: BiometricAuthenticationRequestHandler + + @Before + fun attach() { + biometricAuthenticationRequestHandler = BiometricAuthenticationRequestHandler(nativeApi) + biometricShowPromptUseCase = BiometricShowPromptUseCase(activity, biometricAuthenticationRequestHandler, biometricPromptFacade) + } + + @Test + fun `When no biometric authentication callback is set, Then it should resolve with an error`() { + biometricShowPromptUseCase(OWBiometricMessages("", "", ""), callbackMock) + + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + SdkErrorAssert.assertEquals(BIOMETRIC_AUTHENTICATION_NOT_IN_PROGRESS, firstValue.exceptionOrNull()) + } + } + + @Test + fun `When biometric authentication callback is set, Then it should resolve successfully`() { + whenBiometricHasStarted() + + biometricShowPromptUseCase(OWBiometricMessages("", "", ""), callbackMock) + + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + Assert.assertEquals(firstValue.getOrNull(), Unit) + } + } + + private fun whenBiometricHasStarted() { + biometricAuthenticationRequestHandler.startAuthentication(UserProfile("123456"), cryptoObject, oneginiBiometricCallbackMock) + } + +} \ No newline at end of file diff --git a/android/src/test/java/com/onegini/mobile/sdk/FingerprintAuthenticationRequestAcceptUseCaseTest.kt b/android/src/test/java/com/onegini/mobile/sdk/FingerprintAuthenticationRequestAcceptUseCaseTest.kt deleted file mode 100644 index 6778b535..00000000 --- a/android/src/test/java/com/onegini/mobile/sdk/FingerprintAuthenticationRequestAcceptUseCaseTest.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.onegini.mobile.sdk - -import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiFingerprintCallback -import com.onegini.mobile.sdk.android.model.entity.UserProfile -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION -import com.onegini.mobile.sdk.flutter.SdkErrorAssert -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler -import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi -import com.onegini.mobile.sdk.flutter.useCases.FingerprintAuthenticationRequestAcceptUseCase -import org.junit.Assert -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner -import org.mockito.kotlin.verify - -@RunWith(MockitoJUnitRunner::class) -class FingerprintAuthenticationRequestAcceptUseCaseTest { - @Mock - lateinit var oneginiFingerprintCallbackMock: OneginiFingerprintCallback - - @Mock - lateinit var nativeApi: NativeCallFlutterApi - - private lateinit var fingerprintAuthenticationRequestAcceptUseCase: FingerprintAuthenticationRequestAcceptUseCase - - private lateinit var fingerprintAuthenticationRequestHandler: FingerprintAuthenticationRequestHandler - - @Before - fun attach() { - fingerprintAuthenticationRequestHandler = FingerprintAuthenticationRequestHandler(nativeApi) - fingerprintAuthenticationRequestAcceptUseCase = FingerprintAuthenticationRequestAcceptUseCase(fingerprintAuthenticationRequestHandler) - } - - @Test - fun `When no fingerprint authentication callback is set, Then it should fail with an error`() { - val result = fingerprintAuthenticationRequestAcceptUseCase().exceptionOrNull() - - SdkErrorAssert.assertEquals(NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION, result) - } - - @Test - fun `When a pin authentication callback is set, Then it should resolve successfully`() { - whenFingerPrintHasStarted() - - val result = fingerprintAuthenticationRequestAcceptUseCase().getOrNull() - - Assert.assertEquals(Unit, result) - } - - @Test - fun `When a pin authentication callback is set, Then it should call accept on the sdk callback`() { - whenFingerPrintHasStarted() - - fingerprintAuthenticationRequestAcceptUseCase() - - verify(oneginiFingerprintCallbackMock).acceptAuthenticationRequest() - } - - private fun whenFingerPrintHasStarted() { - fingerprintAuthenticationRequestHandler.startAuthentication(UserProfile("123456"), oneginiFingerprintCallbackMock) - } -} diff --git a/android/src/test/java/com/onegini/mobile/sdk/FingerprintAuthenticationRequestDenyUseCaseTest.kt b/android/src/test/java/com/onegini/mobile/sdk/FingerprintAuthenticationRequestDenyUseCaseTest.kt deleted file mode 100644 index 72da9d2e..00000000 --- a/android/src/test/java/com/onegini/mobile/sdk/FingerprintAuthenticationRequestDenyUseCaseTest.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.onegini.mobile.sdk - -import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiFingerprintCallback -import com.onegini.mobile.sdk.android.model.entity.UserProfile -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION -import com.onegini.mobile.sdk.flutter.SdkErrorAssert -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler -import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi -import com.onegini.mobile.sdk.flutter.useCases.FingerprintAuthenticationRequestDenyUseCase -import org.junit.Assert -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner -import org.mockito.kotlin.verify - -@RunWith(MockitoJUnitRunner::class) -class FingerprintAuthenticationRequestDenyUseCaseTest { - @Mock - lateinit var oneginiFingerprintCallbackMock: OneginiFingerprintCallback - - @Mock - lateinit var nativeApi: NativeCallFlutterApi - - private lateinit var fingerprintAuthenticationRequestDenyUseCase: FingerprintAuthenticationRequestDenyUseCase - - private lateinit var fingerprintAuthenticationRequestHandler: FingerprintAuthenticationRequestHandler - - @Before - fun attach() { - fingerprintAuthenticationRequestHandler = FingerprintAuthenticationRequestHandler(nativeApi) - fingerprintAuthenticationRequestDenyUseCase = FingerprintAuthenticationRequestDenyUseCase(fingerprintAuthenticationRequestHandler) - } - - @Test - fun `When no fingerprint authentication callback is set, Then it should fail with an error`() { - val result = fingerprintAuthenticationRequestDenyUseCase().exceptionOrNull() - - SdkErrorAssert.assertEquals(NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION, result) - } - - @Test - fun `When a pin authentication callback is set, Then it should resolve successfully`() { - whenFingerPrintHasStarted() - - val result = fingerprintAuthenticationRequestDenyUseCase().getOrNull() - - Assert.assertEquals(Unit, result) - } - - @Test - fun `When a pin authentication callback is set, Then it should call deny on the sdk callback`() { - whenFingerPrintHasStarted() - - fingerprintAuthenticationRequestDenyUseCase() - - verify(oneginiFingerprintCallbackMock).denyAuthenticationRequest() - } - - private fun whenFingerPrintHasStarted() { - fingerprintAuthenticationRequestHandler.startAuthentication(UserProfile("123456"), oneginiFingerprintCallbackMock) - } -} diff --git a/android/src/test/java/com/onegini/mobile/sdk/FingerprintFallbackToPinUseCaseTest.kt b/android/src/test/java/com/onegini/mobile/sdk/FingerprintFallbackToPinUseCaseTest.kt deleted file mode 100644 index 7082de5c..00000000 --- a/android/src/test/java/com/onegini/mobile/sdk/FingerprintFallbackToPinUseCaseTest.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.onegini.mobile.sdk - -import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiFingerprintCallback -import com.onegini.mobile.sdk.android.model.entity.UserProfile -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION -import com.onegini.mobile.sdk.flutter.SdkErrorAssert -import com.onegini.mobile.sdk.flutter.handlers.FingerprintAuthenticationRequestHandler -import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi -import com.onegini.mobile.sdk.flutter.useCases.FingerprintFallbackToPinUseCase -import org.junit.Assert -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner -import org.mockito.kotlin.verify - -@RunWith(MockitoJUnitRunner::class) -class FingerprintFallbackToPinUseCaseTest { - @Mock - lateinit var oneginiFingerprintCallbackMock: OneginiFingerprintCallback - - @Mock - lateinit var nativeApi: NativeCallFlutterApi - - private lateinit var fingerprintFallbackToPinUseCase: FingerprintFallbackToPinUseCase - - private lateinit var fingerprintAuthenticationRequestHandler: FingerprintAuthenticationRequestHandler - - @Before - fun attach() { - fingerprintAuthenticationRequestHandler = FingerprintAuthenticationRequestHandler(nativeApi) - fingerprintFallbackToPinUseCase = FingerprintFallbackToPinUseCase(fingerprintAuthenticationRequestHandler) - } - - @Test - fun `When no fingerprint authentication callback is set, Then it should resolve with an error`() { - val result = fingerprintFallbackToPinUseCase().exceptionOrNull() - - SdkErrorAssert.assertEquals(NOT_IN_PROGRESS_FINGERPRINT_AUTHENTICATION, result) - } - - @Test - fun `When a pin authentication callback is set, Then it should resolve successfully`() { - whenFingerPrintHasStarted() - - val result = fingerprintFallbackToPinUseCase().getOrNull() - - Assert.assertEquals(Unit, result) - } - - @Test - fun `When a pin authentication callback is set, Then it should call fallbackToPin on the sdk callback`() { - whenFingerPrintHasStarted() - - fingerprintFallbackToPinUseCase() - - verify(oneginiFingerprintCallbackMock).fallbackToPin() - } - - private fun whenFingerPrintHasStarted() { - fingerprintAuthenticationRequestHandler.startAuthentication(UserProfile("123456"), oneginiFingerprintCallbackMock) - } -} diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml index a554de43..d8b1739b 100644 --- a/example/android/app/src/main/res/values/styles.xml +++ b/example/android/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ -