Skip to content

Commit e2ca4c0

Browse files
authored
fix: pass provided credentialsprovider to session (#20)
1 parent 2327523 commit e2ca4c0

File tree

5 files changed

+163
-0
lines changed

5 files changed

+163
-0
lines changed

Sources/FaceLiveness/Views/Liveness/FaceLivenessDetectionView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public struct FaceLivenessDetectorView: View {
3939
self.sessionTask = Task {
4040
let session = try await AWSPredictionsPlugin.startFaceLivenessSession(
4141
withID: sessionID,
42+
credentialsProvider: credentialsProvider,
4243
region: region,
4344
options: .init(),
4445
completion: map(detectionCompletion: onCompletion)
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import XCTest
9+
import SwiftUI
10+
import AWSPluginsCore
11+
@testable import FaceLiveness
12+
@testable import AWSPredictionsPlugin
13+
@_spi(PredictionsFaceLiveness) import AWSPredictionsPlugin
14+
15+
@MainActor
16+
final class CredentialsProviderTestCase: XCTestCase {
17+
var videoChunker: VideoChunker!
18+
var viewModel: FaceLivenessDetectionViewModel!
19+
var faceDetector: MockFaceDetector!
20+
var livenessService: MockLivenessService!
21+
22+
override func setUp() {
23+
faceDetector = MockFaceDetector()
24+
livenessService = MockLivenessService()
25+
let videoChunker = VideoChunker(
26+
assetWriter: LivenessAVAssetWriter(),
27+
assetWriterDelegate: VideoChunker.AssetWriterDelegate(),
28+
assetWriterInput: LivenessAVAssetWriterInput()
29+
)
30+
let captureSession = LivenessCaptureSession(
31+
captureDevice: .init(avCaptureDevice: nil),
32+
outputDelegate: OutputSampleBufferCapturer(
33+
faceDetector: faceDetector,
34+
videoChunker: videoChunker
35+
)
36+
)
37+
38+
let viewModel = FaceLivenessDetectionViewModel(
39+
faceDetector: faceDetector,
40+
faceInOvalMatching: .init(instructor: .init()),
41+
captureSession: captureSession,
42+
videoChunker: videoChunker,
43+
closeButtonAction: {},
44+
sessionID: UUID().uuidString
45+
)
46+
47+
self.videoChunker = videoChunker
48+
self.viewModel = viewModel
49+
}
50+
51+
/// Given: A `FaceLivenessDetectorView`
52+
/// When: The callsite provides an `AWSCredentialsProvider` conforming type that provides
53+
/// an `AWSCredentials` conforming type
54+
/// Then: The provided `accessKeyId` and `secretAccessKey` should
55+
/// match that of credentials used by the underlying `SigV4Signer`. **And** the
56+
/// sessionToken should be `nil`
57+
func testUsesProvidedCredentialsProvider() async throws {
58+
let accessKey = "AKIAIOSFODNN7EXAMPLE"
59+
let secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
60+
let credentialsProvider = MockCredentialsProvider {
61+
MockAWSCredentials(accessKeyId: accessKey, secretAccessKey: secretKey)
62+
}
63+
64+
let liveness = FaceLivenessDetectorView(
65+
sessionID: UUID().uuidString,
66+
credentialsProvider: credentialsProvider,
67+
region: "us-east-1",
68+
isPresented: .constant(true),
69+
onCompletion: { _ in }
70+
)
71+
72+
let session = try await liveness.sessionTask.value
73+
let credential = session.signer.credential
74+
75+
XCTAssertEqual(accessKey, credential.accessKey)
76+
XCTAssertEqual(secretKey, credential.secretKey)
77+
XCTAssertNil(credential.sessionToken)
78+
}
79+
80+
81+
/// Given: A `FaceLivenessDetectorView`
82+
/// When: The callsite provides an `AWSCredentialsProvider` conforming type that provides
83+
/// an `AWSTemporaryCredentials` conforming type
84+
/// Then: The provided `accessKeyId`, `secretAccessKey`, **and** `sessionToken` should
85+
/// match that of credentials used by the underlying `SigV4Signer`
86+
func testUsesProvidedCredentialsProvider_temporaryCredentials() async throws {
87+
let accessKey = "AKIAIOSFODNN7EXAMPLE"
88+
let secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
89+
let sessionToken = "MOCK_SESSION_TOKEN"
90+
91+
let credentialsProvider = MockCredentialsProvider {
92+
MockAWSTemporaryCredentials(
93+
sessionToken: sessionToken,
94+
expiration: .distantFuture,
95+
accessKeyId: accessKey,
96+
secretAccessKey: secretKey
97+
)
98+
}
99+
100+
let liveness = FaceLivenessDetectorView(
101+
sessionID: UUID().uuidString,
102+
credentialsProvider: credentialsProvider,
103+
region: "us-east-1",
104+
isPresented: .constant(true),
105+
onCompletion: { _ in }
106+
)
107+
108+
let session = try await liveness.sessionTask.value
109+
let credential = session.signer.credential
110+
111+
XCTAssertEqual(accessKey, credential.accessKey)
112+
XCTAssertEqual(secretKey, credential.secretKey)
113+
XCTAssertEqual(sessionToken, credential.sessionToken)
114+
}
115+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
import AWSPluginsCore
10+
11+
struct MockAWSCredentials: AWSCredentials {
12+
var accessKeyId: String
13+
var secretAccessKey: String
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
import AWSPluginsCore
10+
11+
struct MockAWSTemporaryCredentials: AWSTemporaryCredentials {
12+
var sessionToken: String
13+
var expiration: Date
14+
var accessKeyId: String
15+
var secretAccessKey: String
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
import AWSPluginsCore
10+
11+
struct MockCredentialsProvider: AWSCredentialsProvider {
12+
let credentials: () -> AWSCredentials
13+
14+
func fetchAWSCredentials() async throws -> AWSCredentials {
15+
credentials()
16+
}
17+
}

0 commit comments

Comments
 (0)