@@ -10,6 +10,7 @@ import com.darkrockstudios.app.securecamera.preferences.HashedPin
1010import com.darkrockstudios.app.securecamera.security.SoftwareSchemeConfig
1111import com.darkrockstudios.app.securecamera.security.pin.PinRepository
1212import com.darkrockstudios.app.securecamera.security.schemes.EncryptionScheme
13+ import com.darkrockstudios.app.securecamera.usecases.AuthorizePinUseCase
1314import io.mockk.coEvery
1415import io.mockk.coVerify
1516import io.mockk.mockk
@@ -24,6 +25,7 @@ import org.junit.Test
2425import testutil.FakeDataStore
2526import java.util.concurrent.TimeUnit
2627import kotlin.time.Duration.Companion.milliseconds
28+ import kotlin.time.Duration.Companion.seconds
2729import kotlin.time.Instant
2830
2931@ExperimentalCoroutinesApi
@@ -32,9 +34,10 @@ class AuthorizationManagerTest {
3234 private lateinit var context: Context
3335 private lateinit var preferencesManager: AppPreferencesDataSource
3436 private lateinit var authManager: AuthorizationRepository
37+ private lateinit var authorizePinUseCase: AuthorizePinUseCase
38+ private lateinit var pinRepository: PinRepository
3539 private lateinit var dataStore: DataStore <Preferences >
3640 private lateinit var encryptionManager: EncryptionScheme
37- private lateinit var pinRepository: PinRepository
3841 private lateinit var clock: TestClock
3942
4043 private val configJson = Json .encodeToString(SoftwareSchemeConfig )
@@ -45,49 +48,15 @@ class AuthorizationManagerTest {
4548 dataStore = FakeDataStore (emptyPreferences())
4649 preferencesManager = spyk(AppPreferencesDataSource (context, dataStore))
4750 encryptionManager = mockk(relaxed = true )
48- pinRepository = mockk()
4951 clock = TestClock (Instant .fromEpochSeconds(1 ))
5052
51- // Default mocks for PinRepository methods
53+ authManager = AuthorizationRepository (preferencesManager, encryptionManager, context, clock)
54+
55+ pinRepository = mockk()
5256 coEvery { pinRepository.getHashedPin() } returns HashedPin (" hashed_pin" , " salt" )
5357 coEvery { pinRepository.verifySecurityPin(any()) } returns true
54- coEvery { pinRepository.activatePoisonPill() } returns Unit
55- coEvery { pinRepository.verifyPoisonPillPin(any()) } returns true
56- coEvery { pinRepository.hasPoisonPillPin() } returns true
57-
58- authManager = AuthorizationRepository (preferencesManager, pinRepository, encryptionManager, context, clock)
59- }
6058
61- @Test
62- fun `verifyPin should update authorization state when PIN is valid` () = runTest {
63- // Given
64- val pin = " 1234"
65- preferencesManager.setAppPin(pin, configJson)
66-
67- // When
68- val result = authManager.verifyPin(pin)
69-
70- // Then
71- assertNotNull(result)
72- assertTrue(authManager.isAuthorized.first())
73- }
74-
75- @Test
76- fun `verifyPin should not update authorization state when PIN is invalid` () = runTest {
77- // Given
78- val correctPin = " 1234"
79- val incorrectPin = " 5678"
80- preferencesManager.setAppPin(correctPin, configJson)
81-
82- // Mock verifySecurityPin to return false for incorrect PIN
83- coEvery { pinRepository.verifySecurityPin(incorrectPin) } returns false
84-
85- // When
86- val result = authManager.verifyPin(incorrectPin)
87-
88- // Then
89- assertNull(result)
90- assertFalse(authManager.isAuthorized.first())
59+ authorizePinUseCase = AuthorizePinUseCase (authManager, pinRepository)
9160 }
9261
9362 @Test
@@ -108,7 +77,7 @@ class AuthorizationManagerTest {
10877 // Given
10978 val pin = " 1234"
11079 preferencesManager.setAppPin(pin, configJson)
111- authManager.verifyPin (pin)
80+ authorizePinUseCase.authorizePin (pin)
11281
11382 // When
11483 val result = authManager.checkSessionValidity()
@@ -124,15 +93,12 @@ class AuthorizationManagerTest {
12493 val pin = " 1234"
12594 preferencesManager.setAppPin(pin, configJson)
12695
127- coEvery { pinRepository.getHashedPin() } returns null
128-
12996 // Set a very small session timeout (1 millisecond)
13097 preferencesManager.setSessionTimeout(1L )
13198
132- authManager.verifyPin (pin)
99+ authorizePinUseCase.authorizePin (pin)
133100
134- // Wait for the session to expire
135- Thread .sleep(10 )
101+ clock.advanceBy(1 .seconds)
136102
137103 // When
138104 val result = authManager.checkSessionValidity()
@@ -147,7 +113,7 @@ class AuthorizationManagerTest {
147113 // Given
148114 val pin = " 1234"
149115 preferencesManager.setAppPin(pin, configJson)
150- authManager.verifyPin (pin)
116+ authorizePinUseCase.authorizePin (pin)
151117 assertTrue(authManager.isAuthorized.first())
152118
153119 // When
@@ -166,7 +132,7 @@ class AuthorizationManagerTest {
166132 preferencesManager.setSessionTimeout(customTimeout)
167133
168134 // When
169- authManager.verifyPin (pin)
135+ authorizePinUseCase.authorizePin (pin)
170136
171137 // Then
172138 assertTrue(authManager.checkSessionValidity())
@@ -232,22 +198,6 @@ class AuthorizationManagerTest {
232198 assertEquals(0L , preferencesManager.getLastFailedAttemptTimestamp())
233199 }
234200
235- @Test
236- fun `verifyPin should reset failed attempts when PIN is valid` () = runTest {
237- // Given
238- val pin = " 1234"
239- preferencesManager.setAppPin(pin, configJson)
240- preferencesManager.setFailedPinAttempts(3 )
241- preferencesManager.setLastFailedAttemptTimestamp(1000L )
242-
243- // When
244- val result = authManager.verifyPin(pin)
245-
246- // Then
247- assertNotNull(result)
248- assertEquals(0 , preferencesManager.getFailedPinAttempts())
249- assertEquals(0L , preferencesManager.getLastFailedAttemptTimestamp())
250- }
251201
252202 @Test
253203 fun `getLastFailedAttemptTimestamp should return the timestamp from preferences` () = runTest {
@@ -311,9 +261,9 @@ class AuthorizationManagerTest {
311261 // Given
312262 val pin = " 1234"
313263
314- // Create a new spy for preferencesManager for this test
264+ // Create a new AuthorizationRepository for this test
315265 val testAuthManager =
316- AuthorizationRepository (preferencesManager, pinRepository, encryptionManager, context, clock)
266+ AuthorizationRepository (preferencesManager, encryptionManager, context, clock)
317267
318268 // Set up initial state
319269 preferencesManager.setAppPin(pin, configJson)
@@ -331,21 +281,6 @@ class AuthorizationManagerTest {
331281 coVerify { preferencesManager.securityFailureReset() }
332282 }
333283
334- @Test
335- fun `verifyPin should not update authorization state when PIN is valid but hashedPin is null` () = runTest {
336- // Given
337- val pin = " 1234"
338- coEvery { pinRepository.verifySecurityPin(pin) } returns true
339- coEvery { pinRepository.getHashedPin() } returns null
340-
341- // When
342- val result = authManager.verifyPin(pin)
343-
344- // Then
345- assertNull(result)
346- assertFalse(authManager.isAuthorized.first())
347- coVerify { pinRepository.verifySecurityPin(pin) }
348- }
349284
350285 @Test
351286 fun `calculateRemainingBackoffSeconds should return 0 when elapsed time exceeds backoff time` () = runTest {
@@ -379,7 +314,7 @@ class AuthorizationManagerTest {
379314 clock.fixedInstant = initialTime
380315
381316 // Authorize the session
382- authManager.verifyPin (pin)
317+ authorizePinUseCase.authorizePin (pin)
383318 assertTrue(authManager.isAuthorized.first())
384319
385320 // Advance time by half the session timeout
0 commit comments