Skip to content

Commit f0bec04

Browse files
authored
feat: add handling of 'LAError.Code.passcodeNotSet' error (#2)
1 parent 483ef73 commit f0bec04

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

Sources/LocalAuthenticationProvider/LocalAuthenticationError.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ import Foundation
2828
public enum LocalAuthenticationError: Error {
2929
// MARK: - Error codes for common local authentication errors.
3030

31-
/// -6
31+
/// -5, LAError.Code.passcodeNotSet
32+
public static let passcodeNotSet: Int = -5
33+
34+
/// -6, LAError.Code.biometryNotAvailable
3235
public static let denied: Int = -6
3336

34-
/// -7
37+
/// -7, LAError.Code.biometryNotEnrolled
3538
public static let noBiometricsEnrolled: Int = -7
3639

3740
/// 0
@@ -52,6 +55,9 @@ public enum LocalAuthenticationError: Error {
5255
/// No fingerprints are enrolled on the device.
5356
case noFingerprintEnrolled
5457

58+
/// A passcode isn’t set on the device.
59+
case noPasscodeSet
60+
5561
/// An underlying error occurred.
5662
///
5763
/// - Parameter error: The underlying error.

Sources/LocalAuthenticationProvider/LocalAuthenticationProvider.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,12 @@ public final class LocalAuthenticationProvider: LocalAuthenticationProviderProto
7070
logger.error("\(#function) Local Authentication Error: \(error.localizedDescription)")
7171
throw LocalAuthenticationError.biometricError
7272
}
73+
case LocalAuthenticationError.passcodeNotSet:
74+
logger.error("\(#function) Check biometric auth available: \(error.localizedDescription)")
75+
throw LocalAuthenticationError.noPasscodeSet
7376
default:
7477
logger.error("\(#function) Local Authentication Error: \(error.localizedDescription)")
75-
throw LocalAuthenticationError.biometricError
78+
throw LocalAuthenticationError.error(error)
7679
}
7780
}
7881
return false

Tests/LocalAuthenticationProviderTests/LocalAuthenticationProviderTests.swift

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import XCTest
2626
@testable import LocalAuthenticationProvider
2727

2828
final class LocalAuthenticationProviderTests: XCTestCase {
29-
func testCanEvaluatePolicyWhenOwnetAuthenticatedWithBiometrics() async throws {
29+
func testCanEvaluatePolicyWhenOwnerAuthenticatedWithBiometrics() async throws {
3030
let context = MockLAContext(canEvaluatePolicies: [.deviceOwnerAuthenticationWithBiometrics])
3131
let provider = LocalAuthenticationProvider(context: context)
3232
let checkBiometricsSuccess = try await provider.checkBiometricAvailable()
@@ -58,6 +58,19 @@ final class LocalAuthenticationProviderTests: XCTestCase {
5858
}
5959
}
6060

61+
func testCanEvaluatePolicyWhenPasscodeNotSet() async {
62+
let errorCode = LocalAuthenticationError.passcodeNotSet
63+
let context = MockLAContext(canEvaluatePolicyError: NSError(domain: "", code: errorCode))
64+
let provider = LocalAuthenticationProvider(context: context)
65+
do {
66+
_ = try await provider.checkBiometricAvailable()
67+
XCTFail(".noPasscodeSet error must be thrown")
68+
} catch LocalAuthenticationError.noPasscodeSet {
69+
} catch {
70+
XCTFail("Unexpected error thrown - must be .noPasscodeSet")
71+
}
72+
}
73+
6174
func testCanEvaluatePolicyWhenBiometricsIssue() async {
6275
let errorCode = LocalAuthenticationError.noBiometricsEnrolled
6376
let context = MockLAContext(canEvaluatePolicyError: NSError(domain: "", code: errorCode))
@@ -99,18 +112,20 @@ final class LocalAuthenticationProviderTests: XCTestCase {
99112

100113
func testCanEvaluatePolicyWhenUnknownError() async {
101114
let errorCode = LocalAuthenticationError.unknownError
102-
let context = MockLAContext(canEvaluatePolicyError: NSError(domain: "", code: errorCode))
115+
let expectedError = NSError(domain: "", code: errorCode)
116+
let context = MockLAContext(canEvaluatePolicyError: expectedError)
103117
let provider = LocalAuthenticationProvider(context: context)
104118
do {
105119
_ = try await provider.checkBiometricAvailable()
106120
XCTFail("Error must be thrown")
107-
} catch LocalAuthenticationError.biometricError {
121+
} catch LocalAuthenticationError.error(let error) {
122+
XCTAssertEqual(error as NSError, expectedError)
108123
} catch {
109124
XCTFail("Unexpected error thrown")
110125
}
111126
}
112127

113-
func testEvaluatePolicyWhenBiometricsSetSuccesful() async throws {
128+
func testEvaluatePolicyWhenBiometricsSetSuccessful() async throws {
114129
let context = MockLAContext(
115130
successEvaluatePolicies: [.deviceOwnerAuthenticationWithBiometrics],
116131
canEvaluatePolicies: [.deviceOwnerAuthenticationWithBiometrics])

0 commit comments

Comments
 (0)