Skip to content

Commit 3aa8012

Browse files
committed
Result type for PayPal checkout, docStrings
1 parent 48b1164 commit 3aa8012

File tree

4 files changed

+83
-54
lines changed

4 files changed

+83
-54
lines changed

Diff for: Demo/Demo/PayPalWebPayments/PayPalWebViewModel/PayPalWebViewModel.swift

+11-10
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,17 @@ class PayPalWebViewModel: ObservableObject {
8484

8585
if let orderID = state.createOrder?.id {
8686
let payPalRequest = PayPalWebCheckoutRequest(orderID: orderID, fundingSource: funding)
87-
payPalWebCheckoutClient.start(request: payPalRequest) { result, error in
88-
if let error {
87+
payPalWebCheckoutClient.start(request: payPalRequest) { result in
88+
switch result {
89+
case .success(let paypalResult):
90+
DispatchQueue.main.async {
91+
self.state.approveResultResponse = .loaded(
92+
PayPalPaymentState.ApprovalResult(id: paypalResult.orderID, status: "APPROVED")
93+
)
94+
self.checkoutResult = paypalResult
95+
print("✅ Checkout result: \(String(describing: paypalResult))")
96+
}
97+
case .failure(let error):
8998
DispatchQueue.main.async {
9099
if error == PayPalError.checkoutCanceledError {
91100
print("Canceled")
@@ -94,14 +103,6 @@ class PayPalWebViewModel: ObservableObject {
94103
self.state.approveResultResponse = .error(message: error.localizedDescription)
95104
}
96105
}
97-
} else {
98-
DispatchQueue.main.async {
99-
self.state.approveResultResponse = .loaded(
100-
PayPalPaymentState.ApprovalResult(id: orderID, status: "APPROVED")
101-
)
102-
self.checkoutResult = result
103-
print("✅ Checkout result: \(String(describing: result))")
104-
}
105106
}
106107
}
107108
}

Diff for: Sources/CardPayments/CardClient.swift

+13-5
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ 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 `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
44+
/// The closure returns a `Result`:
45+
/// - `.success(CardVaultResult)` containing:
46+
/// - `setupTokenID`: The ID of the token that was updated.
47+
/// - `status`: The setup token status.
48+
/// - `didAttemptThreeDSecureAuthentication`: A flag indicating if 3D Secure authentication was attempted.
49+
/// - `.failure(CoreSDKError)`: Describes the reason for failure.
4650
public func vault(_ vaultRequest: CardVaultRequest, completion: @escaping (Result<CardVaultResult, CoreSDKError>) -> Void) {
4751
analyticsService = AnalyticsService(coreConfig: config, setupToken: vaultRequest.setupTokenID)
4852
analyticsService?.sendEvent("card-payments:vault-wo-purchase:started")
@@ -95,9 +99,13 @@ public class CardClient: NSObject {
9599
/// - Parameters:
96100
/// - orderId: Order id for approval
97101
/// - request: The request containing the card
98-
/// - completion: A completion block that is invoked when the request is completed. If the request succeeds,
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
102+
/// - completion: A completion block that is invoked when the request is completed.
103+
/// The closure returns a `Result`:
104+
/// - `.success(CardResult)` containing:
105+
/// - `orderID`: The ID of the approved order.
106+
/// - `status`: The approval status.
107+
/// - `didAttemptThreeDSecureAuthentication`: A flag indicating if 3D Secure authentication was attempted.
108+
/// - `.failure(CoreSDKError)`: Describes the reason for failure.
101109
public func approveOrder(request: CardRequest, completion: @escaping (Result<CardResult, CoreSDKError>) -> Void) {
102110
analyticsService = AnalyticsService(coreConfig: config, orderID: request.orderID)
103111
analyticsService?.sendEvent("card-payments:approve-order:started")

Diff for: Sources/PayPalWebPayments/PayPalWebCheckoutClient.swift

+27-14
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ public class PayPalWebCheckoutClient: NSObject {
3030
/// Launch the PayPal web flow
3131
/// - Parameters:
3232
/// - request: the PayPalRequest for the transaction
33-
/// - completion: A completion block that is invoked when the request is completed. If the request succeeds,
34-
/// a `PayPalWebCheckoutResult` with `orderID` and `payerID` are returned and `error` will be `nil`;
35-
/// if it fails, `PayPalWebCheckoutResult will be `nil` and `error` will describe the failure
36-
public func start(request: PayPalWebCheckoutRequest, completion: @escaping (PayPalWebCheckoutResult?, CoreSDKError?) -> Void) {
33+
/// - completion: A completion block that is invoked when the request is completed.
34+
/// The closure returns a `Result`:
35+
/// - `.success(CardResult)` containing:
36+
/// - `orderID`: The ID of the approved order.
37+
/// - `payerID`: Payer ID (or user id associated with the transaction
38+
/// - `.failure(CoreSDKError)`: Describes the reason for failure.
39+
public func start(request: PayPalWebCheckoutRequest, completion: @escaping (Result<PayPalWebCheckoutResult, CoreSDKError>) -> Void) {
3740
analyticsService = AnalyticsService(coreConfig: config, orderID: request.orderID)
3841
analyticsService?.sendEvent("paypal-web-payments:checkout:started")
3942

@@ -95,11 +98,12 @@ public class PayPalWebCheckoutClient: NSObject {
9598
/// - Throws: A `CoreSDKError` describing the failure
9699
public func start(request: PayPalWebCheckoutRequest) async throws -> PayPalWebCheckoutResult {
97100
try await withCheckedThrowingContinuation { continuation in
98-
start(request: request) { result, error in
99-
if let error {
100-
continuation.resume(throwing: error)
101-
} else if let result {
101+
start(request: request) { result in
102+
switch result {
103+
case .success(let result):
102104
continuation.resume(returning: result)
105+
case .failure(let error):
106+
continuation.resume(throwing: error)
103107
}
104108
}
105109
}
@@ -202,19 +206,28 @@ public class PayPalWebCheckoutClient: NSObject {
202206
return url.queryItems?.first { $0.name == param }?.value
203207
}
204208

205-
private func notifyCheckoutSuccess(for result: PayPalWebCheckoutResult, completion: (PayPalWebCheckoutResult?, CoreSDKError?) -> Void) {
209+
private func notifyCheckoutSuccess(
210+
for result: PayPalWebCheckoutResult,
211+
completion: (Result<PayPalWebCheckoutResult, CoreSDKError>) -> Void
212+
) {
206213
self.analyticsService?.sendEvent("paypal-web-payments:checkout:succeeded")
207-
completion(result, nil)
214+
completion(.success(result))
208215
}
209216

210-
private func notifyCheckoutFailure(with error: CoreSDKError, completion: (PayPalWebCheckoutResult?, CoreSDKError?) -> Void) {
217+
private func notifyCheckoutFailure(
218+
with error: CoreSDKError,
219+
completion: (Result<PayPalWebCheckoutResult, CoreSDKError>) -> Void
220+
) {
211221
self.analyticsService?.sendEvent("paypal-web-payments:checkout:failed")
212-
completion(nil, error)
222+
completion(.failure(error))
213223
}
214224

215-
private func notifyCheckoutCancelWithError(with error: CoreSDKError, completion: (PayPalWebCheckoutResult?, CoreSDKError?) -> Void) {
225+
private func notifyCheckoutCancelWithError(
226+
with error: CoreSDKError,
227+
completion: (Result<PayPalWebCheckoutResult, CoreSDKError>) -> Void
228+
) {
216229
analyticsService?.sendEvent("paypal-web-payments:checkout:canceled")
217-
completion(nil, error)
230+
completion(.failure(error))
218231
}
219232

220233
private func notifyVaultSuccess(for result: PayPalVaultResult, completion: (PayPalVaultResult?, CoreSDKError?) -> Void) {

Diff for: UnitTests/PayPalWebPaymentsTests/PayPalWebCheckoutClient_Tests.swift

+32-25
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,14 @@ class PayPalClient_Tests: XCTestCase {
178178
)
179179

180180
let expectation = self.expectation(description: "Call back invoked with error")
181-
payPalClient.start(request: request) { result, error in
182-
XCTAssertNil(result)
183-
if let error {
181+
payPalClient.start(request: request) { result in
182+
switch result {
183+
case .success:
184+
XCTFail("Expected failure with error")
185+
case .failure(let error):
184186
XCTAssertEqual(error.domain, PayPalError.domain)
185187
XCTAssertEqual(error.code, PayPalError.checkoutCanceledError.code)
186188
XCTAssertEqual(error.localizedDescription, PayPalError.checkoutCanceledError.localizedDescription)
187-
} else {
188-
XCTFail("Expected error not to be nil")
189189
}
190190
expectation.fulfill()
191191
}
@@ -206,20 +206,19 @@ class PayPalClient_Tests: XCTestCase {
206206
)
207207

208208
let expectation = self.expectation(description: "Call back invoked with error")
209-
payPalClient.start(request: request) { result, error in
210-
XCTAssertNil(result)
211-
if let error {
209+
payPalClient.start(request: request) { result in
210+
switch result {
211+
case .success:
212+
XCTFail("Expected failure with error")
213+
case .failure(let error):
212214
XCTAssertTrue(PayPalError.isCheckoutCanceled(error))
213-
} else {
214-
XCTFail("Expected error from PayPal checkout cancellation.")
215215
}
216216
expectation.fulfill()
217217
}
218218

219219
waitForExpectations(timeout: 2, handler: nil)
220220
}
221221

222-
223222
func testStart_whenWebAuthenticationSessions_returnsWebSessionError() {
224223
let request = PayPalWebCheckoutRequest(orderID: "1234")
225224

@@ -230,17 +229,19 @@ class PayPalClient_Tests: XCTestCase {
230229
)
231230

232231
let expectation = self.expectation(description: "Call back invoked with error")
233-
payPalClient.start(request: request) { result, error in
234-
XCTAssertNil(result)
235-
if let error {
232+
233+
payPalClient.start(request: request) { result in
234+
switch result {
235+
case .success:
236+
XCTFail("Expected failure with error")
237+
case .failure(let error):
236238
XCTAssertEqual(error.domain, PayPalError.domain)
237239
XCTAssertEqual(error.code, PayPalError.Code.webSessionError.rawValue)
238240
XCTAssertEqual(error.localizedDescription, "Mock web session error description.")
239-
} else {
240-
XCTFail("Expected error not to be nil")
241241
}
242242
expectation.fulfill()
243243
}
244+
244245
waitForExpectations(timeout: 2, handler: nil)
245246
}
246247

@@ -249,17 +250,18 @@ class PayPalClient_Tests: XCTestCase {
249250

250251
mockWebAuthenticationSession.cannedResponseURL = URL(string: "https://fakeURL?PayerID=98765")
251252
let expectation = self.expectation(description: "Call back invoked with error")
252-
payPalClient.start(request: request) { result, error in
253-
XCTAssertNil(result)
254-
if let error {
253+
payPalClient.start(request: request) { result in
254+
switch result {
255+
case .success:
256+
XCTFail("Expected failure with error")
257+
case .failure(let error):
255258
XCTAssertEqual(error.domain, PayPalError.domain)
256259
XCTAssertEqual(error.code, PayPalError.Code.malformedResultError.rawValue)
257260
XCTAssertEqual(error.localizedDescription, "Result did not contain the expected data.")
258-
} else {
259-
XCTFail("Expected error not to be nil")
260261
}
261262
expectation.fulfill()
262263
}
264+
263265
waitForExpectations(timeout: 2, handler: nil)
264266
}
265267

@@ -268,12 +270,17 @@ class PayPalClient_Tests: XCTestCase {
268270

269271
mockWebAuthenticationSession.cannedResponseURL = URL(string: "https://fakeURL?token=1234&PayerID=98765")
270272
let expectation = self.expectation(description: "Call back invoked with error")
271-
payPalClient.start(request: request) { result, error in
272-
XCTAssertEqual(result?.orderID, "1234")
273-
XCTAssertEqual(result?.payerID, "98765")
274-
XCTAssertNil(error)
273+
payPalClient.start(request: request) { result in
274+
switch result {
275+
case .success(let result):
276+
XCTAssertEqual(result.orderID, "1234")
277+
XCTAssertEqual(result.payerID, "98765")
278+
case .failure:
279+
XCTFail("Expected success with PayPalCheckoutResult")
280+
}
275281
expectation.fulfill()
276282
}
283+
277284
waitForExpectations(timeout: 2, handler: nil)
278285
}
279286

0 commit comments

Comments
 (0)