@usercentrics/react-native-sdk 2.23.2 → 2.24.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 (92) hide show
  1. package/README.md +5 -5
  2. package/android/build-legacy.gradle +11 -1
  3. package/android/build.gradle.kts +44 -14
  4. package/android/gradle.properties +2 -0
  5. package/android/settings.gradle.kts +1 -1
  6. package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/RNUsercentricsModuleTest.kt +5 -5
  7. package/android/src/androidTest/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
  8. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModule.kt +3 -3
  9. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModuleSpec.kt +1 -1
  10. package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsPackage.kt +51 -0
  11. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProvider.kt +1 -1
  12. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProviderImpl.kt +1 -1
  13. package/android/src/main/java/com/usercentrics/reactnative/UCRNFlag.kt +4 -0
  14. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/api/UsercentricsProxy.kt +2 -2
  15. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerFontExtensions.kt +1 -1
  16. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerSettingsExtensions.kt +1 -1
  17. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/CCPADataExtensions.kt +1 -1
  18. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ConsentDisclosureSerializer.kt +1 -1
  19. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ReadableMapExtensions.kt +1 -1
  20. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/TCFDataExtensions.kt +1 -1
  21. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserDecisionExtensions.kt +1 -1
  22. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserOptionsExtensions.kt +1 -1
  23. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsCMPDataExtensions.kt +1 -1
  24. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsConsentUserResponseExtensions.kt +1 -1
  25. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsReadyStatusExtensions.kt +1 -1
  26. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsServiceConsentExtensions.kt +1 -1
  27. package/android/src/main/jni/CMakeLists.txt +85 -0
  28. package/android/src/main/jni/RNUsercentricsModule.cpp +21 -0
  29. package/android/src/main/jni/rn_usercentrics.cpp +22 -0
  30. package/android/src/test/java/com/usercentrics/reactnative/RNUsercentricsModuleTest.kt +159 -0
  31. package/android/src/test/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
  32. package/ios/Extensions/BannerSettings+Dict.swift +1 -0
  33. package/ios/Extensions/UIColor+Extensions.swift +1 -1
  34. package/ios/Extensions/UIImage+UsercentricsLogoDict.swift +1 -0
  35. package/ios/RNUsercentricsModule.swift +1 -0
  36. package/lib/NativeUsercentrics.d.ts +1 -1
  37. package/lib/NativeUsercentrics.js +10 -2
  38. package/lib/NativeUsercentrics.js.map +1 -1
  39. package/lib/fabric/NativeUsercentricsModule.d.ts +30 -0
  40. package/lib/fabric/NativeUsercentricsModule.js +3 -0
  41. package/lib/fabric/NativeUsercentricsModule.js.map +1 -0
  42. package/package.json +108 -96
  43. package/react-native.config.js +15 -0
  44. package/src/NativeUsercentrics.ts +75 -0
  45. package/src/Usercentrics.tsx +145 -0
  46. package/src/__tests__/index.test.ts +476 -0
  47. package/src/__tests__/mocks.ts +402 -0
  48. package/src/fabric/NativeUsercentricsModule.ts +51 -0
  49. package/src/index.tsx +2 -0
  50. package/src/models/AdditionalConsentModeData.tsx +33 -0
  51. package/src/models/BannerSettings.tsx +117 -0
  52. package/src/models/CCPAData.tsx +32 -0
  53. package/src/models/CCPASettings.tsx +49 -0
  54. package/src/models/ConsentDisclosureObject.tsx +47 -0
  55. package/src/models/FirstLayerSettings.tsx +185 -0
  56. package/src/models/GeolocationRuleset.tsx +10 -0
  57. package/src/models/LegalBasisLocalization.tsx +100 -0
  58. package/src/models/NetworkMode.tsx +5 -0
  59. package/src/models/SecondLayerSettings.tsx +12 -0
  60. package/src/models/TCF2Settings.tsx +209 -0
  61. package/src/models/TCFData.tsx +297 -0
  62. package/src/models/TCFDecisionUILayer.tsx +5 -0
  63. package/src/models/TCFUserDecisions.tsx +73 -0
  64. package/src/models/UserDecision.tsx +10 -0
  65. package/src/models/UsercentricsAnalyticsEventType.tsx +15 -0
  66. package/src/models/UsercentricsCMPData.tsx +38 -0
  67. package/src/models/UsercentricsCategory.tsx +26 -0
  68. package/src/models/UsercentricsConsentType.tsx +5 -0
  69. package/src/models/UsercentricsConsentUserResponse.tsx +14 -0
  70. package/src/models/UsercentricsLabels.tsx +276 -0
  71. package/src/models/UsercentricsLocation.tsx +32 -0
  72. package/src/models/UsercentricsLoggerLevel.tsx +7 -0
  73. package/src/models/UsercentricsOptions.tsx +45 -0
  74. package/src/models/UsercentricsReadyStatus.tsx +20 -0
  75. package/src/models/UsercentricsService.tsx +134 -0
  76. package/src/models/UsercentricsServiceConsent.tsx +37 -0
  77. package/src/models/UsercentricsSettings.tsx +177 -0
  78. package/src/models/UsercentricsUserInteraction.tsx +7 -0
  79. package/src/models/UsercentricsVariant.tsx +6 -0
  80. package/src/models/index.tsx +29 -0
  81. package/android/src/androidTest/java/com/usercentrics/reactnativemodule/fake/FakePromise.kt +0 -67
  82. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsPackage.kt +0 -22
  83. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/UCRNFlag.kt +0 -4
  84. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/api/FakeUsercentricsProxy.kt +0 -0
  85. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetCMPDataMock.kt +0 -0
  86. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetConsentsMock.kt +0 -0
  87. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetTCFDataMock.kt +0 -0
  88. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUSPDataMock.kt +0 -0
  89. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUserSessionDataMock.kt +0 -0
  90. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/ReactContextProviderMock.kt +0 -0
  91. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsForTCFMock.kt +0 -0
  92. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsMock.kt +0 -0
