From d4536ed39e93b8ace3f49e6a532136c03099d5b1 Mon Sep 17 00:00:00 2001 From: Michiel Vrins Date: Thu, 2 Mar 2023 14:05:50 +0100 Subject: [PATCH 1/4] FP-62: Android: Move SSO into a useCase and add Tests --- .../flutter/FlutterOneWelcomeSdkComponent.kt | 3 +- .../mobile/sdk/flutter/OnMethodCallMapper.kt | 29 +--- .../sdk/flutter/OneginiMethodsWrapper.kt | 5 + .../mobile/sdk/flutter/facade/UriFacade.kt | 8 ++ .../sdk/flutter/facade/UriFacadeImpl.kt | 17 +++ .../mobile/sdk/flutter/module/FacadeModule.kt | 13 ++ .../GetAppToWebSingleSignOnUseCase.kt | 46 ++++++ .../GetAppToWebSingleSignOnUseCaseTests.kt | 135 ++++++++++++++++++ 8 files changed, 227 insertions(+), 29 deletions(-) create mode 100644 android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacade.kt create mode 100644 android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacadeImpl.kt create mode 100644 android/src/main/kotlin/com/onegini/mobile/sdk/flutter/module/FacadeModule.kt create mode 100644 android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt create mode 100644 android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/FlutterOneWelcomeSdkComponent.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/FlutterOneWelcomeSdkComponent.kt index 7b452cbd..6f847e58 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/FlutterOneWelcomeSdkComponent.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/FlutterOneWelcomeSdkComponent.kt @@ -1,10 +1,11 @@ package com.onegini.mobile.sdk.flutter +import com.onegini.mobile.sdk.flutter.module.FacadeModule import com.onegini.mobile.sdk.flutter.module.FlutterOneWelcomeSdkModule import dagger.Component import javax.inject.Singleton -@Component(modules = [FlutterOneWelcomeSdkModule::class]) +@Component(modules = [FlutterOneWelcomeSdkModule::class, FacadeModule::class]) @Singleton interface FlutterOneWelcomeSdkComponent { diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OnMethodCallMapper.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OnMethodCallMapper.kt index 6b5c393f..872c573a 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OnMethodCallMapper.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OnMethodCallMapper.kt @@ -86,7 +86,7 @@ class OnMethodCallMapper @Inject constructor(private val oneginiMethodsWrapper: // Other Constants.METHOD_CHANGE_PIN -> oneginiMethodsWrapper.changePin(result) - Constants.METHOD_GET_APP_TO_WEB_SINGLE_SIGN_ON -> getAppToWebSingleSignOn(call.argument("url"), result, client) + Constants.METHOD_GET_APP_TO_WEB_SINGLE_SIGN_ON -> oneginiMethodsWrapper.getAppToWebSingleSignOn(call, result) Constants.METHOD_GET_USER_PROFILES -> oneginiMethodsWrapper.getUserProfiles(result) Constants.METHOD_GET_ACCESS_TOKEN -> oneginiMethodsWrapper.getAccessToken(result) Constants.METHOD_GET_AUTHENTICATED_USER_PROFILE -> oneginiMethodsWrapper.getAuthenticatedUserProfile(result) @@ -95,31 +95,4 @@ class OnMethodCallMapper @Inject constructor(private val oneginiMethodsWrapper: else -> SdkError(METHOD_TO_CALL_NOT_FOUND).flutterError(result) } } - - fun getAppToWebSingleSignOn(url: String?, result: MethodChannel.Result, oneginiClient: OneginiClient) { - if (url == null) { - SdkError(URL_CANT_BE_NULL).flutterError(result) - return - } - if (!Patterns.WEB_URL.matcher(url).matches()) { - SdkError(MALFORMED_URL).flutterError(result) - return - } - val targetUri: Uri = Uri.parse(url) - oneginiClient.userClient.getAppToWebSingleSignOn( - targetUri, - object : OneginiAppToWebSingleSignOnHandler { - override fun onSuccess(oneginiAppToWebSingleSignOn: OneginiAppToWebSingleSignOn) { - result.success(Gson().toJson(mapOf("token" to oneginiAppToWebSingleSignOn.token, "redirectUrl" to oneginiAppToWebSingleSignOn.redirectUrl.toString()))) - } - - override fun onError(oneginiSingleSignOnError: OneginiAppToWebSingleSignOnError) { - SdkError( - code = oneginiSingleSignOnError.errorType, - message = oneginiSingleSignOnError.message - ).flutterError(result) - } - } - ) - } } diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiMethodsWrapper.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiMethodsWrapper.kt index ba12514d..5912591d 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiMethodsWrapper.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/OneginiMethodsWrapper.kt @@ -27,6 +27,7 @@ class OneginiMethodsWrapper @Inject constructor( private val getRegisteredAuthenticatorsUseCase: GetRegisteredAuthenticatorsUseCase, private val getResourceAnonymousUseCase: GetResourceAnonymousUseCase, private val getResourceUseCase: GetResourceUseCase, + private val getAppToWebSingleSignOnUseCase: GetAppToWebSingleSignOnUseCase, private val getUnauthenticatedResourceUseCase: GetUnauthenticatedResourceUseCase, private val getUserProfilesUseCase: GetUserProfilesUseCase, private val handleRegisteredUrlUseCase: HandleRegisteredUrlUseCase, @@ -160,4 +161,8 @@ class OneginiMethodsWrapper @Inject constructor( fun changePin(result: MethodChannel.Result) { changePinUseCase(result) } + + fun getAppToWebSingleSignOn(call: MethodCall, result: MethodChannel.Result) { + getAppToWebSingleSignOnUseCase(call, result) + } } diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacade.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacade.kt new file mode 100644 index 00000000..f1101d65 --- /dev/null +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacade.kt @@ -0,0 +1,8 @@ +package com.onegini.mobile.sdk.flutter.facade + +import android.net.Uri + +interface UriFacade { + fun parse(string: String): Uri + fun withAppendedPath(baseUri: Uri, pathSegment: String): Uri +} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacadeImpl.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacadeImpl.kt new file mode 100644 index 00000000..a1fa14a7 --- /dev/null +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/facade/UriFacadeImpl.kt @@ -0,0 +1,17 @@ + +package com.onegini.mobile.sdk.flutter.facade + +import javax.inject.Singleton +import javax.inject.Inject +import android.net.Uri + +@Singleton +class UriFacadeImpl @Inject constructor() : UriFacade { + override fun parse(string: String): Uri { + return Uri.parse(string) + } + + override fun withAppendedPath(baseUri: Uri, pathSegment: String): Uri { + return Uri.withAppendedPath(baseUri, pathSegment) + } +} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/module/FacadeModule.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/module/FacadeModule.kt new file mode 100644 index 00000000..61b4ea37 --- /dev/null +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/module/FacadeModule.kt @@ -0,0 +1,13 @@ +package com.onegini.mobile.sdk.flutter.module + +import com.onegini.mobile.sdk.flutter.facade.UriFacade +import com.onegini.mobile.sdk.flutter.facade.UriFacadeImpl +import dagger.Binds +import dagger.Module + +@Module +interface FacadeModule { + + @Binds + fun bindUriFacade(uriFacade: UriFacadeImpl): UriFacade +} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt new file mode 100644 index 00000000..33586491 --- /dev/null +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt @@ -0,0 +1,46 @@ +package com.onegini.mobile.sdk.flutter.useCases + +import android.util.Patterns +import com.google.gson.Gson +import com.onegini.mobile.sdk.android.handlers.OneginiAppToWebSingleSignOnHandler +import com.onegini.mobile.sdk.android.handlers.error.OneginiAppToWebSingleSignOnError +import com.onegini.mobile.sdk.android.model.OneginiAppToWebSingleSignOn +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.MALFORMED_URL +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.URL_CANT_BE_NULL +import com.onegini.mobile.sdk.flutter.OneginiSDK +import com.onegini.mobile.sdk.flutter.facade.UriFacade +import com.onegini.mobile.sdk.flutter.helpers.SdkError +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class GetAppToWebSingleSignOnUseCase @Inject constructor(private val oneginiSDK: OneginiSDK, private val uriFacade: UriFacade) { + operator fun invoke(call: MethodCall, result: MethodChannel.Result) { + val url = call.argument("url") ?: return SdkError(URL_CANT_BE_NULL).flutterError(result) + val targetUri = uriFacade.parse(url) + oneginiSDK.oneginiClient.userClient.getAppToWebSingleSignOn( + targetUri, + object : OneginiAppToWebSingleSignOnHandler { + override fun onSuccess(oneginiAppToWebSingleSignOn: OneginiAppToWebSingleSignOn) { + result.success( + Gson().toJson( + mapOf( + "token" to oneginiAppToWebSingleSignOn.token, + "redirectUrl" to oneginiAppToWebSingleSignOn.redirectUrl.toString() + ) + ) + ) + } + + override fun onError(oneginiSingleSignOnError: OneginiAppToWebSingleSignOnError) { + SdkError( + code = oneginiSingleSignOnError.errorType, + message = oneginiSingleSignOnError.message + ).flutterError(result) + } + } + ) + } +} diff --git a/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt b/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt new file mode 100644 index 00000000..0e565fa8 --- /dev/null +++ b/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt @@ -0,0 +1,135 @@ +package com.onegini.mobile.sdk + +import android.net.Uri +import com.google.gson.Gson +import com.onegini.mobile.sdk.android.handlers.OneginiAppToWebSingleSignOnHandler +import com.onegini.mobile.sdk.android.handlers.error.OneginiAppToWebSingleSignOnError +import com.onegini.mobile.sdk.android.model.OneginiAppToWebSingleSignOn +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.* +import com.onegini.mobile.sdk.flutter.OneginiSDK +import com.onegini.mobile.sdk.flutter.facade.UriFacade +import com.onegini.mobile.sdk.flutter.useCases.GetAppToWebSingleSignOnUseCase +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import junit.framework.TestCase.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Answers +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.any +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.eq +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +@RunWith(MockitoJUnitRunner::class) +class GetAppToWebSingleSignOnUseCaseTests { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + lateinit var oneginiSdk: OneginiSDK + + @Mock + lateinit var resultMock: MethodChannel.Result + + @Mock + lateinit var callMock: MethodCall + + @Mock + private lateinit var uriFacade: UriFacade + + // We need to deep stub here to mock a uri object's .toString() as we cant pass a uriFacade into the OneginiAppToWebSingleSignOn + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private lateinit var oneginiAppToWebSingleSignOn: OneginiAppToWebSingleSignOn + + @Mock + private lateinit var oneginiAppToWebSingleSignOnError: OneginiAppToWebSingleSignOnError + + @Mock + private lateinit var parsedUri: Uri + + private val correctUri = "https://login-mobile.test.onegini.com/personal/dashboard" + private val mockedTokenString = "mockedToken" + private val mockedRedirectUrlString = "mockedRedirectUrl" + + lateinit var getAppToWebSingleSignOnUseCase: GetAppToWebSingleSignOnUseCase + @Before + fun setup() { + getAppToWebSingleSignOnUseCase = GetAppToWebSingleSignOnUseCase(oneginiSdk, uriFacade) + } + + @Test + fun `When GetAppToWebSingleSignOn is called without a url argument, Then should fail with URL_CANT_BE_NULL error`() { + whenCalledWithNullUrl() + + getAppToWebSingleSignOnUseCase(callMock, resultMock) + + val message = URL_CANT_BE_NULL.message + verify(resultMock).error(eq(URL_CANT_BE_NULL.code.toString()), eq(message), any()) + } + + @Test + fun `When oginini getAppToWebSingleSignOn calls onSuccess on the handler, Then promise should resolve with a map containing the content from the result`() { + whenCalledWithUrl() + mockParseUri(correctUri) + mockSingleSignOnObject() + whenever(oneginiSdk.oneginiClient.userClient.getAppToWebSingleSignOn(any(), any())).thenAnswer { + it.getArgument(1).onSuccess(oneginiAppToWebSingleSignOn) + } + + getAppToWebSingleSignOnUseCase(callMock, resultMock) + + val argumentCaptor = argumentCaptor() + verify(resultMock).success(argumentCaptor.capture()) + // This will be reworked after FP-20 when we actually send the objects + val expectedResult = Gson().toJson( + mapOf( + "token" to oneginiAppToWebSingleSignOn.token, + "redirectUrl" to oneginiAppToWebSingleSignOn.redirectUrl.toString() + ) + ) + assertEquals(argumentCaptor.firstValue, expectedResult) + + } + + @Test + fun `When oginini getAppToWebSingleSignOn calls onError on the handler, Then result should fail with the error message and code`() { + mockParseUri(correctUri) + whenCalledWithUrl() + whenSSOReturnsError() + + getAppToWebSingleSignOnUseCase(callMock, resultMock) + + val message = oneginiAppToWebSingleSignOnError.message + verify(resultMock).error(eq(oneginiAppToWebSingleSignOnError.errorType.toString()), eq(message), any()) + } + + + + private fun mockSingleSignOnObject() { + whenever(oneginiAppToWebSingleSignOn.token).thenReturn(mockedTokenString) + whenever(oneginiAppToWebSingleSignOn.redirectUrl.toString()).thenReturn(mockedRedirectUrlString) + } + + private fun whenSSOReturnsError() { + whenever(oneginiAppToWebSingleSignOnError.errorType).thenReturn(1000) + whenever(oneginiAppToWebSingleSignOnError.message).thenReturn("message") + whenever(oneginiSdk.oneginiClient.userClient.getAppToWebSingleSignOn(any(), any())).thenAnswer { + it.getArgument(1).onError(oneginiAppToWebSingleSignOnError) + } + } + + private fun mockParseUri(uri: String) { + whenever(uriFacade.parse(uri)).thenReturn(parsedUri) + } + + private fun whenCalledWithUrl() { + whenever(callMock.argument("url")).thenReturn(correctUri) + } + + private fun whenCalledWithNullUrl() { + whenever(callMock.argument("url")).thenReturn(null) + } + +} \ No newline at end of file From c5721f6d7f72fa0b61f3d93a788be55ff890397c Mon Sep 17 00:00:00 2001 From: Michiel Vrins Date: Thu, 23 Mar 2023 09:36:23 +0100 Subject: [PATCH 2/4] FP-62: Android: Use pigeon for sso usecase --- .../mobile/sdk/flutter/PigeonInterface.kt | 26 +++------------ .../GetAppToWebSingleSignOnUseCase.kt | 32 +++++++++---------- 2 files changed, 19 insertions(+), 39 deletions(-) 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 be9bd374..a7312af1 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 @@ -31,6 +31,7 @@ import com.onegini.mobile.sdk.flutter.useCases.FingerprintAuthenticationRequestD import com.onegini.mobile.sdk.flutter.useCases.FingerprintFallbackToPinUseCase import com.onegini.mobile.sdk.flutter.useCases.GetAccessTokenUseCase import com.onegini.mobile.sdk.flutter.useCases.GetAllAuthenticatorsUseCase +import com.onegini.mobile.sdk.flutter.useCases.GetAppToWebSingleSignOnUseCase import com.onegini.mobile.sdk.flutter.useCases.GetAuthenticatedUserProfileUseCase import com.onegini.mobile.sdk.flutter.useCases.GetIdentityProvidersUseCase import com.onegini.mobile.sdk.flutter.useCases.GetNotRegisteredAuthenticatorsUseCase @@ -71,6 +72,8 @@ open class PigeonInterface : UserClientApi, ResourceMethodApi { @Inject lateinit var getAllAuthenticatorsUseCase: GetAllAuthenticatorsUseCase @Inject + lateinit var getAppToWebSingleSignOnUseCase: GetAppToWebSingleSignOnUseCase + @Inject lateinit var getAuthenticatedUserProfileUseCase: GetAuthenticatedUserProfileUseCase @Inject lateinit var getIdentityProvidersUseCase: GetIdentityProvidersUseCase @@ -184,28 +187,7 @@ open class PigeonInterface : UserClientApi, ResourceMethodApi { } override fun getAppToWebSingleSignOn(url: String, callback: (Result) -> Unit) { - // TODO NEEDS OWN USE CASE; https://onewelcome.atlassian.net/browse/FP-62 - if (!Patterns.WEB_URL.matcher(url).matches()) { - callback(Result.failure(SdkError(OneWelcomeWrapperErrors.MALFORMED_URL).pigeonError())) - return - } - val targetUri: Uri = Uri.parse(url) - - oneginiSDK.oneginiClient.userClient.getAppToWebSingleSignOn( - targetUri, - object : OneginiAppToWebSingleSignOnHandler { - override fun onSuccess(oneginiAppToWebSingleSignOn: OneginiAppToWebSingleSignOn) { - callback(Result.success(OWAppToWebSingleSignOn(oneginiAppToWebSingleSignOn.token, oneginiAppToWebSingleSignOn.redirectUrl.toString()))) - } - - override fun onError(oneginiSingleSignOnError: OneginiAppToWebSingleSignOnError) { - callback(Result.failure(SdkError( - code = oneginiSingleSignOnError.errorType, - message = oneginiSingleSignOnError.message - ).pigeonError())) - } - } - ) + getAppToWebSingleSignOnUseCase(url, callback) } override fun getAccessToken(callback: (Result) -> Unit) { diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt index 33586491..49cfbcce 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/GetAppToWebSingleSignOnUseCase.kt @@ -1,44 +1,42 @@ package com.onegini.mobile.sdk.flutter.useCases -import android.util.Patterns -import com.google.gson.Gson import com.onegini.mobile.sdk.android.handlers.OneginiAppToWebSingleSignOnHandler import com.onegini.mobile.sdk.android.handlers.error.OneginiAppToWebSingleSignOnError import com.onegini.mobile.sdk.android.model.OneginiAppToWebSingleSignOn -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.MALFORMED_URL -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.URL_CANT_BE_NULL import com.onegini.mobile.sdk.flutter.OneginiSDK import com.onegini.mobile.sdk.flutter.facade.UriFacade import com.onegini.mobile.sdk.flutter.helpers.SdkError -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel +import com.onegini.mobile.sdk.flutter.pigeonPlugin.OWAppToWebSingleSignOn import javax.inject.Inject import javax.inject.Singleton @Singleton class GetAppToWebSingleSignOnUseCase @Inject constructor(private val oneginiSDK: OneginiSDK, private val uriFacade: UriFacade) { - operator fun invoke(call: MethodCall, result: MethodChannel.Result) { - val url = call.argument("url") ?: return SdkError(URL_CANT_BE_NULL).flutterError(result) + operator fun invoke(url: String, callback: (Result) -> Unit) { val targetUri = uriFacade.parse(url) oneginiSDK.oneginiClient.userClient.getAppToWebSingleSignOn( targetUri, object : OneginiAppToWebSingleSignOnHandler { override fun onSuccess(oneginiAppToWebSingleSignOn: OneginiAppToWebSingleSignOn) { - result.success( - Gson().toJson( - mapOf( - "token" to oneginiAppToWebSingleSignOn.token, - "redirectUrl" to oneginiAppToWebSingleSignOn.redirectUrl.toString() + callback( + Result.success( + OWAppToWebSingleSignOn( + oneginiAppToWebSingleSignOn.token, + oneginiAppToWebSingleSignOn.redirectUrl.toString() ) ) ) } override fun onError(oneginiSingleSignOnError: OneginiAppToWebSingleSignOnError) { - SdkError( - code = oneginiSingleSignOnError.errorType, - message = oneginiSingleSignOnError.message - ).flutterError(result) + callback( + Result.failure( + SdkError( + code = oneginiSingleSignOnError.errorType, + message = oneginiSingleSignOnError.message + ).pigeonError() + ) + ) } } ) From 406c54ad82a271cdf4bbacc0c99e2cd6d0ae5993 Mon Sep 17 00:00:00 2001 From: Michiel Vrins Date: Fri, 24 Mar 2023 10:10:45 +0100 Subject: [PATCH 3/4] FP-62: Update tests for SSO --- .../sdk/flutter/OneWelcomeWrapperErrors.kt | 1 - .../GetAppToWebSingleSignOnUseCaseTests.kt | 61 ++++++------------- 2 files changed, 20 insertions(+), 42 deletions(-) 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 710d1211..9f1bb7b7 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 @@ -20,7 +20,6 @@ enum class OneWelcomeWrapperErrors(val code: Int, val message: String) { IDENTITY_PROVIDER_NOT_FOUND(8005, "The requested identity provider is not found"), QR_CODE_HAS_NO_DATA(8006, "QR-code does not have data"), METHOD_TO_CALL_NOT_FOUND(8007, "Method to call not found"), - URL_CANT_BE_NULL(8008, "Url can not be null"), MALFORMED_URL(8009, "Incorrect url format"), PREFERRED_AUTHENTICATOR_ERROR(8010, "Something went wrong when setting the preferred authenticator"), ONEWELCOME_SDK_NOT_INITIALIZED(8012, "OneWelcomeSDK is not initialized"), diff --git a/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt b/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt index 0e565fa8..eb69aa84 100644 --- a/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt +++ b/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt @@ -3,15 +3,20 @@ package com.onegini.mobile.sdk import android.net.Uri import com.google.gson.Gson import com.onegini.mobile.sdk.android.handlers.OneginiAppToWebSingleSignOnHandler +import com.onegini.mobile.sdk.android.handlers.OneginiPinValidationHandler import com.onegini.mobile.sdk.android.handlers.error.OneginiAppToWebSingleSignOnError import com.onegini.mobile.sdk.android.model.OneginiAppToWebSingleSignOn import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.* import com.onegini.mobile.sdk.flutter.OneginiSDK +import com.onegini.mobile.sdk.flutter.SdkErrorAssert import com.onegini.mobile.sdk.flutter.facade.UriFacade +import com.onegini.mobile.sdk.flutter.pigeonPlugin.FlutterError +import com.onegini.mobile.sdk.flutter.pigeonPlugin.OWAppToWebSingleSignOn import com.onegini.mobile.sdk.flutter.useCases.GetAppToWebSingleSignOnUseCase import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import junit.framework.TestCase.assertEquals +import org.junit.Assert import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -31,10 +36,8 @@ class GetAppToWebSingleSignOnUseCaseTests { lateinit var oneginiSdk: OneginiSDK @Mock - lateinit var resultMock: MethodChannel.Result + lateinit var callbackMock: (Result) -> Unit - @Mock - lateinit var callMock: MethodCall @Mock private lateinit var uriFacade: UriFacade @@ -60,52 +63,36 @@ class GetAppToWebSingleSignOnUseCaseTests { } @Test - fun `When GetAppToWebSingleSignOn is called without a url argument, Then should fail with URL_CANT_BE_NULL error`() { - whenCalledWithNullUrl() - - getAppToWebSingleSignOnUseCase(callMock, resultMock) - - val message = URL_CANT_BE_NULL.message - verify(resultMock).error(eq(URL_CANT_BE_NULL.code.toString()), eq(message), any()) - } - - @Test - fun `When oginini getAppToWebSingleSignOn calls onSuccess on the handler, Then promise should resolve with a map containing the content from the result`() { - whenCalledWithUrl() + fun `When oginini getAppToWebSingleSignOn calls onSuccess on the handler, Then promise should resolve with a OWAppToWebSingleSignOn with the token and url`() { mockParseUri(correctUri) mockSingleSignOnObject() whenever(oneginiSdk.oneginiClient.userClient.getAppToWebSingleSignOn(any(), any())).thenAnswer { it.getArgument(1).onSuccess(oneginiAppToWebSingleSignOn) } - getAppToWebSingleSignOnUseCase(callMock, resultMock) - - val argumentCaptor = argumentCaptor() - verify(resultMock).success(argumentCaptor.capture()) - // This will be reworked after FP-20 when we actually send the objects - val expectedResult = Gson().toJson( - mapOf( - "token" to oneginiAppToWebSingleSignOn.token, - "redirectUrl" to oneginiAppToWebSingleSignOn.redirectUrl.toString() - ) - ) - assertEquals(argumentCaptor.firstValue, expectedResult) + getAppToWebSingleSignOnUseCase(correctUri, callbackMock) + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + Assert.assertEquals(firstValue.getOrNull()?.token, oneginiAppToWebSingleSignOn.token) + Assert.assertEquals(firstValue.getOrNull()?.redirectUrl, oneginiAppToWebSingleSignOn.redirectUrl.toString()) + } } @Test fun `When oginini getAppToWebSingleSignOn calls onError on the handler, Then result should fail with the error message and code`() { mockParseUri(correctUri) - whenCalledWithUrl() whenSSOReturnsError() - getAppToWebSingleSignOnUseCase(callMock, resultMock) - - val message = oneginiAppToWebSingleSignOnError.message - verify(resultMock).error(eq(oneginiAppToWebSingleSignOnError.errorType.toString()), eq(message), any()) - } + getAppToWebSingleSignOnUseCase(correctUri, callbackMock) + argumentCaptor>().apply { + verify(callbackMock).invoke(capture()) + val expected = FlutterError(oneginiAppToWebSingleSignOnError.errorType.toString(), oneginiAppToWebSingleSignOnError.message) + SdkErrorAssert.assertEquals(expected, firstValue.exceptionOrNull()) + } + } private fun mockSingleSignOnObject() { whenever(oneginiAppToWebSingleSignOn.token).thenReturn(mockedTokenString) @@ -124,12 +111,4 @@ class GetAppToWebSingleSignOnUseCaseTests { whenever(uriFacade.parse(uri)).thenReturn(parsedUri) } - private fun whenCalledWithUrl() { - whenever(callMock.argument("url")).thenReturn(correctUri) - } - - private fun whenCalledWithNullUrl() { - whenever(callMock.argument("url")).thenReturn(null) - } - } \ No newline at end of file From a7484836ab0fa603a3bdd570dfaf0f35b49da53e Mon Sep 17 00:00:00 2001 From: Michiel Vrins Date: Fri, 24 Mar 2023 10:14:18 +0100 Subject: [PATCH 4/4] FP-62: Fix newlines --- .../onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt b/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt index eb69aa84..55674431 100644 --- a/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt +++ b/android/src/test/java/com/onegini/mobile/sdk/GetAppToWebSingleSignOnUseCaseTests.kt @@ -110,5 +110,4 @@ class GetAppToWebSingleSignOnUseCaseTests { private fun mockParseUri(uri: String) { whenever(uriFacade.parse(uri)).thenReturn(parsedUri) } - -} \ No newline at end of file +}