Skip to content

Commit

Permalink
[Important] Adding imageUrl, upcType, upcCode to PayPalLineItem (#1165)
Browse files Browse the repository at this point in the history
* Added the ability for merchants to pass imageURL, upcCode, upcType in PayPalLineItem

Co-authored-by: Jax DesMarais-Leder <jdesmarais@paypal.com>
  • Loading branch information
vankads and jaxdesmarais authored Jan 18, 2024
1 parent a16d4b5 commit 307cbdf
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 8 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Braintree iOS SDK Release Notes

## unreleased
* BraintreePayPal
* Add `imageURL`, `upcCode`, and `upcType` to `BTPayPalLineItem`

## 6.11.0 (2023-12-20)
* Update all SDK errors to be public and [Equatable](https://developer.apple.com/documentation/swift/equatable) (fixes #1152 and #1080)
* BraintreeThreeDSecure
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,12 @@ class PayPalWebCheckoutViewController: PaymentButtonBaseViewController {
sender.setTitle("Processing...", for: .disabled)
sender.isEnabled = false

let request = BTPayPalCheckoutRequest(amount: "4.30")
let request = BTPayPalCheckoutRequest(amount: "5.00")
let lineItem = BTPayPalLineItem(quantity: "1", unitAmount: "5.00", name: "item one 1234567", kind: .debit)
lineItem.upcCode = "123456789"
lineItem.upcType = .UPC_A
lineItem.imageURL = URL(string: "https://www.example.com/example.jpg")
request.lineItems = [lineItem]

payPalClient.tokenize(request) { nonce, error in
sender.isEnabled = true
Expand Down
74 changes: 72 additions & 2 deletions Sources/BraintreePayPal/BTPayPalLineItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,55 @@ import Foundation
case credit
}

/// Use this option to specify the UPC type of the line item.
@objc public enum BTPayPalLineItemUPCType: Int {

/// Default
case none

/// Upc Type A
case UPC_A

/// Upc Type B
case UPC_B

/// Upc Type C
case UPC_C

/// Upc Type D
case UPC_D

/// Upc Type E
case UPC_E

/// Upc Type 2
case UPC_2

/// Upc Type 5
case UPC_5

var stringValue: String? {
switch self {
case .none:
return nil
case .UPC_A:
return "UPC-A"
case .UPC_B:
return "UPC-B"
case .UPC_C:
return "UPC-C"
case .UPC_D:
return "UPC-D"
case .UPC_E:
return "UPC-E"
case .UPC_2:
return "UPC-2"
case .UPC_5:
return "UPC-5"
}
}
}

/// A PayPal line item to be displayed in the PayPal checkout flow.
@objcMembers public class BTPayPalLineItem: NSObject {

Expand All @@ -31,12 +80,21 @@ import Foundation

/// Optional: Item description. Maximum 127 characters.
public let itemDescription: String? = nil

/// Optional: The URL to product information.
public let url: URL? = nil

/// Optional: Product or UPC code for the item. Maximum 127 characters.
public let productCode: String? = nil

/// Optional: The URL to product image information.
public var imageURL: URL? = nil

/// Optional: The URL to product information.
public let url: URL? = nil
/// Optional: UPC code for the item.
public var upcCode: String? = nil

/// Optional: UPC type for the item.
public var upcType: BTPayPalLineItemUPCType = .none

// MARK: - Public Initializer

Expand Down Expand Up @@ -82,6 +140,18 @@ import Foundation
requestParameters["url"] = url.absoluteString
}

if let imageURL, imageURL != URL(string: "") {
requestParameters["image_url"] = imageURL.absoluteString
}

if let upcCode, upcCode != "" {
requestParameters["upc_code"] = upcCode
}

if upcType.stringValue != nil {
requestParameters["upc_type"] = upcType.stringValue
}

return requestParameters
}
}
48 changes: 48 additions & 0 deletions UnitTests/BraintreePayPalTests/BTPayPalLineItem_Tests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import Foundation
import XCTest
@testable import BraintreePayPal

class BTPayPalLineItem_Tests: XCTestCase {

func testUPCTypeStringReturnsCorrectValue() {
let lineItem = BTPayPalLineItem(quantity: "1", unitAmount: "10", name: "item-name", kind: .debit)

lineItem.upcType = .UPC_A
let requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-A");

lineItem.upcType = .UPC_B
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-B");

lineItem.upcType = .UPC_C
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-C");

lineItem.upcType = .UPC_D
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-D");

lineItem.upcType = .UPC_E
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-E");

lineItem.upcType = .UPC_1
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-1");

lineItem.upcType = .UPC_2
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["upc_type"] as! String, "UPC-2");
}

func testKindStringReturnsCorrectValue() {
let lineItem = BTPayPalLineItem(quantity: "1", unitAmount: "10", name: "item-name", kind: .debit)
let requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["kind"] as! String, "debit");

lineItem = BTPayPalLineItem(quantity: "1", unitAmount: "10", name: "item-name", kind: .credit)
requestParams = lineItem.requestParameters();
XCTAssertEqual(requestParams["kind"] as! String, "credit");
}
}
17 changes: 12 additions & 5 deletions UnitTests/BraintreePayPalTests/BTPayPalRequest_Tests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,12 @@ class BTPayPalRequest_Tests: XCTestCase {
request.riskCorrelationID = "123-correlation-id"
request.merchantAccountID = "merchant-account-id"
request.isShippingAddressEditable = true

request.lineItems = [BTPayPalLineItem(quantity: "1", unitAmount: "1", name: "item", kind: .credit)]

let lineItem = BTPayPalLineItem(quantity: "1", unitAmount: "1", name: "item", kind: .credit)
lineItem.imageURL = URL(string: "http://example/image.jpg")
lineItem.upcCode = "upc-code"
lineItem.upcType = .UPC_A
request.lineItems = [lineItem]

let parameters = request.parameters(with: configuration)
guard let experienceProfile = parameters["experience_profile"] as? [String : Any] else { XCTFail(); return }
Expand All @@ -60,9 +64,12 @@ class BTPayPalRequest_Tests: XCTestCase {
XCTAssertEqual(parameters["correlation_id"] as? String, "123-correlation-id")
XCTAssertEqual(experienceProfile["address_override"] as? Bool, false)
XCTAssertEqual(parameters["line_items"] as? [[String : String]], [["quantity" : "1",
"unit_amount": "1",
"name": "item",
"kind": "credit"]])
"unit_amount": "1",
"name": "item",
"kind": "credit",
"upc_code": "upc-code",
"upc_type": "UPC-A",
"image_url": "http://example/image.jpg"]])

XCTAssertEqual(parameters["return_url"] as? String, "sdk.ios.braintree://onetouch/v1/success")
XCTAssertEqual(parameters["cancel_url"] as? String, "sdk.ios.braintree://onetouch/v1/cancel")
Expand Down

0 comments on commit 307cbdf

Please sign in to comment.