react-native-klarna-inapp-sdk 2.4.10 → 2.5.1

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 (167) hide show
  1. package/android/build.gradle +3 -1
  2. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +5 -1
  3. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/checkout/KlarnaCheckoutViewManager.java +4 -10
  4. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +28 -0
  5. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/event/ComponentEventSender.java +5 -1
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/ResizeObserverWrapperView.java +2 -2
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/WrapperView.java +2 -2
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelper.java +39 -0
  9. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewCallback.kt +30 -0
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewEventSender.kt +80 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManager.java +544 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandler.java +30 -0
  13. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSender.java +64 -0
  14. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManager.java +356 -0
  15. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +31 -0
  16. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +31 -0
  17. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +36 -0
  18. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +32 -0
  19. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java +5 -1
  20. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelperTest.java +79 -0
  21. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManagerTest.java +259 -0
  22. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandlerTest.java +136 -0
  23. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSenderTest.java +184 -0
  24. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManagerTest.java +385 -0
  25. package/ios/RNKlarnaMobileSDK.xcodeproj/project.pbxproj +110 -52
  26. package/ios/Sources/KlarnaExpressCheckoutViewManager.h +5 -0
  27. package/ios/Sources/KlarnaExpressCheckoutViewManager.mm +39 -0
  28. package/ios/Sources/KlarnaOSMViewManager.h +5 -0
  29. package/ios/Sources/KlarnaOSMViewManager.mm +59 -0
  30. package/ios/Sources/view/KlarnaExpressCheckoutButtonDelegateProxy.swift +145 -0
  31. package/ios/Sources/view/KlarnaExpressCheckoutViewWrapper.h +41 -0
  32. package/ios/Sources/view/KlarnaOSMViewWrapper.h +48 -0
  33. package/ios/Sources/view/newarch/KlarnaExpressCheckoutViewWrapper.mm +228 -0
  34. package/ios/Sources/view/newarch/KlarnaOSMViewWrapper.mm +294 -0
  35. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +20 -13
  36. package/ios/Sources/view/oldarch/KlarnaExpressCheckoutViewWrapper.mm +222 -0
  37. package/ios/Sources/view/oldarch/KlarnaOSMViewWrapper.mm +273 -0
  38. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +11 -13
  39. package/ios/Tests/KlarnaExpressCheckoutViewWrapperTests.m +391 -0
  40. package/ios/Tests/KlarnaOSMViewWrapperTests.m +450 -0
  41. package/ios/Tests/KlarnaStandaloneWebViewWrapperTests.m +105 -0
  42. package/lib/commonjs/KlarnaCheckoutView.js +2 -4
  43. package/lib/commonjs/KlarnaCheckoutView.js.map +1 -1
  44. package/lib/commonjs/KlarnaExpressCheckoutView.js +73 -0
  45. package/lib/commonjs/KlarnaExpressCheckoutView.js.map +1 -0
  46. package/lib/commonjs/KlarnaOSMView.js +92 -0
  47. package/lib/commonjs/KlarnaOSMView.js.map +1 -0
  48. package/lib/commonjs/KlarnaPaymentView.js +32 -55
  49. package/lib/commonjs/KlarnaPaymentView.js.map +1 -1
  50. package/lib/commonjs/KlarnaSignInSDK.js +1 -1
  51. package/lib/commonjs/KlarnaSignInSDK.js.map +1 -1
  52. package/lib/commonjs/KlarnaStandaloneWebView.js +2 -4
  53. package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -1
  54. package/lib/commonjs/index.js +128 -0
  55. package/lib/commonjs/index.js.map +1 -1
  56. package/lib/commonjs/specs/KlarnaCheckoutViewNativeComponent.js +3 -5
  57. package/lib/commonjs/specs/KlarnaCheckoutViewNativeComponent.js.map +1 -1
  58. package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js +10 -0
  59. package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
  60. package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js +14 -0
  61. package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
  62. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js +3 -5
  63. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js.map +1 -1
  64. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +3 -5
  65. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
  66. package/lib/commonjs/specs/NativeKlarnaSignIn.js +1 -2
  67. package/lib/commonjs/specs/NativeKlarnaSignIn.js.map +1 -1
  68. package/lib/commonjs/types/button/KlarnaButtonShape.js +13 -0
  69. package/lib/commonjs/types/button/KlarnaButtonShape.js.map +1 -0
  70. package/lib/commonjs/types/button/KlarnaButtonStyle.js +12 -0
  71. package/lib/commonjs/types/button/KlarnaButtonStyle.js.map +1 -0
  72. package/lib/commonjs/types/button/KlarnaButtonTheme.js +13 -0
  73. package/lib/commonjs/types/button/KlarnaButtonTheme.js.map +1 -0
  74. package/lib/commonjs/types/common/KlarnaEnvironment.js +1 -2
  75. package/lib/commonjs/types/common/KlarnaEnvironment.js.map +1 -1
  76. package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js +8 -0
  77. package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
  78. package/lib/commonjs/types/common/KlarnaMobileSDKError.js.map +1 -1
  79. package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js +2 -0
  80. package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js.map +1 -0
  81. package/lib/commonjs/types/common/KlarnaProductEvent.js.map +1 -1
  82. package/lib/commonjs/types/common/KlarnaRegion.js +1 -2
  83. package/lib/commonjs/types/common/KlarnaRegion.js.map +1 -1
  84. package/lib/commonjs/types/common/KlarnaTheme.js +13 -0
  85. package/lib/commonjs/types/common/KlarnaTheme.js.map +1 -0
  86. package/lib/module/KlarnaCheckoutView.js.map +1 -1
  87. package/lib/module/KlarnaExpressCheckoutView.js +64 -0
  88. package/lib/module/KlarnaExpressCheckoutView.js.map +1 -0
  89. package/lib/module/KlarnaOSMView.js +84 -0
  90. package/lib/module/KlarnaOSMView.js.map +1 -0
  91. package/lib/module/KlarnaPaymentView.js +30 -51
  92. package/lib/module/KlarnaPaymentView.js.map +1 -1
  93. package/lib/module/KlarnaSignInSDK.js.map +1 -1
  94. package/lib/module/KlarnaStandaloneWebView.js.map +1 -1
  95. package/lib/module/index.js +11 -0
  96. package/lib/module/index.js.map +1 -1
  97. package/lib/module/specs/KlarnaCheckoutViewNativeComponent.js.map +1 -1
  98. package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js +3 -0
  99. package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
  100. package/lib/module/specs/KlarnaOSMViewNativeComponent.js +7 -0
  101. package/lib/module/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
  102. package/lib/module/specs/KlarnaPaymentViewNativeComponent.js.map +1 -1
  103. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
  104. package/lib/module/specs/NativeKlarnaSignIn.js.map +1 -1
  105. package/lib/module/types/button/KlarnaButtonShape.js +7 -0
  106. package/lib/module/types/button/KlarnaButtonShape.js.map +1 -0
  107. package/lib/module/types/button/KlarnaButtonStyle.js +6 -0
  108. package/lib/module/types/button/KlarnaButtonStyle.js.map +1 -0
  109. package/lib/module/types/button/KlarnaButtonTheme.js +7 -0
  110. package/lib/module/types/button/KlarnaButtonTheme.js.map +1 -0
  111. package/lib/module/types/common/KlarnaEnvironment.js.map +1 -1
  112. package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js +2 -0
  113. package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
  114. package/lib/module/types/common/KlarnaMobileSDKError.js.map +1 -1
  115. package/lib/module/types/common/KlarnaOSMPlacementKey.js +2 -0
  116. package/lib/module/types/common/KlarnaOSMPlacementKey.js.map +1 -0
  117. package/lib/module/types/common/KlarnaProductEvent.js.map +1 -1
  118. package/lib/module/types/common/KlarnaRegion.js.map +1 -1
  119. package/lib/module/types/common/KlarnaTheme.js +7 -0
  120. package/lib/module/types/common/KlarnaTheme.js.map +1 -0
  121. package/lib/typescript/KlarnaCheckoutView.d.ts.map +1 -1
  122. package/lib/typescript/KlarnaExpressCheckoutView.d.ts +47 -0
  123. package/lib/typescript/KlarnaExpressCheckoutView.d.ts.map +1 -0
  124. package/lib/typescript/KlarnaOSMView.d.ts +36 -0
  125. package/lib/typescript/KlarnaOSMView.d.ts.map +1 -0
  126. package/lib/typescript/KlarnaPaymentView.d.ts.map +1 -1
  127. package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -1
  128. package/lib/typescript/index.d.ts +11 -0
  129. package/lib/typescript/index.d.ts.map +1 -1
  130. package/lib/typescript/specs/KlarnaCheckoutViewNativeComponent.d.ts.map +1 -1
  131. package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts +45 -0
  132. package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts.map +1 -0
  133. package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts +35 -0
  134. package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts.map +1 -0
  135. package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts.map +1 -1
  136. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -1
  137. package/lib/typescript/specs/NativeKlarnaSignIn.d.ts +1 -1
  138. package/lib/typescript/specs/NativeKlarnaSignIn.d.ts.map +1 -1
  139. package/lib/typescript/types/button/KlarnaButtonShape.d.ts +6 -0
  140. package/lib/typescript/types/button/KlarnaButtonShape.d.ts.map +1 -0
  141. package/lib/typescript/types/button/KlarnaButtonStyle.d.ts +5 -0
  142. package/lib/typescript/types/button/KlarnaButtonStyle.d.ts.map +1 -0
  143. package/lib/typescript/types/button/KlarnaButtonTheme.d.ts +6 -0
  144. package/lib/typescript/types/button/KlarnaButtonTheme.d.ts.map +1 -0
  145. package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts +10 -0
  146. package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts.map +1 -0
  147. package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts +2 -0
  148. package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts.map +1 -0
  149. package/lib/typescript/types/common/KlarnaTheme.d.ts +6 -0
  150. package/lib/typescript/types/common/KlarnaTheme.d.ts.map +1 -0
  151. package/package.json +17 -16
  152. package/react-native-klarna-inapp-sdk.podspec +2 -1
  153. package/src/KlarnaExpressCheckoutView.tsx +169 -0
  154. package/src/KlarnaOSMView.tsx +157 -0
  155. package/src/KlarnaStandaloneWebView.tsx +1 -2
  156. package/src/index.tsx +11 -0
  157. package/src/specs/KlarnaExpressCheckoutViewNativeComponent.ts +66 -0
  158. package/src/specs/KlarnaOSMViewNativeComponent.ts +50 -0
  159. package/src/specs/NativeKlarnaSignIn.ts +1 -1
  160. package/src/types/button/KlarnaButtonShape.ts +5 -0
  161. package/src/types/button/KlarnaButtonStyle.ts +4 -0
  162. package/src/types/button/KlarnaButtonTheme.ts +5 -0
  163. package/src/types/common/KlarnaExpressCheckoutSessionOptions.ts +13 -0
  164. package/src/types/common/KlarnaOSMPlacementKey.ts +3 -0
  165. package/src/types/common/KlarnaTheme.ts +5 -0
  166. package/LICENSE +0 -201
  167. package/README.md +0 -93