@@ -0,0 +1,145 @@
1
+ import {NativeModules, Platform} from 'react-native';
2
+ import {
3
+ AdditionalConsentModeData,
4
+ BannerSettings,
5
+ CCPAData,
6
+ TCFData,
7
+ TCFDecisionUILayer,
8
+ TCFUserDecisions,
9
+ UsercentricsAnalyticsEventType,
10
+ UsercentricsCMPData,
11
+ UsercentricsConsentType,
12
+ UsercentricsConsentUserResponse,
13
+ UsercentricsOptions,
14
+ UsercentricsReadyStatus,
15
+ UsercentricsServiceConsent,
16
+ UserDecision,
17
+ } from './models';
18
+ import NativeUsercentrics from './NativeUsercentrics';
19
+
20
+ // Use TurboModule when available, fallback to legacy bridge
21
+ const RNUsercentricsModule = NativeUsercentrics || NativeModules.RNUsercentricsModule;
22
+
23
+ export const Usercentrics = {
24
+
25
+ configure: (options: UsercentricsOptions) => {
26
+ RNUsercentricsModule.configure(options)
27
+ },
28
+
29
+ status: (): Promise<UsercentricsReadyStatus> => {
30
+ return RNUsercentricsModule.isReady();
31
+ },
32
+
33
+ showFirstLayer: async (options?: BannerSettings): Promise<UsercentricsConsentUserResponse> => {
34
+ await RNUsercentricsModule.isReady();
35
+ return RNUsercentricsModule.showFirstLayer(options);
36
+ },
37
+
38
+ showSecondLayer: async (options?: BannerSettings): Promise<UsercentricsConsentUserResponse> => {
39
+ await RNUsercentricsModule.isReady();
40
+ return RNUsercentricsModule.showSecondLayer(options);
41
+ },
42
+
43
+ restoreUserSession: async (controllerId: string): Promise<UsercentricsReadyStatus> => {
44
+ await RNUsercentricsModule.isReady();
45
+ return RNUsercentricsModule.restoreUserSession(controllerId);
46
+ },
47
+
48
+ getControllerId: async (): Promise<string> => {
49
+ await RNUsercentricsModule.isReady();
50
+ return RNUsercentricsModule.getControllerId();
51
+ },
52
+
53
+ getABTestingVariant: async (): Promise<string | null> => {
54
+ await RNUsercentricsModule.isReady();
55
+ return RNUsercentricsModule.getABTestingVariant();
56
+ },
57
+
58
+ getConsents: async (): Promise<Array<UsercentricsServiceConsent>> => {
59
+ await RNUsercentricsModule.isReady();
60
+ return RNUsercentricsModule.getConsents();
61
+ },
62
+
63
+ getCMPData: async (): Promise<UsercentricsCMPData> => {
64
+ await RNUsercentricsModule.isReady();
65
+ return RNUsercentricsModule.getCMPData();
66
+ },
67
+
68
+ getUserSessionData: async (): Promise<string> => {
69
+ await RNUsercentricsModule.isReady();
70
+ return RNUsercentricsModule.getUserSessionData();
71
+ },
72
+
73
+ getCCPAData: async (): Promise<CCPAData> => {
74
+ await RNUsercentricsModule.isReady();
75
+ return RNUsercentricsModule.getUSPData();
76
+ },
77
+
78
+ getTCFData: async (): Promise<TCFData> => {
79
+ await RNUsercentricsModule.isReady();
80
+ return RNUsercentricsModule.getTCFData();
81
+ },
82
+
83
+ getAdditionalConsentModeData: async (): Promise<AdditionalConsentModeData> => {
84
+ await RNUsercentricsModule.isReady();
85
+ return RNUsercentricsModule.getAdditionalConsentModeData();
86
+ },
87
+
88
+ changeLanguage: async (language: string): Promise<void> => {
89
+ await RNUsercentricsModule.isReady();
90
+ return RNUsercentricsModule.changeLanguage(language);
91
+ },
92
+
93
+ acceptAll: async (consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
94
+ await RNUsercentricsModule.isReady();
95
+ return RNUsercentricsModule.acceptAll(consentType);
96
+ },
97
+
98
+ acceptAllForTCF: async (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
99
+ await RNUsercentricsModule.isReady();
100
+ return RNUsercentricsModule.acceptAllForTCF(fromLayer, consentType);
101
+ },
102
+
103
+ denyAll: async (consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
104
+ await RNUsercentricsModule.isReady();
105
+ return RNUsercentricsModule.denyAll(consentType);
106
+ },
107
+
108
+ denyAllForTCF: async (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
109
+ await RNUsercentricsModule.isReady();
110
+ return RNUsercentricsModule.denyAllForTCF(fromLayer, consentType);
111
+ },
112
+
113
+ saveDecisions: async (decisions: UserDecision[], consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
114
+ await RNUsercentricsModule.isReady();
115
+ return RNUsercentricsModule.saveDecisions(decisions, consentType);
116
+ },
117
+
118
+ saveDecisionsForTCF: async (tcfDecisions: TCFUserDecisions, fromLayer: TCFDecisionUILayer, decisions: UserDecision[], consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
119
+ await RNUsercentricsModule.isReady();
120
+ return RNUsercentricsModule.saveDecisionsForTCF(tcfDecisions, fromLayer, decisions, consentType);
121
+ },
122
+
123
+ saveOptOutForCCPA: async (isOptedOut: boolean, consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
124
+ await RNUsercentricsModule.isReady();
125
+ return RNUsercentricsModule.saveOptOutForCCPA(isOptedOut, consentType);
126
+ },
127
+
128
+ setCMPId: (id: number) => {
129
+ RNUsercentricsModule.setCMPId(id);
130
+ },
131
+
132
+ setABTestingVariant: (variant: string) => {
133
+ RNUsercentricsModule.setABTestingVariant(variant);
134
+ },
135
+
136
+ track: async (event: UsercentricsAnalyticsEventType) => {
137
+ await RNUsercentricsModule.isReady();
138
+ RNUsercentricsModule.track(event);
139
+ },
140
+
141
+ clearUserSession: async (): Promise<UsercentricsReadyStatus> => {
142
+ await RNUsercentricsModule.isReady();
143
+ return RNUsercentricsModule.clearUserSession();
144
+ },
145
+ }
@@ -0,0 +1,476 @@
1
+ import {NativeModules} from 'react-native';
2
+ import {
3
+ BannerSettings,
4
+ NetworkMode,
5
+ TCFData,
6
+ TCFDecisionUILayer,
7
+ UsercentricsConsentType,
8
+ UsercentricsConsentUserResponse,
9
+ UsercentricsLayout,
10
+ UsercentricsLoggerLevel,
11
+ UsercentricsOptions,
12
+ UsercentricsReadyStatus,
13
+ UsercentricsUserInteraction
14
+ } from '../models';
15
+ import {Usercentrics} from '../Usercentrics';
16
+ import {
17
+ adTechProviderDecisionExample,
18
+ ccpaDataExample,
19
+ cmpDataExample,
20
+ featuresExample,
21
+ purposesExample,
22
+ tcfUserDecisionOnPurposeExample,
23
+ tcfUserDecisionOnSpecialFeatureExample,
24
+ tcfUserDecisionOnVendorExample,
25
+ usercentricsServiceConsent,
26
+ userDecision
27
+ } from './mocks';
28
+ import {UsercentricsAnalyticsEventType} from "../models/UsercentricsAnalyticsEventType";
29
+ import {AdditionalConsentModeData} from "../models/AdditionalConsentModeData";
30
+
31
+ const {RNUsercentricsModule} = NativeModules;
32
+
33
+ jest.mock("react-native", () => {
34
+ const RN = jest.requireActual("react-native");
35
+
36
+ RN.NativeModules.RNUsercentricsModule = {
37
+ configure: jest.fn(),
38
+ isReady: jest.fn(),
39
+ showCMP: jest.fn(),
40
+ showFirstLayer: jest.fn(),
41
+ restoreUserSession: jest.fn(),
42
+ getControllerId: jest.fn(),
43
+ getABTestingVariant: jest.fn(),
44
+ getConsents: jest.fn(),
45
+ getCMPData: jest.fn(),
46
+ getUserSessionData: jest.fn(),
47
+ getUSPData: jest.fn(),
48
+ getTCFData: jest.fn(),
49
+ getAdditionalConsentModeData: jest.fn(),
50
+ changeLanguage: jest.fn(),
51
+ acceptAll: jest.fn(),
52
+ acceptAllForTCF: jest.fn(),
53
+ denyAll: jest.fn(),
54
+ denyAllForTCF: jest.fn(),
55
+ saveOptOutForCCPA: jest.fn(),
56
+ saveDecisionsForTCF: jest.fn(),
57
+ saveDecisions: jest.fn(),
58
+ track: jest.fn(),
59
+ reset: jest.fn(),
60
+ clearUserSession: jest.fn()
61
+ };
62
+
63
+ return RN
64
+ })
65
+
66
+ describe('Test Usercentrics Module', () => {
67
+ test('testConfigureBridge', () => {
68
+ const options = new UsercentricsOptions({
69
+ settingsId: "abc",
70
+ ruleSetId: "qwer",
71
+ defaultLanguage: "en",
72
+ loggerLevel: UsercentricsLoggerLevel.debug,
73
+ timeoutMillis: 123,
74
+ version: "1.2.3",
75
+ networkMode: NetworkMode.eu,
76
+ initTimeoutMillis: 1000
77
+ });
78
+ Usercentrics.configure(options);
79
+ const call = RNUsercentricsModule.configure.mock.calls[0][0];
80
+ expect(call).toBe(options)
81
+ })
82
+
83
+ test('testStatus', async () => {
84
+ const readyStatus = new UsercentricsReadyStatus(
85
+ true,
86
+ [
87
+ {
88
+ templateId: "123",
89
+ status: false,
90
+ dataProcessor: "facebook",
91
+ version: "123",
92
+ type: 0,
93
+ isEssential: false,
94
+ history: [{
95
+ status: false,
96
+ timestampInMillis: 123.0,
97
+ type: 0
98
+ }],
99
+ category: "essemtial"
100
+ }
101
+ ],
102
+ {
103
+ countryCode: "PT",
104
+ regionCode: "PT11",
105
+ isInEU: true,
106
+ isInUS: false,
107
+ isInCalifornia: false
108
+ },
109
+ {
110
+ activeSettingsId: "",
111
+ bannerRequiredAtLocation: false
112
+ }
113
+ )
114
+
115
+ RNUsercentricsModule.isReady.mockImplementationOnce(
116
+ (): Promise<any> => Promise.resolve(readyStatus)
117
+ )
118
+
119
+ const data = await Usercentrics.status();
120
+ expect(data).toBe(readyStatus);
121
+ })
122
+
123
+ test('testStatusWithError', async () => {
124
+ RNUsercentricsModule.isReady.mockImplementationOnce(
125
+ (): Promise<any> => Promise.reject("Failed")
126
+ )
127
+
128
+ try {
129
+ await Usercentrics.status();
130
+ } catch (e) {
131
+ expect(e).toBe("Failed");
132
+ }
133
+ })
134
+
135
+ test('testShowFirstLayer', async () => {
136
+ const response = new UsercentricsConsentUserResponse(
137
+ "abc",
138
+ UsercentricsUserInteraction.acceptAll,
139
+ [
140
+ {
141
+ templateId: "123",
142
+ status: false,
143
+ dataProcessor: "facebook",
144
+ version: "123",
145
+ type: 0,
146
+ isEssential: false,
147
+ history: [{
148
+ status: false,
149
+ timestampInMillis: 123.0,
150
+ type: 0
151
+ }],
152
+ category: "essemtial"
153
+ }
154
+ ]
155
+ )
156
+
157
+ RNUsercentricsModule.showFirstLayer.mockImplementationOnce(
158
+ (): Promise<any> => Promise.resolve(response)
159
+ )
160
+
161
+ const bannerSettings: BannerSettings = {
162
+ firstLayerStyleSettings: {
163
+ layout: UsercentricsLayout.popupBottom
164
+ }
165
+ }
166
+
167
+ const data = await Usercentrics.showFirstLayer(bannerSettings)
168
+ expect(data).toBe(response);
169
+
170
+ const call = RNUsercentricsModule.showFirstLayer.mock.calls[0][0];
171
+ expect(call).toBe(bannerSettings)
172
+ })
173
+
174
+ test('testRestoreUserSession', async () => {
175
+ const readyStatus = new UsercentricsReadyStatus(
176
+ true,
177
+ [
178
+ {
179
+ templateId: "123",
180
+ status: false,
181
+ dataProcessor: "facebook",
182
+ version: "123",
183
+ type: 0,
184
+ isEssential: false,
185
+ history: [{
186
+ status: false,
187
+ timestampInMillis: 123.0,
188
+ type: 0
189
+ }],
190
+ category: "essemtial"
191
+ }
192
+ ],
193
+ {
194
+ countryCode: "PT",
195
+ regionCode: "PT11",
196
+ isInEU: true,
197
+ isInUS: false,
198
+ isInCalifornia: false
199
+ },
200
+ {
201
+ activeSettingsId: "",
202
+ bannerRequiredAtLocation: false
203
+ }
204
+ )
205
+
206
+ RNUsercentricsModule.restoreUserSession.mockImplementationOnce(
207
+ (): Promise<any> => Promise.resolve(readyStatus)
208
+ )
209
+
210
+ const data = await Usercentrics.restoreUserSession("abc");
211
+ expect(data).toBe(readyStatus);
212
+
213
+ const call = RNUsercentricsModule.restoreUserSession.mock.calls[0][0];
214
+ expect(call).toBe("abc")
215
+ })
216
+
217
+ test('testRestoreUserSessionWithError', async () => {
218
+ RNUsercentricsModule.restoreUserSession.mockImplementationOnce(
219
+ (): Promise<any> => Promise.reject("Failed")
220
+ )
221
+
222
+ try {
223
+ await Usercentrics.restoreUserSession("abc");
224
+ } catch (e) {
225
+ expect(e).toBe("Failed");
226
+ }
227
+
228
+ const call = RNUsercentricsModule.restoreUserSession.mock.calls[0][0];
229
+ expect(call).toBe("abc")
230
+ })
231
+
232
+ test('testGetControllerId', async () => {
233
+ RNUsercentricsModule.getControllerId.mockImplementationOnce(
234
+ (): Promise<string> => Promise.resolve("abc")
235
+ )
236
+
237
+ const data = await Usercentrics.getControllerId();
238
+ expect(data).toBe("abc");
239
+ })
240
+
241
+ test('testGetABTestingVariant', async () => {
242
+ RNUsercentricsModule.getABTestingVariant.mockImplementationOnce(
243
+ (): Promise<string> => Promise.resolve("variantA")
244
+ )
245
+
246
+ const data = await Usercentrics.getABTestingVariant();
247
+ expect(data).toBe("variantA");
248
+ })
249
+
250
+ test('testGetABTestingVariant_WhenNull', async () => {
251
+ RNUsercentricsModule.getABTestingVariant.mockImplementationOnce(
252
+ (): Promise<string | null> => Promise.resolve(null)
253
+ )
254
+
255
+ const data = await Usercentrics.getABTestingVariant();
256
+ expect(data).toBe(null);
257
+ })
258
+
259
+ test('testChangeLanguage', async () => {
260
+ RNUsercentricsModule.changeLanguage.mockImplementationOnce(
261
+ (): Promise<any> => Promise.resolve()
262
+ )
263
+
264
+ const data = await Usercentrics.changeLanguage("pt");
265
+ expect(data).toBe(undefined);
266
+ })
267
+
268
+ test('testGetConsents', async () => {
269
+ RNUsercentricsModule.getConsents.mockImplementationOnce(
270
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
271
+ )
272
+
273
+ const data = await Usercentrics.getConsents();
274
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
275
+ })
276
+
277
+ test('testGetCMPData', async () => {
278
+ RNUsercentricsModule.getCMPData.mockImplementationOnce(
279
+ (): Promise<any> => Promise.resolve(cmpDataExample)
280
+ )
281
+
282
+ const data = await Usercentrics.getCMPData();
283
+ expect(data).toBe(cmpDataExample);
284
+ })
285
+
286
+ test('testGetUserSessionData', async () => {
287
+ RNUsercentricsModule.getUserSessionData.mockImplementationOnce(
288
+ (): Promise<any> => Promise.resolve("abc")
289
+ )
290
+
291
+ const data = await Usercentrics.getUserSessionData();
292
+ expect(data).toBe("abc");
293
+ })
294
+
295
+ test('testGetCCPAData', async () => {
296
+ RNUsercentricsModule.getUSPData.mockImplementationOnce(
297
+ (): Promise<any> => Promise.resolve(ccpaDataExample)
298
+ )
299
+
300
+ const data = await Usercentrics.getCCPAData();
301
+ expect(data).toBe(ccpaDataExample);
302
+ })
303
+
304
+ test('testGetTCFData', async () => {
305
+ const response: TCFData = {
306
+ features: featuresExample,
307
+ purposes: purposesExample,
308
+ specialFeatures: [],
309
+ specialPurposes: [],
310
+ stacks: [],
311
+ vendors: [],
312
+ tcString: "ABCD1234",
313
+ thirdPartyCount: 13
314
+ }
315
+
316
+ RNUsercentricsModule.getTCFData.mockImplementationOnce(
317
+ (): Promise<any> => Promise.resolve(response)
318
+ )
319
+
320
+ const data = await Usercentrics.getTCFData();
321
+ expect(data).toStrictEqual(response)
322
+ })
323
+
324
+ test('testAcceptAllForTCF', async () => {
325
+ RNUsercentricsModule.acceptAllForTCF.mockImplementationOnce(
326
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
327
+ )
328
+
329
+ const data = await Usercentrics.acceptAllForTCF(TCFDecisionUILayer.firstLayer, UsercentricsConsentType.explicit);
330
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
331
+ })
332
+
333
+ test('testDenyAllForTCF', async () => {
334
+ RNUsercentricsModule.denyAllForTCF.mockImplementationOnce(
335
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
336
+ )
337
+
338
+ const data = await Usercentrics.denyAllForTCF(TCFDecisionUILayer.firstLayer, UsercentricsConsentType.explicit);
339
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
340
+ })
341
+
342
+ test('testAcceptAll', async () => {
343
+ RNUsercentricsModule.acceptAll.mockImplementationOnce(
344
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
345
+ )
346
+
347
+ const data = await Usercentrics.acceptAll(UsercentricsConsentType.explicit);
348
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
349
+ })
350
+
351
+ test('testDenyAll', async () => {
352
+ RNUsercentricsModule.denyAll.mockImplementationOnce(
353
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
354
+ )
355
+
356
+ const data = await Usercentrics.denyAll(UsercentricsConsentType.explicit);
357
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
358
+ })
359
+
360
+ test('testSaveOptOutForCCPA', async () => {
361
+ RNUsercentricsModule.saveOptOutForCCPA.mockImplementationOnce(
362
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
363
+ )
364
+
365
+ const data = await Usercentrics.saveOptOutForCCPA(false, UsercentricsConsentType.explicit);
366
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
367
+ })
368
+
369
+ test('testSaveDecisions', async () => {
370
+ RNUsercentricsModule.saveDecisions.mockImplementationOnce(
371
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
372
+ )
373
+
374
+ const data = await Usercentrics.saveDecisions([userDecision], UsercentricsConsentType.explicit);
375
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
376
+ })
377
+
378
+ test('testSaveDecisionsForTCF', async () => {
379
+ RNUsercentricsModule.saveDecisionsForTCF.mockImplementationOnce(
380
+ (): Promise<any> => Promise.resolve([usercentricsServiceConsent])
381
+ )
382
+
383
+ const data = await Usercentrics.saveDecisionsForTCF(
384
+ {
385
+ purposes: tcfUserDecisionOnPurposeExample,
386
+ specialFeatures: tcfUserDecisionOnSpecialFeatureExample,
387
+ vendors: tcfUserDecisionOnVendorExample,
388
+ adTechProviders: adTechProviderDecisionExample
389
+ },
390
+ TCFDecisionUILayer.firstLayer,
391
+ [userDecision],
392
+ UsercentricsConsentType.explicit
393
+ );
394
+
395
+ expect(data).toStrictEqual([usercentricsServiceConsent]);
396
+ })
397
+
398
+ test('testTrack', async () => {
399
+ await Usercentrics.track(UsercentricsAnalyticsEventType.acceptAllFirstLayer);
400
+ let spy = jest.spyOn(RNUsercentricsModule, "track")
401
+ expect(spy).toHaveBeenCalledTimes(1);
402
+ })
403
+
404
+ test('testGetAdditionalConsentModeData', async () => {
405
+ const response: AdditionalConsentModeData = {
406
+ acString: '2~43.46.55~dv.',
407
+ adTechProviders: [
408
+ {
409
+ id: 1,
410
+ name: 'provider',
411
+ consent: false,
412
+ privacyPolicyUrl: 'https://'
413
+ }
414
+ ]
415
+ }
416
+
417
+ RNUsercentricsModule.getAdditionalConsentModeData.mockImplementationOnce(
418
+ (): Promise<any> => Promise.resolve(response)
419
+ )
420
+
421
+ const data = await Usercentrics.getAdditionalConsentModeData();
422
+ expect(data).toStrictEqual(response)
423
+ })
424
+
425
+ test('testClearUserSession', async () => {
426
+ const readyStatus = new UsercentricsReadyStatus(
427
+ true,
428
+ [
429
+ {
430
+ templateId: "123",
431
+ status: false,
432
+ dataProcessor: "facebook",
433
+ version: "123",
434
+ type: 0,
435
+ isEssential: false,
436
+ history: [{
437
+ status: false,
438
+ timestampInMillis: 123.0,
439
+ type: 0
440
+ }],
441
+ category: "essemtial"
442
+ }
443
+ ],
444
+ {
445
+ countryCode: "PT",
446
+ regionCode: "PT11",
447
+ isInEU: true,
448
+ isInUS: false,
449
+ isInCalifornia: false
450
+ },
451
+ {
452
+ activeSettingsId: "",
453
+ bannerRequiredAtLocation: false
454
+ }
455
+ )
456
+
457
+ RNUsercentricsModule.clearUserSession.mockImplementationOnce(
458
+ (): Promise<any> => Promise.resolve(readyStatus)
459
+ )
460
+
461
+ const data = await Usercentrics.clearUserSession();
462
+ expect(data).toBe(readyStatus);
463
+ })
464
+
465
+ test('testClearUserSessionWithError', async () => {
466
+ RNUsercentricsModule.restoreUserSession.mockImplementationOnce(
467
+ (): Promise<any> => Promise.reject("Failed")
468
+ )
469
+
470
+ try {
471
+ await Usercentrics.clearUserSession();
472
+ } catch (e) {
473
+ expect(e).toBe("Failed");
474
+ }
475
+ })
476
+ })