@klarna/react-native-klarna-network-payment 0.0.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -29
- package/android/build.gradle +95 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentButtonViewSpec.kt +22 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModule.kt +46 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImpl.kt +163 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentPackage.kt +30 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonPressEvent.kt +19 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManager.kt +276 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapper.kt +132 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapper.kt +328 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapper.kt +145 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImplTest.kt +361 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManagerTest.kt +155 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapperTest.kt +447 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapperTest.kt +489 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapperTest.kt +456 -0
- package/ios/Sources/KlarnaNetworkPayment.h +5 -0
- package/ios/Sources/KlarnaNetworkPayment.mm +110 -0
- package/ios/Sources/KlarnaNetworkPaymentModuleImpl.swift +196 -0
- package/ios/Sources/KlarnaPaymentButtonComponentView.mm +147 -0
- package/ios/Sources/KlarnaPaymentButtonViewImpl.swift +77 -0
- package/ios/Sources/KlarnaPaymentPresentationMapping.swift +102 -0
- package/ios/Sources/KlarnaPaymentRequestDataMapping.swift +232 -0
- package/ios/Sources/KlarnaPaymentRequestMapping.swift +103 -0
- package/ios/Tests/KlarnaNetworkPaymentModuleImplTests.swift +143 -0
- package/ios/Tests/KlarnaPaymentButtonViewImplTests.swift +122 -0
- package/ios/Tests/KlarnaPaymentPresentationMappingTests.swift +335 -0
- package/lib/commonjs/KlarnaNetworkPayment.js +6 -0
- package/lib/commonjs/KlarnaNetworkPayment.js.map +1 -0
- package/lib/commonjs/KlarnaNetworkPaymentImpl.js +44 -0
- package/lib/commonjs/KlarnaNetworkPaymentImpl.js.map +1 -0
- package/lib/commonjs/KlarnaNetworkPaymentMapper.js +164 -0
- package/lib/commonjs/KlarnaNetworkPaymentMapper.js.map +1 -0
- package/lib/commonjs/KlarnaPaymentButton.js +43 -0
- package/lib/commonjs/KlarnaPaymentButton.js.map +1 -0
- package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js +10 -0
- package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
- package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js +13 -0
- package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
- package/lib/commonjs/index.js +51 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequest.js +6 -0
- package/lib/commonjs/types/KlarnaPaymentRequest.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequestState.js +2 -0
- package/lib/commonjs/types/KlarnaPaymentRequestState.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js +6 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js +2 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaBillingPlan.js +6 -0
- package/lib/commonjs/types/models/KlarnaBillingPlan.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js +2 -0
- package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaCustomer.js +6 -0
- package/lib/commonjs/types/models/KlarnaCustomer.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaFreeTrial.js +2 -0
- package/lib/commonjs/types/models/KlarnaFreeTrial.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaInterval.js +2 -0
- package/lib/commonjs/types/models/KlarnaInterval.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaLineItem.js +2 -0
- package/lib/commonjs/types/models/KlarnaLineItem.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaOndemandService.js +6 -0
- package/lib/commonjs/types/models/KlarnaOndemandService.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaPartnerCustomer.js +6 -0
- package/lib/commonjs/types/models/KlarnaPartnerCustomer.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaPaymentPresentation.js +6 -0
- package/lib/commonjs/types/models/KlarnaPaymentPresentation.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaPaymentRequestData.js +6 -0
- package/lib/commonjs/types/models/KlarnaPaymentRequestData.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js +6 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShipping.js +6 -0
- package/lib/commonjs/types/models/KlarnaShipping.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingConfig.js +6 -0
- package/lib/commonjs/types/models/KlarnaShippingConfig.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingConfigMode.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingConfigMode.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingOption.js +6 -0
- package/lib/commonjs/types/models/KlarnaShippingOption.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingRecipient.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingRecipient.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingType.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingType.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaSubscription.js +6 -0
- package/lib/commonjs/types/models/KlarnaSubscription.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js +6 -0
- package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
- package/lib/commonjs/types/models/index.js +2 -0
- package/lib/commonjs/types/models/index.js.map +1 -0
- package/lib/module/KlarnaNetworkPayment.js +2 -0
- package/lib/module/KlarnaNetworkPayment.js.map +1 -0
- package/lib/module/KlarnaNetworkPaymentImpl.js +36 -0
- package/lib/module/KlarnaNetworkPaymentImpl.js.map +1 -0
- package/lib/module/KlarnaNetworkPaymentMapper.js +146 -0
- package/lib/module/KlarnaNetworkPaymentMapper.js.map +1 -0
- package/lib/module/KlarnaPaymentButton.js +37 -0
- package/lib/module/KlarnaPaymentButton.js.map +1 -0
- package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js +3 -0
- package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
- package/lib/module/Specs/NativeKlarnaNetworkPayment.js +9 -0
- package/lib/module/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
- package/lib/module/index.js +40 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequest.js +2 -0
- package/lib/module/types/KlarnaPaymentRequest.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequestState.js +2 -0
- package/lib/module/types/KlarnaPaymentRequestState.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequestStateContext.js +2 -0
- package/lib/module/types/KlarnaPaymentRequestStateContext.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequestStateReason.js +2 -0
- package/lib/module/types/KlarnaPaymentRequestStateReason.js.map +1 -0
- package/lib/module/types/models/KlarnaBillingPlan.js +2 -0
- package/lib/module/types/models/KlarnaBillingPlan.js.map +1 -0
- package/lib/module/types/models/KlarnaCollectCustomerProfileType.js +2 -0
- package/lib/module/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
- package/lib/module/types/models/KlarnaCustomer.js +2 -0
- package/lib/module/types/models/KlarnaCustomer.js.map +1 -0
- package/lib/module/types/models/KlarnaFreeTrial.js +2 -0
- package/lib/module/types/models/KlarnaFreeTrial.js.map +1 -0
- package/lib/module/types/models/KlarnaInterval.js +2 -0
- package/lib/module/types/models/KlarnaInterval.js.map +1 -0
- package/lib/module/types/models/KlarnaLineItem.js +2 -0
- package/lib/module/types/models/KlarnaLineItem.js.map +1 -0
- package/lib/module/types/models/KlarnaOndemandService.js +2 -0
- package/lib/module/types/models/KlarnaOndemandService.js.map +1 -0
- package/lib/module/types/models/KlarnaPartnerCustomer.js +2 -0
- package/lib/module/types/models/KlarnaPartnerCustomer.js.map +1 -0
- package/lib/module/types/models/KlarnaPaymentPresentation.js +2 -0
- package/lib/module/types/models/KlarnaPaymentPresentation.js.map +1 -0
- package/lib/module/types/models/KlarnaPaymentRequestData.js +2 -0
- package/lib/module/types/models/KlarnaPaymentRequestData.js.map +1 -0
- package/lib/module/types/models/KlarnaRequestCustomerToken.js +2 -0
- package/lib/module/types/models/KlarnaRequestCustomerToken.js.map +1 -0
- package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
- package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
- package/lib/module/types/models/KlarnaShipping.js +2 -0
- package/lib/module/types/models/KlarnaShipping.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingConfig.js +2 -0
- package/lib/module/types/models/KlarnaShippingConfig.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingConfigMode.js +2 -0
- package/lib/module/types/models/KlarnaShippingConfigMode.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingOption.js +2 -0
- package/lib/module/types/models/KlarnaShippingOption.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingRecipient.js +2 -0
- package/lib/module/types/models/KlarnaShippingRecipient.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingType.js +2 -0
- package/lib/module/types/models/KlarnaShippingType.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingTypeAttribute.js +2 -0
- package/lib/module/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
- package/lib/module/types/models/KlarnaSubscription.js +2 -0
- package/lib/module/types/models/KlarnaSubscription.js.map +1 -0
- package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js +2 -0
- package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
- package/lib/module/types/models/index.js +2 -0
- package/lib/module/types/models/index.js.map +1 -0
- package/lib/typescript/KlarnaNetworkPayment.d.ts +22 -0
- package/lib/typescript/KlarnaNetworkPayment.d.ts.map +1 -0
- package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts +12 -0
- package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts.map +1 -0
- package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts +273 -0
- package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts.map +1 -0
- package/lib/typescript/KlarnaPaymentButton.d.ts +51 -0
- package/lib/typescript/KlarnaPaymentButton.d.ts.map +1 -0
- package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts +16 -0
- package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts +13 -0
- package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +14 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequest.d.ts +19 -0
- package/lib/typescript/types/KlarnaPaymentRequest.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequestState.d.ts +15 -0
- package/lib/typescript/types/KlarnaPaymentRequestState.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts +12 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts +13 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaBillingPlan.d.ts +17 -0
- package/lib/typescript/types/models/KlarnaBillingPlan.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts +19 -0
- package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaCustomer.d.ts +11 -0
- package/lib/typescript/types/models/KlarnaCustomer.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaFreeTrial.d.ts +7 -0
- package/lib/typescript/types/models/KlarnaFreeTrial.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaInterval.d.ts +11 -0
- package/lib/typescript/types/models/KlarnaInterval.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaLineItem.d.ts +28 -0
- package/lib/typescript/types/models/KlarnaLineItem.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaOndemandService.d.ts +17 -0
- package/lib/typescript/types/models/KlarnaOndemandService.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts +15 -0
- package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts +119 -0
- package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts +24 -0
- package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts +9 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts +9 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShipping.d.ts +15 -0
- package/lib/typescript/types/models/KlarnaShipping.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingConfig.d.ts +9 -0
- package/lib/typescript/types/models/KlarnaShippingConfig.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts +5 -0
- package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingOption.d.ts +12 -0
- package/lib/typescript/types/models/KlarnaShippingOption.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts +14 -0
- package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingType.d.ts +25 -0
- package/lib/typescript/types/models/KlarnaShippingType.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts +21 -0
- package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaSubscription.d.ts +14 -0
- package/lib/typescript/types/models/KlarnaSubscription.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts +21 -0
- package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts.map +1 -0
- package/lib/typescript/types/models/index.d.ts +22 -0
- package/lib/typescript/types/models/index.d.ts.map +1 -0
- package/package.json +120 -6
- package/react-native-klarna-network-payment.podspec +28 -0
- package/src/KlarnaNetworkPayment.ts +30 -0
- package/src/KlarnaNetworkPaymentImpl.ts +79 -0
- package/src/KlarnaNetworkPaymentMapper.ts +204 -0
- package/src/KlarnaPaymentButton.tsx +80 -0
- package/src/Specs/KlarnaPaymentButtonNativeComponent.ts +22 -0
- package/src/Specs/NativeKlarnaNetworkPayment.ts +17 -0
- package/src/index.tsx +63 -0
- package/src/types/KlarnaPaymentRequest.ts +19 -0
- package/src/types/KlarnaPaymentRequestState.ts +14 -0
- package/src/types/KlarnaPaymentRequestStateContext.ts +12 -0
- package/src/types/KlarnaPaymentRequestStateReason.ts +12 -0
- package/src/types/models/KlarnaBillingPlan.ts +17 -0
- package/src/types/models/KlarnaCollectCustomerProfileType.ts +18 -0
- package/src/types/models/KlarnaCustomer.ts +11 -0
- package/src/types/models/KlarnaFreeTrial.ts +6 -0
- package/src/types/models/KlarnaInterval.ts +10 -0
- package/src/types/models/KlarnaLineItem.ts +27 -0
- package/src/types/models/KlarnaOndemandService.ts +17 -0
- package/src/types/models/KlarnaPartnerCustomer.ts +15 -0
- package/src/types/models/KlarnaPaymentPresentation.ts +135 -0
- package/src/types/models/KlarnaPaymentRequestData.ts +24 -0
- package/src/types/models/KlarnaRequestCustomerToken.ts +9 -0
- package/src/types/models/KlarnaRequestCustomerTokenScope.ts +8 -0
- package/src/types/models/KlarnaShipping.ts +15 -0
- package/src/types/models/KlarnaShippingConfig.ts +9 -0
- package/src/types/models/KlarnaShippingConfigMode.ts +4 -0
- package/src/types/models/KlarnaShippingOption.ts +12 -0
- package/src/types/models/KlarnaShippingRecipient.ts +13 -0
- package/src/types/models/KlarnaShippingType.ts +24 -0
- package/src/types/models/KlarnaShippingTypeAttribute.ts +20 -0
- package/src/types/models/KlarnaSubscription.ts +14 -0
- package/src/types/models/KlarnaSupplementaryPurchaseData.ts +21 -0
- package/src/types/models/index.ts +35 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import KlarnaNetworkCore
|
|
3
|
+
import KlarnaNetworkPayment
|
|
4
|
+
|
|
5
|
+
// JS has no integer type — all numbers arrive as Double at the bridge boundary.
|
|
6
|
+
// Every integer SDK field is therefore parsed with `.map { Int64($0) }` / `.map { Int32($0) }`.
|
|
7
|
+
func klarnaPaymentRequestData(from dict: NSDictionary) -> KlarnaPaymentRequestData? {
|
|
8
|
+
guard let amount = dict["amount"] as? NSNumber,
|
|
9
|
+
let currency = dict["currency"] as? String else {
|
|
10
|
+
return nil
|
|
11
|
+
}
|
|
12
|
+
return KlarnaPaymentRequestData(
|
|
13
|
+
amount: amount.int64Value,
|
|
14
|
+
currency: currency,
|
|
15
|
+
paymentOptionId: dict["paymentOptionId"] as? String,
|
|
16
|
+
paymentRequestReference: dict["paymentRequestReference"] as? String,
|
|
17
|
+
requestCustomerToken: buildRequestCustomerToken(from: dict["requestCustomerToken"] as? [String: Any]),
|
|
18
|
+
shippingConfig: buildShippingConfig(from: dict["shippingConfig"] as? [String: Any]),
|
|
19
|
+
collectCustomerProfile: buildCollectCustomerProfile(from: dict["collectCustomerProfile"] as? [String]),
|
|
20
|
+
supplementaryPurchaseData: buildSupplementaryPurchaseData(from: dict["supplementaryPurchaseData"] as? [String: Any])
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// MARK: - Top-level sub-objects
|
|
25
|
+
|
|
26
|
+
private func buildRequestCustomerToken(from dict: [String: Any]?) -> KlarnaRequestCustomerToken? {
|
|
27
|
+
guard let dict,
|
|
28
|
+
let rawScopes = dict["scopes"] as? [String], !rawScopes.isEmpty else {
|
|
29
|
+
return nil
|
|
30
|
+
}
|
|
31
|
+
let scopes = rawScopes.compactMap { KlarnaRequestCustomerTokenScope(rawValue: $0) }
|
|
32
|
+
return KlarnaRequestCustomerToken(
|
|
33
|
+
scopes: scopes,
|
|
34
|
+
customerTokenReference: dict["customerTokenReference"] as? String
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private func buildShippingConfig(from dict: [String: Any]?) -> KlarnaShippingConfig? {
|
|
39
|
+
guard let dict,
|
|
40
|
+
let rawMode = dict["mode"] as? String,
|
|
41
|
+
let mode = KlarnaShippingConfigMode(rawValue: rawMode) else {
|
|
42
|
+
return nil
|
|
43
|
+
}
|
|
44
|
+
return KlarnaShippingConfig(
|
|
45
|
+
supportedCountries: dict["supportedCountries"] as? [String],
|
|
46
|
+
mode: mode
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private func buildCollectCustomerProfile(from raw: [String]?) -> [KlarnaCollectCustomerProfileType]? {
|
|
51
|
+
guard let raw, !raw.isEmpty else { return nil }
|
|
52
|
+
let types = raw.compactMap { KlarnaCollectCustomerProfileType(rawValue: $0) }
|
|
53
|
+
return types.isEmpty ? nil : types
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// MARK: - KlarnaSupplementaryPurchaseData
|
|
57
|
+
|
|
58
|
+
private func buildSupplementaryPurchaseData(from dict: [String: Any]?) -> KlarnaSupplementaryPurchaseData? {
|
|
59
|
+
guard let dict else { return nil }
|
|
60
|
+
return KlarnaSupplementaryPurchaseData(
|
|
61
|
+
customer: buildPartnerCustomer(from: dict["customer"] as? [String: Any]),
|
|
62
|
+
lineItems: buildLineItems(from: dict["lineItems"] as? [[String: Any]]),
|
|
63
|
+
purchaseReference: dict["purchaseReference"] as? String,
|
|
64
|
+
shipping: buildShippingList(from: dict["shipping"] as? [[String: Any]]),
|
|
65
|
+
ondemandService: buildOndemandService(from: dict["ondemandService"] as? [String: Any]),
|
|
66
|
+
subscriptions: buildSubscriptions(from: dict["subscriptions"] as? [[String: Any]])
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// MARK: - KlarnaAddress
|
|
71
|
+
|
|
72
|
+
private func buildAddress(from dict: [String: Any]?) -> KlarnaAddress? {
|
|
73
|
+
guard let dict else { return nil }
|
|
74
|
+
return KlarnaAddress(
|
|
75
|
+
city: dict["city"] as? String,
|
|
76
|
+
country: dict["country"] as? String,
|
|
77
|
+
postalCode: dict["postalCode"] as? String,
|
|
78
|
+
region: dict["region"] as? String,
|
|
79
|
+
streetAddress: dict["streetAddress"] as? String,
|
|
80
|
+
streetAddress2: dict["streetAddress2"] as? String
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// MARK: - KlarnaPartnerCustomer
|
|
85
|
+
|
|
86
|
+
private func buildPartnerCustomer(from dict: [String: Any]?) -> KlarnaPartnerCustomer? {
|
|
87
|
+
guard let dict else { return nil }
|
|
88
|
+
return KlarnaPartnerCustomer(
|
|
89
|
+
address: buildAddress(from: dict["address"] as? [String: Any]),
|
|
90
|
+
email: dict["email"] as? String,
|
|
91
|
+
familyName: dict["familyName"] as? String,
|
|
92
|
+
givenName: dict["givenName"] as? String,
|
|
93
|
+
phone: dict["phone"] as? String
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// MARK: - KlarnaLineItem
|
|
98
|
+
|
|
99
|
+
private func buildLineItems(from dicts: [[String: Any]]?) -> [KlarnaLineItem]? {
|
|
100
|
+
guard let dicts, !dicts.isEmpty else { return nil }
|
|
101
|
+
return dicts.compactMap { buildLineItem(from: $0) }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private func buildLineItem(from dict: [String: Any]) -> KlarnaLineItem? {
|
|
105
|
+
guard let name = dict["name"] as? String,
|
|
106
|
+
let totalAmount = (dict["totalAmount"] as? Double).map({ Int64($0) }),
|
|
107
|
+
let quantity = (dict["quantity"] as? Double).map({ Int($0) }) else { return nil }
|
|
108
|
+
return KlarnaLineItem(
|
|
109
|
+
currency: dict["currency"] as? String,
|
|
110
|
+
imageUrl: dict["imageUrl"] as? String,
|
|
111
|
+
name: name,
|
|
112
|
+
productIdentifier: dict["productIdentifier"] as? String,
|
|
113
|
+
productUrl: dict["productUrl"] as? String,
|
|
114
|
+
lineItemReference: dict["lineItemReference"] as? String,
|
|
115
|
+
shippingReference: dict["shippingReference"] as? String,
|
|
116
|
+
subscriptionReference: dict["subscriptionReference"] as? String,
|
|
117
|
+
quantity: quantity,
|
|
118
|
+
totalAmount: totalAmount,
|
|
119
|
+
totalTaxAmount: (dict["totalTaxAmount"] as? Double).map { Int64($0) },
|
|
120
|
+
unitPrice: (dict["unitPrice"] as? Double).map { Int64($0) }
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// MARK: - KlarnaShipping
|
|
125
|
+
|
|
126
|
+
private func buildShippingList(from dicts: [[String: Any]]?) -> [KlarnaShipping]? {
|
|
127
|
+
guard let dicts, !dicts.isEmpty else { return nil }
|
|
128
|
+
return dicts.map { buildShipping(from: $0) }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private func buildShipping(from dict: [String: Any]) -> KlarnaShipping {
|
|
132
|
+
KlarnaShipping(
|
|
133
|
+
address: buildAddress(from: dict["address"] as? [String: Any]),
|
|
134
|
+
recipient: buildShippingRecipient(from: dict["recipient"] as? [String: Any]),
|
|
135
|
+
shippingOption: buildShippingOption(from: dict["shippingOption"] as? [String: Any]),
|
|
136
|
+
shippingReference: dict["shippingReference"] as? String
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private func buildShippingRecipient(from dict: [String: Any]?) -> KlarnaShippingRecipient? {
|
|
141
|
+
guard let dict,
|
|
142
|
+
let familyName = dict["familyName"] as? String,
|
|
143
|
+
let givenName = dict["givenName"] as? String else {
|
|
144
|
+
return nil
|
|
145
|
+
}
|
|
146
|
+
return KlarnaShippingRecipient(
|
|
147
|
+
attention: dict["attention"] as? String,
|
|
148
|
+
email: dict["email"] as? String,
|
|
149
|
+
familyName: familyName,
|
|
150
|
+
givenName: givenName,
|
|
151
|
+
phone: dict["phone"] as? String
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private func buildShippingOption(from dict: [String: Any]?) -> KlarnaShippingOption? {
|
|
156
|
+
guard let dict,
|
|
157
|
+
let rawType = dict["shippingType"] as? String,
|
|
158
|
+
let shippingType = KlarnaShippingType(rawValue: rawType) else {
|
|
159
|
+
return nil
|
|
160
|
+
}
|
|
161
|
+
let attributes: [KlarnaShippingTypeAttribute]? = (dict["shippingTypeAttributes"] as? [String])
|
|
162
|
+
.map { $0.compactMap { KlarnaShippingTypeAttribute(rawValue: $0) } }
|
|
163
|
+
return KlarnaShippingOption(
|
|
164
|
+
shippingCarrier: dict["shippingCarrier"] as? String,
|
|
165
|
+
shippingType: shippingType,
|
|
166
|
+
shippingTypeAttributes: attributes
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// MARK: - KlarnaOndemandService
|
|
171
|
+
|
|
172
|
+
private func buildOndemandService(from dict: [String: Any]?) -> KlarnaOndemandService? {
|
|
173
|
+
guard let dict else { return nil }
|
|
174
|
+
let interval: KlarnaInterval? = (dict["purchaseInterval"] as? String)
|
|
175
|
+
.flatMap { KlarnaInterval(rawValue: $0) }
|
|
176
|
+
return KlarnaOndemandService(
|
|
177
|
+
currency: dict["currency"] as? String,
|
|
178
|
+
averageAmount: (dict["averageAmount"] as? Double).map { Int64($0) },
|
|
179
|
+
minimumAmount: (dict["minimumAmount"] as? Double).map { Int64($0) },
|
|
180
|
+
maximumAmount: (dict["maximumAmount"] as? Double).map { Int64($0) },
|
|
181
|
+
purchaseInterval: interval,
|
|
182
|
+
purchaseIntervalFrequency: (dict["purchaseIntervalFrequency"] as? Double).map { Int32($0) }
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// MARK: - KlarnaSubscription / KlarnaBillingPlan
|
|
187
|
+
|
|
188
|
+
private func buildSubscriptions(from dicts: [[String: Any]]?) -> [KlarnaSubscription]? {
|
|
189
|
+
guard let dicts, !dicts.isEmpty else { return nil }
|
|
190
|
+
return dicts.compactMap { buildSubscription(from: $0) }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private func buildSubscription(from dict: [String: Any]) -> KlarnaSubscription? {
|
|
194
|
+
guard let subscriptionReference = dict["subscriptionReference"] as? String else { return nil }
|
|
195
|
+
return KlarnaSubscription(
|
|
196
|
+
subscriptionReference: subscriptionReference,
|
|
197
|
+
name: dict["name"] as? String,
|
|
198
|
+
freeTrial: (dict["freeTrial"] as? String).flatMap { KlarnaFreeTrial(rawValue: $0) },
|
|
199
|
+
billingPlans: buildBillingPlans(from: dict["billingPlans"] as? [[String: Any]])
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private func buildBillingPlans(from dicts: [[String: Any]]?) -> [KlarnaBillingPlan]? {
|
|
204
|
+
guard let dicts, !dicts.isEmpty else { return nil }
|
|
205
|
+
return dicts.compactMap { buildBillingPlan(from: $0) }
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private func buildBillingPlan(from dict: [String: Any]) -> KlarnaBillingPlan? {
|
|
209
|
+
guard let fromString = dict["from"] as? String,
|
|
210
|
+
let fromDate = parseIso8601Date(from: fromString),
|
|
211
|
+
let rawInterval = dict["interval"] as? String,
|
|
212
|
+
let interval = KlarnaInterval(rawValue: rawInterval),
|
|
213
|
+
let billingAmount = dict["billingAmount"] as? Double,
|
|
214
|
+
let intervalFrequency = dict["intervalFrequency"] as? Double else {
|
|
215
|
+
return nil
|
|
216
|
+
}
|
|
217
|
+
return KlarnaBillingPlan(
|
|
218
|
+
billingAmount: Int64(billingAmount),
|
|
219
|
+
currency: dict["currency"] as? String,
|
|
220
|
+
from: fromDate,
|
|
221
|
+
interval: interval,
|
|
222
|
+
intervalFrequency: Int32(intervalFrequency)
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Mirrors Android's parseIso8601Date: tries with fractional seconds first, then without.
|
|
227
|
+
private func parseIso8601Date(from string: String) -> Date? {
|
|
228
|
+
let withMillis = ISO8601DateFormatter()
|
|
229
|
+
withMillis.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
|
|
230
|
+
if let date = withMillis.date(from: string) { return date }
|
|
231
|
+
return ISO8601DateFormatter().date(from: string)
|
|
232
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import KlarnaNetworkCore
|
|
3
|
+
import KlarnaNetworkPayment
|
|
4
|
+
|
|
5
|
+
extension KlarnaPaymentRequest {
|
|
6
|
+
func toDictionary() -> [String: Any] {
|
|
7
|
+
[
|
|
8
|
+
"paymentRequestId": paymentRequestId,
|
|
9
|
+
"state": state.rawValue,
|
|
10
|
+
"previousState": orNull(previousState?.rawValue),
|
|
11
|
+
"stateReason": orNull(stateReason?.rawValue),
|
|
12
|
+
"paymentRequestReference": orNull(paymentRequestReference),
|
|
13
|
+
"stateContext": orNull(stateContext?.toDictionary()),
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private extension KlarnaPaymentRequestStateContext {
|
|
19
|
+
func toDictionary() -> [String: Any] {
|
|
20
|
+
[
|
|
21
|
+
"klarnaNetworkSessionToken": orNull(klarnaNetworkSessionToken),
|
|
22
|
+
"klarnaCustomer": orNull(klarnaCustomer?.toDictionary()),
|
|
23
|
+
"shipping": orNull(shipping?.toDictionary()),
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private extension KlarnaCustomer {
|
|
29
|
+
func toDictionary() -> [String: Any] {
|
|
30
|
+
[
|
|
31
|
+
"customerToken": orNull(customerToken),
|
|
32
|
+
"customerTokenReference": orNull(customerTokenReference),
|
|
33
|
+
"customerProfile": orNull(customerProfile?.toDictionary()),
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private extension KlarnaCustomerProfile {
|
|
39
|
+
func toDictionary() -> [String: Any] {
|
|
40
|
+
[
|
|
41
|
+
"address": orNull(address?.toDictionary()),
|
|
42
|
+
"customerId": orNull(customerId),
|
|
43
|
+
"country": orNull(country),
|
|
44
|
+
"email": orNull(email),
|
|
45
|
+
"emailVerified": orNull(emailVerified.map { $0 as NSNumber }),
|
|
46
|
+
"familyName": orNull(familyName),
|
|
47
|
+
"givenName": orNull(givenName),
|
|
48
|
+
"locale": orNull(locale),
|
|
49
|
+
"phone": orNull(phone),
|
|
50
|
+
"phoneVerified": orNull(phoneVerified.map { $0 as NSNumber }),
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private extension KlarnaShipping {
|
|
56
|
+
func toDictionary() -> [String: Any] {
|
|
57
|
+
[
|
|
58
|
+
"address": orNull(address?.toDictionary()),
|
|
59
|
+
"recipient": orNull(recipient?.toDictionary()),
|
|
60
|
+
"shippingOption": orNull(shippingOption?.toDictionary()),
|
|
61
|
+
"shippingReference": orNull(shippingReference),
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private extension KlarnaAddress {
|
|
67
|
+
func toDictionary() -> [String: Any] {
|
|
68
|
+
[
|
|
69
|
+
"city": orNull(city),
|
|
70
|
+
"country": orNull(country),
|
|
71
|
+
"postalCode": orNull(postalCode),
|
|
72
|
+
"region": orNull(region),
|
|
73
|
+
"streetAddress": orNull(streetAddress),
|
|
74
|
+
"streetAddress2": orNull(streetAddress2),
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private extension KlarnaShippingRecipient {
|
|
80
|
+
func toDictionary() -> [String: Any] {
|
|
81
|
+
[
|
|
82
|
+
"attention": orNull(attention),
|
|
83
|
+
"email": orNull(email),
|
|
84
|
+
"familyName": familyName,
|
|
85
|
+
"givenName": givenName,
|
|
86
|
+
"phone": orNull(phone),
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private extension KlarnaShippingOption {
|
|
92
|
+
func toDictionary() -> [String: Any] {
|
|
93
|
+
[
|
|
94
|
+
"shippingCarrier": orNull(shippingCarrier),
|
|
95
|
+
"shippingType": shippingType.rawValue,
|
|
96
|
+
"shippingTypeAttributes": orNull(shippingTypeAttributes?.map { $0.rawValue }),
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private func orNull(_ value: Any?) -> Any {
|
|
102
|
+
value ?? NSNull()
|
|
103
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import XCTest
|
|
2
|
+
@testable import react_native_klarna_network_payment
|
|
3
|
+
|
|
4
|
+
final class KlarnaNetworkPaymentModuleImplTests: XCTestCase {
|
|
5
|
+
|
|
6
|
+
private let instanceId = "test-instance-id"
|
|
7
|
+
private let errorInstanceNotFound = "No instance found for the given instanceId. Call initialize first."
|
|
8
|
+
private var sut: KlarnaNetworkPaymentModuleImpl!
|
|
9
|
+
|
|
10
|
+
override func setUpWithError() throws {
|
|
11
|
+
sut = KlarnaNetworkPaymentModuleImpl()
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
override func tearDownWithError() throws {
|
|
15
|
+
sut = nil
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// MARK: - Helpers
|
|
19
|
+
|
|
20
|
+
private func assertRejectsWithInstanceNotFound(
|
|
21
|
+
code: String?,
|
|
22
|
+
message: String?,
|
|
23
|
+
file: StaticString = #file,
|
|
24
|
+
line: UInt = #line
|
|
25
|
+
) {
|
|
26
|
+
XCTAssertEqual(code, "KlarnaNetworkPayment", file: file, line: line)
|
|
27
|
+
XCTAssertEqual(message, errorInstanceNotFound, file: file, line: line)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// MARK: - initiateWithId
|
|
31
|
+
|
|
32
|
+
func test_initiateWithId_rejectsWhenInstanceNotFound() {
|
|
33
|
+
var rejectedCode: String?
|
|
34
|
+
var rejectedMessage: String?
|
|
35
|
+
sut.initiateWithId(
|
|
36
|
+
instanceId: instanceId,
|
|
37
|
+
paymentRequestId: "pr-1",
|
|
38
|
+
resolve: { _ in XCTFail("should not resolve") },
|
|
39
|
+
reject: { code, message, _ in
|
|
40
|
+
rejectedCode = code
|
|
41
|
+
rejectedMessage = message
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
assertRejectsWithInstanceNotFound(code: rejectedCode, message: rejectedMessage)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// MARK: - initiateWithData
|
|
48
|
+
|
|
49
|
+
func test_initiateWithData_rejectsWhenInstanceNotFound() {
|
|
50
|
+
var rejectedCode: String?
|
|
51
|
+
var rejectedMessage: String?
|
|
52
|
+
sut.initiateWithData(
|
|
53
|
+
instanceId: instanceId,
|
|
54
|
+
data: NSDictionary(),
|
|
55
|
+
resolve: { _ in XCTFail("should not resolve") },
|
|
56
|
+
reject: { code, message, _ in
|
|
57
|
+
rejectedCode = code
|
|
58
|
+
rejectedMessage = message
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
assertRejectsWithInstanceNotFound(code: rejectedCode, message: rejectedMessage)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// MARK: - fetch
|
|
65
|
+
|
|
66
|
+
func test_fetch_rejectsWhenInstanceNotFound() {
|
|
67
|
+
var rejectedCode: String?
|
|
68
|
+
var rejectedMessage: String?
|
|
69
|
+
sut.fetch(
|
|
70
|
+
instanceId: instanceId,
|
|
71
|
+
paymentRequestId: "pr-1",
|
|
72
|
+
resolve: { _ in XCTFail("should not resolve") },
|
|
73
|
+
reject: { code, message, _ in
|
|
74
|
+
rejectedCode = code
|
|
75
|
+
rejectedMessage = message
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
assertRejectsWithInstanceNotFound(code: rejectedCode, message: rejectedMessage)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// MARK: - cancel
|
|
82
|
+
|
|
83
|
+
func test_cancel_rejectsWhenInstanceNotFound() {
|
|
84
|
+
var rejectedCode: String?
|
|
85
|
+
var rejectedMessage: String?
|
|
86
|
+
sut.cancel(
|
|
87
|
+
instanceId: instanceId,
|
|
88
|
+
paymentRequestId: "pr-1",
|
|
89
|
+
resolve: { _ in XCTFail("should not resolve") },
|
|
90
|
+
reject: { code, message, _ in
|
|
91
|
+
rejectedCode = code
|
|
92
|
+
rejectedMessage = message
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
assertRejectsWithInstanceNotFound(code: rejectedCode, message: rejectedMessage)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// MARK: - presentationFetch
|
|
99
|
+
|
|
100
|
+
func test_presentationFetch_rejectsWhenInstanceNotFound() {
|
|
101
|
+
var rejectedCode: String?
|
|
102
|
+
var rejectedMessage: String?
|
|
103
|
+
sut.presentationFetch(
|
|
104
|
+
instanceId: instanceId,
|
|
105
|
+
data: NSDictionary(),
|
|
106
|
+
resolve: { _ in XCTFail("should not resolve") },
|
|
107
|
+
reject: { code, message, _ in
|
|
108
|
+
rejectedCode = code
|
|
109
|
+
rejectedMessage = message
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
assertRejectsWithInstanceNotFound(code: rejectedCode, message: rejectedMessage)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// MARK: - dispose
|
|
116
|
+
|
|
117
|
+
func test_dispose_resolves() {
|
|
118
|
+
var resolved = false
|
|
119
|
+
sut.dispose(
|
|
120
|
+
instanceId: instanceId,
|
|
121
|
+
resolve: { _ in resolved = true },
|
|
122
|
+
reject: { _, _, _ in XCTFail("should not reject") }
|
|
123
|
+
)
|
|
124
|
+
XCTAssertTrue(resolved)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// MARK: - presentationHandleLink
|
|
128
|
+
|
|
129
|
+
func test_presentationHandleLink_rejectsWhenInstanceNotFound() {
|
|
130
|
+
var rejectedCode: String?
|
|
131
|
+
var rejectedMessage: String?
|
|
132
|
+
sut.presentationHandleLink(
|
|
133
|
+
instanceId: instanceId,
|
|
134
|
+
url: "https://example.com",
|
|
135
|
+
resolve: { _ in XCTFail("should not resolve") },
|
|
136
|
+
reject: { code, message, _ in
|
|
137
|
+
rejectedCode = code
|
|
138
|
+
rejectedMessage = message
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
assertRejectsWithInstanceNotFound(code: rejectedCode, message: rejectedMessage)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import XCTest
|
|
2
|
+
import KlarnaCore
|
|
3
|
+
import KlarnaNetworkPayment
|
|
4
|
+
@testable import react_native_klarna_network_payment
|
|
5
|
+
|
|
6
|
+
final class KlarnaPaymentButtonViewImplTests: XCTestCase {
|
|
7
|
+
|
|
8
|
+
// MARK: - makeButton
|
|
9
|
+
|
|
10
|
+
func test_makeButton_withUnknownInstanceId_returnsNil() {
|
|
11
|
+
XCTAssertNil(KlarnaPaymentButtonViewImpl.makeButton(
|
|
12
|
+
instanceId: "unknown-instance",
|
|
13
|
+
state: nil,
|
|
14
|
+
intent: "pay",
|
|
15
|
+
shape: nil,
|
|
16
|
+
buttonStyle: nil,
|
|
17
|
+
theme: nil
|
|
18
|
+
))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// MARK: - parseState
|
|
22
|
+
|
|
23
|
+
func test_parseState_withNil_returnsDefault() {
|
|
24
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseState(nil), .default)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func test_parseState_withDisabled_returnsDisabled() {
|
|
28
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseState("disabled"), .disabled)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func test_parseState_withLoading_returnsLoading() {
|
|
32
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseState("loading"), .loading)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func test_parseState_withUnknownValue_returnsDefault() {
|
|
36
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseState("unknown"), .default)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// MARK: - parseIntent
|
|
40
|
+
|
|
41
|
+
func test_parseIntent_withNil_returnsPay() {
|
|
42
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseIntent(nil), .pay)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
func test_parseIntent_withPay_returnsPay() {
|
|
46
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseIntent("pay"), .pay)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func test_parseIntent_withSubscribe_returnsSubscribe() {
|
|
50
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseIntent("subscribe"), .subscribe)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func test_parseIntent_withAddToWallet_returnsAddToWallet() {
|
|
54
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseIntent("addToWallet"), .addToWallet)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
func test_parseIntent_withUnknownValue_returnsPay() {
|
|
58
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseIntent("unknown"), .pay)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// MARK: - parseShape
|
|
62
|
+
|
|
63
|
+
func test_parseShape_withNil_returnsRoundedRect() {
|
|
64
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseShape(nil), .roundedRect)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func test_parseShape_withRoundedRect_returnsRoundedRect() {
|
|
68
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseShape("roundedRect"), .roundedRect)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func test_parseShape_withPill_returnsPill() {
|
|
72
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseShape("pill"), .pill)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
func test_parseShape_withRectangle_returnsRectangle() {
|
|
76
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseShape("rectangle"), .rectangle)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
func test_parseShape_withUnknownValue_returnsRoundedRect() {
|
|
80
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseShape("unknown"), .roundedRect)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// MARK: - parseStyle
|
|
84
|
+
|
|
85
|
+
func test_parseStyle_withNil_returnsFilled() {
|
|
86
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseStyle(nil), .filled)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
func test_parseStyle_withFilled_returnsFilled() {
|
|
90
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseStyle("filled"), .filled)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
func test_parseStyle_withOutlined_returnsOutlined() {
|
|
94
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseStyle("outlined"), .outlined)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
func test_parseStyle_withUnknownValue_returnsFilled() {
|
|
98
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseStyle("unknown"), .filled)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// MARK: - parseTheme
|
|
102
|
+
|
|
103
|
+
func test_parseTheme_withNil_returnsDark() {
|
|
104
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseTheme(nil), .dark)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
func test_parseTheme_withLight_returnsLight() {
|
|
108
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseTheme("light"), .light)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
func test_parseTheme_withDark_returnsDark() {
|
|
112
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseTheme("dark"), .dark)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
func test_parseTheme_withAutomatic_returnsAutomatic() {
|
|
116
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseTheme("automatic"), .automatic)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
func test_parseTheme_withUnknownValue_returnsDark() {
|
|
120
|
+
XCTAssertEqual(KlarnaPaymentButtonViewImpl.parseTheme("unknown"), .dark)
|
|
121
|
+
}
|
|
122
|
+
}
|