This repository has been archived by the owner on Nov 1, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 475
/
BiometricPromptFeatureTest.kt
139 lines (113 loc) · 5.12 KB
/
BiometricPromptFeatureTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package mozilla.components.lib.auth
import android.os.Build.VERSION_CODES.LOLLIPOP
import android.os.Build.VERSION_CODES.M
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt
import androidx.fragment.app.Fragment
import mozilla.components.support.test.any
import mozilla.components.support.test.mock
import mozilla.components.support.test.robolectric.createAddedTestFragment
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
class BiometricPromptFeatureTest {
private lateinit var biometricPromptFeature: BiometricPromptFeature
private lateinit var biometricManager: BiometricManager
private lateinit var fragment: Fragment
private lateinit var biometricUtils: BiometricUtils
@Before
fun setup() {
fragment = createAddedTestFragment { Fragment() }
biometricUtils = spy(BiometricUtils())
biometricPromptFeature = spy(
BiometricPromptFeature(
testContext,
fragment,
object : AuthenticationCallbacks {
override val onAuthFailure: () -> Unit
get() = {}
override val onAuthSuccess: () -> Unit
get() = { }
override val onAuthError: (errorText: String) -> Unit
get() = {}
}
)
)
biometricManager = mock()
doReturn(biometricManager).`when`(biometricUtils).getAndroidBiometricManager(testContext)
}
@Config(sdk = [LOLLIPOP])
@Test
fun `canUseFeature checks for SDK compatible`() {
assertFalse(biometricUtils.canUseFeature(testContext))
}
@Config(sdk = [M])
@Test
fun `GIVEN canUseFeature is called WHEN hardware is available and biometric is enrolled THEN canUseFeature return true`() {
doReturn(true).`when`(biometricUtils).isHardwareAvailable(biometricManager)
doReturn(true).`when`(biometricUtils).isEnrolled(biometricManager)
assertTrue(biometricUtils.canUseFeature(testContext))
}
@Config(sdk = [M])
@Test
fun `GIVEN canUseFeature is called WHEN hardware is available and biometric is not enrolled THEN canUseFeature return false`() {
doReturn(false).`when`(biometricUtils).isHardwareAvailable(biometricManager)
doReturn(true).`when`(biometricUtils).isEnrolled(biometricManager)
assertFalse(biometricUtils.canUseFeature(testContext))
}
@Config(sdk = [M])
@Test
fun `GIVEN canUseFeature is called WHEN hardware is not available and biometric is not enrolled THEN canUseFeature return false`() {
doReturn(false).`when`(biometricUtils).isHardwareAvailable(biometricManager)
doReturn(false).`when`(biometricUtils).isEnrolled(biometricManager)
assertFalse(biometricUtils.canUseFeature(testContext))
}
@Config(sdk = [M])
@Test
fun `GIVEN canUseFeature is called WHEN hardware is not available and biometric is enrolled THEN canUseFeature return false`() {
doReturn(false).`when`(biometricUtils).isHardwareAvailable(biometricManager)
doReturn(true).`when`(biometricUtils).isEnrolled(biometricManager)
assertFalse(biometricUtils.canUseFeature(testContext))
}
@Test
fun `prompt is created and destroyed on start and stop`() {
assertNull(biometricPromptFeature.biometricPrompt)
biometricPromptFeature.start()
assertNotNull(biometricPromptFeature.biometricPrompt)
biometricPromptFeature.stop()
assertNull(biometricPromptFeature.biometricPrompt)
}
@Test
fun `requestAuthentication invokes biometric prompt`() {
val prompt: BiometricPrompt = mock()
biometricPromptFeature.biometricPrompt = prompt
biometricPromptFeature.requestAuthentication("title", "subtitle")
verify(prompt).authenticate(any())
}
@Test
fun `promptCallback fires feature callbacks`() {
val promptCallback: BiometricPromptFeature.PromptCallback = mock()
val prompt = BiometricPrompt(fragment, promptCallback)
biometricPromptFeature.biometricPrompt = prompt
promptCallback.onAuthenticationError(BiometricPrompt.ERROR_CANCELED, "")
verify(promptCallback).onAuthenticationError(BiometricPrompt.ERROR_CANCELED, "")
promptCallback.onAuthenticationFailed()
verify(promptCallback).onAuthenticationFailed()
promptCallback.onAuthenticationSucceeded(any())
verify(promptCallback).onAuthenticationSucceeded(any())
}
}