@usercentrics/react-native-sdk 2.23.3 → 2.24.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.
- package/README.md +5 -5
- package/android/build-legacy.gradle +11 -1
- package/android/build.gradle.kts +35 -17
- package/android/gradle.properties +1 -3
- package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsPackage.kt +37 -8
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/RNUsercentricsModule.cpp +21 -0
- package/android/src/main/jni/rn_usercentrics.cpp +22 -0
- package/ios/Extensions/UsercentricsOptions+Dict.swift +1 -1
- package/lib/NativeUsercentrics.d.ts +2 -1
- package/lib/NativeUsercentrics.js +3 -2
- package/lib/NativeUsercentrics.js.map +1 -1
- package/lib/fabric/NativeUsercentricsModule.d.ts +30 -0
- package/lib/fabric/NativeUsercentricsModule.js +3 -0
- package/lib/fabric/NativeUsercentricsModule.js.map +1 -0
- package/package.json +15 -4
- package/react-native.config.js +15 -0
- package/src/NativeUsercentrics.ts +75 -0
- package/src/Usercentrics.tsx +145 -0
- package/src/__tests__/index.test.ts +476 -0
- package/src/__tests__/mocks.ts +402 -0
- package/src/fabric/NativeUsercentricsModule.ts +51 -0
- package/src/index.tsx +2 -0
- package/src/models/AdditionalConsentModeData.tsx +33 -0
- package/src/models/BannerSettings.tsx +117 -0
- package/src/models/CCPAData.tsx +32 -0
- package/src/models/CCPASettings.tsx +49 -0
- package/src/models/ConsentDisclosureObject.tsx +47 -0
- package/src/models/FirstLayerSettings.tsx +185 -0
- package/src/models/GeolocationRuleset.tsx +10 -0
- package/src/models/LegalBasisLocalization.tsx +100 -0
- package/src/models/NetworkMode.tsx +5 -0
- package/src/models/SecondLayerSettings.tsx +12 -0
- package/src/models/TCF2Settings.tsx +209 -0
- package/src/models/TCFData.tsx +297 -0
- package/src/models/TCFDecisionUILayer.tsx +5 -0
- package/src/models/TCFUserDecisions.tsx +73 -0
- package/src/models/UserDecision.tsx +10 -0
- package/src/models/UsercentricsAnalyticsEventType.tsx +15 -0
- package/src/models/UsercentricsCMPData.tsx +38 -0
- package/src/models/UsercentricsCategory.tsx +26 -0
- package/src/models/UsercentricsConsentType.tsx +5 -0
- package/src/models/UsercentricsConsentUserResponse.tsx +14 -0
- package/src/models/UsercentricsLabels.tsx +276 -0
- package/src/models/UsercentricsLocation.tsx +32 -0
- package/src/models/UsercentricsLoggerLevel.tsx +7 -0
- package/src/models/UsercentricsOptions.tsx +45 -0
- package/src/models/UsercentricsReadyStatus.tsx +20 -0
- package/src/models/UsercentricsService.tsx +134 -0
- package/src/models/UsercentricsServiceConsent.tsx +37 -0
- package/src/models/UsercentricsSettings.tsx +177 -0
- package/src/models/UsercentricsUserInteraction.tsx +7 -0
- package/src/models/UsercentricsVariant.tsx +6 -0
- package/src/models/index.tsx +29 -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
|
+
})
|