Skip to content

Commit f2ef952

Browse files
Merge pull request #1 from passageidentity/PSG-3965-passkey-readiness
Added tests for passkey readiness methods
2 parents 1cb19f6 + b518868 commit f2ef952

File tree

7 files changed

+77
-31
lines changed

7 files changed

+77
-31
lines changed

Package.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@
44
import PackageDescription
55

66
let package = Package(
7-
name: "passage-authentikit-ios",
7+
name: "Passage Authentikit",
88
platforms: [.iOS(.v14), .macOS(.v10_13), .visionOS(.v1), .tvOS(.v13)],
99
products: [
1010
// Products define the executables and libraries a package produces, making them visible to other packages.
1111
.library(
12-
name: "passage-authentikit-ios",
13-
targets: ["passage-authentikit-ios"]),
12+
name: "Passage Authentikit",
13+
targets: ["Authentikit"]),
1414
],
1515
targets: [
1616
// Targets are the basic building blocks of a package, defining a module or a test suite.
1717
// Targets can depend on other targets in this package and products from dependencies.
1818
.target(
19-
name: "passage-authentikit-ios"),
19+
name: "Authentikit"),
2020
.testTarget(
2121
name: "passage-authentikit-iosTests",
22-
dependencies: ["passage-authentikit-ios"]),
22+
dependencies: ["Authentikit"]),
2323
]
2424
)

Sources/passage-authentikit-ios/Authentikit.swift renamed to Sources/Authentikit/Authentikit.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public class Authentikit {
44

55
public let passkey: Passkey
66

7-
internal static let BASE_PATH = "https://auth-uat.passage.dev"
7+
internal static var BASE_PATH = "https://auth.passage.id"
88
internal static let PACKAGE_VERSION = "0.1.0"
99

1010
public init(clientSideKey: String) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Foundation
2+
3+
public class AuthentikitException: Error, CustomStringConvertible {
4+
public var message: String
5+
6+
public init(_ message: String) {
7+
self.message = message
8+
}
9+
10+
public var description: String {
11+
return message
12+
}
13+
}
14+
15+
public class PasskeyException: AuthentikitException {}
16+
17+
public class PasskeyEvaluationException: PasskeyException {}

Sources/passage-authentikit-ios/Passkey.swift renamed to Sources/Authentikit/Passkey.swift

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@ public class Passkey {
44

55
private let clientSideKey: String
66
private let userDefaults = UserDefaults.standard
7-
private let lastEvaluationKey = "lastEvaluationDate"
7+
private static let LAST_EVALUATION_KEY = "LAST_EVALUATION_KEY"
88

99
init(clientSideKey: String) {
1010
self.clientSideKey = clientSideKey
1111
}
1212

13-
public func evaluateReadiness() async {
13+
public func evaluateReadiness() async throws {
1414
guard canEvaluateReadiness() else {
15-
print("❌ Evaluate readiness can only be called once in 24 hours.")
1615
return
1716
}
1817
let device = await UIDevice.current
18+
let bundleId = Bundle.main.bundleIdentifier ?? ""
1919
let requestHeaders: [String : String] = await [
20-
"app_identifier": Bundle.main.bundleIdentifier ?? "",
20+
"app_identifier": bundleId,
2121
"device_os": device.systemName,
2222
"device_os_version": device.systemVersion,
23+
"origin": bundleId,
2324
"Content-Type": "application/json",
2425
"Passage-Version": "Passage Authentikit iOS \(Authentikit.PACKAGE_VERSION)",
2526
"X-API-KEY": clientSideKey,
@@ -35,9 +36,11 @@ public class Passkey {
3536
"security_key": supportsPassekeys,
3637
]
3738
let urlString = "\(Authentikit.BASE_PATH)/v1/analytics/passkey-readiness"
39+
print(urlString)
40+
print(requestHeaders)
41+
print(requestBody)
3842
guard let url = URL(string: urlString) else {
39-
print("❌ Failed evaluate passkey readiness.")
40-
return
43+
throw PasskeyEvaluationException("Could not initialize URL.")
4144
}
4245
var request = URLRequest(url: url)
4346
request.httpMethod = "POST"
@@ -47,30 +50,33 @@ public class Passkey {
4750
do {
4851
let jsonData = try JSONSerialization.data(withJSONObject: requestBody, options: [])
4952
request.httpBody = jsonData
50-
let (data, response) = try await URLSession.shared.data(for: request)
53+
let (_, response) = try await URLSession.shared.data(for: request)
5154
guard let httpResponse = response as? HTTPURLResponse,
5255
(200...299).contains(httpResponse.statusCode)
5356
else {
54-
print("❌ Failed evaluate passkey readiness.")
55-
return
57+
throw PasskeyEvaluationException("Network request failed.")
5658
}
5759
updateLastEvaluationDate()
58-
print("✅ Successfully evaluated passkey readiness.")
60+
return
5961
} catch {
60-
print("❌ Failed evaluate passkey readiness.")
62+
throw PasskeyEvaluationException(error.localizedDescription)
6163
}
6264

6365
}
6466

6567
private func canEvaluateReadiness() -> Bool {
66-
if let lastEvaluationDate = userDefaults.object(forKey: lastEvaluationKey) as? Date {
68+
if let lastEvaluationDate = userDefaults.object(forKey: Passkey.LAST_EVALUATION_KEY) as? Date {
6769
return Date().timeIntervalSince(lastEvaluationDate) > 24 * 60 * 60
6870
}
6971
return true
7072
}
7173

7274
private func updateLastEvaluationDate() {
73-
userDefaults.set(Date(), forKey: lastEvaluationKey)
75+
userDefaults.set(Date(), forKey: Passkey.LAST_EVALUATION_KEY)
76+
}
77+
78+
internal func clearLastEvaluationDate() {
79+
userDefaults.set(nil, forKey: Passkey.LAST_EVALUATION_KEY)
7480
}
7581

7682
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import XCTest
2+
@testable import Authentikit
3+
4+
final class AuthentikitTests: XCTestCase {
5+
6+
static let VALID_KEY = "PLACEHOLDER_VALID_KEY"
7+
static let INVALID_KEY = "INVALID_KEY"
8+
9+
override class func setUp() {
10+
super.setUp()
11+
Authentikit.BASE_PATH = "https://auth-uat.passage.dev"
12+
}
13+
14+
override class func tearDown() {
15+
super.tearDown()
16+
let authentikit = Authentikit(clientSideKey: AuthentikitTests.VALID_KEY)
17+
authentikit.passkey.clearLastEvaluationDate()
18+
}
19+
20+
func testValidClientKeySucceeds() async throws {
21+
let authentikit = Authentikit(clientSideKey: AuthentikitTests.VALID_KEY)
22+
try await authentikit.passkey.evaluateReadiness()
23+
authentikit.passkey.clearLastEvaluationDate()
24+
}
25+
26+
func testInvalidClientKeyFails() async {
27+
let authentikit = Authentikit(clientSideKey: AuthentikitTests.INVALID_KEY)
28+
do {
29+
try await authentikit.passkey.evaluateReadiness()
30+
XCTFail("evaluateReadiness should fail with PasskeyEvaluationException")
31+
} catch {
32+
XCTAssertTrue(error is PasskeyEvaluationException)
33+
}
34+
}
35+
}

Tests/passage-authentikit-iosTests/passage_authentikit_iosTests.swift

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)