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