@newskit-render/feature-flags 0.0.0-1cbb2a4f → 0.0.0-1f8fc3b48
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 +38 -48
- package/dist/cjs/__tests__/utils.tests.js +268 -347
- package/dist/cjs/__tests__/utils.tests.js.map +1 -1
- package/dist/cjs/feature-flags-context.js.map +1 -1
- package/dist/cjs/optimizelyClient.d.ts +3 -1
- package/dist/cjs/optimizelyClient.js +16 -19
- package/dist/cjs/optimizelyClient.js.map +1 -1
- package/dist/cjs/types.d.ts +5 -1
- package/dist/cjs/types.js +0 -21
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils.d.ts +5 -2
- package/dist/cjs/utils.js +101 -76
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/__tests__/utils.tests.js +269 -348
- package/dist/esm/__tests__/utils.tests.js.map +1 -1
- package/dist/esm/feature-flags-context.js.map +1 -1
- package/dist/esm/optimizelyClient.d.ts +3 -1
- package/dist/esm/optimizelyClient.js +14 -18
- package/dist/esm/optimizelyClient.js.map +1 -1
- package/dist/esm/types.d.ts +5 -1
- package/dist/esm/types.js +0 -21
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils.d.ts +5 -2
- package/dist/esm/utils.js +98 -75
- package/dist/esm/utils.js.map +1 -1
- package/package.json +4 -4
|
@@ -20,8 +20,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
20
20
|
});
|
|
21
21
|
};
|
|
22
22
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g =
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
25
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
26
|
function step(op) {
|
|
27
27
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -53,62 +53,59 @@ var originalEnv = process.env;
|
|
|
53
53
|
jest.mock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
54
54
|
decide: jest
|
|
55
55
|
.fn()
|
|
56
|
-
.mockImplementation(function (key,
|
|
56
|
+
.mockImplementation(function (key, config) {
|
|
57
57
|
return flagsMock[key];
|
|
58
58
|
}),
|
|
59
59
|
decideForKeys: jest
|
|
60
60
|
.fn()
|
|
61
|
-
.mockImplementation(function (keys,
|
|
61
|
+
.mockImplementation(function (keys, config) {
|
|
62
62
|
var filtered = {};
|
|
63
63
|
keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
|
|
64
64
|
return filtered;
|
|
65
65
|
}),
|
|
66
66
|
decideAll: jest
|
|
67
67
|
.fn()
|
|
68
|
-
.mockImplementation(function (
|
|
68
|
+
.mockImplementation(function (config) {
|
|
69
69
|
return flagsMock;
|
|
70
70
|
}),
|
|
71
71
|
}); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); }, setLogLevel: jest.fn(), setLogger: jest.fn() })); });
|
|
72
72
|
var flagsMock = {
|
|
73
|
-
|
|
73
|
+
test_flag_1: {
|
|
74
74
|
variationKey: 'on',
|
|
75
75
|
enabled: true,
|
|
76
76
|
variables: {},
|
|
77
77
|
ruleKey: 'default-rollout-216689-29200910123',
|
|
78
|
-
flagKey: '
|
|
78
|
+
flagKey: 'test_flag_1',
|
|
79
79
|
userContext: {
|
|
80
80
|
_qualifiedSegments: null,
|
|
81
|
-
// optimizely: [e],
|
|
82
81
|
userId: 'user123',
|
|
83
82
|
attributes: {},
|
|
84
83
|
forcedDecisionsMap: {},
|
|
85
84
|
},
|
|
86
85
|
reasons: [],
|
|
87
86
|
},
|
|
88
|
-
|
|
87
|
+
test_flag_2: {
|
|
89
88
|
variationKey: 'max_10',
|
|
90
89
|
enabled: true,
|
|
91
90
|
variables: { max_family_members: 10 },
|
|
92
91
|
ruleKey: 'default-rollout-223709-29200910123',
|
|
93
|
-
flagKey: '
|
|
92
|
+
flagKey: 'test_flag_2',
|
|
94
93
|
userContext: {
|
|
95
94
|
_qualifiedSegments: null,
|
|
96
|
-
// optimizely: [e],
|
|
97
95
|
userId: 'user123',
|
|
98
96
|
attributes: {},
|
|
99
97
|
forcedDecisionsMap: {},
|
|
100
98
|
},
|
|
101
99
|
reasons: [],
|
|
102
100
|
},
|
|
103
|
-
|
|
101
|
+
test_flag_3: {
|
|
104
102
|
variationKey: 'off',
|
|
105
103
|
enabled: false,
|
|
106
104
|
variables: {},
|
|
107
105
|
ruleKey: 'default-rollout-225089-29200910123',
|
|
108
|
-
flagKey: '
|
|
106
|
+
flagKey: 'test_flag_3',
|
|
109
107
|
userContext: {
|
|
110
108
|
_qualifiedSegments: null,
|
|
111
|
-
// optimizely: [e],
|
|
112
109
|
userId: 'user123',
|
|
113
110
|
attributes: {},
|
|
114
111
|
forcedDecisionsMap: {},
|
|
@@ -138,21 +135,24 @@ var flagsMock = {
|
|
|
138
135
|
reasons: [],
|
|
139
136
|
},
|
|
140
137
|
};
|
|
141
|
-
// TO DO: Improve test coverage
|
|
142
138
|
beforeEach(function () {
|
|
143
139
|
jest.resetModules();
|
|
144
140
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: 'optimizely-sdk-key' });
|
|
145
141
|
});
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
142
|
+
var optionsWithIncludeFlagVariables = {
|
|
143
|
+
includeFlagVariables: true,
|
|
144
|
+
};
|
|
145
|
+
var optionsWithDefaultFlags = {
|
|
146
|
+
defaultFeatureFlags: {
|
|
147
|
+
default_flag: {
|
|
148
|
+
variationKey: 'off',
|
|
149
|
+
enabled: true,
|
|
150
|
+
variables: {},
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
describe('getAllFeatureFlags', function () {
|
|
155
|
+
it('should return all flags data in flat mode with default config', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
156
156
|
var flagsAll;
|
|
157
157
|
return __generator(this, function (_a) {
|
|
158
158
|
switch (_a.label) {
|
|
@@ -160,34 +160,30 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
160
160
|
case 1:
|
|
161
161
|
flagsAll = _a.sent();
|
|
162
162
|
expect(flagsAll).toEqual({
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
test_flag_3: false,
|
|
164
|
+
test_flag_1: true,
|
|
165
|
+
test_flag_2: true,
|
|
166
166
|
testing_flag_with_variations_and_variables: true,
|
|
167
167
|
});
|
|
168
168
|
return [2 /*return*/];
|
|
169
169
|
}
|
|
170
170
|
});
|
|
171
171
|
}); });
|
|
172
|
-
it('should return all flags with included variable data when "includeFlagVariables: true" is added in the
|
|
173
|
-
var
|
|
172
|
+
it('should return all flags with included variable data when "includeFlagVariables: true" is added in the config', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
173
|
+
var flagsAll;
|
|
174
174
|
return __generator(this, function (_a) {
|
|
175
175
|
switch (_a.label) {
|
|
176
|
-
case 0:
|
|
177
|
-
options = {
|
|
178
|
-
includeFlagVariables: true,
|
|
179
|
-
};
|
|
180
|
-
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(options)];
|
|
176
|
+
case 0: return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(optionsWithIncludeFlagVariables)];
|
|
181
177
|
case 1:
|
|
182
178
|
flagsAll = _a.sent();
|
|
183
179
|
expect(flagsAll).toEqual({
|
|
184
|
-
|
|
185
|
-
|
|
180
|
+
test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
|
|
181
|
+
test_flag_2: {
|
|
186
182
|
variationKey: 'max_10',
|
|
187
183
|
enabled: true,
|
|
188
184
|
variables: { max_family_members: 10 },
|
|
189
185
|
},
|
|
190
|
-
|
|
186
|
+
test_flag_3: {
|
|
191
187
|
variationKey: 'off',
|
|
192
188
|
enabled: false,
|
|
193
189
|
variables: {},
|
|
@@ -217,10 +213,10 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
217
213
|
jest.doMock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
218
214
|
decideAll: jest
|
|
219
215
|
.fn()
|
|
220
|
-
.mockImplementation(function (
|
|
216
|
+
.mockImplementation(function (config) {
|
|
221
217
|
return undefined;
|
|
222
218
|
}),
|
|
223
|
-
}); }, onReady: jest.fn().mockResolvedValue({ success: true })
|
|
219
|
+
}); }, onReady: jest.fn().mockResolvedValue({ success: true }) })); } })); });
|
|
224
220
|
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
225
221
|
return [4 /*yield*/, getAllFeatureFlags()];
|
|
226
222
|
case 1:
|
|
@@ -230,13 +226,34 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
230
226
|
}
|
|
231
227
|
});
|
|
232
228
|
}); });
|
|
233
|
-
it('should return
|
|
234
|
-
var
|
|
229
|
+
it('should return the defaultFeatureFlags if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
230
|
+
var getAllFeatureFlags, flagsAll;
|
|
231
|
+
return __generator(this, function (_a) {
|
|
232
|
+
switch (_a.label) {
|
|
233
|
+
case 0:
|
|
234
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
235
|
+
decideAll: jest
|
|
236
|
+
.fn()
|
|
237
|
+
.mockImplementation(function (config) {
|
|
238
|
+
return undefined;
|
|
239
|
+
}),
|
|
240
|
+
}); }, onReady: jest.fn().mockResolvedValue({ success: true }) })); } })); });
|
|
241
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
242
|
+
return [4 /*yield*/, getAllFeatureFlags(optionsWithDefaultFlags)];
|
|
243
|
+
case 1:
|
|
244
|
+
flagsAll = _a.sent();
|
|
245
|
+
expect(flagsAll).toEqual(optionsWithDefaultFlags.defaultFeatureFlags);
|
|
246
|
+
return [2 /*return*/];
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}); });
|
|
250
|
+
it('should return all flags with custom config', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
251
|
+
var config, flagsAll;
|
|
235
252
|
return __generator(this, function (_a) {
|
|
236
253
|
switch (_a.label) {
|
|
237
254
|
case 0:
|
|
238
255
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
|
|
239
|
-
|
|
256
|
+
config = {
|
|
240
257
|
sdkConfig: {
|
|
241
258
|
sdkKey: 'custom-optimizely-sdk',
|
|
242
259
|
},
|
|
@@ -246,17 +263,17 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
246
263
|
},
|
|
247
264
|
includeFlagVariables: true,
|
|
248
265
|
};
|
|
249
|
-
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(
|
|
266
|
+
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(config)];
|
|
250
267
|
case 1:
|
|
251
268
|
flagsAll = _a.sent();
|
|
252
269
|
expect(flagsAll).toEqual({
|
|
253
|
-
|
|
254
|
-
|
|
270
|
+
test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
|
|
271
|
+
test_flag_2: {
|
|
255
272
|
variationKey: 'max_10',
|
|
256
273
|
enabled: true,
|
|
257
274
|
variables: { max_family_members: 10 },
|
|
258
275
|
},
|
|
259
|
-
|
|
276
|
+
test_flag_3: {
|
|
260
277
|
variationKey: 'off',
|
|
261
278
|
enabled: false,
|
|
262
279
|
variables: {},
|
|
@@ -327,14 +344,14 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
327
344
|
});
|
|
328
345
|
}); });
|
|
329
346
|
it('should instantiate logger with log level', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
330
|
-
var
|
|
347
|
+
var config;
|
|
331
348
|
return __generator(this, function (_a) {
|
|
332
349
|
switch (_a.label) {
|
|
333
350
|
case 0:
|
|
334
|
-
|
|
351
|
+
config = {
|
|
335
352
|
logLevel: 'critical',
|
|
336
353
|
};
|
|
337
|
-
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(
|
|
354
|
+
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(config)];
|
|
338
355
|
case 1:
|
|
339
356
|
_a.sent();
|
|
340
357
|
expect(optimizely_sdk_1.setLogLevel).toBeCalledWith('critical');
|
|
@@ -344,7 +361,7 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
344
361
|
});
|
|
345
362
|
}); });
|
|
346
363
|
it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
347
|
-
var getAllFeatureFlags,
|
|
364
|
+
var getAllFeatureFlags, flagsAll;
|
|
348
365
|
return __generator(this, function (_a) {
|
|
349
366
|
switch (_a.label) {
|
|
350
367
|
case 0:
|
|
@@ -352,7 +369,7 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
352
369
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
353
370
|
decideAll: jest
|
|
354
371
|
.fn()
|
|
355
|
-
.mockImplementation(function (
|
|
372
|
+
.mockImplementation(function (config) {
|
|
356
373
|
return flagsMock;
|
|
357
374
|
}),
|
|
358
375
|
}); }, onReady: jest
|
|
@@ -360,7 +377,94 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
360
377
|
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
361
378
|
}); });
|
|
362
379
|
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
363
|
-
|
|
380
|
+
return [4 /*yield*/, getAllFeatureFlags(optionsWithDefaultFlags)];
|
|
381
|
+
case 1:
|
|
382
|
+
flagsAll = _a.sent();
|
|
383
|
+
expect(flagsAll).toEqual(optionsWithDefaultFlags.defaultFeatureFlags);
|
|
384
|
+
return [2 /*return*/];
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}); });
|
|
388
|
+
});
|
|
389
|
+
describe('getFeatureFlagsByKeys', function () {
|
|
390
|
+
it('should return only the requested feature flags included variable data when "includeFlagVariables: true" is added in the config', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
391
|
+
var flagsByKeys;
|
|
392
|
+
return __generator(this, function (_a) {
|
|
393
|
+
switch (_a.label) {
|
|
394
|
+
case 0: return [4 /*yield*/, (0, utils_1.getFeatureFlagsByKeys)(['test_flag_3', 'test_flag_1'], optionsWithIncludeFlagVariables)];
|
|
395
|
+
case 1:
|
|
396
|
+
flagsByKeys = _a.sent();
|
|
397
|
+
expect(flagsByKeys).toEqual({
|
|
398
|
+
test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
|
|
399
|
+
test_flag_3: {
|
|
400
|
+
variationKey: 'off',
|
|
401
|
+
enabled: false,
|
|
402
|
+
variables: {},
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
return [2 /*return*/];
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}); });
|
|
409
|
+
it('should return only the requested feature flags in flat mode with default config', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
410
|
+
var flagsByKeys;
|
|
411
|
+
return __generator(this, function (_a) {
|
|
412
|
+
switch (_a.label) {
|
|
413
|
+
case 0: return [4 /*yield*/, (0, utils_1.getFeatureFlagsByKeys)([
|
|
414
|
+
'test_flag_3',
|
|
415
|
+
'test_flag_1',
|
|
416
|
+
])];
|
|
417
|
+
case 1:
|
|
418
|
+
flagsByKeys = _a.sent();
|
|
419
|
+
expect(flagsByKeys).toEqual({
|
|
420
|
+
test_flag_1: true,
|
|
421
|
+
test_flag_3: false,
|
|
422
|
+
});
|
|
423
|
+
return [2 /*return*/];
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}); });
|
|
427
|
+
it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
428
|
+
var getFeatureFlagsByKeys, flagsAll;
|
|
429
|
+
return __generator(this, function (_a) {
|
|
430
|
+
switch (_a.label) {
|
|
431
|
+
case 0:
|
|
432
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
433
|
+
decideForKeys: jest
|
|
434
|
+
.fn()
|
|
435
|
+
.mockImplementation(function (config) {
|
|
436
|
+
return undefined;
|
|
437
|
+
}),
|
|
438
|
+
}); }, onReady: jest.fn().mockResolvedValue({ success: true }) })); } })); });
|
|
439
|
+
getFeatureFlagsByKeys = require('../utils').getFeatureFlagsByKeys;
|
|
440
|
+
return [4 /*yield*/, getFeatureFlagsByKeys(['test_flag_3', 'test_flag_1'])];
|
|
441
|
+
case 1:
|
|
442
|
+
flagsAll = _a.sent();
|
|
443
|
+
expect(flagsAll).toEqual({});
|
|
444
|
+
return [2 /*return*/];
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
}); });
|
|
448
|
+
it('should return defaultFeatureFlags when they have been passed and optimizely client creation fails', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
449
|
+
var getFeatureFlagsByKeys, config, flagsByKeys;
|
|
450
|
+
return __generator(this, function (_a) {
|
|
451
|
+
switch (_a.label) {
|
|
452
|
+
case 0:
|
|
453
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
454
|
+
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
455
|
+
decideForKeys: jest
|
|
456
|
+
.fn()
|
|
457
|
+
.mockImplementation(function (keys, config) {
|
|
458
|
+
var filtered = {};
|
|
459
|
+
keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
|
|
460
|
+
return filtered;
|
|
461
|
+
}),
|
|
462
|
+
}); }, onReady: jest
|
|
463
|
+
.fn()
|
|
464
|
+
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
465
|
+
}); });
|
|
466
|
+
getFeatureFlagsByKeys = require('../utils').getFeatureFlagsByKeys;
|
|
467
|
+
config = {
|
|
364
468
|
defaultFeatureFlags: {
|
|
365
469
|
default_flag: {
|
|
366
470
|
variationKey: 'off',
|
|
@@ -369,304 +473,121 @@ describe.skip('getAllFeatureFlags', function () {
|
|
|
369
473
|
},
|
|
370
474
|
},
|
|
371
475
|
};
|
|
372
|
-
return [4 /*yield*/,
|
|
476
|
+
return [4 /*yield*/, getFeatureFlagsByKeys(['test_flag_3', 'test_flag_1'], config)];
|
|
373
477
|
case 1:
|
|
374
|
-
|
|
375
|
-
expect(
|
|
478
|
+
flagsByKeys = _a.sent();
|
|
479
|
+
expect(flagsByKeys).toEqual(config.defaultFeatureFlags);
|
|
480
|
+
return [2 /*return*/];
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
}); });
|
|
484
|
+
it('should return empty object when no default flag have been passed and optimizely client creation fails', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
485
|
+
var getFeatureFlagsByKeys, flagsByKeys;
|
|
486
|
+
return __generator(this, function (_a) {
|
|
487
|
+
switch (_a.label) {
|
|
488
|
+
case 0:
|
|
489
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
490
|
+
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
491
|
+
decideForKeys: jest
|
|
492
|
+
.fn()
|
|
493
|
+
.mockImplementation(function (keys, config) {
|
|
494
|
+
var filtered = {};
|
|
495
|
+
keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
|
|
496
|
+
return filtered;
|
|
497
|
+
}),
|
|
498
|
+
}); }, onReady: jest
|
|
499
|
+
.fn()
|
|
500
|
+
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
501
|
+
}); });
|
|
502
|
+
getFeatureFlagsByKeys = require('../utils').getFeatureFlagsByKeys;
|
|
503
|
+
return [4 /*yield*/, getFeatureFlagsByKeys([
|
|
504
|
+
'test_flag_3',
|
|
505
|
+
'test_flag_1',
|
|
506
|
+
])];
|
|
507
|
+
case 1:
|
|
508
|
+
flagsByKeys = _a.sent();
|
|
509
|
+
expect(flagsByKeys).toEqual({});
|
|
510
|
+
return [2 /*return*/];
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
}); });
|
|
514
|
+
});
|
|
515
|
+
describe('trackEvent', function () {
|
|
516
|
+
it('should track event successfully when user context is available', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
517
|
+
var mockTrackEvent, trackEvent, eventName, tags, config;
|
|
518
|
+
return __generator(this, function (_a) {
|
|
519
|
+
switch (_a.label) {
|
|
520
|
+
case 0:
|
|
521
|
+
mockTrackEvent = jest.fn();
|
|
522
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return ({
|
|
523
|
+
createUserContext: function () { return ({
|
|
524
|
+
trackEvent: mockTrackEvent,
|
|
525
|
+
}); },
|
|
526
|
+
onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
527
|
+
}); } })); });
|
|
528
|
+
trackEvent = require('../utils').trackEvent;
|
|
529
|
+
eventName = 'test_event';
|
|
530
|
+
tags = { userId: '123', action: 'click' };
|
|
531
|
+
config = {
|
|
532
|
+
sdkKey: 'test_key',
|
|
533
|
+
userData: { userId: 'asrt', attributes: { has_consent: true } },
|
|
534
|
+
};
|
|
535
|
+
return [4 /*yield*/, trackEvent(eventName, tags, config)];
|
|
536
|
+
case 1:
|
|
537
|
+
_a.sent();
|
|
538
|
+
expect(mockTrackEvent).toHaveBeenCalledWith(eventName, tags);
|
|
539
|
+
return [2 /*return*/];
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
}); });
|
|
543
|
+
it('should not track event if user has no consent', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
544
|
+
var mockTrackEvent, trackEvent, eventName, tags, config;
|
|
545
|
+
return __generator(this, function (_a) {
|
|
546
|
+
switch (_a.label) {
|
|
547
|
+
case 0:
|
|
548
|
+
mockTrackEvent = jest.fn();
|
|
549
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return ({
|
|
550
|
+
createUserContext: function () { return ({
|
|
551
|
+
trackEvent: mockTrackEvent,
|
|
552
|
+
}); },
|
|
553
|
+
onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
554
|
+
}); } })); });
|
|
555
|
+
trackEvent = require('../utils').trackEvent;
|
|
556
|
+
eventName = 'test_event';
|
|
557
|
+
tags = { userId: '123', action: 'click' };
|
|
558
|
+
config = {
|
|
559
|
+
sdkConfig: { sdkKey: 'test_key' },
|
|
560
|
+
userData: { userId: 'asrt', attributes: { has_consent: false } },
|
|
561
|
+
};
|
|
562
|
+
return [4 /*yield*/, expect(trackEvent(eventName, tags, config)).rejects.toThrow("Failed to track event 'test_event': User has no consent.")];
|
|
563
|
+
case 1:
|
|
564
|
+
_a.sent();
|
|
565
|
+
expect(mockTrackEvent).not.toHaveBeenCalled();
|
|
566
|
+
return [2 /*return*/];
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
}); });
|
|
570
|
+
it('should throw error when user context is not available', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
571
|
+
var trackEvent, eventName, tags, config;
|
|
572
|
+
return __generator(this, function (_a) {
|
|
573
|
+
switch (_a.label) {
|
|
574
|
+
case 0:
|
|
575
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
576
|
+
createInstance: function () { return ({
|
|
577
|
+
createUserContext: jest.fn().mockReturnValue(null),
|
|
578
|
+
onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
579
|
+
}); },
|
|
580
|
+
}); });
|
|
581
|
+
trackEvent = require('../utils').trackEvent;
|
|
582
|
+
eventName = 'test_event';
|
|
583
|
+
tags = { userId: '123', action: 'click' };
|
|
584
|
+
config = { sdkKey: 'test_key' };
|
|
585
|
+
return [4 /*yield*/, expect(trackEvent(eventName, tags, config)).rejects.toThrow("Error: Failed to track event 'test_event': User has no consent.")];
|
|
586
|
+
case 1:
|
|
587
|
+
_a.sent();
|
|
376
588
|
return [2 /*return*/];
|
|
377
589
|
}
|
|
378
590
|
});
|
|
379
591
|
}); });
|
|
380
592
|
});
|
|
381
|
-
// describe('getFlagsAll', () => {
|
|
382
|
-
// it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
|
|
383
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
384
|
-
// createInstance: () => ({
|
|
385
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
386
|
-
// createUserContext: () => ({
|
|
387
|
-
// decideAll: jest
|
|
388
|
-
// .fn()
|
|
389
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
390
|
-
// return flagsMock as {
|
|
391
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
392
|
-
// }
|
|
393
|
-
// }),
|
|
394
|
-
// }),
|
|
395
|
-
// onReady: jest
|
|
396
|
-
// .fn()
|
|
397
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
398
|
-
// }),
|
|
399
|
-
// }))
|
|
400
|
-
// const { getFlagsAll } = require('../utils')
|
|
401
|
-
// const options: SDKConfig = {
|
|
402
|
-
// defaultFeatureFlags: {
|
|
403
|
-
// default_flag: {
|
|
404
|
-
// variationKey: 'off',
|
|
405
|
-
// enabled: true,
|
|
406
|
-
// variables: {},
|
|
407
|
-
// },
|
|
408
|
-
// },
|
|
409
|
-
// }
|
|
410
|
-
// const flagsAll = await getFlagsAll(options)
|
|
411
|
-
// expect(flagsAll).toEqual(options.defaultFeatureFlags)
|
|
412
|
-
// })
|
|
413
|
-
// it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
|
|
414
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
415
|
-
// createInstance: () => ({
|
|
416
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
417
|
-
// createUserContext: () => ({
|
|
418
|
-
// decideAll: jest
|
|
419
|
-
// .fn()
|
|
420
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
421
|
-
// return flagsMock as {
|
|
422
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
423
|
-
// }
|
|
424
|
-
// }),
|
|
425
|
-
// }),
|
|
426
|
-
// onReady: jest
|
|
427
|
-
// .fn()
|
|
428
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
429
|
-
// }),
|
|
430
|
-
// }))
|
|
431
|
-
// const { getFlagsAll } = require('../utils')
|
|
432
|
-
// const flagsAll = await getFlagsAll()
|
|
433
|
-
// expect(flagsAll).toEqual({})
|
|
434
|
-
// })
|
|
435
|
-
// })
|
|
436
|
-
// describe('closeFlagsInstance', () => {
|
|
437
|
-
// it('should close sdk instance successfully', async () => {
|
|
438
|
-
// const spy = jest.spyOn(console, 'log')
|
|
439
|
-
// await getFlagsAll()
|
|
440
|
-
// await closeFlagsInstance()
|
|
441
|
-
// expect(spy).toHaveBeenCalledWith('optimizely instance closed successfully')
|
|
442
|
-
// })
|
|
443
|
-
// it('should not close sdk instance sucessfully', async () => {
|
|
444
|
-
// const spy = jest.spyOn(console, 'log')
|
|
445
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
446
|
-
// createInstance: () => ({
|
|
447
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
448
|
-
// createUserContext: () => ({
|
|
449
|
-
// decide: jest
|
|
450
|
-
// .fn()
|
|
451
|
-
// .mockImplementation(
|
|
452
|
-
// (key: string, options?: OptimizelyDecideOption[]) => {
|
|
453
|
-
// return getFlagsAll as Omit<OptimizelyDecision, 'userContext'>
|
|
454
|
-
// }
|
|
455
|
-
// ),
|
|
456
|
-
// }),
|
|
457
|
-
// onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
458
|
-
// close: jest
|
|
459
|
-
// .fn()
|
|
460
|
-
// .mockResolvedValue({ success: false, reason: 'Closing rejected' }),
|
|
461
|
-
// }),
|
|
462
|
-
// }))
|
|
463
|
-
// const { getFlagsAll, closeFlagsInstance } = require('../utils')
|
|
464
|
-
// await getFlagsAll()
|
|
465
|
-
// await closeFlagsInstance()
|
|
466
|
-
// expect(spy).toHaveBeenCalledWith(
|
|
467
|
-
// 'closing Optimizely instance failed, reason: Closing rejected'
|
|
468
|
-
// )
|
|
469
|
-
// })
|
|
470
|
-
// })
|
|
471
|
-
// describe('getFlag', () => {
|
|
472
|
-
// it('should return a flag with default options', async () => {
|
|
473
|
-
// const flag = await getFlag('testing_flag_with_variations_and_variables')
|
|
474
|
-
// expect(flag).toEqual({
|
|
475
|
-
// testing_flag_with_variations_and_variables: {
|
|
476
|
-
// variationKey: 'primary_with_new_weclome_message_and_max_accounts',
|
|
477
|
-
// enabled: true,
|
|
478
|
-
// variables: {
|
|
479
|
-
// family_primary_welcome_message: 'This is the new message',
|
|
480
|
-
// family_primary_enable_secondary_accounts: true,
|
|
481
|
-
// family_primary_max_secondary_accounts: 10,
|
|
482
|
-
// family_primary_metadata_json: {
|
|
483
|
-
// metadata1: 'a',
|
|
484
|
-
// },
|
|
485
|
-
// },
|
|
486
|
-
// },
|
|
487
|
-
// })
|
|
488
|
-
// })
|
|
489
|
-
// it('should return empty object if no flags are fetched', async () => {
|
|
490
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
491
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk'),
|
|
492
|
-
// createInstance: () => ({
|
|
493
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
494
|
-
// createUserContext: () => ({
|
|
495
|
-
// decide: jest
|
|
496
|
-
// .fn()
|
|
497
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
498
|
-
// return undefined
|
|
499
|
-
// }),
|
|
500
|
-
// }),
|
|
501
|
-
// onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
502
|
-
// close: jest.fn().mockResolvedValue({ success: true }),
|
|
503
|
-
// }),
|
|
504
|
-
// }))
|
|
505
|
-
// const { getFlag } = require('../utils')
|
|
506
|
-
// const flagsAll = await getFlag('testing_flag_with_variations_and_variables')
|
|
507
|
-
// expect(flagsAll).toEqual({})
|
|
508
|
-
// })
|
|
509
|
-
// it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
|
|
510
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
511
|
-
// createInstance: () => ({
|
|
512
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
513
|
-
// createUserContext: () => ({
|
|
514
|
-
// decide: jest
|
|
515
|
-
// .fn()
|
|
516
|
-
// .mockImplementation(
|
|
517
|
-
// (key: string, options?: OptimizelyDecideOption[]) => {
|
|
518
|
-
// return flagsMock[key] as Omit<OptimizelyDecision, 'userContext'>
|
|
519
|
-
// }
|
|
520
|
-
// ),
|
|
521
|
-
// }),
|
|
522
|
-
// onReady: jest
|
|
523
|
-
// .fn()
|
|
524
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
525
|
-
// }),
|
|
526
|
-
// }))
|
|
527
|
-
// const { getFlag } = require('../utils')
|
|
528
|
-
// const options: SDKConfig = {
|
|
529
|
-
// defaultFeatureFlags: {
|
|
530
|
-
// default_flag: {
|
|
531
|
-
// variationKey: 'off',
|
|
532
|
-
// enabled: true,
|
|
533
|
-
// variables: {},
|
|
534
|
-
// },
|
|
535
|
-
// },
|
|
536
|
-
// }
|
|
537
|
-
// const flag = await getFlag(
|
|
538
|
-
// 'testing_flag_with_variations_and_variables',
|
|
539
|
-
// options
|
|
540
|
-
// )
|
|
541
|
-
// expect(flag).toEqual(options.defaultFeatureFlags)
|
|
542
|
-
// })
|
|
543
|
-
// it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
|
|
544
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
545
|
-
// createInstance: () => ({
|
|
546
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
547
|
-
// createUserContext: () => ({
|
|
548
|
-
// decide: jest
|
|
549
|
-
// .fn()
|
|
550
|
-
// .mockImplementation(
|
|
551
|
-
// (key: string, options?: OptimizelyDecideOption[]) => {
|
|
552
|
-
// return flagsMock[key] as Omit<OptimizelyDecision, 'userContext'>
|
|
553
|
-
// }
|
|
554
|
-
// ),
|
|
555
|
-
// }),
|
|
556
|
-
// onReady: jest
|
|
557
|
-
// .fn()
|
|
558
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
559
|
-
// }),
|
|
560
|
-
// }))
|
|
561
|
-
// const { getFlag } = require('../utils')
|
|
562
|
-
// const flag = await getFlag('testing_flag_with_variations_and_variables')
|
|
563
|
-
// expect(flag).toEqual({})
|
|
564
|
-
// })
|
|
565
|
-
// })
|
|
566
|
-
// describe('getFlagsByKeys', () => {
|
|
567
|
-
// it('should return flags by keys with default options', async () => {
|
|
568
|
-
// const flagsByKeys = await getFlagsByKeys([
|
|
569
|
-
// 'another_test_flag_1',
|
|
570
|
-
// 'qualtrics_flag',
|
|
571
|
-
// ])
|
|
572
|
-
// expect(flagsByKeys).toEqual({
|
|
573
|
-
// qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
|
|
574
|
-
// another_test_flag_1: {
|
|
575
|
-
// variationKey: 'off',
|
|
576
|
-
// enabled: false,
|
|
577
|
-
// variables: {},
|
|
578
|
-
// },
|
|
579
|
-
// })
|
|
580
|
-
// })
|
|
581
|
-
// it('should return empty object if no flags are fetched', async () => {
|
|
582
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
583
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk'),
|
|
584
|
-
// createInstance: () => ({
|
|
585
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
586
|
-
// createUserContext: () => ({
|
|
587
|
-
// decideForKeys: jest
|
|
588
|
-
// .fn()
|
|
589
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
590
|
-
// return undefined
|
|
591
|
-
// }),
|
|
592
|
-
// }),
|
|
593
|
-
// onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
594
|
-
// close: jest.fn().mockResolvedValue({ success: true }),
|
|
595
|
-
// }),
|
|
596
|
-
// }))
|
|
597
|
-
// const { getFlagsByKeys } = require('../utils')
|
|
598
|
-
// const flagsAll = await getFlagsByKeys([
|
|
599
|
-
// 'another_test_flag_1',
|
|
600
|
-
// 'qualtrics_flag',
|
|
601
|
-
// ])
|
|
602
|
-
// expect(flagsAll).toEqual({})
|
|
603
|
-
// })
|
|
604
|
-
// it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
|
|
605
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
606
|
-
// createInstance: () => ({
|
|
607
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
608
|
-
// createUserContext: () => ({
|
|
609
|
-
// decideForKeys: jest
|
|
610
|
-
// .fn()
|
|
611
|
-
// .mockImplementation(
|
|
612
|
-
// (keys: string[], options?: OptimizelyDecideOption[]) => {
|
|
613
|
-
// const filtered: {
|
|
614
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
615
|
-
// } = {}
|
|
616
|
-
// keys.forEach((k) => (filtered[k] = flagsMock[k]))
|
|
617
|
-
// return filtered
|
|
618
|
-
// }
|
|
619
|
-
// ),
|
|
620
|
-
// }),
|
|
621
|
-
// onReady: jest
|
|
622
|
-
// .fn()
|
|
623
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
624
|
-
// }),
|
|
625
|
-
// }))
|
|
626
|
-
// const { getFlagsByKeys } = require('../utils')
|
|
627
|
-
// const options: SDKConfig = {
|
|
628
|
-
// defaultFeatureFlags: {
|
|
629
|
-
// default_flag: {
|
|
630
|
-
// variationKey: 'off',
|
|
631
|
-
// enabled: true,
|
|
632
|
-
// variables: {},
|
|
633
|
-
// },
|
|
634
|
-
// },
|
|
635
|
-
// }
|
|
636
|
-
// const flagsByKeys = await getFlagsByKeys(
|
|
637
|
-
// ['another_test_flag_1', 'qualtrics_flag'],
|
|
638
|
-
// options
|
|
639
|
-
// )
|
|
640
|
-
// expect(flagsByKeys).toEqual(options.defaultFeatureFlags)
|
|
641
|
-
// })
|
|
642
|
-
// it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
|
|
643
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
644
|
-
// createInstance: () => ({
|
|
645
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
646
|
-
// createUserContext: () => ({
|
|
647
|
-
// decideForKeys: jest
|
|
648
|
-
// .fn()
|
|
649
|
-
// .mockImplementation(
|
|
650
|
-
// (keys: string[], options?: OptimizelyDecideOption[]) => {
|
|
651
|
-
// const filtered: {
|
|
652
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
653
|
-
// } = {}
|
|
654
|
-
// keys.forEach((k) => (filtered[k] = flagsMock[k]))
|
|
655
|
-
// return filtered
|
|
656
|
-
// }
|
|
657
|
-
// ),
|
|
658
|
-
// }),
|
|
659
|
-
// onReady: jest
|
|
660
|
-
// .fn()
|
|
661
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
662
|
-
// }),
|
|
663
|
-
// }))
|
|
664
|
-
// const { getFlagsByKeys } = require('../utils')
|
|
665
|
-
// const flagsByKeys = await getFlagsByKeys([
|
|
666
|
-
// 'another_test_flag_1',
|
|
667
|
-
// 'qualtrics_flag',
|
|
668
|
-
// ])
|
|
669
|
-
// expect(flagsByKeys).toEqual({})
|
|
670
|
-
// })
|
|
671
|
-
// })
|
|
672
593
|
//# sourceMappingURL=utils.tests.js.map
|