@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.
Files changed (261) hide show
  1. package/README.md +143 -29
  2. package/android/build.gradle +95 -0
  3. package/android/src/main/AndroidManifest.xml +1 -0
  4. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentButtonViewSpec.kt +22 -0
  5. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModule.kt +46 -0
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImpl.kt +163 -0
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentPackage.kt +30 -0
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonPressEvent.kt +19 -0
  9. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManager.kt +276 -0
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapper.kt +132 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapper.kt +328 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapper.kt +145 -0
  13. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImplTest.kt +361 -0
  14. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManagerTest.kt +155 -0
  15. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapperTest.kt +447 -0
  16. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapperTest.kt +489 -0
  17. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapperTest.kt +456 -0
  18. package/ios/Sources/KlarnaNetworkPayment.h +5 -0
  19. package/ios/Sources/KlarnaNetworkPayment.mm +110 -0
  20. package/ios/Sources/KlarnaNetworkPaymentModuleImpl.swift +196 -0
  21. package/ios/Sources/KlarnaPaymentButtonComponentView.mm +147 -0
  22. package/ios/Sources/KlarnaPaymentButtonViewImpl.swift +77 -0
  23. package/ios/Sources/KlarnaPaymentPresentationMapping.swift +102 -0
  24. package/ios/Sources/KlarnaPaymentRequestDataMapping.swift +232 -0
  25. package/ios/Sources/KlarnaPaymentRequestMapping.swift +103 -0
  26. package/ios/Tests/KlarnaNetworkPaymentModuleImplTests.swift +143 -0
  27. package/ios/Tests/KlarnaPaymentButtonViewImplTests.swift +122 -0
  28. package/ios/Tests/KlarnaPaymentPresentationMappingTests.swift +335 -0
  29. package/lib/commonjs/KlarnaNetworkPayment.js +6 -0
  30. package/lib/commonjs/KlarnaNetworkPayment.js.map +1 -0
  31. package/lib/commonjs/KlarnaNetworkPaymentImpl.js +44 -0
  32. package/lib/commonjs/KlarnaNetworkPaymentImpl.js.map +1 -0
  33. package/lib/commonjs/KlarnaNetworkPaymentMapper.js +164 -0
  34. package/lib/commonjs/KlarnaNetworkPaymentMapper.js.map +1 -0
  35. package/lib/commonjs/KlarnaPaymentButton.js +43 -0
  36. package/lib/commonjs/KlarnaPaymentButton.js.map +1 -0
  37. package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js +10 -0
  38. package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
  39. package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js +13 -0
  40. package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
  41. package/lib/commonjs/index.js +51 -0
  42. package/lib/commonjs/index.js.map +1 -0
  43. package/lib/commonjs/types/KlarnaPaymentRequest.js +6 -0
  44. package/lib/commonjs/types/KlarnaPaymentRequest.js.map +1 -0
  45. package/lib/commonjs/types/KlarnaPaymentRequestState.js +2 -0
  46. package/lib/commonjs/types/KlarnaPaymentRequestState.js.map +1 -0
  47. package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js +6 -0
  48. package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js.map +1 -0
  49. package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js +2 -0
  50. package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js.map +1 -0
  51. package/lib/commonjs/types/models/KlarnaBillingPlan.js +6 -0
  52. package/lib/commonjs/types/models/KlarnaBillingPlan.js.map +1 -0
  53. package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js +2 -0
  54. package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
  55. package/lib/commonjs/types/models/KlarnaCustomer.js +6 -0
  56. package/lib/commonjs/types/models/KlarnaCustomer.js.map +1 -0
  57. package/lib/commonjs/types/models/KlarnaFreeTrial.js +2 -0
  58. package/lib/commonjs/types/models/KlarnaFreeTrial.js.map +1 -0
  59. package/lib/commonjs/types/models/KlarnaInterval.js +2 -0
  60. package/lib/commonjs/types/models/KlarnaInterval.js.map +1 -0
  61. package/lib/commonjs/types/models/KlarnaLineItem.js +2 -0
  62. package/lib/commonjs/types/models/KlarnaLineItem.js.map +1 -0
  63. package/lib/commonjs/types/models/KlarnaOndemandService.js +6 -0
  64. package/lib/commonjs/types/models/KlarnaOndemandService.js.map +1 -0
  65. package/lib/commonjs/types/models/KlarnaPartnerCustomer.js +6 -0
  66. package/lib/commonjs/types/models/KlarnaPartnerCustomer.js.map +1 -0
  67. package/lib/commonjs/types/models/KlarnaPaymentPresentation.js +6 -0
  68. package/lib/commonjs/types/models/KlarnaPaymentPresentation.js.map +1 -0
  69. package/lib/commonjs/types/models/KlarnaPaymentRequestData.js +6 -0
  70. package/lib/commonjs/types/models/KlarnaPaymentRequestData.js.map +1 -0
  71. package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js +6 -0
  72. package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js.map +1 -0
  73. package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
  74. package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
  75. package/lib/commonjs/types/models/KlarnaShipping.js +6 -0
  76. package/lib/commonjs/types/models/KlarnaShipping.js.map +1 -0
  77. package/lib/commonjs/types/models/KlarnaShippingConfig.js +6 -0
  78. package/lib/commonjs/types/models/KlarnaShippingConfig.js.map +1 -0
  79. package/lib/commonjs/types/models/KlarnaShippingConfigMode.js +2 -0
  80. package/lib/commonjs/types/models/KlarnaShippingConfigMode.js.map +1 -0
  81. package/lib/commonjs/types/models/KlarnaShippingOption.js +6 -0
  82. package/lib/commonjs/types/models/KlarnaShippingOption.js.map +1 -0
  83. package/lib/commonjs/types/models/KlarnaShippingRecipient.js +2 -0
  84. package/lib/commonjs/types/models/KlarnaShippingRecipient.js.map +1 -0
  85. package/lib/commonjs/types/models/KlarnaShippingType.js +2 -0
  86. package/lib/commonjs/types/models/KlarnaShippingType.js.map +1 -0
  87. package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js +2 -0
  88. package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
  89. package/lib/commonjs/types/models/KlarnaSubscription.js +6 -0
  90. package/lib/commonjs/types/models/KlarnaSubscription.js.map +1 -0
  91. package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js +6 -0
  92. package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
  93. package/lib/commonjs/types/models/index.js +2 -0
  94. package/lib/commonjs/types/models/index.js.map +1 -0
  95. package/lib/module/KlarnaNetworkPayment.js +2 -0
  96. package/lib/module/KlarnaNetworkPayment.js.map +1 -0
  97. package/lib/module/KlarnaNetworkPaymentImpl.js +36 -0
  98. package/lib/module/KlarnaNetworkPaymentImpl.js.map +1 -0
  99. package/lib/module/KlarnaNetworkPaymentMapper.js +146 -0
  100. package/lib/module/KlarnaNetworkPaymentMapper.js.map +1 -0
  101. package/lib/module/KlarnaPaymentButton.js +37 -0
  102. package/lib/module/KlarnaPaymentButton.js.map +1 -0
  103. package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js +3 -0
  104. package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
  105. package/lib/module/Specs/NativeKlarnaNetworkPayment.js +9 -0
  106. package/lib/module/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
  107. package/lib/module/index.js +40 -0
  108. package/lib/module/index.js.map +1 -0
  109. package/lib/module/types/KlarnaPaymentRequest.js +2 -0
  110. package/lib/module/types/KlarnaPaymentRequest.js.map +1 -0
  111. package/lib/module/types/KlarnaPaymentRequestState.js +2 -0
  112. package/lib/module/types/KlarnaPaymentRequestState.js.map +1 -0
  113. package/lib/module/types/KlarnaPaymentRequestStateContext.js +2 -0
  114. package/lib/module/types/KlarnaPaymentRequestStateContext.js.map +1 -0
  115. package/lib/module/types/KlarnaPaymentRequestStateReason.js +2 -0
  116. package/lib/module/types/KlarnaPaymentRequestStateReason.js.map +1 -0
  117. package/lib/module/types/models/KlarnaBillingPlan.js +2 -0
  118. package/lib/module/types/models/KlarnaBillingPlan.js.map +1 -0
  119. package/lib/module/types/models/KlarnaCollectCustomerProfileType.js +2 -0
  120. package/lib/module/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
  121. package/lib/module/types/models/KlarnaCustomer.js +2 -0
  122. package/lib/module/types/models/KlarnaCustomer.js.map +1 -0
  123. package/lib/module/types/models/KlarnaFreeTrial.js +2 -0
  124. package/lib/module/types/models/KlarnaFreeTrial.js.map +1 -0
  125. package/lib/module/types/models/KlarnaInterval.js +2 -0
  126. package/lib/module/types/models/KlarnaInterval.js.map +1 -0
  127. package/lib/module/types/models/KlarnaLineItem.js +2 -0
  128. package/lib/module/types/models/KlarnaLineItem.js.map +1 -0
  129. package/lib/module/types/models/KlarnaOndemandService.js +2 -0
  130. package/lib/module/types/models/KlarnaOndemandService.js.map +1 -0
  131. package/lib/module/types/models/KlarnaPartnerCustomer.js +2 -0
  132. package/lib/module/types/models/KlarnaPartnerCustomer.js.map +1 -0
  133. package/lib/module/types/models/KlarnaPaymentPresentation.js +2 -0
  134. package/lib/module/types/models/KlarnaPaymentPresentation.js.map +1 -0
  135. package/lib/module/types/models/KlarnaPaymentRequestData.js +2 -0
  136. package/lib/module/types/models/KlarnaPaymentRequestData.js.map +1 -0
  137. package/lib/module/types/models/KlarnaRequestCustomerToken.js +2 -0
  138. package/lib/module/types/models/KlarnaRequestCustomerToken.js.map +1 -0
  139. package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
  140. package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
  141. package/lib/module/types/models/KlarnaShipping.js +2 -0
  142. package/lib/module/types/models/KlarnaShipping.js.map +1 -0
  143. package/lib/module/types/models/KlarnaShippingConfig.js +2 -0
  144. package/lib/module/types/models/KlarnaShippingConfig.js.map +1 -0
  145. package/lib/module/types/models/KlarnaShippingConfigMode.js +2 -0
  146. package/lib/module/types/models/KlarnaShippingConfigMode.js.map +1 -0
  147. package/lib/module/types/models/KlarnaShippingOption.js +2 -0
  148. package/lib/module/types/models/KlarnaShippingOption.js.map +1 -0
  149. package/lib/module/types/models/KlarnaShippingRecipient.js +2 -0
  150. package/lib/module/types/models/KlarnaShippingRecipient.js.map +1 -0
  151. package/lib/module/types/models/KlarnaShippingType.js +2 -0
  152. package/lib/module/types/models/KlarnaShippingType.js.map +1 -0
  153. package/lib/module/types/models/KlarnaShippingTypeAttribute.js +2 -0
  154. package/lib/module/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
  155. package/lib/module/types/models/KlarnaSubscription.js +2 -0
  156. package/lib/module/types/models/KlarnaSubscription.js.map +1 -0
  157. package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js +2 -0
  158. package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
  159. package/lib/module/types/models/index.js +2 -0
  160. package/lib/module/types/models/index.js.map +1 -0
  161. package/lib/typescript/KlarnaNetworkPayment.d.ts +22 -0
  162. package/lib/typescript/KlarnaNetworkPayment.d.ts.map +1 -0
  163. package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts +12 -0
  164. package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts.map +1 -0
  165. package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts +273 -0
  166. package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts.map +1 -0
  167. package/lib/typescript/KlarnaPaymentButton.d.ts +51 -0
  168. package/lib/typescript/KlarnaPaymentButton.d.ts.map +1 -0
  169. package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts +16 -0
  170. package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts.map +1 -0
  171. package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts +13 -0
  172. package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts.map +1 -0
  173. package/lib/typescript/index.d.ts +14 -0
  174. package/lib/typescript/index.d.ts.map +1 -0
  175. package/lib/typescript/types/KlarnaPaymentRequest.d.ts +19 -0
  176. package/lib/typescript/types/KlarnaPaymentRequest.d.ts.map +1 -0
  177. package/lib/typescript/types/KlarnaPaymentRequestState.d.ts +15 -0
  178. package/lib/typescript/types/KlarnaPaymentRequestState.d.ts.map +1 -0
  179. package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts +12 -0
  180. package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts.map +1 -0
  181. package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts +13 -0
  182. package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts.map +1 -0
  183. package/lib/typescript/types/models/KlarnaBillingPlan.d.ts +17 -0
  184. package/lib/typescript/types/models/KlarnaBillingPlan.d.ts.map +1 -0
  185. package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts +19 -0
  186. package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts.map +1 -0
  187. package/lib/typescript/types/models/KlarnaCustomer.d.ts +11 -0
  188. package/lib/typescript/types/models/KlarnaCustomer.d.ts.map +1 -0
  189. package/lib/typescript/types/models/KlarnaFreeTrial.d.ts +7 -0
  190. package/lib/typescript/types/models/KlarnaFreeTrial.d.ts.map +1 -0
  191. package/lib/typescript/types/models/KlarnaInterval.d.ts +11 -0
  192. package/lib/typescript/types/models/KlarnaInterval.d.ts.map +1 -0
  193. package/lib/typescript/types/models/KlarnaLineItem.d.ts +28 -0
  194. package/lib/typescript/types/models/KlarnaLineItem.d.ts.map +1 -0
  195. package/lib/typescript/types/models/KlarnaOndemandService.d.ts +17 -0
  196. package/lib/typescript/types/models/KlarnaOndemandService.d.ts.map +1 -0
  197. package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts +15 -0
  198. package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts.map +1 -0
  199. package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts +119 -0
  200. package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts.map +1 -0
  201. package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts +24 -0
  202. package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts.map +1 -0
  203. package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts +9 -0
  204. package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts.map +1 -0
  205. package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts +9 -0
  206. package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts.map +1 -0
  207. package/lib/typescript/types/models/KlarnaShipping.d.ts +15 -0
  208. package/lib/typescript/types/models/KlarnaShipping.d.ts.map +1 -0
  209. package/lib/typescript/types/models/KlarnaShippingConfig.d.ts +9 -0
  210. package/lib/typescript/types/models/KlarnaShippingConfig.d.ts.map +1 -0
  211. package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts +5 -0
  212. package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts.map +1 -0
  213. package/lib/typescript/types/models/KlarnaShippingOption.d.ts +12 -0
  214. package/lib/typescript/types/models/KlarnaShippingOption.d.ts.map +1 -0
  215. package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts +14 -0
  216. package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts.map +1 -0
  217. package/lib/typescript/types/models/KlarnaShippingType.d.ts +25 -0
  218. package/lib/typescript/types/models/KlarnaShippingType.d.ts.map +1 -0
  219. package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts +21 -0
  220. package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts.map +1 -0
  221. package/lib/typescript/types/models/KlarnaSubscription.d.ts +14 -0
  222. package/lib/typescript/types/models/KlarnaSubscription.d.ts.map +1 -0
  223. package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts +21 -0
  224. package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts.map +1 -0
  225. package/lib/typescript/types/models/index.d.ts +22 -0
  226. package/lib/typescript/types/models/index.d.ts.map +1 -0
  227. package/package.json +120 -6
  228. package/react-native-klarna-network-payment.podspec +28 -0
  229. package/src/KlarnaNetworkPayment.ts +30 -0
  230. package/src/KlarnaNetworkPaymentImpl.ts +79 -0
  231. package/src/KlarnaNetworkPaymentMapper.ts +204 -0
  232. package/src/KlarnaPaymentButton.tsx +80 -0
  233. package/src/Specs/KlarnaPaymentButtonNativeComponent.ts +22 -0
  234. package/src/Specs/NativeKlarnaNetworkPayment.ts +17 -0
  235. package/src/index.tsx +63 -0
  236. package/src/types/KlarnaPaymentRequest.ts +19 -0
  237. package/src/types/KlarnaPaymentRequestState.ts +14 -0
  238. package/src/types/KlarnaPaymentRequestStateContext.ts +12 -0
  239. package/src/types/KlarnaPaymentRequestStateReason.ts +12 -0
  240. package/src/types/models/KlarnaBillingPlan.ts +17 -0
  241. package/src/types/models/KlarnaCollectCustomerProfileType.ts +18 -0
  242. package/src/types/models/KlarnaCustomer.ts +11 -0
  243. package/src/types/models/KlarnaFreeTrial.ts +6 -0
  244. package/src/types/models/KlarnaInterval.ts +10 -0
  245. package/src/types/models/KlarnaLineItem.ts +27 -0
  246. package/src/types/models/KlarnaOndemandService.ts +17 -0
  247. package/src/types/models/KlarnaPartnerCustomer.ts +15 -0
  248. package/src/types/models/KlarnaPaymentPresentation.ts +135 -0
  249. package/src/types/models/KlarnaPaymentRequestData.ts +24 -0
  250. package/src/types/models/KlarnaRequestCustomerToken.ts +9 -0
  251. package/src/types/models/KlarnaRequestCustomerTokenScope.ts +8 -0
  252. package/src/types/models/KlarnaShipping.ts +15 -0
  253. package/src/types/models/KlarnaShippingConfig.ts +9 -0
  254. package/src/types/models/KlarnaShippingConfigMode.ts +4 -0
  255. package/src/types/models/KlarnaShippingOption.ts +12 -0
  256. package/src/types/models/KlarnaShippingRecipient.ts +13 -0
  257. package/src/types/models/KlarnaShippingType.ts +24 -0
  258. package/src/types/models/KlarnaShippingTypeAttribute.ts +20 -0
  259. package/src/types/models/KlarnaSubscription.ts +14 -0
  260. package/src/types/models/KlarnaSupplementaryPurchaseData.ts +21 -0
  261. 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
+ }