Skip to content

Commit

Permalink
af: Use Application Context for Credentials Manager (#289)
Browse files Browse the repository at this point in the history
  • Loading branch information
poovamraj authored Jul 11, 2023
1 parent d72bf76 commit 6e25f10
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class Auth0FlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {

credentialsManagerMethodChannel = MethodChannel(flutterPluginBinding.binaryMessenger, "auth0.com/auth0_flutter/credentials_manager")
credentialsManagerMethodChannel.setMethodCallHandler(credentialsManagerCallHandler)

credentialsManagerCallHandler.context = flutterPluginBinding.applicationContext
}

override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.auth0.auth0_flutter

import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.annotation.NonNull
import com.auth0.android.authentication.AuthenticationAPIClient
Expand All @@ -23,6 +24,8 @@ class CredentialsManagerMethodCallHandler(private val requestHandlers: List<Cred
// GitHub issue: https://github.com/jacoco/jacoco/issues/1182
@Generated
lateinit var activity: Activity
@Generated
lateinit var context: Context

var credentialsManager: SecureCredentialsManager? = null

Expand All @@ -33,8 +36,8 @@ class CredentialsManagerMethodCallHandler(private val requestHandlers: List<Cred
val request = MethodCallRequest.fromCall(call)

val api = AuthenticationAPIClient(request.account)
val storage = SharedPreferencesStorage(activity)
credentialsManager = credentialsManager ?: SecureCredentialsManager(activity, api, storage)
val storage = SharedPreferencesStorage(context)
credentialsManager = credentialsManager ?: SecureCredentialsManager(context, api, storage)

val credentialsManager = credentialsManager as SecureCredentialsManager
val localAuthentication = request.data.get("localAuthentication") as Map<String, String>?
Expand All @@ -44,7 +47,7 @@ class CredentialsManagerMethodCallHandler(private val requestHandlers: List<Cred
val description = localAuthentication["description"]
credentialsManager.requireAuthentication(activity, RequestCodes.AUTH_REQ_CODE, title, description)
}
requestHandler.handle(credentialsManager, activity, request, result)
requestHandler.handle(credentialsManager, context, request, result)
} else {
result.notImplemented()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.auth0.auth0_flutter

import android.app.Activity
import android.content.Context
import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodChannel
import org.junit.Test
Expand All @@ -17,7 +19,10 @@ class Auth0FlutterPluginTest {
mockConstruction(MethodChannel::class.java).use { m ->
val plugin = Auth0FlutterPlugin()

plugin.onAttachedToEngine(mock())
val mockBindings = mock<FlutterPluginBinding>()
val mockContext = mock<Context>()
`when`(mockBindings.applicationContext).thenReturn(mockContext)
plugin.onAttachedToEngine(mockBindings)

val constructed: List<MethodChannel> = m.constructed()

Expand All @@ -40,7 +45,10 @@ class Auth0FlutterPluginTest {
mockConstruction(MethodChannel::class.java).use { m ->
val plugin = Auth0FlutterPlugin()

plugin.onAttachedToEngine(mock())
val mockBindings = mock<FlutterPluginBinding>()
val mockContext = mock<Context>()
`when`(mockBindings.applicationContext).thenReturn(mockContext)
plugin.onAttachedToEngine(mockBindings)

val constructed: List<MethodChannel> = m.constructed()

Expand All @@ -61,19 +69,22 @@ class Auth0FlutterPluginTest {
}

@Test
fun `should set Activity on onAttachedToActivity`() {
fun `should set Activity on onAttachedToActivity and ApplicationContext on onAttachedToEngine`() {
mockConstruction(MethodChannel::class.java).use { m ->
val plugin = Auth0FlutterPlugin()

plugin.onAttachedToEngine(mock())
val mockBindings = mock<FlutterPluginBinding>()
val mockContext = mock<Context>()
`when`(mockBindings.applicationContext).thenReturn(mockContext)
plugin.onAttachedToEngine(mockBindings)

val constructed: List<MethodChannel> = m.constructed()

val mockBindings = mock<ActivityPluginBinding>()
val mockActivityBindings = mock<ActivityPluginBinding>()
val mockActivity = mock<Activity>()
`when`(mockBindings.activity).thenReturn(mockActivity)
`when`(mockActivityBindings.activity).thenReturn(mockActivity)

plugin.onAttachedToActivity(mockBindings)
plugin.onAttachedToActivity(mockActivityBindings)

fun <TMethodCallHandler : MethodChannel.MethodCallHandler> getHandler(i: Int): TMethodCallHandler {
val captor = argumentCaptor<MethodChannel.MethodCallHandler>()
Expand All @@ -86,6 +97,7 @@ class Auth0FlutterPluginTest {

assert(getHandler<Auth0FlutterWebAuthMethodCallHandler>(0).activity == mockActivity)
assert(getHandler<CredentialsManagerMethodCallHandler>(2).activity == mockActivity)
assert(getHandler<CredentialsManagerMethodCallHandler>(2).context == mockContext)

assert(constructed.size == 3)
}
Expand All @@ -96,16 +108,19 @@ class Auth0FlutterPluginTest {
mockConstruction(MethodChannel::class.java).use {
val plugin = Auth0FlutterPlugin()

plugin.onAttachedToEngine(mock())
val mockBindings = mock<FlutterPluginBinding>()
val mockContext = mock<Context>()
`when`(mockBindings.applicationContext).thenReturn(mockContext)
plugin.onAttachedToEngine(mockBindings)

val mockBindings = mock<ActivityPluginBinding>()
val mockActivityBindings = mock<ActivityPluginBinding>()
val mockActivity = mock<Activity>()

`when`(mockBindings.activity).thenReturn(mockActivity)
`when`(mockActivityBindings.activity).thenReturn(mockActivity)

plugin.onAttachedToActivity(mockBindings)
plugin.onAttachedToActivity(mockActivityBindings)

verify(mockBindings).addActivityResultListener(
verify(mockActivityBindings).addActivityResultListener(
any<CredentialsManagerMethodCallHandler>()
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.auth0.auth0_flutter

import android.app.Activity
import android.content.Context
import android.content.SharedPreferences
import com.auth0.auth0_flutter.request_handlers.credentials_manager.ClearCredentialsRequestHandler
import com.auth0.auth0_flutter.request_handlers.credentials_manager.CredentialsManagerRequestHandler
Expand Down Expand Up @@ -33,12 +34,14 @@ class CredentialsManagerMethodCallHandlerTest {
arguments: HashMap<String, Any?> = defaultArguments,
requestHandlers: List<CredentialsManagerRequestHandler>,
activity: Activity? = null,
context: Context? = null,
onResult: (Result) -> Unit,
) {
val handler = CredentialsManagerMethodCallHandler(requestHandlers)
val mockResult = mock<Result>()

handler.activity = if (activity === null) mock() else activity
handler.context = if (context === null) mock() else context

handler.onMethodCall(MethodCall(method, arguments), mockResult)
onResult(mockResult)
Expand Down Expand Up @@ -69,15 +72,17 @@ class CredentialsManagerMethodCallHandlerTest {
`when`(clearCredentialsHandler.method).thenReturn("credentialsManager#clearCredentials")

val activity: Activity = mock()
val context: Context = mock()
val mockPrefs: SharedPreferences = mock()

`when`(activity.getSharedPreferences(any(), any()))
`when`(context.getSharedPreferences(any(), any()))
.thenReturn(mockPrefs)

val handler = CredentialsManagerMethodCallHandler(listOf(clearCredentialsHandler))
val mockResult = mock<Result>()

handler.activity = activity
handler.context = context
handler.credentialsManager = mock()

handler.onMethodCall(MethodCall(clearCredentialsHandler.method, defaultArguments), mockResult)
Expand All @@ -92,15 +97,17 @@ class CredentialsManagerMethodCallHandlerTest {
`when`(clearCredentialsHandler.method).thenReturn("credentialsManager#clearCredentials")

val activity: Activity = mock()
val context: Context = mock()
val mockPrefs: SharedPreferences = mock()

`when`(activity.getSharedPreferences(any(), any()))
`when`(context.getSharedPreferences(any(), any()))
.thenReturn(mockPrefs)

val handler = CredentialsManagerMethodCallHandler(listOf(clearCredentialsHandler))
val mockResult = mock<Result>()

handler.activity = activity
handler.context = context
handler.credentialsManager = mock()

handler.onMethodCall(MethodCall(clearCredentialsHandler.method, defaultArguments + hashMapOf("localAuthentication" to hashMapOf("title" to "test", "description" to "test description"))), mockResult)
Expand All @@ -115,15 +122,17 @@ class CredentialsManagerMethodCallHandlerTest {
`when`(clearCredentialsHandler.method).thenReturn("credentialsManager#clearCredentials")

val activity: Activity = mock()
val context: Context = mock()
val mockPrefs: SharedPreferences = mock()

`when`(activity.getSharedPreferences(any(), any()))
`when`(context.getSharedPreferences(any(), any()))
.thenReturn(mockPrefs)

val handler = CredentialsManagerMethodCallHandler(listOf(clearCredentialsHandler))
val mockResult = mock<Result>()

handler.activity = activity
handler.context = context
handler.credentialsManager = mock()

handler.onMethodCall(MethodCall(clearCredentialsHandler.method, defaultArguments + hashMapOf("localAuthentication" to hashMapOf<String, String>())), mockResult)
Expand All @@ -140,14 +149,15 @@ class CredentialsManagerMethodCallHandlerTest {
`when`(hasValidCredentialsHandler.method).thenReturn("credentialsManager#hasValidCredentials")

val activity: Activity = mock()
val context: Context = mock()
val mockPrefs: SharedPreferences = mock()

`when`(activity.getSharedPreferences(any(), any()))
`when`(context.getSharedPreferences(any(), any()))
.thenReturn(mockPrefs)

runCallHandler(clearCredentialsHandler.method, activity = activity, requestHandlers = listOf(clearCredentialsHandler, hasValidCredentialsHandler)) {
verify(clearCredentialsHandler).handle(any(), eq(activity), any(), any())
verify(hasValidCredentialsHandler, times(0)).handle(any(), eq(activity), any(), any())
runCallHandler(clearCredentialsHandler.method, activity = activity, context = context, requestHandlers = listOf(clearCredentialsHandler, hasValidCredentialsHandler)) {
verify(clearCredentialsHandler).handle(any(), eq(context), any(), any())
verify(hasValidCredentialsHandler, times(0)).handle(any(), eq(context), any(), any())
}
}

Expand Down

0 comments on commit 6e25f10

Please sign in to comment.