@stripe/stripe-react-native 0.57.0 → 0.57.2

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 (324) hide show
  1. package/README.md +0 -8
  2. package/android/.idea/AndroidProjectSystem.xml +6 -0
  3. package/android/.idea/caches/deviceStreaming.xml +1029 -0
  4. package/android/.idea/compiler.xml +6 -0
  5. package/android/.idea/gradle.xml +19 -0
  6. package/android/.idea/migrations.xml +10 -0
  7. package/android/.idea/misc.xml +10 -0
  8. package/android/.idea/runConfigurations.xml +17 -0
  9. package/android/.idea/vcs.xml +6 -0
  10. package/android/build.gradle +76 -118
  11. package/android/gradle.properties +1 -1
  12. package/android/local.properties +8 -0
  13. package/android/settings.gradle +2 -0
  14. package/android/spotless.gradle +1 -1
  15. package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormView.kt +20 -17
  16. package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +13 -11
  17. package/android/src/main/java/com/reactnativestripesdk/CardFormView.kt +17 -21
  18. package/android/src/main/java/com/reactnativestripesdk/CollectBankAccountLauncherManager.kt +2 -0
  19. package/android/src/main/java/com/reactnativestripesdk/CustomPaymentMethodActivity.kt +2 -0
  20. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +53 -11
  21. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +105 -117
  22. package/android/src/main/java/com/reactnativestripesdk/EventEmitterCompat.kt +4 -8
  23. package/android/src/main/java/com/reactnativestripesdk/FakeOnrampSdkModule.kt +154 -0
  24. package/android/src/main/java/com/reactnativestripesdk/FinancialConnectionsSheetManager.kt +13 -15
  25. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +1 -1
  26. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherManager.kt +1 -1
  27. package/android/src/main/java/com/reactnativestripesdk/GooglePayRequestHelper.kt +7 -5
  28. package/android/src/main/java/com/reactnativestripesdk/NavigationBarManager.kt +31 -0
  29. package/android/src/main/java/com/reactnativestripesdk/NavigationBarView.kt +120 -0
  30. package/android/src/main/java/com/reactnativestripesdk/PaymentElementConfig.kt +228 -0
  31. package/android/src/main/java/com/reactnativestripesdk/PaymentLauncherManager.kt +1 -0
  32. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +3 -0
  33. package/android/src/main/java/com/reactnativestripesdk/PaymentOptionDisplayDataMapper.kt +4 -6
  34. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetAppearance.kt +73 -30
  35. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +19 -245
  36. package/android/src/main/java/com/reactnativestripesdk/StripeAbstractComposeView.kt +53 -17
  37. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +52 -14
  38. package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +21 -2
  39. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetView.kt +4 -4
  40. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetViewManager.kt +2 -2
  41. package/android/src/main/java/com/reactnativestripesdk/customersheet/CustomerSheetManager.kt +15 -35
  42. package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerSessionProvider.kt +2 -1
  43. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +5 -10
  44. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +90 -77
  45. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +6 -4
  46. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +13 -3
  47. package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +41 -0
  48. package/android/src/main/java/com/reactnativestripesdk/utils/KeepJsAwakeTask.kt +1 -1
  49. package/android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt +92 -44
  50. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +3 -0
  51. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +2 -0
  52. package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +118 -0
  53. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +4 -0
  54. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +922 -0
  55. package/android/src/test/java/com/facebook/testutils/shadows/ShadowArguments.kt +29 -0
  56. package/android/src/test/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManagerTest.kt +163 -0
  57. package/android/src/test/java/com/reactnativestripesdk/PaymentElementConfigTest.kt +976 -0
  58. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetAppearanceTest.kt +801 -0
  59. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetManagerTest.kt +523 -0
  60. package/android/src/test/java/com/reactnativestripesdk/addresssheet/AddressSheetViewTest.kt +551 -0
  61. package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +567 -0
  62. package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +456 -0
  63. package/android/src/test/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxyTest.kt +43 -0
  64. package/android/src/test/resources/robolectric.properties +2 -0
  65. package/ios/AddressSheet/AddressSheetUtils.swift +3 -3
  66. package/ios/AddressSheet/AddressSheetView.swift +25 -25
  67. package/ios/AddressSheet/AddressSheetViewManager.swift +2 -2
  68. package/ios/ApplePayButtonManager.swift +1 -1
  69. package/ios/ApplePayButtonView.swift +9 -10
  70. package/ios/ApplePayUtils.swift +51 -51
  71. package/ios/ApplePayViewController.swift +25 -29
  72. package/ios/AuBECSDebitFormManager.swift +1 -1
  73. package/ios/AuBECSDebitFormView.swift +13 -15
  74. package/ios/CardFieldManager.swift +4 -4
  75. package/ios/CardFieldView.swift +9 -9
  76. package/ios/CardFormManager.swift +3 -3
  77. package/ios/CardFormView.swift +28 -28
  78. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingView.swift +97 -0
  79. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +133 -0
  80. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.m +16 -0
  81. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.swift +17 -0
  82. package/ios/CustomerSheet/CustomerSheetUtils.swift +15 -16
  83. package/ios/CustomerSheet/ReactNativeCustomerAdapter.swift +19 -19
  84. package/ios/EmbeddedPaymentElementView.swift +2 -2
  85. package/ios/Errors.swift +22 -23
  86. package/ios/FinancialConnections.swift +37 -37
  87. package/ios/Mappers.swift +210 -71
  88. package/ios/NavigationBarManager.m +13 -0
  89. package/ios/NavigationBarManager.swift +17 -0
  90. package/ios/NavigationBarView.swift +65 -0
  91. package/ios/NewArch/NavigationBarComponentView.h +10 -0
  92. package/ios/NewArch/NavigationBarComponentView.mm +86 -0
  93. package/ios/OldArch/StripeSdkEventEmitterCompat.h +1 -0
  94. package/ios/OldArch/StripeSdkEventEmitterCompat.m +7 -1
  95. package/ios/PaymentMethodFactory.swift +24 -24
  96. package/ios/PaymentOptionDisplayData+ReactNative.swift +4 -4
  97. package/ios/PaymentPassFinder.swift +9 -10
  98. package/ios/PaymentSheetAppearance.swift +137 -138
  99. package/ios/PushProvisioning/AddToWalletButtonManager.swift +2 -2
  100. package/ios/PushProvisioning/AddToWalletButtonView.swift +15 -17
  101. package/ios/PushProvisioning/PushProvisioningUtils.swift +11 -11
  102. package/ios/StripeContainerManager.swift +1 -1
  103. package/ios/StripeContainerView.swift +3 -3
  104. package/ios/StripeOnrampSdk.h +17 -0
  105. package/ios/StripeOnrampSdk.mm +158 -0
  106. package/ios/StripeSdk.mm +8 -0
  107. package/ios/StripeSdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  108. package/ios/StripeSdk.xcodeproj/project.xcworkspace/xcuserdata/tianzhao.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  109. package/ios/StripeSdk.xcodeproj/xcuserdata/tianzhao.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  110. package/ios/StripeSdkEmitter.swift +4 -0
  111. package/ios/StripeSdkImpl+CustomerSheet.swift +30 -25
  112. package/ios/StripeSdkImpl+Embedded.swift +11 -9
  113. package/ios/StripeSdkImpl+PaymentSheet.swift +36 -34
  114. package/ios/StripeSdkImpl.swift +913 -185
  115. package/ios/UIColorExtension.swift +72 -0
  116. package/lib/commonjs/components/AddToWalletButton.js +1 -1
  117. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  118. package/lib/commonjs/components/AddressSheet.js +1 -1
  119. package/lib/commonjs/components/AddressSheet.js.map +1 -1
  120. package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
  121. package/lib/commonjs/components/AuBECSDebitForm.js.map +1 -1
  122. package/lib/commonjs/components/CardField.js +1 -1
  123. package/lib/commonjs/components/CardField.js.map +1 -1
  124. package/lib/commonjs/components/CardForm.js +1 -1
  125. package/lib/commonjs/components/CardForm.js.map +1 -1
  126. package/lib/commonjs/components/PlatformPayButton.js +1 -1
  127. package/lib/commonjs/components/PlatformPayButton.js.map +1 -1
  128. package/lib/commonjs/components/StripeContainer.js +1 -1
  129. package/lib/commonjs/components/StripeContainer.js.map +1 -1
  130. package/lib/commonjs/components/StripeProvider.js +1 -1
  131. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  132. package/lib/commonjs/connect/Components.js +2 -0
  133. package/lib/commonjs/connect/Components.js.map +1 -0
  134. package/lib/commonjs/connect/ConnectComponentsProvider.js +2 -0
  135. package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -0
  136. package/lib/commonjs/connect/EmbeddedComponent.js +19 -0
  137. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -0
  138. package/lib/commonjs/connect/ModalCloseButton.js +2 -0
  139. package/lib/commonjs/connect/ModalCloseButton.js.map +1 -0
  140. package/lib/commonjs/connect/NavigationBar.js +2 -0
  141. package/lib/commonjs/connect/NavigationBar.js.map +1 -0
  142. package/lib/commonjs/connect/connectTypes.js +2 -0
  143. package/lib/commonjs/connect/connectTypes.js.map +1 -0
  144. package/lib/commonjs/events.js +1 -1
  145. package/lib/commonjs/events.js.map +1 -1
  146. package/lib/commonjs/helpers.js +1 -1
  147. package/lib/commonjs/helpers.js.map +1 -1
  148. package/lib/commonjs/hooks/useOnramp.js +2 -0
  149. package/lib/commonjs/hooks/useOnramp.js.map +1 -0
  150. package/lib/commonjs/index.js +1 -1
  151. package/lib/commonjs/index.js.map +1 -1
  152. package/lib/commonjs/plugin/withStripe.js +1 -1
  153. package/lib/commonjs/plugin/withStripe.js.map +1 -1
  154. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  155. package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
  156. package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
  157. package/lib/commonjs/specs/NativeAddressSheet.js.map +1 -1
  158. package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
  159. package/lib/commonjs/specs/NativeApplePayButton.js.map +1 -1
  160. package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
  161. package/lib/commonjs/specs/NativeAuBECSDebitForm.js.map +1 -1
  162. package/lib/commonjs/specs/NativeCardField.js +1 -1
  163. package/lib/commonjs/specs/NativeCardField.js.map +1 -1
  164. package/lib/commonjs/specs/NativeCardForm.js +1 -1
  165. package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
  166. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +2 -0
  167. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  168. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  169. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  170. package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
  171. package/lib/commonjs/specs/NativeGooglePayButton.js.map +1 -1
  172. package/lib/commonjs/specs/NativeNavigationBar.js +2 -0
  173. package/lib/commonjs/specs/NativeNavigationBar.js.map +1 -0
  174. package/lib/commonjs/specs/NativeOnrampSdkModule.js +2 -0
  175. package/lib/commonjs/specs/NativeOnrampSdkModule.js.map +1 -0
  176. package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
  177. package/lib/commonjs/specs/NativeStripeContainer.js.map +1 -1
  178. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  179. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  180. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  181. package/lib/commonjs/types/Errors.js +1 -1
  182. package/lib/commonjs/types/Errors.js.map +1 -1
  183. package/lib/commonjs/types/Onramp.js +2 -0
  184. package/lib/commonjs/types/Onramp.js.map +1 -0
  185. package/lib/commonjs/types/PaymentSheet.js.map +1 -1
  186. package/lib/commonjs/types/index.js +1 -1
  187. package/lib/commonjs/types/index.js.map +1 -1
  188. package/lib/module/components/AddToWalletButton.js +1 -1
  189. package/lib/module/components/AddToWalletButton.js.map +1 -1
  190. package/lib/module/components/AddressSheet.js +1 -1
  191. package/lib/module/components/AddressSheet.js.map +1 -1
  192. package/lib/module/components/AuBECSDebitForm.js +1 -1
  193. package/lib/module/components/AuBECSDebitForm.js.map +1 -1
  194. package/lib/module/components/CardField.js +1 -1
  195. package/lib/module/components/CardField.js.map +1 -1
  196. package/lib/module/components/CardForm.js +1 -1
  197. package/lib/module/components/CardForm.js.map +1 -1
  198. package/lib/module/components/PlatformPayButton.js +1 -1
  199. package/lib/module/components/PlatformPayButton.js.map +1 -1
  200. package/lib/module/components/StripeContainer.js +1 -1
  201. package/lib/module/components/StripeContainer.js.map +1 -1
  202. package/lib/module/components/StripeProvider.js +1 -1
  203. package/lib/module/components/StripeProvider.js.map +1 -1
  204. package/lib/module/connect/Components.js +2 -0
  205. package/lib/module/connect/Components.js.map +1 -0
  206. package/lib/module/connect/ConnectComponentsProvider.js +2 -0
  207. package/lib/module/connect/ConnectComponentsProvider.js.map +1 -0
  208. package/lib/module/connect/EmbeddedComponent.js +19 -0
  209. package/lib/module/connect/EmbeddedComponent.js.map +1 -0
  210. package/lib/module/connect/ModalCloseButton.js +2 -0
  211. package/lib/module/connect/ModalCloseButton.js.map +1 -0
  212. package/lib/module/connect/NavigationBar.js +2 -0
  213. package/lib/module/connect/NavigationBar.js.map +1 -0
  214. package/lib/module/connect/connectTypes.js +2 -0
  215. package/lib/module/connect/connectTypes.js.map +1 -0
  216. package/lib/module/events.js +1 -1
  217. package/lib/module/events.js.map +1 -1
  218. package/lib/module/helpers.js +1 -1
  219. package/lib/module/helpers.js.map +1 -1
  220. package/lib/module/hooks/useOnramp.js +2 -0
  221. package/lib/module/hooks/useOnramp.js.map +1 -0
  222. package/lib/module/index.js +1 -1
  223. package/lib/module/index.js.map +1 -1
  224. package/lib/module/plugin/withStripe.js +1 -1
  225. package/lib/module/plugin/withStripe.js.map +1 -1
  226. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  227. package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
  228. package/lib/module/specs/NativeAddressSheet.js +1 -1
  229. package/lib/module/specs/NativeAddressSheet.js.map +1 -1
  230. package/lib/module/specs/NativeApplePayButton.js +1 -1
  231. package/lib/module/specs/NativeApplePayButton.js.map +1 -1
  232. package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
  233. package/lib/module/specs/NativeAuBECSDebitForm.js.map +1 -1
  234. package/lib/module/specs/NativeCardField.js +1 -1
  235. package/lib/module/specs/NativeCardField.js.map +1 -1
  236. package/lib/module/specs/NativeCardForm.js +1 -1
  237. package/lib/module/specs/NativeCardForm.js.map +1 -1
  238. package/lib/module/specs/NativeConnectAccountOnboardingView.js +2 -0
  239. package/lib/module/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  240. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  241. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  242. package/lib/module/specs/NativeGooglePayButton.js +1 -1
  243. package/lib/module/specs/NativeGooglePayButton.js.map +1 -1
  244. package/lib/module/specs/NativeNavigationBar.js +2 -0
  245. package/lib/module/specs/NativeNavigationBar.js.map +1 -0
  246. package/lib/module/specs/NativeOnrampSdkModule.js +2 -0
  247. package/lib/module/specs/NativeOnrampSdkModule.js.map +1 -0
  248. package/lib/module/specs/NativeStripeContainer.js +1 -1
  249. package/lib/module/specs/NativeStripeContainer.js.map +1 -1
  250. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  251. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  252. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  253. package/lib/module/types/Errors.js +1 -1
  254. package/lib/module/types/Errors.js.map +1 -1
  255. package/lib/module/types/Onramp.js +2 -0
  256. package/lib/module/types/Onramp.js.map +1 -0
  257. package/lib/module/types/PaymentSheet.js.map +1 -1
  258. package/lib/module/types/index.js +1 -1
  259. package/lib/module/types/index.js.map +1 -1
  260. package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
  261. package/lib/typescript/src/connect/Components.d.ts +23 -0
  262. package/lib/typescript/src/connect/Components.d.ts.map +1 -0
  263. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts +22 -0
  264. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts.map +1 -0
  265. package/lib/typescript/src/connect/EmbeddedComponent.d.ts +18 -0
  266. package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -0
  267. package/lib/typescript/src/connect/ModalCloseButton.d.ts +7 -0
  268. package/lib/typescript/src/connect/ModalCloseButton.d.ts.map +1 -0
  269. package/lib/typescript/src/connect/NavigationBar.d.ts +8 -0
  270. package/lib/typescript/src/connect/NavigationBar.d.ts.map +1 -0
  271. package/lib/typescript/src/connect/connectTypes.d.ts +464 -0
  272. package/lib/typescript/src/connect/connectTypes.d.ts.map +1 -0
  273. package/lib/typescript/src/events.d.ts +4 -0
  274. package/lib/typescript/src/events.d.ts.map +1 -1
  275. package/lib/typescript/src/functions.d.ts.map +1 -1
  276. package/lib/typescript/src/helpers.d.ts.map +1 -1
  277. package/lib/typescript/src/hooks/useOnramp.d.ts +158 -0
  278. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -0
  279. package/lib/typescript/src/index.d.ts +4 -0
  280. package/lib/typescript/src/index.d.ts.map +1 -1
  281. package/lib/typescript/src/plugin/withStripe.d.ts +15 -0
  282. package/lib/typescript/src/plugin/withStripe.d.ts.map +1 -1
  283. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts +14 -0
  284. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts.map +1 -0
  285. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +1 -0
  286. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
  287. package/lib/typescript/src/specs/NativeNavigationBar.d.ts +11 -0
  288. package/lib/typescript/src/specs/NativeNavigationBar.d.ts.map +1 -0
  289. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +28 -0
  290. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -0
  291. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +3 -0
  292. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  293. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
  294. package/lib/typescript/src/types/Errors.d.ts +5 -0
  295. package/lib/typescript/src/types/Errors.d.ts.map +1 -1
  296. package/lib/typescript/src/types/Onramp.d.ts +275 -0
  297. package/lib/typescript/src/types/Onramp.d.ts.map +1 -0
  298. package/lib/typescript/src/types/PaymentSheet.d.ts +7 -0
  299. package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
  300. package/lib/typescript/src/types/index.d.ts +7 -1
  301. package/lib/typescript/src/types/index.d.ts.map +1 -1
  302. package/package.json +25 -14
  303. package/src/components/StripeProvider.tsx +5 -0
  304. package/src/connect/Components.tsx +279 -0
  305. package/src/connect/ConnectComponentsProvider.tsx +93 -0
  306. package/src/connect/EmbeddedComponent.tsx +407 -0
  307. package/src/connect/ModalCloseButton.tsx +44 -0
  308. package/src/connect/NavigationBar.tsx +29 -0
  309. package/src/connect/connectTypes.ts +626 -0
  310. package/src/events.ts +23 -0
  311. package/src/hooks/useOnramp.tsx +334 -0
  312. package/src/index.tsx +13 -0
  313. package/src/plugin/withStripe.ts +104 -7
  314. package/src/specs/NativeConnectAccountOnboardingView.ts +19 -0
  315. package/src/specs/NativeEmbeddedPaymentElement.ts +5 -1
  316. package/src/specs/NativeNavigationBar.ts +16 -0
  317. package/src/specs/NativeOnrampSdkModule.ts +47 -0
  318. package/src/specs/NativeStripeSdkModule.ts +5 -0
  319. package/src/types/EmbeddedPaymentElement.tsx +24 -3
  320. package/src/types/Errors.ts +6 -0
  321. package/src/types/Onramp.ts +317 -0
  322. package/src/types/PaymentSheet.ts +7 -0
  323. package/src/types/index.ts +8 -0
  324. package/stripe-react-native.podspec +20 -7
