Skip to content

Commit 48b1164

Browse files
committed
card vault Result type
1 parent 64c8728 commit 48b1164

File tree

3 files changed

+78
-74
lines changed

3 files changed

+78
-74
lines changed

Demo/Demo/CardVault/CardVaultViewModel/CardVaultViewModel.swift

+5-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ class CardVaultViewModel: VaultViewModel {
1414
let config = try await configManager.getCoreConfig()
1515
let cardClient = CardClient(config: config)
1616
let cardVaultRequest = CardVaultRequest(card: card, setupTokenID: setupToken)
17-
cardClient.vault(cardVaultRequest) { result, error in
18-
if let result {
19-
self.setUpdateSetupTokenResult(vaultResult: result, vaultError: nil)
20-
} else if let error {
17+
cardClient.vault(cardVaultRequest) { result in
18+
switch result {
19+
case .success(let cardVaultResult):
20+
self.setUpdateSetupTokenResult(vaultResult: cardVaultResult, vaultError: nil)
21+
case .failure(let error):
2122
self.setUpdateSetupTokenResult(vaultResult: nil, vaultError: error)
2223
}
2324
}

Sources/CardPayments/CardClient.swift

+23-22
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ public class CardClient: NSObject {
4141
/// - Parameters:
4242
/// - vaultRequest: The request containing setupTokenID and card
4343
/// - completion: A completion block that is invoked when the request is completed. If the request succeeds,
44-
/// a `CardVaultResult` with `setupTokenID` and `status` are returned and `error` will be `nil`;
45-
/// if it fails, `CardVaultResult will be `nil` and `error` will describe the failure
46-
public func vault(_ vaultRequest: CardVaultRequest, completion: @escaping (CardVaultResult?, CoreSDKError?) -> Void) {
44+
/// a `Result` type with `.success(CardVaultResult)` with `setupTokenID` and `status` are returned;
45+
/// if it fails, `Result` type with `.failure(CoreSDKError)` that describes the failure will be returned
46+
public func vault(_ vaultRequest: CardVaultRequest, completion: @escaping (Result<CardVaultResult, CoreSDKError>) -> Void) {
4747
analyticsService = AnalyticsService(coreConfig: config, setupToken: vaultRequest.setupTokenID)
4848
analyticsService?.sendEvent("card-payments:vault-wo-purchase:started")
4949
Task {
@@ -79,11 +79,12 @@ public class CardClient: NSObject {
7979
/// - Throws: A `CoreSDKError` describing failure
8080
public func vault(_ vaultRequest: CardVaultRequest) async throws -> CardVaultResult {
8181
try await withCheckedThrowingContinuation { continuation in
82-
vault(vaultRequest) { result, error in
83-
if let error {
82+
vault(vaultRequest) { result in
83+
switch result {
84+
case .success(let cardVaultResult):
85+
continuation.resume(returning: cardVaultResult)
86+
case .failure(let error):
8487
continuation.resume(throwing: error)
85-
} else if let result {
86-
continuation.resume(returning: result)
8788
}
8889
}
8990
}
@@ -95,8 +96,8 @@ public class CardClient: NSObject {
9596
/// - orderId: Order id for approval
9697
/// - request: The request containing the card
9798
/// - completion: A completion block that is invoked when the request is completed. If the request succeeds,
98-
/// a `CardResult` with `orderID` , `status` and `didAttemptThreeDSecureAuthentication` are returned and `error` will be `nil`;
99-
/// if it fails, `CardResult will be `nil` and `error` will describe the failure
99+
/// a `Result` type will be returned with `.success(CardResult)` with `orderID` , `status` and `didAttemptThreeDSecureAuthentication`;
100+
/// if it fails, `Result` type with `.failure(CoreSDKError)` that describes the failure will be returned
100101
public func approveOrder(request: CardRequest, completion: @escaping (Result<CardResult, CoreSDKError>) -> Void) {
101102
analyticsService = AnalyticsService(coreConfig: config, orderID: request.orderID)
102103
analyticsService?.sendEvent("card-payments:approve-order:started")
@@ -138,10 +139,10 @@ public class CardClient: NSObject {
138139
try await withCheckedThrowingContinuation { continuation in
139140
approveOrder(request: request) { result in
140141
switch result {
141-
case .failure(let error):
142-
continuation.resume(throwing: error)
143142
case .success(let cardResult):
144143
continuation.resume(returning: cardResult)
144+
case .failure(let error):
145+
continuation.resume(throwing: error)
145146
}
146147
}
147148
}
@@ -189,7 +190,7 @@ public class CardClient: NSObject {
189190
private func startVaultThreeDSecureChallenge(
190191
url: URL,
191192
setupTokenID: String,
192-
completion: @escaping (CardVaultResult?, CoreSDKError?) -> Void
193+
completion: @escaping (Result<CardVaultResult, CoreSDKError>) -> Void
193194
) {
194195

195196
webAuthenticationSession.start(
@@ -246,29 +247,29 @@ public class CardClient: NSObject {
246247
completion(.failure(error))
247248
}
248249

249-
private func notifyVaultSuccess(for vaultResult: CardVaultResult, completion: (CardVaultResult?, CoreSDKError?) -> Void) {
250+
private func notifyVaultSuccess(for vaultResult: CardVaultResult, completion: (Result<CardVaultResult, CoreSDKError>) -> Void) {
250251
analyticsService?.sendEvent("card-payments:vault-wo-purchase:succeeded")
251-
completion(vaultResult, nil)
252+
completion(.success(vaultResult))
252253
}
253254

254-
private func notify3dsVaultSuccess(for vaultResult: CardVaultResult, completion: (CardVaultResult?, CoreSDKError?) -> Void) {
255+
private func notify3dsVaultSuccess(for vaultResult: CardVaultResult, completion: (Result<CardVaultResult, CoreSDKError>) -> Void) {
255256
analyticsService?.sendEvent("card-payments:vault-wo-purchase:auth-challenge:succeeded")
256-
completion(vaultResult, nil)
257+
completion(.success(vaultResult))
257258
}
258259

259-
private func notifyVaultFailure(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) {
260+
private func notifyVaultFailure(with vaultError: CoreSDKError, completion: (Result<CardVaultResult, CoreSDKError>) -> Void) {
260261
analyticsService?.sendEvent("card-payments:vault-wo-purchase:failed")
261-
completion(nil, vaultError)
262+
completion(.failure(vaultError))
262263
}
263264

264-
private func notify3dsVaultFailure(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) {
265+
private func notify3dsVaultFailure(with vaultError: CoreSDKError, completion: (Result<CardVaultResult, CoreSDKError>) -> Void) {
265266
analyticsService?.sendEvent("card-payments:vault-wo-purchase:auth-challenge:failed")
266-
completion(nil, vaultError)
267+
completion(.failure(vaultError))
267268
}
268269

269-
private func notify3dsVaultCancelWithError(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) {
270+
private func notify3dsVaultCancelWithError(with vaultError: CoreSDKError, completion: (Result<CardVaultResult, CoreSDKError>) -> Void) {
270271
analyticsService?.sendEvent("card-payments:vault-wo-purchase:auth-challenge:canceled")
271-
completion(nil, vaultError)
272+
completion(.failure(vaultError))
272273
}
273274
}
274275

UnitTests/CardPaymentsTests/CardClient_Tests.swift

+50-48
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,16 @@ class CardClient_Tests: XCTestCase {
6161

6262
let expectation = expectation(description: "vault completed")
6363

64-
sut.vault(vaultRequest) { result, error in
65-
XCTAssertEqual(result?.setupTokenID, setupTokenID)
66-
XCTAssertEqual(result?.status, vaultStatus)
67-
XCTAssertNil(error)
64+
sut.vault(vaultRequest) { result in
65+
switch result {
66+
case .success(let cardVaultResult):
67+
XCTAssertEqual(cardVaultResult.setupTokenID, setupTokenID)
68+
XCTAssertEqual(cardVaultResult.status, vaultStatus)
69+
case .failure:
70+
XCTFail("Expected success with CardVaultResult")
71+
}
6872
expectation.fulfill()
6973
}
70-
7174
waitForExpectations(timeout: 2, handler: nil)
7275
}
7376

@@ -81,16 +84,15 @@ class CardClient_Tests: XCTestCase {
8184
mockVaultAPI.stubSetupTokenResponse = updateSetupTokenResponse
8285

8386
let expectation = expectation(description: "vault completed")
84-
sut.vault(vaultRequest) { result, error in
85-
if let result {
86-
XCTAssertEqual(result.setupTokenID, setupTokenID)
87-
XCTAssertNil(result.status)
88-
XCTAssertTrue(result.didAttemptThreeDSecureAuthentication)
89-
} else {
90-
XCTFail("expected result not to be nil")
87+
sut.vault(vaultRequest) { result in
88+
switch result {
89+
case .success(let cardVaultResult):
90+
XCTAssertEqual(cardVaultResult.setupTokenID, setupTokenID)
91+
XCTAssertNil(cardVaultResult.status)
92+
XCTAssertTrue(cardVaultResult.didAttemptThreeDSecureAuthentication)
93+
case .failure:
94+
XCTFail("Expected success with CardVaultResult")
9195
}
92-
93-
XCTAssertNil(error)
9496
expectation.fulfill()
9597
}
9698

@@ -108,14 +110,14 @@ class CardClient_Tests: XCTestCase {
108110

109111
let expectation = expectation(description: "vault completed")
110112

111-
sut.vault(vaultRequest) { result, error in
112-
XCTAssertNil(result)
113-
if let error {
113+
sut.vault(vaultRequest) { result in
114+
switch result {
115+
case .success:
116+
XCTFail("Expected failure with error")
117+
case .failure(let error):
114118
XCTAssertEqual(error.domain, CardError.domain)
115119
XCTAssertEqual(error.code, CardError.threeDSecureURLError.code)
116120
XCTAssertEqual(error.localizedDescription, CardError.threeDSecureURLError.localizedDescription)
117-
} else {
118-
XCTFail("Expected error not to be nil")
119121
}
120122
expectation.fulfill()
121123
}
@@ -126,19 +128,19 @@ class CardClient_Tests: XCTestCase {
126128
func testVault_whenVaultAPIError_bubblesError() {
127129
let setupTokenID = "testToken1"
128130
let vaultRequest = CardVaultRequest(card: card, setupTokenID: setupTokenID)
129-
131+
130132
mockVaultAPI.stubError = CoreSDKError(code: 123, domain: "fake-domain", errorDescription: "api-error")
131133

132134
let expectation = expectation(description: "vault completed")
133135

134-
sut.vault(vaultRequest) { result, error in
135-
XCTAssertNil(result)
136-
if let error {
136+
sut.vault(vaultRequest) { result in
137+
switch result {
138+
case .success:
139+
XCTFail("Expected failure with error")
140+
case .failure(let error):
137141
XCTAssertEqual(error.domain, "fake-domain")
138142
XCTAssertEqual(error.code, 123)
139143
XCTAssertEqual(error.localizedDescription, "api-error")
140-
} else {
141-
XCTFail("Expected error not to be nil")
142144
}
143145
expectation.fulfill()
144146
}
@@ -153,14 +155,14 @@ class CardClient_Tests: XCTestCase {
153155
mockVaultAPI.stubError = NSError(domain: "some-domain", code: 123, userInfo: [NSLocalizedDescriptionKey: "some-description"])
154156

155157
let expectation = expectation(description: "vault completed")
156-
sut.vault(vaultRequest) { result, error in
157-
XCTAssertNil(result)
158-
if let error {
158+
sut.vault(vaultRequest) { result in
159+
switch result {
160+
case .success:
161+
XCTFail("Expected failure with error")
162+
case .failure(let error):
159163
XCTAssertEqual(error.domain, CardError.domain)
160164
XCTAssertEqual(error.code, CardError.Code.vaultTokenError.rawValue)
161165
XCTAssertEqual(error.localizedDescription, "An error occurred while vaulting a card.")
162-
} else {
163-
XCTFail("Expected error not to be nil")
164166
}
165167
expectation.fulfill()
166168
}
@@ -175,14 +177,14 @@ class CardClient_Tests: XCTestCase {
175177

176178
let expectation = expectation(description: "vault() completed")
177179

178-
sut.vault(cardVaultRequest) { result, error in
179-
XCTAssertNil(error)
180-
if let result {
181-
XCTAssertEqual(result.setupTokenID, "testSetupTokenId")
182-
XCTAssertNil(result.status)
183-
XCTAssertTrue(result.didAttemptThreeDSecureAuthentication)
184-
} else {
185-
XCTFail("Expected result not to be nil")
180+
sut.vault(cardVaultRequest) { result in
181+
switch result {
182+
case .success(let cardVaultResult):
183+
XCTAssertEqual(cardVaultResult.setupTokenID, "testSetupTokenId")
184+
XCTAssertNil(cardVaultResult.status)
185+
XCTAssertTrue(cardVaultResult.didAttemptThreeDSecureAuthentication)
186+
case .failure:
187+
XCTFail("Expected success with CardVaultResult")
186188
}
187189
expectation.fulfill()
188190
}
@@ -200,14 +202,14 @@ class CardClient_Tests: XCTestCase {
200202

201203
let expectation = expectation(description: "vault() completed")
202204

203-
sut.vault(cardVaultRequest) { result, error in
204-
XCTAssertNil(result)
205-
if let error {
205+
sut.vault(cardVaultRequest) { result in
206+
switch result {
207+
case .success:
208+
XCTFail("Expected failure with error")
209+
case .failure(let error):
206210
XCTAssertEqual(error.domain, CardError.domain)
207211
XCTAssertEqual(error.code, CardError.Code.threeDSecureCanceledError.rawValue)
208212
XCTAssertEqual(error.localizedDescription, CardError.threeDSecureCanceledError.localizedDescription)
209-
} else {
210-
XCTFail("Expected error not to be nil")
211213
}
212214
expectation.fulfill()
213215
}
@@ -226,14 +228,14 @@ class CardClient_Tests: XCTestCase {
226228

227229
let expectation = expectation(description: "vault() completed")
228230

229-
sut.vault(cardVaultRequest) { result, error in
230-
XCTAssertNil(result)
231-
if let error {
231+
sut.vault(cardVaultRequest) { result in
232+
switch result {
233+
case .success:
234+
XCTFail("Expected failure with error")
235+
case .failure(let error):
232236
XCTAssertEqual(error.domain, CardError.domain)
233237
XCTAssertEqual(error.code, CardError.Code.threeDSecureError.rawValue)
234238
XCTAssertEqual(error.localizedDescription, "Mock web session error description.")
235-
} else {
236-
XCTFail("Expected error not to be nil")
237239
}
238240
expectation.fulfill()
239241
}

0 commit comments

Comments
 (0)