@@ -0,0 +1,385 @@
1
+ package com.klarna.mobile.sdk.reactnative.osm;
2
+
3
+ import static com.klarna.mobile.sdk.reactnative.osm.KlarnaOSMViewManager.COMMAND_RENDER_OSM;
4
+ import static com.klarna.mobile.sdk.reactnative.osm.KlarnaOSMViewManager.KLARNA_OSM_VIEW_REACT_CLASS;
5
+
6
+ import com.facebook.react.bridge.Arguments;
7
+ import com.facebook.react.bridge.JavaOnlyArray;
8
+ import com.facebook.react.bridge.JavaOnlyMap;
9
+ import com.facebook.react.bridge.ReadableArray;
10
+ import com.klarna.mobile.sdk.api.KlarnaEnvironment;
11
+ import com.klarna.mobile.sdk.api.KlarnaRegion;
12
+ import com.klarna.mobile.sdk.api.KlarnaTheme;
13
+ import com.klarna.mobile.sdk.api.osm.KlarnaOSMView;
14
+ import com.klarna.mobile.sdk.reactnative.common.ui.WrapperView;
15
+
16
+ import org.junit.After;
17
+ import org.junit.Assert;
18
+ import org.junit.Before;
19
+ import org.junit.Test;
20
+ import org.junit.runner.RunWith;
21
+ import org.mockito.MockedStatic;
22
+ import org.mockito.Mockito;
23
+ import org.robolectric.RobolectricTestRunner;
24
+
25
+ @RunWith(RobolectricTestRunner.class)
26
+ public class KlarnaOSMViewManagerTest {
27
+
28
+ private MockedStatic<Arguments> mockedStaticArguments;
29
+ private KlarnaOSMViewManager manager;
30
+ private WrapperView<KlarnaOSMView> wrapper;
31
+ private KlarnaOSMView osmView;
32
+
33
+ @SuppressWarnings("unchecked")
34
+ @Before
35
+ public void setup() {
36
+ manager = new KlarnaOSMViewManager();
37
+
38
+ osmView = Mockito.mock(KlarnaOSMView.class);
39
+ wrapper = Mockito.mock(WrapperView.class);
40
+ Mockito.when(wrapper.getView()).thenReturn(osmView);
41
+
42
+ mockedStaticArguments = Mockito.mockStatic(Arguments.class);
43
+ Mockito.when(Arguments.createArray())
44
+ .thenAnswer(invocation -> new JavaOnlyArray());
45
+ Mockito.when(Arguments.createMap())
46
+ .thenAnswer(invocation -> new JavaOnlyMap());
47
+ }
48
+
49
+ @After
50
+ public void teardown() {
51
+ Mockito.reset(wrapper, osmView);
52
+ mockedStaticArguments.close();
53
+ }
54
+
55
+ // --- getName ---
56
+
57
+ @Test
58
+ public void testReactClassName() {
59
+ Assert.assertEquals("RNKlarnaOSMView", manager.getName());
60
+ Assert.assertEquals("RNKlarnaOSMView", KLARNA_OSM_VIEW_REACT_CLASS);
61
+ }
62
+
63
+ // --- Prop setters: string props ---
64
+
65
+ @Test
66
+ public void testSetClientId() {
67
+ manager.setClientId(wrapper, "test-client-id");
68
+ Mockito.verify(osmView).setClientId("test-client-id");
69
+ }
70
+
71
+ @Test
72
+ public void testSetClientIdNull() {
73
+ manager.setClientId(wrapper, null);
74
+ Mockito.verify(osmView, Mockito.never()).setClientId(Mockito.anyString());
75
+ }
76
+
77
+ @Test
78
+ public void testSetClientIdEmpty() {
79
+ manager.setClientId(wrapper, "");
80
+ Mockito.verify(osmView, Mockito.never()).setClientId(Mockito.anyString());
81
+ }
82
+
83
+ @Test
84
+ public void testSetPlacementKey() {
85
+ manager.setPlacementKey(wrapper, "test-placement-key");
86
+ Mockito.verify(osmView).setPlacementKey("test-placement-key");
87
+ }
88
+
89
+ @Test
90
+ public void testSetPlacementKeyNull() {
91
+ manager.setPlacementKey(wrapper, null);
92
+ Mockito.verify(osmView, Mockito.never()).setPlacementKey(Mockito.anyString());
93
+ }
94
+
95
+ @Test
96
+ public void testSetPlacementKeyEmpty() {
97
+ manager.setPlacementKey(wrapper, "");
98
+ Mockito.verify(osmView, Mockito.never()).setPlacementKey(Mockito.anyString());
99
+ }
100
+
101
+ @Test
102
+ public void testSetLocale() {
103
+ manager.setLocale(wrapper, "en-US");
104
+ Mockito.verify(osmView).setLocale("en-US");
105
+ }
106
+
107
+ @Test
108
+ public void testSetLocaleNull() {
109
+ manager.setLocale(wrapper, null);
110
+ Mockito.verify(osmView, Mockito.never()).setLocale(Mockito.anyString());
111
+ }
112
+
113
+ @Test
114
+ public void testSetLocaleEmpty() {
115
+ manager.setLocale(wrapper, "");
116
+ Mockito.verify(osmView, Mockito.never()).setLocale(Mockito.anyString());
117
+ }
118
+
119
+ // --- Prop setter: purchaseAmount ---
120
+
121
+ @Test
122
+ public void testSetPurchaseAmountValid() {
123
+ manager.setPurchaseAmount(wrapper, "9999");
124
+ Mockito.verify(osmView).setPurchaseAmount(9999L);
125
+ }
126
+
127
+ @Test
128
+ public void testSetPurchaseAmountNull() {
129
+ manager.setPurchaseAmount(wrapper, null);
130
+ Mockito.verify(osmView, Mockito.never()).setPurchaseAmount(Mockito.anyLong());
131
+ }
132
+
133
+ @Test
134
+ public void testSetPurchaseAmountEmpty() {
135
+ manager.setPurchaseAmount(wrapper, "");
136
+ Mockito.verify(osmView, Mockito.never()).setPurchaseAmount(Mockito.anyLong());
137
+ }
138
+
139
+ @Test
140
+ public void testSetPurchaseAmountInvalid() {
141
+ // Should not throw, but should not set the value either
142
+ manager.setPurchaseAmount(wrapper, "not-a-number");
143
+ Mockito.verify(osmView, Mockito.never()).setPurchaseAmount(Mockito.anyLong());
144
+ }
145
+
146
+ @Test
147
+ public void testSetPurchaseAmountLargeNumber() {
148
+ manager.setPurchaseAmount(wrapper, "999999999999");
149
+ Mockito.verify(osmView).setPurchaseAmount(999999999999L);
150
+ }
151
+
152
+ // --- Prop setter: environment ---
153
+
154
+ @Test
155
+ public void testSetEnvironmentPlayground() {
156
+ manager.setEnvironment(wrapper, "playground");
157
+ Mockito.verify(osmView).setEnvironment(KlarnaEnvironment.PLAYGROUND);
158
+ }
159
+
160
+ @Test
161
+ public void testSetEnvironmentProduction() {
162
+ manager.setEnvironment(wrapper, "production");
163
+ Mockito.verify(osmView).setEnvironment(KlarnaEnvironment.PRODUCTION);
164
+ }
165
+
166
+ @Test
167
+ public void testSetEnvironmentStaging() {
168
+ manager.setEnvironment(wrapper, "staging");
169
+ Mockito.verify(osmView).setEnvironment(KlarnaEnvironment.STAGING);
170
+ }
171
+
172
+ @Test
173
+ public void testSetEnvironmentUnknown() {
174
+ manager.setEnvironment(wrapper, "unknown");
175
+ Mockito.verify(osmView, Mockito.never()).setEnvironment(Mockito.any());
176
+ }
177
+
178
+ @Test
179
+ public void testSetEnvironmentNull() {
180
+ manager.setEnvironment(wrapper, null);
181
+ Mockito.verify(osmView, Mockito.never()).setEnvironment(Mockito.any());
182
+ }
183
+
184
+ @Test
185
+ public void testSetEnvironmentEmpty() {
186
+ manager.setEnvironment(wrapper, "");
187
+ Mockito.verify(osmView, Mockito.never()).setEnvironment(Mockito.any());
188
+ }
189
+
190
+ // --- Prop setter: region ---
191
+
192
+ @Test
193
+ public void testSetRegionEu() {
194
+ manager.setRegion(wrapper, "eu");
195
+ Mockito.verify(osmView).setRegion(KlarnaRegion.EU);
196
+ }
197
+
198
+ @Test
199
+ public void testSetRegionNa() {
200
+ manager.setRegion(wrapper, "na");
201
+ Mockito.verify(osmView).setRegion(KlarnaRegion.NA);
202
+ }
203
+
204
+ @Test
205
+ public void testSetRegionOc() {
206
+ manager.setRegion(wrapper, "oc");
207
+ Mockito.verify(osmView).setRegion(KlarnaRegion.OC);
208
+ }
209
+
210
+ @Test
211
+ public void testSetRegionUnknown() {
212
+ manager.setRegion(wrapper, "unknown");
213
+ Mockito.verify(osmView, Mockito.never()).setRegion(Mockito.any());
214
+ }
215
+
216
+ @Test
217
+ public void testSetRegionNull() {
218
+ manager.setRegion(wrapper, null);
219
+ Mockito.verify(osmView, Mockito.never()).setRegion(Mockito.any());
220
+ }
221
+
222
+ // --- Prop setter: theme ---
223
+
224
+ @Test
225
+ public void testSetThemeLight() {
226
+ manager.setTheme(wrapper, "light");
227
+ Mockito.verify(osmView).setTheme(KlarnaTheme.LIGHT);
228
+ }
229
+
230
+ @Test
231
+ public void testSetThemeDark() {
232
+ manager.setTheme(wrapper, "dark");
233
+ Mockito.verify(osmView).setTheme(KlarnaTheme.DARK);
234
+ }
235
+
236
+ @Test
237
+ public void testSetThemeAutomatic() {
238
+ manager.setTheme(wrapper, "automatic");
239
+ Mockito.verify(osmView).setTheme(KlarnaTheme.AUTOMATIC);
240
+ }
241
+
242
+ @Test
243
+ public void testSetThemeUnknown() {
244
+ manager.setTheme(wrapper, "unknown");
245
+ Mockito.verify(osmView, Mockito.never()).setTheme(Mockito.any());
246
+ }
247
+
248
+ @Test
249
+ public void testSetThemeNull() {
250
+ manager.setTheme(wrapper, null);
251
+ Mockito.verify(osmView, Mockito.never()).setTheme(Mockito.any());
252
+ }
253
+
254
+ // --- Prop setter: returnUrl (no-op) ---
255
+
256
+ @Test
257
+ public void testSetReturnUrlIsNoOp() {
258
+ // returnUrl is intentionally ignored for OSM
259
+ manager.setReturnUrl(wrapper, "https://return.example.com");
260
+ // Verify no interaction with osmView for returnUrl
261
+ Mockito.verifyNoInteractions(osmView);
262
+ }
263
+
264
+ // --- Prop setter: backgroundColor / textColor ---
265
+
266
+ @Test
267
+ public void testSetBackgroundColor() {
268
+ manager.setBackgroundColor(wrapper, "#FF0000");
269
+ Mockito.verify(osmView).setStyleConfiguration(Mockito.any());
270
+ }
271
+
272
+ @Test
273
+ public void testSetTextColor() {
274
+ manager.setTextColor(wrapper, "#00FF00");
275
+ Mockito.verify(osmView).setStyleConfiguration(Mockito.any());
276
+ }
277
+
278
+ @Test
279
+ public void testSetBackgroundColorNull() {
280
+ manager.setBackgroundColor(wrapper, null);
281
+ // null color means null style configuration
282
+ Mockito.verify(osmView).setStyleConfiguration(null);
283
+ }
284
+
285
+ @Test
286
+ public void testSetTextColorNull() {
287
+ manager.setTextColor(wrapper, null);
288
+ Mockito.verify(osmView).setStyleConfiguration(null);
289
+ }
290
+
291
+ @Test
292
+ public void testSetBackgroundColorInvalid() {
293
+ manager.setBackgroundColor(wrapper, "not-a-color");
294
+ // Invalid color should result in null style configuration
295
+ Mockito.verify(osmView).setStyleConfiguration(null);
296
+ }
297
+
298
+ @Test
299
+ public void testSetColorWithoutHash() {
300
+ // parseColor should auto-prefix "#"
301
+ manager.setBackgroundColor(wrapper, "FF0000");
302
+ Mockito.verify(osmView).setStyleConfiguration(Mockito.any());
303
+ }
304
+
305
+ // --- receiveCommand ---
306
+
307
+ @Test
308
+ public void testReceiveCommandRender() {
309
+ // receiveCommand with "render" requires context for render(),
310
+ // but we can verify the command routing by mocking the context
311
+ ReadableArray args = new JavaOnlyArray();
312
+ // render() calls view.getView() and then needs ReactContext, so this will
313
+ // exercise the command dispatch path; the actual render is tested separately
314
+ try {
315
+ manager.receiveCommand(wrapper, COMMAND_RENDER_OSM, args);
316
+ } catch (Exception e) {
317
+ // Expected: render() tries to cast wrapper.getContext() to ReactContext
318
+ }
319
+ }
320
+
321
+ @Test
322
+ public void testReceiveCommandUnknown() {
323
+ // Unknown command should be silently ignored
324
+ ReadableArray args = new JavaOnlyArray();
325
+ manager.receiveCommand(wrapper, "unknownCommand", args);
326
+ // No exception should be thrown
327
+ }
328
+
329
+ // --- getExportedCustomDirectEventTypeConstants ---
330
+
331
+ @Test
332
+ public void testExportedEvents() {
333
+ java.util.Map<String, Object> events = manager.getExportedCustomDirectEventTypeConstants();
334
+ Assert.assertNotNull(events);
335
+ Assert.assertEquals(3, events.size());
336
+ Assert.assertTrue(events.containsKey("onError"));
337
+ Assert.assertTrue(events.containsKey("onResized"));
338
+ Assert.assertTrue(events.containsKey("onOSMViewReady"));
339
+ }
340
+
341
+ // --- Null view edge case ---
342
+
343
+ @Test
344
+ public void testSetClientIdNullInnerView() {
345
+ Mockito.when(wrapper.getView()).thenReturn(null);
346
+ // Should not throw
347
+ manager.setClientId(wrapper, "test-client-id");
348
+ }
349
+
350
+ @Test
351
+ public void testSetPurchaseAmountNullInnerView() {
352
+ Mockito.when(wrapper.getView()).thenReturn(null);
353
+ manager.setPurchaseAmount(wrapper, "9999");
354
+ }
355
+
356
+ @Test
357
+ public void testSetEnvironmentNullInnerView() {
358
+ Mockito.when(wrapper.getView()).thenReturn(null);
359
+ manager.setEnvironment(wrapper, "production");
360
+ }
361
+
362
+ @Test
363
+ public void testSetRegionNullInnerView() {
364
+ Mockito.when(wrapper.getView()).thenReturn(null);
365
+ manager.setRegion(wrapper, "eu");
366
+ }
367
+
368
+ @Test
369
+ public void testSetThemeNullInnerView() {
370
+ Mockito.when(wrapper.getView()).thenReturn(null);
371
+ manager.setTheme(wrapper, "light");
372
+ }
373
+
374
+ @Test
375
+ public void testSetBackgroundColorNullInnerView() {
376
+ Mockito.when(wrapper.getView()).thenReturn(null);
377
+ manager.setBackgroundColor(wrapper, "#FF0000");
378
+ }
379
+
380
+ @Test
381
+ public void testSetTextColorNullInnerView() {
382
+ Mockito.when(wrapper.getView()).thenReturn(null);
383
+ manager.setTextColor(wrapper, "#00FF00");
384
+ }
385
+ }