@@ -0,0 +1,976 @@
1
+ package com.reactnativestripesdk
2
+
3
+ import com.reactnativestripesdk.utils.PaymentSheetException
4
+ import com.reactnativestripesdk.utils.readableArrayOf
5
+ import com.reactnativestripesdk.utils.readableMapOf
6
+ import com.stripe.android.paymentelement.PaymentMethodOptionsSetupFutureUsagePreview
7
+ import com.stripe.android.paymentsheet.PaymentSheet
8
+ import org.junit.Assert.assertEquals
9
+ import org.junit.Assert.assertNotNull
10
+ import org.junit.Assert.assertNull
11
+ import org.junit.Test
12
+ import org.junit.runner.RunWith
13
+ import org.robolectric.RobolectricTestRunner
14
+
15
+ @RunWith(RobolectricTestRunner::class)
16
+ @OptIn(PaymentMethodOptionsSetupFutureUsagePreview::class)
17
+ class PaymentElementConfigTest {
18
+ // ============================================
19
+ // buildIntentConfiguration Tests
20
+ // ============================================
21
+
22
+ @Test
23
+ fun buildIntentConfiguration_NullParams_ReturnsNull() {
24
+ val result = buildIntentConfiguration(null)
25
+ assertNull(result)
26
+ }
27
+
28
+ @Test(expected = PaymentSheetException::class)
29
+ fun buildIntentConfiguration_MissingMode_ThrowsException() {
30
+ val params = readableMapOf()
31
+ buildIntentConfiguration(params)
32
+ }
33
+
34
+ @Test
35
+ fun buildIntentConfiguration_WithPaymentMode_Success() {
36
+ val params =
37
+ readableMapOf(
38
+ "mode" to
39
+ readableMapOf(
40
+ "amount" to 1000,
41
+ "currencyCode" to "usd",
42
+ ),
43
+ )
44
+
45
+ val result = buildIntentConfiguration(params)
46
+
47
+ assertNotNull(result)
48
+ val mode = result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment
49
+ assertEquals(1000L, mode?.amount)
50
+ assertEquals("usd", mode?.currency)
51
+ }
52
+
53
+ @Test
54
+ fun buildIntentConfiguration_WithPaymentMethodTypes_Success() {
55
+ val params =
56
+ readableMapOf(
57
+ "mode" to
58
+ readableMapOf(
59
+ "amount" to 1000,
60
+ "currencyCode" to "usd",
61
+ ),
62
+ "paymentMethodTypes" to readableArrayOf("card", "klarna"),
63
+ )
64
+
65
+ val result = buildIntentConfiguration(params)
66
+
67
+ assertNotNull(result)
68
+ assertEquals(2, result?.paymentMethodTypes?.size)
69
+ assertEquals("card", result?.paymentMethodTypes?.get(0))
70
+ assertEquals("klarna", result?.paymentMethodTypes?.get(1))
71
+ }
72
+
73
+ @Test
74
+ fun buildIntentConfiguration_EmptyPaymentMethodTypes_ReturnsEmptyList() {
75
+ val params =
76
+ readableMapOf(
77
+ "mode" to
78
+ readableMapOf(
79
+ "amount" to 1000,
80
+ "currencyCode" to "usd",
81
+ ),
82
+ )
83
+
84
+ val result = buildIntentConfiguration(params)
85
+
86
+ assertNotNull(result)
87
+ assertEquals(0, result?.paymentMethodTypes?.size)
88
+ }
89
+
90
+ @Test
91
+ fun buildIntentConfiguration_WithOnBehalfOf_Success() {
92
+ val params =
93
+ readableMapOf(
94
+ "mode" to
95
+ readableMapOf(
96
+ "amount" to 1000,
97
+ "currencyCode" to "usd",
98
+ ),
99
+ "onBehalfOf" to "acct_connected_account_a",
100
+ )
101
+
102
+ val result = buildIntentConfiguration(params)
103
+
104
+ assertNotNull(result)
105
+ assertEquals("acct_connected_account_a", result?.onBehalfOf)
106
+ }
107
+
108
+ @Test
109
+ fun buildIntentConfiguration_WithOnBehalfOf_Failure() {
110
+ val params =
111
+ readableMapOf(
112
+ "mode" to
113
+ readableMapOf(
114
+ "amount" to 1000,
115
+ "currencyCode" to "usd",
116
+ ),
117
+ )
118
+
119
+ val result = buildIntentConfiguration(params)
120
+
121
+ assertNotNull(result)
122
+ assertNull(result?.onBehalfOf)
123
+ }
124
+
125
+ // ============================================
126
+ // buildIntentConfigurationMode Tests
127
+ // ============================================
128
+
129
+ @Test
130
+ fun buildIntentConfigurationMode_PaymentMode_MinimalParams() {
131
+ val params =
132
+ readableMapOf(
133
+ "mode" to
134
+ readableMapOf(
135
+ "amount" to 5000,
136
+ "currencyCode" to "eur",
137
+ ),
138
+ )
139
+
140
+ val result = buildIntentConfiguration(params)
141
+
142
+ val mode = result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment
143
+ assertNotNull(mode)
144
+ assertEquals(5000L, mode?.amount)
145
+ assertEquals("eur", mode?.currency)
146
+ }
147
+
148
+ @Test(expected = PaymentSheetException::class)
149
+ fun buildIntentConfigurationMode_PaymentMode_MissingCurrency_ThrowsException() {
150
+ val params =
151
+ readableMapOf(
152
+ "mode" to
153
+ readableMapOf(
154
+ "amount" to 5000,
155
+ ),
156
+ )
157
+
158
+ buildIntentConfiguration(params)
159
+ }
160
+
161
+ @Test
162
+ fun buildIntentConfigurationMode_PaymentMode_WithSetupFutureUsage() {
163
+ val params =
164
+ readableMapOf(
165
+ "mode" to
166
+ readableMapOf(
167
+ "amount" to 5000,
168
+ "currencyCode" to "usd",
169
+ "setupFutureUsage" to "OffSession",
170
+ ),
171
+ )
172
+
173
+ val result = buildIntentConfiguration(params)
174
+
175
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
176
+ }
177
+
178
+ @Test
179
+ fun buildIntentConfigurationMode_PaymentMode_WithCaptureMethod() {
180
+ val params =
181
+ readableMapOf(
182
+ "mode" to
183
+ readableMapOf(
184
+ "amount" to 5000,
185
+ "currencyCode" to "usd",
186
+ "captureMethod" to "Manual",
187
+ ),
188
+ )
189
+
190
+ val result = buildIntentConfiguration(params)
191
+
192
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
193
+ }
194
+
195
+ @Test
196
+ fun buildIntentConfigurationMode_PaymentMode_WithPaymentMethodOptions() {
197
+ val params =
198
+ readableMapOf(
199
+ "mode" to
200
+ readableMapOf(
201
+ "amount" to 5000,
202
+ "currencyCode" to "usd",
203
+ "paymentMethodOptions" to
204
+ readableMapOf(
205
+ "setupFutureUsageValues" to
206
+ readableMapOf(
207
+ "card" to "OffSession",
208
+ "us_bank_account" to "OnSession",
209
+ ),
210
+ ),
211
+ ),
212
+ )
213
+
214
+ val result = buildIntentConfiguration(params)
215
+
216
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
217
+ }
218
+
219
+ @Test
220
+ fun buildIntentConfigurationMode_SetupMode_Success() {
221
+ val params =
222
+ readableMapOf(
223
+ "mode" to
224
+ readableMapOf(
225
+ "setupFutureUsage" to "OffSession",
226
+ ),
227
+ )
228
+
229
+ val result = buildIntentConfiguration(params)
230
+
231
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Setup)
232
+ }
233
+
234
+ @Test
235
+ fun buildIntentConfigurationMode_SetupMode_WithCurrency() {
236
+ val params =
237
+ readableMapOf(
238
+ "mode" to
239
+ readableMapOf(
240
+ "setupFutureUsage" to "OnSession",
241
+ "currencyCode" to "gbp",
242
+ ),
243
+ )
244
+
245
+ val result = buildIntentConfiguration(params)
246
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Setup)
247
+ }
248
+
249
+ @Test(expected = PaymentSheetException::class)
250
+ fun buildIntentConfigurationMode_SetupMode_MissingSetupFutureUsage_ThrowsException() {
251
+ val params =
252
+ readableMapOf(
253
+ "mode" to readableMapOf(),
254
+ )
255
+
256
+ buildIntentConfiguration(params)
257
+ }
258
+
259
+ @Test
260
+ fun buildIntentConfigurationMode_PaymentMode_InvalidSetupFutureUsage_UsesNull() {
261
+ val params =
262
+ readableMapOf(
263
+ "mode" to
264
+ readableMapOf(
265
+ "amount" to 5000,
266
+ "currencyCode" to "usd",
267
+ "setupFutureUsage" to "Unknown",
268
+ ),
269
+ )
270
+
271
+ val result = buildIntentConfiguration(params)
272
+
273
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
274
+ }
275
+
276
+ @Test
277
+ fun buildIntentConfigurationMode_PaymentMode_InvalidCaptureMethod_DefaultsToAutomatic() {
278
+ val params =
279
+ readableMapOf(
280
+ "mode" to
281
+ readableMapOf(
282
+ "amount" to 5000,
283
+ "currencyCode" to "usd",
284
+ "captureMethod" to "InvalidMethod",
285
+ ),
286
+ )
287
+
288
+ val result = buildIntentConfiguration(params)
289
+
290
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
291
+ }
292
+
293
+ @Test
294
+ fun buildIntentConfigurationMode_PaymentMode_NullPaymentMethodOptions() {
295
+ val params =
296
+ readableMapOf(
297
+ "mode" to
298
+ readableMapOf(
299
+ "amount" to 5000,
300
+ "currencyCode" to "usd",
301
+ "paymentMethodOptions" to null,
302
+ ),
303
+ )
304
+
305
+ val result = buildIntentConfiguration(params)
306
+
307
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
308
+ }
309
+
310
+ @Test
311
+ fun buildIntentConfigurationMode_PaymentMode_EmptyPaymentMethodOptions() {
312
+ val params =
313
+ readableMapOf(
314
+ "mode" to
315
+ readableMapOf(
316
+ "amount" to 5000,
317
+ "currencyCode" to "usd",
318
+ "paymentMethodOptions" to
319
+ readableMapOf(
320
+ "setupFutureUsageValues" to readableMapOf(),
321
+ ),
322
+ ),
323
+ )
324
+
325
+ val result = buildIntentConfiguration(params)
326
+
327
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
328
+ }
329
+
330
+ @Test
331
+ fun buildIntentConfigurationMode_PaymentMode_InvalidPaymentMethodCodesInOptions() {
332
+ val params =
333
+ readableMapOf(
334
+ "mode" to
335
+ readableMapOf(
336
+ "amount" to 5000,
337
+ "currencyCode" to "usd",
338
+ "paymentMethodOptions" to
339
+ readableMapOf(
340
+ "setupFutureUsageValues" to
341
+ readableMapOf(
342
+ "invalid_code" to "OffSession",
343
+ "another_invalid" to "OnSession",
344
+ ),
345
+ ),
346
+ ),
347
+ )
348
+
349
+ val result = buildIntentConfiguration(params)
350
+
351
+ assertNotNull(result?.mode as? PaymentSheet.IntentConfiguration.Mode.Payment)
352
+ }
353
+
354
+ @Test(expected = PaymentSheetException::class)
355
+ fun buildIntentConfigurationMode_SetupMode_InvalidSetupFutureUsage_ThrowsException() {
356
+ val params =
357
+ readableMapOf(
358
+ "mode" to
359
+ readableMapOf(
360
+ "setupFutureUsage" to "Unknown",
361
+ ),
362
+ )
363
+
364
+ buildIntentConfiguration(params)
365
+ }
366
+
367
+ // ============================================
368
+ // buildLinkConfig Tests
369
+ // ============================================
370
+
371
+ @Test
372
+ fun buildLinkConfig_NullParams_ReturnsDefaultConfig() {
373
+ val result = buildLinkConfig(null)
374
+
375
+ assertNotNull(result)
376
+ }
377
+
378
+ @Test
379
+ fun buildLinkConfig_EmptyParams_ReturnsDefaultConfig() {
380
+ val params = readableMapOf()
381
+ val result = buildLinkConfig(params)
382
+
383
+ assertNotNull(result)
384
+ }
385
+
386
+ @Test
387
+ fun buildLinkConfig_DisplayAutomatic() {
388
+ val params =
389
+ readableMapOf(
390
+ "display" to "automatic",
391
+ )
392
+ val result = buildLinkConfig(params)
393
+
394
+ assertNotNull(result)
395
+ }
396
+
397
+ @Test
398
+ fun buildLinkConfig_DisplayNever() {
399
+ val params =
400
+ readableMapOf(
401
+ "display" to "never",
402
+ )
403
+ val result = buildLinkConfig(params)
404
+
405
+ assertNotNull(result)
406
+ }
407
+
408
+ @Test
409
+ fun buildLinkConfig_InvalidDisplay_DefaultsToAutomatic() {
410
+ val params =
411
+ readableMapOf(
412
+ "display" to "invalid_value",
413
+ )
414
+ val result = buildLinkConfig(params)
415
+
416
+ assertNotNull(result)
417
+ }
418
+
419
+ // ============================================
420
+ // buildGooglePayConfig Tests
421
+ // ============================================
422
+
423
+ @Test
424
+ fun buildGooglePayConfig_NullParams_ReturnsNull() {
425
+ val result = buildGooglePayConfig(null)
426
+ assertNull(result)
427
+ }
428
+
429
+ @Test
430
+ fun buildGooglePayConfig_EmptyParams_ReturnsNull() {
431
+ val params = readableMapOf()
432
+ val result = buildGooglePayConfig(params)
433
+ assertNull(result)
434
+ }
435
+
436
+ @Test
437
+ fun buildGooglePayConfig_MinimalParams_TestEnvironment() {
438
+ val params =
439
+ readableMapOf(
440
+ "merchantCountryCode" to "US",
441
+ "currencyCode" to "usd",
442
+ "testEnv" to true,
443
+ )
444
+
445
+ val result = buildGooglePayConfig(params)
446
+
447
+ assertNotNull(result)
448
+ }
449
+
450
+ @Test
451
+ fun buildGooglePayConfig_ProductionEnvironment() {
452
+ val params =
453
+ readableMapOf(
454
+ "merchantCountryCode" to "CA",
455
+ "currencyCode" to "cad",
456
+ "testEnv" to false,
457
+ )
458
+
459
+ val result = buildGooglePayConfig(params)
460
+
461
+ assertNotNull(result)
462
+ }
463
+
464
+ @Test
465
+ fun buildGooglePayConfig_WithAmount() {
466
+ val params =
467
+ readableMapOf(
468
+ "merchantCountryCode" to "US",
469
+ "currencyCode" to "usd",
470
+ "testEnv" to true,
471
+ "amount" to "2500",
472
+ )
473
+
474
+ val result = buildGooglePayConfig(params)
475
+
476
+ assertNotNull(result)
477
+ }
478
+
479
+ @Test
480
+ fun buildGooglePayConfig_WithInvalidAmount() {
481
+ val params =
482
+ readableMapOf(
483
+ "merchantCountryCode" to "US",
484
+ "currencyCode" to "usd",
485
+ "testEnv" to true,
486
+ "amount" to "not_a_number",
487
+ )
488
+
489
+ val result = buildGooglePayConfig(params)
490
+
491
+ assertNotNull(result)
492
+ }
493
+
494
+ @Test
495
+ fun buildGooglePayConfig_WithLabel() {
496
+ val params =
497
+ readableMapOf(
498
+ "merchantCountryCode" to "US",
499
+ "currencyCode" to "usd",
500
+ "testEnv" to true,
501
+ "label" to "Total",
502
+ )
503
+
504
+ val result = buildGooglePayConfig(params)
505
+
506
+ assertNotNull(result)
507
+ }
508
+
509
+ @Test
510
+ fun buildGooglePayConfig_TestEnvNotProvided_DefaultsToFalse() {
511
+ val params =
512
+ readableMapOf(
513
+ "merchantCountryCode" to "US",
514
+ "currencyCode" to "usd",
515
+ )
516
+
517
+ val result = buildGooglePayConfig(params)
518
+
519
+ assertNotNull(result)
520
+ }
521
+
522
+ @Test
523
+ fun buildGooglePayConfig_EmptyMerchantCountryCode() {
524
+ val params =
525
+ readableMapOf(
526
+ "merchantCountryCode" to "",
527
+ "currencyCode" to "usd",
528
+ "testEnv" to true,
529
+ )
530
+
531
+ val result = buildGooglePayConfig(params)
532
+
533
+ assertNotNull(result)
534
+ }
535
+
536
+ @Test
537
+ fun buildGooglePayConfig_EmptyCurrencyCode() {
538
+ val params =
539
+ readableMapOf(
540
+ "merchantCountryCode" to "US",
541
+ "currencyCode" to "",
542
+ "testEnv" to true,
543
+ )
544
+
545
+ val result = buildGooglePayConfig(params)
546
+
547
+ assertNotNull(result)
548
+ }
549
+
550
+ @Test
551
+ fun buildGooglePayConfig_MissingMerchantCountryCode() {
552
+ val params =
553
+ readableMapOf(
554
+ "currencyCode" to "usd",
555
+ "testEnv" to true,
556
+ )
557
+
558
+ val result = buildGooglePayConfig(params)
559
+
560
+ assertNotNull(result)
561
+ }
562
+
563
+ @Test
564
+ fun buildGooglePayConfig_MissingCurrencyCode() {
565
+ val params =
566
+ readableMapOf(
567
+ "merchantCountryCode" to "US",
568
+ "testEnv" to true,
569
+ )
570
+
571
+ val result = buildGooglePayConfig(params)
572
+
573
+ assertNotNull(result)
574
+ }
575
+
576
+ @Test
577
+ fun buildGooglePayConfig_ButtonTypes() {
578
+ val testCases =
579
+ listOf(
580
+ 1 to PaymentSheet.GooglePayConfiguration.ButtonType.Buy,
581
+ 6 to PaymentSheet.GooglePayConfiguration.ButtonType.Book,
582
+ 5 to PaymentSheet.GooglePayConfiguration.ButtonType.Checkout,
583
+ 4 to PaymentSheet.GooglePayConfiguration.ButtonType.Donate,
584
+ 11 to PaymentSheet.GooglePayConfiguration.ButtonType.Order,
585
+ 1000 to PaymentSheet.GooglePayConfiguration.ButtonType.Pay,
586
+ 7 to PaymentSheet.GooglePayConfiguration.ButtonType.Subscribe,
587
+ 1001 to PaymentSheet.GooglePayConfiguration.ButtonType.Plain,
588
+ 9999 to PaymentSheet.GooglePayConfiguration.ButtonType.Pay, // Invalid defaults to Pay
589
+ )
590
+
591
+ for ((buttonTypeValue) in testCases) {
592
+ val params =
593
+ readableMapOf(
594
+ "merchantCountryCode" to "US",
595
+ "currencyCode" to "usd",
596
+ "testEnv" to true,
597
+ "buttonType" to buttonTypeValue,
598
+ )
599
+
600
+ val result = buildGooglePayConfig(params)
601
+
602
+ assertNotNull(result)
603
+ }
604
+ }
605
+
606
+ @Test
607
+ fun buildGooglePayConfig_CompleteConfig() {
608
+ val params =
609
+ readableMapOf(
610
+ "merchantCountryCode" to "GB",
611
+ "currencyCode" to "gbp",
612
+ "testEnv" to false,
613
+ "amount" to "10000",
614
+ "label" to "Order Total",
615
+ "buttonType" to 5,
616
+ )
617
+
618
+ val result = buildGooglePayConfig(params)
619
+
620
+ assertNotNull(result)
621
+ }
622
+
623
+ // ============================================
624
+ // buildCustomerConfiguration Tests
625
+ // ============================================
626
+
627
+ @Test
628
+ fun buildCustomerConfiguration_NullParams_ReturnsNull() {
629
+ val result = buildCustomerConfiguration(null)
630
+ assertNull(result)
631
+ }
632
+
633
+ @Test
634
+ fun buildCustomerConfiguration_EmptyParams_ReturnsNull() {
635
+ val params = readableMapOf()
636
+ val result = buildCustomerConfiguration(params)
637
+ assertNull(result)
638
+ }
639
+
640
+ @Test
641
+ fun buildCustomerConfiguration_OnlyCustomerId_ReturnsNull() {
642
+ val params =
643
+ readableMapOf(
644
+ "customerId" to "cus_123",
645
+ )
646
+
647
+ val result = buildCustomerConfiguration(params)
648
+ assertNull(result)
649
+ }
650
+
651
+ @Test
652
+ fun buildCustomerConfiguration_WithEphemeralKey_Success() {
653
+ val params =
654
+ readableMapOf(
655
+ "customerId" to "cus_123",
656
+ "customerEphemeralKeySecret" to "ek_test_123",
657
+ )
658
+
659
+ val result = buildCustomerConfiguration(params)
660
+
661
+ assertNotNull(result)
662
+ }
663
+
664
+ @Test
665
+ fun buildCustomerConfiguration_WithCustomerSession_Success() {
666
+ val params =
667
+ readableMapOf(
668
+ "customerId" to "cus_456",
669
+ "customerSessionClientSecret" to "cuss_test_456",
670
+ )
671
+
672
+ val result = buildCustomerConfiguration(params)
673
+
674
+ assertNotNull(result)
675
+ }
676
+
677
+ @Test(expected = PaymentSheetException::class)
678
+ fun buildCustomerConfiguration_BothSecretsProvided_ThrowsException() {
679
+ val params =
680
+ readableMapOf(
681
+ "customerId" to "cus_789",
682
+ "customerEphemeralKeySecret" to "ek_test_789",
683
+ "customerSessionClientSecret" to "cuss_test_789",
684
+ )
685
+
686
+ buildCustomerConfiguration(params)
687
+ }
688
+
689
+ @Test
690
+ fun buildCustomerConfiguration_OnlyEphemeralKey_NoCustomerId_ReturnsNull() {
691
+ val params =
692
+ readableMapOf(
693
+ "customerEphemeralKeySecret" to "ek_test_123",
694
+ )
695
+
696
+ val result = buildCustomerConfiguration(params)
697
+ assertNull(result)
698
+ }
699
+
700
+ @Test
701
+ fun buildCustomerConfiguration_OnlyCustomerSession_NoCustomerId_ReturnsNull() {
702
+ val params =
703
+ readableMapOf(
704
+ "customerSessionClientSecret" to "cuss_test_456",
705
+ )
706
+
707
+ val result = buildCustomerConfiguration(params)
708
+ assertNull(result)
709
+ }
710
+
711
+ // ============================================
712
+ // buildBillingDetails Tests
713
+ // ============================================
714
+
715
+ @Test
716
+ fun buildBillingDetails_NullMap_ReturnsNull() {
717
+ val result = buildBillingDetails(null)
718
+ assertNull(result)
719
+ }
720
+
721
+ @Test
722
+ fun buildBillingDetails_EmptyMap_ReturnsEmptyBillingDetails() {
723
+ val params = readableMapOf()
724
+
725
+ val result = buildBillingDetails(params)
726
+ assertNotNull(result)
727
+ assertNotNull(result!!.address)
728
+ assertNull(result.address?.city)
729
+ assertNull(result.address?.country)
730
+ assertNull(result.address?.line1)
731
+ assertNull(result.address?.line2)
732
+ assertNull(result.address?.postalCode)
733
+ assertNull(result.address?.state)
734
+ assertNull(result.email)
735
+ assertNull(result.name)
736
+ assertNull(result.phone)
737
+ }
738
+
739
+ @Test
740
+ fun buildBillingDetails_FullDetails_ReturnsComplete() {
741
+ val params =
742
+ readableMapOf(
743
+ "email" to "test@example.com",
744
+ "name" to "John Doe",
745
+ "phone" to "+1234567890",
746
+ "address" to
747
+ readableMapOf(
748
+ "city" to "San Francisco",
749
+ "country" to "US",
750
+ "line1" to "123 Main St",
751
+ "line2" to "Apt 4",
752
+ "postalCode" to "94111",
753
+ "state" to "CA",
754
+ ),
755
+ )
756
+
757
+ val result = buildBillingDetails(params)
758
+ assertNotNull(result)
759
+ assertEquals("test@example.com", result!!.email)
760
+ assertEquals("John Doe", result.name)
761
+ assertEquals("+1234567890", result.phone)
762
+ assertNotNull(result.address)
763
+ assertEquals("San Francisco", result.address?.city)
764
+ assertEquals("US", result.address?.country)
765
+ assertEquals("123 Main St", result.address?.line1)
766
+ assertEquals("Apt 4", result.address?.line2)
767
+ assertEquals("94111", result.address?.postalCode)
768
+ assertEquals("CA", result.address?.state)
769
+ }
770
+
771
+ @Test
772
+ fun buildBillingDetails_OnlyEmail_ReturnsPartialDetails() {
773
+ val params =
774
+ readableMapOf(
775
+ "email" to "test@example.com",
776
+ )
777
+
778
+ val result = buildBillingDetails(params)
779
+ assertNotNull(result)
780
+ assertEquals("test@example.com", result!!.email)
781
+ assertNull(result.name)
782
+ assertNull(result.phone)
783
+ assertNotNull(result.address)
784
+ assertNull(result.address?.city)
785
+ }
786
+
787
+ @Test
788
+ fun buildBillingDetails_OnlyName_ReturnsPartialDetails() {
789
+ val params =
790
+ readableMapOf(
791
+ "name" to "John Doe",
792
+ )
793
+
794
+ val result = buildBillingDetails(params)
795
+ assertNotNull(result)
796
+ assertNull(result!!.email)
797
+ assertEquals("John Doe", result.name)
798
+ assertNull(result.phone)
799
+ }
800
+
801
+ @Test
802
+ fun buildBillingDetails_OnlyPhone_ReturnsPartialDetails() {
803
+ val params =
804
+ readableMapOf(
805
+ "phone" to "+1234567890",
806
+ )
807
+
808
+ val result = buildBillingDetails(params)
809
+ assertNotNull(result)
810
+ assertNull(result!!.email)
811
+ assertNull(result.name)
812
+ assertEquals("+1234567890", result.phone)
813
+ }
814
+
815
+ @Test
816
+ fun buildBillingDetails_OnlyAddress_ReturnsPartialDetails() {
817
+ val params =
818
+ readableMapOf(
819
+ "address" to
820
+ readableMapOf(
821
+ "city" to "San Francisco",
822
+ "country" to "US",
823
+ ),
824
+ )
825
+
826
+ val result = buildBillingDetails(params)
827
+ assertNotNull(result)
828
+ assertNull(result!!.email)
829
+ assertNull(result.name)
830
+ assertNull(result.phone)
831
+ assertNotNull(result.address)
832
+ assertEquals("San Francisco", result.address?.city)
833
+ assertEquals("US", result.address?.country)
834
+ assertNull(result.address?.line1)
835
+ }
836
+
837
+ @Test
838
+ fun buildBillingDetails_PartialAddress_ReturnsPartialDetails() {
839
+ val params =
840
+ readableMapOf(
841
+ "email" to "test@example.com",
842
+ "address" to
843
+ readableMapOf(
844
+ "line1" to "123 Main St",
845
+ "postalCode" to "94111",
846
+ ),
847
+ )
848
+
849
+ val result = buildBillingDetails(params)
850
+ assertNotNull(result)
851
+ assertEquals("test@example.com", result!!.email)
852
+ assertNotNull(result.address)
853
+ assertNull(result.address?.city)
854
+ assertNull(result.address?.country)
855
+ assertEquals("123 Main St", result.address?.line1)
856
+ assertNull(result.address?.line2)
857
+ assertEquals("94111", result.address?.postalCode)
858
+ assertNull(result.address?.state)
859
+ }
860
+
861
+ @Test
862
+ fun buildBillingDetails_EmptyAddress_ReturnsEmptyAddressObject() {
863
+ val params =
864
+ readableMapOf(
865
+ "email" to "test@example.com",
866
+ "address" to readableMapOf(),
867
+ )
868
+
869
+ val result = buildBillingDetails(params)
870
+ assertNotNull(result)
871
+ assertEquals("test@example.com", result!!.email)
872
+ assertNotNull(result.address)
873
+ assertNull(result.address?.city)
874
+ assertNull(result.address?.country)
875
+ assertNull(result.address?.line1)
876
+ assertNull(result.address?.line2)
877
+ assertNull(result.address?.postalCode)
878
+ assertNull(result.address?.state)
879
+ }
880
+
881
+ @Test
882
+ fun buildBillingDetails_MixedFields_ReturnsPartialDetails() {
883
+ val params =
884
+ readableMapOf(
885
+ "name" to "Jane Smith",
886
+ "address" to
887
+ readableMapOf(
888
+ "country" to "CA",
889
+ "state" to "ON",
890
+ ),
891
+ )
892
+
893
+ val result = buildBillingDetails(params)
894
+ assertNotNull(result)
895
+ assertNull(result!!.email)
896
+ assertEquals("Jane Smith", result.name)
897
+ assertNull(result.phone)
898
+ assertNotNull(result.address)
899
+ assertNull(result.address?.city)
900
+ assertEquals("CA", result.address?.country)
901
+ assertNull(result.address?.line1)
902
+ assertNull(result.address?.line2)
903
+ assertNull(result.address?.postalCode)
904
+ assertEquals("ON", result.address?.state)
905
+ }
906
+
907
+ // ============================================
908
+ // buildBillingDetailsCollectionConfiguration Tests
909
+ // ============================================
910
+
911
+ @Test
912
+ fun buildBillingDetailsCollectionConfiguration_NullMap_ReturnsDefaults() {
913
+ val result = buildBillingDetailsCollectionConfiguration(null)
914
+ assertNotNull(result)
915
+ }
916
+
917
+ @Test
918
+ fun buildBillingDetailsCollectionConfiguration_EmptyMap_ReturnsDefaults() {
919
+ val params = readableMapOf()
920
+
921
+ val result = buildBillingDetailsCollectionConfiguration(params)
922
+ assertNotNull(result)
923
+ }
924
+
925
+ @Test
926
+ fun buildBillingDetailsCollectionConfiguration_AllFieldsSet_ReturnsComplete() {
927
+ val params =
928
+ readableMapOf(
929
+ "name" to "always",
930
+ "phone" to "never",
931
+ "email" to "automatic",
932
+ "address" to "full",
933
+ "attachDefaultsToPaymentMethod" to true,
934
+ )
935
+
936
+ val result = buildBillingDetailsCollectionConfiguration(params)
937
+ assertNotNull(result)
938
+ }
939
+
940
+ @Test
941
+ fun buildBillingDetailsCollectionConfiguration_PartialFields_ReturnsPartial() {
942
+ val params =
943
+ readableMapOf(
944
+ "name" to "always",
945
+ "address" to "never",
946
+ )
947
+
948
+ val result = buildBillingDetailsCollectionConfiguration(params)
949
+ assertNotNull(result)
950
+ }
951
+
952
+ @Test
953
+ fun buildBillingDetailsCollectionConfiguration_InvalidValues_DefaultsToAutomatic() {
954
+ val params =
955
+ readableMapOf(
956
+ "name" to "invalid",
957
+ "phone" to "wrong",
958
+ "email" to "bad",
959
+ "address" to "incorrect",
960
+ )
961
+
962
+ val result = buildBillingDetailsCollectionConfiguration(params)
963
+ assertNotNull(result)
964
+ }
965
+
966
+ @Test
967
+ fun buildBillingDetailsCollectionConfiguration_AttachDefaultsFalse() {
968
+ val params =
969
+ readableMapOf(
970
+ "attachDefaultsToPaymentMethod" to false,
971
+ )
972
+
973
+ val result = buildBillingDetailsCollectionConfiguration(params)
974
+ assertNotNull(result)
975
+ }
976
+ }