@newskit-render/feature-flags 1.9.1 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -48
- package/dist/cjs/__tests__/utils.tests.js +200 -352
- package/dist/cjs/__tests__/utils.tests.js.map +1 -1
- package/dist/cjs/optimizelyClient.d.ts +4 -0
- package/dist/cjs/optimizelyClient.js +41 -0
- package/dist/cjs/optimizelyClient.js.map +1 -0
- package/dist/cjs/types.d.ts +3 -10
- package/dist/cjs/types.js +1 -25
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils.d.ts +3 -3
- package/dist/cjs/utils.js +55 -162
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/__tests__/utils.tests.js +201 -353
- package/dist/esm/__tests__/utils.tests.js.map +1 -1
- package/dist/esm/optimizelyClient.d.ts +4 -0
- package/dist/esm/optimizelyClient.js +36 -0
- package/dist/esm/optimizelyClient.js.map +1 -0
- package/dist/esm/types.d.ts +3 -10
- package/dist/esm/types.js +0 -24
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils.d.ts +3 -3
- package/dist/esm/utils.js +52 -159
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 {
|
|
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,51 +133,55 @@ 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
|
-
|
|
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 () {
|
|
149
154
|
var flagsAll;
|
|
150
155
|
return __generator(this, function (_a) {
|
|
151
156
|
switch (_a.label) {
|
|
152
|
-
case 0: return [4 /*yield*/,
|
|
157
|
+
case 0: return [4 /*yield*/, getAllFeatureFlags()];
|
|
153
158
|
case 1:
|
|
154
159
|
flagsAll = _a.sent();
|
|
155
160
|
expect(flagsAll).toEqual({
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
161
|
+
test_flag_3: false,
|
|
162
|
+
test_flag_1: true,
|
|
163
|
+
test_flag_2: true,
|
|
159
164
|
testing_flag_with_variations_and_variables: true,
|
|
160
165
|
});
|
|
161
166
|
return [2 /*return*/];
|
|
162
167
|
}
|
|
163
168
|
});
|
|
164
169
|
}); });
|
|
165
|
-
it('should return all flags with included variable data when "includeFlagVariables: true" is added in the
|
|
166
|
-
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;
|
|
167
172
|
return __generator(this, function (_a) {
|
|
168
173
|
switch (_a.label) {
|
|
169
|
-
case 0:
|
|
170
|
-
options = {
|
|
171
|
-
includeFlagVariables: true,
|
|
172
|
-
};
|
|
173
|
-
return [4 /*yield*/, initAndGetFeatureFlag(options)];
|
|
174
|
+
case 0: return [4 /*yield*/, getAllFeatureFlags(optionsWithIncludeFlagVariables)];
|
|
174
175
|
case 1:
|
|
175
176
|
flagsAll = _a.sent();
|
|
176
177
|
expect(flagsAll).toEqual({
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
|
|
179
|
+
test_flag_2: {
|
|
179
180
|
variationKey: 'max_10',
|
|
180
181
|
enabled: true,
|
|
181
182
|
variables: { max_family_members: 10 },
|
|
182
183
|
},
|
|
183
|
-
|
|
184
|
+
test_flag_3: {
|
|
184
185
|
variationKey: 'off',
|
|
185
186
|
enabled: false,
|
|
186
187
|
variables: {},
|
|
@@ -203,19 +204,19 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
203
204
|
});
|
|
204
205
|
}); });
|
|
205
206
|
it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
206
|
-
var
|
|
207
|
+
var getAllFeatureFlags, flagsAll;
|
|
207
208
|
return __generator(this, function (_a) {
|
|
208
209
|
switch (_a.label) {
|
|
209
210
|
case 0:
|
|
210
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 ({
|
|
211
212
|
decideAll: jest
|
|
212
213
|
.fn()
|
|
213
|
-
.mockImplementation(function (
|
|
214
|
+
.mockImplementation(function (config) {
|
|
214
215
|
return undefined;
|
|
215
216
|
}),
|
|
216
|
-
}); }, onReady: jest.fn().mockResolvedValue({ success: true })
|
|
217
|
-
|
|
218
|
-
return [4 /*yield*/,
|
|
217
|
+
}); }, onReady: jest.fn().mockResolvedValue({ success: true }) })); } })); });
|
|
218
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
219
|
+
return [4 /*yield*/, getAllFeatureFlags()];
|
|
219
220
|
case 1:
|
|
220
221
|
flagsAll = _a.sent();
|
|
221
222
|
expect(flagsAll).toEqual({});
|
|
@@ -223,13 +224,34 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
223
224
|
}
|
|
224
225
|
});
|
|
225
226
|
}); });
|
|
226
|
-
it('should return
|
|
227
|
-
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;
|
|
228
250
|
return __generator(this, function (_a) {
|
|
229
251
|
switch (_a.label) {
|
|
230
252
|
case 0:
|
|
231
253
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
|
|
232
|
-
|
|
254
|
+
config = {
|
|
233
255
|
sdkConfig: {
|
|
234
256
|
sdkKey: 'custom-optimizely-sdk',
|
|
235
257
|
},
|
|
@@ -239,17 +261,17 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
239
261
|
},
|
|
240
262
|
includeFlagVariables: true,
|
|
241
263
|
};
|
|
242
|
-
return [4 /*yield*/,
|
|
264
|
+
return [4 /*yield*/, getAllFeatureFlags(config)];
|
|
243
265
|
case 1:
|
|
244
266
|
flagsAll = _a.sent();
|
|
245
267
|
expect(flagsAll).toEqual({
|
|
246
|
-
|
|
247
|
-
|
|
268
|
+
test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
|
|
269
|
+
test_flag_2: {
|
|
248
270
|
variationKey: 'max_10',
|
|
249
271
|
enabled: true,
|
|
250
272
|
variables: { max_family_members: 10 },
|
|
251
273
|
},
|
|
252
|
-
|
|
274
|
+
test_flag_3: {
|
|
253
275
|
variationKey: 'off',
|
|
254
276
|
enabled: false,
|
|
255
277
|
variables: {},
|
|
@@ -277,7 +299,7 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
277
299
|
switch (_a.label) {
|
|
278
300
|
case 0:
|
|
279
301
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
|
|
280
|
-
return [4 /*yield*/,
|
|
302
|
+
return [4 /*yield*/, getAllFeatureFlags()];
|
|
281
303
|
case 1:
|
|
282
304
|
flagsAll = _a.sent();
|
|
283
305
|
expect(flagsAll).toEqual({});
|
|
@@ -286,15 +308,15 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
286
308
|
});
|
|
287
309
|
}); });
|
|
288
310
|
it('should return empty object when sdk not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
289
|
-
var
|
|
311
|
+
var getAllFeatureFlags, flagsAll;
|
|
290
312
|
return __generator(this, function (_a) {
|
|
291
313
|
switch (_a.label) {
|
|
292
314
|
case 0:
|
|
293
315
|
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
294
316
|
createInstance: jest.fn().mockReturnValue(null),
|
|
295
317
|
}); });
|
|
296
|
-
|
|
297
|
-
return [4 /*yield*/,
|
|
318
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
319
|
+
return [4 /*yield*/, getAllFeatureFlags()];
|
|
298
320
|
case 1:
|
|
299
321
|
flagsAll = _a.sent();
|
|
300
322
|
expect(flagsAll).toEqual({});
|
|
@@ -303,15 +325,15 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
303
325
|
});
|
|
304
326
|
}); });
|
|
305
327
|
it('should return empty object when user context not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
306
|
-
var
|
|
328
|
+
var getAllFeatureFlags, flagsAll;
|
|
307
329
|
return __generator(this, function (_a) {
|
|
308
330
|
switch (_a.label) {
|
|
309
331
|
case 0:
|
|
310
332
|
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
311
333
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: jest.fn().mockReturnValue(null), onReady: jest.fn().mockResolvedValue({ success: true }) })); },
|
|
312
334
|
}); });
|
|
313
|
-
|
|
314
|
-
return [4 /*yield*/,
|
|
335
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
336
|
+
return [4 /*yield*/, getAllFeatureFlags()];
|
|
315
337
|
case 1:
|
|
316
338
|
flagsAll = _a.sent();
|
|
317
339
|
expect(flagsAll).toEqual({});
|
|
@@ -320,14 +342,14 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
320
342
|
});
|
|
321
343
|
}); });
|
|
322
344
|
it('should instantiate logger with log level', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
323
|
-
var
|
|
345
|
+
var config;
|
|
324
346
|
return __generator(this, function (_a) {
|
|
325
347
|
switch (_a.label) {
|
|
326
348
|
case 0:
|
|
327
|
-
|
|
349
|
+
config = {
|
|
328
350
|
logLevel: 'critical',
|
|
329
351
|
};
|
|
330
|
-
return [4 /*yield*/,
|
|
352
|
+
return [4 /*yield*/, getAllFeatureFlags(config)];
|
|
331
353
|
case 1:
|
|
332
354
|
_a.sent();
|
|
333
355
|
expect(setLogLevel).toBeCalledWith('critical');
|
|
@@ -337,7 +359,7 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
337
359
|
});
|
|
338
360
|
}); });
|
|
339
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 () {
|
|
340
|
-
var
|
|
362
|
+
var getAllFeatureFlags, flagsAll;
|
|
341
363
|
return __generator(this, function (_a) {
|
|
342
364
|
switch (_a.label) {
|
|
343
365
|
case 0:
|
|
@@ -345,15 +367,102 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
345
367
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
346
368
|
decideAll: jest
|
|
347
369
|
.fn()
|
|
348
|
-
.mockImplementation(function (
|
|
370
|
+
.mockImplementation(function (config) {
|
|
349
371
|
return flagsMock;
|
|
350
372
|
}),
|
|
351
373
|
}); }, onReady: jest
|
|
352
374
|
.fn()
|
|
353
375
|
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
354
376
|
}); });
|
|
355
|
-
|
|
356
|
-
|
|
377
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
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 = {
|
|
357
466
|
defaultFeatureFlags: {
|
|
358
467
|
default_flag: {
|
|
359
468
|
variationKey: 'off',
|
|
@@ -362,304 +471,43 @@ describe('initAndGetFeatureFlag', function () {
|
|
|
362
471
|
},
|
|
363
472
|
},
|
|
364
473
|
};
|
|
365
|
-
return [4 /*yield*/,
|
|
474
|
+
return [4 /*yield*/, getFeatureFlagsByKeys(['test_flag_3', 'test_flag_1'], config)];
|
|
366
475
|
case 1:
|
|
367
|
-
|
|
368
|
-
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({});
|
|
369
508
|
return [2 /*return*/];
|
|
370
509
|
}
|
|
371
510
|
});
|
|
372
511
|
}); });
|
|
373
512
|
});
|
|
374
|
-
// describe('getFlagsAll', () => {
|
|
375
|
-
// it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
|
|
376
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
377
|
-
// createInstance: () => ({
|
|
378
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
379
|
-
// createUserContext: () => ({
|
|
380
|
-
// decideAll: jest
|
|
381
|
-
// .fn()
|
|
382
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
383
|
-
// return flagsMock as {
|
|
384
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
385
|
-
// }
|
|
386
|
-
// }),
|
|
387
|
-
// }),
|
|
388
|
-
// onReady: jest
|
|
389
|
-
// .fn()
|
|
390
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
391
|
-
// }),
|
|
392
|
-
// }))
|
|
393
|
-
// const { getFlagsAll } = require('../utils')
|
|
394
|
-
// const options: SDKConfig = {
|
|
395
|
-
// defaultFeatureFlags: {
|
|
396
|
-
// default_flag: {
|
|
397
|
-
// variationKey: 'off',
|
|
398
|
-
// enabled: true,
|
|
399
|
-
// variables: {},
|
|
400
|
-
// },
|
|
401
|
-
// },
|
|
402
|
-
// }
|
|
403
|
-
// const flagsAll = await getFlagsAll(options)
|
|
404
|
-
// expect(flagsAll).toEqual(options.defaultFeatureFlags)
|
|
405
|
-
// })
|
|
406
|
-
// it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
|
|
407
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
408
|
-
// createInstance: () => ({
|
|
409
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
410
|
-
// createUserContext: () => ({
|
|
411
|
-
// decideAll: jest
|
|
412
|
-
// .fn()
|
|
413
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
414
|
-
// return flagsMock as {
|
|
415
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
416
|
-
// }
|
|
417
|
-
// }),
|
|
418
|
-
// }),
|
|
419
|
-
// onReady: jest
|
|
420
|
-
// .fn()
|
|
421
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
422
|
-
// }),
|
|
423
|
-
// }))
|
|
424
|
-
// const { getFlagsAll } = require('../utils')
|
|
425
|
-
// const flagsAll = await getFlagsAll()
|
|
426
|
-
// expect(flagsAll).toEqual({})
|
|
427
|
-
// })
|
|
428
|
-
// })
|
|
429
|
-
// describe('closeFlagsInstance', () => {
|
|
430
|
-
// it('should close sdk instance successfully', async () => {
|
|
431
|
-
// const spy = jest.spyOn(console, 'log')
|
|
432
|
-
// await getFlagsAll()
|
|
433
|
-
// await closeFlagsInstance()
|
|
434
|
-
// expect(spy).toHaveBeenCalledWith('optimizely instance closed successfully')
|
|
435
|
-
// })
|
|
436
|
-
// it('should not close sdk instance sucessfully', async () => {
|
|
437
|
-
// const spy = jest.spyOn(console, 'log')
|
|
438
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
439
|
-
// createInstance: () => ({
|
|
440
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
441
|
-
// createUserContext: () => ({
|
|
442
|
-
// decide: jest
|
|
443
|
-
// .fn()
|
|
444
|
-
// .mockImplementation(
|
|
445
|
-
// (key: string, options?: OptimizelyDecideOption[]) => {
|
|
446
|
-
// return getFlagsAll as Omit<OptimizelyDecision, 'userContext'>
|
|
447
|
-
// }
|
|
448
|
-
// ),
|
|
449
|
-
// }),
|
|
450
|
-
// onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
451
|
-
// close: jest
|
|
452
|
-
// .fn()
|
|
453
|
-
// .mockResolvedValue({ success: false, reason: 'Closing rejected' }),
|
|
454
|
-
// }),
|
|
455
|
-
// }))
|
|
456
|
-
// const { getFlagsAll, closeFlagsInstance } = require('../utils')
|
|
457
|
-
// await getFlagsAll()
|
|
458
|
-
// await closeFlagsInstance()
|
|
459
|
-
// expect(spy).toHaveBeenCalledWith(
|
|
460
|
-
// 'closing Optimizely instance failed, reason: Closing rejected'
|
|
461
|
-
// )
|
|
462
|
-
// })
|
|
463
|
-
// })
|
|
464
|
-
// describe('getFlag', () => {
|
|
465
|
-
// it('should return a flag with default options', async () => {
|
|
466
|
-
// const flag = await getFlag('testing_flag_with_variations_and_variables')
|
|
467
|
-
// expect(flag).toEqual({
|
|
468
|
-
// testing_flag_with_variations_and_variables: {
|
|
469
|
-
// variationKey: 'primary_with_new_weclome_message_and_max_accounts',
|
|
470
|
-
// enabled: true,
|
|
471
|
-
// variables: {
|
|
472
|
-
// family_primary_welcome_message: 'This is the new message',
|
|
473
|
-
// family_primary_enable_secondary_accounts: true,
|
|
474
|
-
// family_primary_max_secondary_accounts: 10,
|
|
475
|
-
// family_primary_metadata_json: {
|
|
476
|
-
// metadata1: 'a',
|
|
477
|
-
// },
|
|
478
|
-
// },
|
|
479
|
-
// },
|
|
480
|
-
// })
|
|
481
|
-
// })
|
|
482
|
-
// it('should return empty object if no flags are fetched', async () => {
|
|
483
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
484
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk'),
|
|
485
|
-
// createInstance: () => ({
|
|
486
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
487
|
-
// createUserContext: () => ({
|
|
488
|
-
// decide: jest
|
|
489
|
-
// .fn()
|
|
490
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
491
|
-
// return undefined
|
|
492
|
-
// }),
|
|
493
|
-
// }),
|
|
494
|
-
// onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
495
|
-
// close: jest.fn().mockResolvedValue({ success: true }),
|
|
496
|
-
// }),
|
|
497
|
-
// }))
|
|
498
|
-
// const { getFlag } = require('../utils')
|
|
499
|
-
// const flagsAll = await getFlag('testing_flag_with_variations_and_variables')
|
|
500
|
-
// expect(flagsAll).toEqual({})
|
|
501
|
-
// })
|
|
502
|
-
// it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
|
|
503
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
504
|
-
// createInstance: () => ({
|
|
505
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
506
|
-
// createUserContext: () => ({
|
|
507
|
-
// decide: jest
|
|
508
|
-
// .fn()
|
|
509
|
-
// .mockImplementation(
|
|
510
|
-
// (key: string, options?: OptimizelyDecideOption[]) => {
|
|
511
|
-
// return flagsMock[key] as Omit<OptimizelyDecision, 'userContext'>
|
|
512
|
-
// }
|
|
513
|
-
// ),
|
|
514
|
-
// }),
|
|
515
|
-
// onReady: jest
|
|
516
|
-
// .fn()
|
|
517
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
518
|
-
// }),
|
|
519
|
-
// }))
|
|
520
|
-
// const { getFlag } = require('../utils')
|
|
521
|
-
// const options: SDKConfig = {
|
|
522
|
-
// defaultFeatureFlags: {
|
|
523
|
-
// default_flag: {
|
|
524
|
-
// variationKey: 'off',
|
|
525
|
-
// enabled: true,
|
|
526
|
-
// variables: {},
|
|
527
|
-
// },
|
|
528
|
-
// },
|
|
529
|
-
// }
|
|
530
|
-
// const flag = await getFlag(
|
|
531
|
-
// 'testing_flag_with_variations_and_variables',
|
|
532
|
-
// options
|
|
533
|
-
// )
|
|
534
|
-
// expect(flag).toEqual(options.defaultFeatureFlags)
|
|
535
|
-
// })
|
|
536
|
-
// it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
|
|
537
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
538
|
-
// createInstance: () => ({
|
|
539
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
540
|
-
// createUserContext: () => ({
|
|
541
|
-
// decide: jest
|
|
542
|
-
// .fn()
|
|
543
|
-
// .mockImplementation(
|
|
544
|
-
// (key: string, options?: OptimizelyDecideOption[]) => {
|
|
545
|
-
// return flagsMock[key] as Omit<OptimizelyDecision, 'userContext'>
|
|
546
|
-
// }
|
|
547
|
-
// ),
|
|
548
|
-
// }),
|
|
549
|
-
// onReady: jest
|
|
550
|
-
// .fn()
|
|
551
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
552
|
-
// }),
|
|
553
|
-
// }))
|
|
554
|
-
// const { getFlag } = require('../utils')
|
|
555
|
-
// const flag = await getFlag('testing_flag_with_variations_and_variables')
|
|
556
|
-
// expect(flag).toEqual({})
|
|
557
|
-
// })
|
|
558
|
-
// })
|
|
559
|
-
// describe('getFlagsByKeys', () => {
|
|
560
|
-
// it('should return flags by keys with default options', async () => {
|
|
561
|
-
// const flagsByKeys = await getFlagsByKeys([
|
|
562
|
-
// 'another_test_flag_1',
|
|
563
|
-
// 'qualtrics_flag',
|
|
564
|
-
// ])
|
|
565
|
-
// expect(flagsByKeys).toEqual({
|
|
566
|
-
// qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
|
|
567
|
-
// another_test_flag_1: {
|
|
568
|
-
// variationKey: 'off',
|
|
569
|
-
// enabled: false,
|
|
570
|
-
// variables: {},
|
|
571
|
-
// },
|
|
572
|
-
// })
|
|
573
|
-
// })
|
|
574
|
-
// it('should return empty object if no flags are fetched', async () => {
|
|
575
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
576
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk'),
|
|
577
|
-
// createInstance: () => ({
|
|
578
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
579
|
-
// createUserContext: () => ({
|
|
580
|
-
// decideForKeys: jest
|
|
581
|
-
// .fn()
|
|
582
|
-
// .mockImplementation((options?: OptimizelyDecideOption[]) => {
|
|
583
|
-
// return undefined
|
|
584
|
-
// }),
|
|
585
|
-
// }),
|
|
586
|
-
// onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
587
|
-
// close: jest.fn().mockResolvedValue({ success: true }),
|
|
588
|
-
// }),
|
|
589
|
-
// }))
|
|
590
|
-
// const { getFlagsByKeys } = require('../utils')
|
|
591
|
-
// const flagsAll = await getFlagsByKeys([
|
|
592
|
-
// 'another_test_flag_1',
|
|
593
|
-
// 'qualtrics_flag',
|
|
594
|
-
// ])
|
|
595
|
-
// expect(flagsAll).toEqual({})
|
|
596
|
-
// })
|
|
597
|
-
// it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
|
|
598
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
599
|
-
// createInstance: () => ({
|
|
600
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
601
|
-
// createUserContext: () => ({
|
|
602
|
-
// decideForKeys: jest
|
|
603
|
-
// .fn()
|
|
604
|
-
// .mockImplementation(
|
|
605
|
-
// (keys: string[], options?: OptimizelyDecideOption[]) => {
|
|
606
|
-
// const filtered: {
|
|
607
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
608
|
-
// } = {}
|
|
609
|
-
// keys.forEach((k) => (filtered[k] = flagsMock[k]))
|
|
610
|
-
// return filtered
|
|
611
|
-
// }
|
|
612
|
-
// ),
|
|
613
|
-
// }),
|
|
614
|
-
// onReady: jest
|
|
615
|
-
// .fn()
|
|
616
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
617
|
-
// }),
|
|
618
|
-
// }))
|
|
619
|
-
// const { getFlagsByKeys } = require('../utils')
|
|
620
|
-
// const options: SDKConfig = {
|
|
621
|
-
// defaultFeatureFlags: {
|
|
622
|
-
// default_flag: {
|
|
623
|
-
// variationKey: 'off',
|
|
624
|
-
// enabled: true,
|
|
625
|
-
// variables: {},
|
|
626
|
-
// },
|
|
627
|
-
// },
|
|
628
|
-
// }
|
|
629
|
-
// const flagsByKeys = await getFlagsByKeys(
|
|
630
|
-
// ['another_test_flag_1', 'qualtrics_flag'],
|
|
631
|
-
// options
|
|
632
|
-
// )
|
|
633
|
-
// expect(flagsByKeys).toEqual(options.defaultFeatureFlags)
|
|
634
|
-
// })
|
|
635
|
-
// it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
|
|
636
|
-
// jest.doMock('@optimizely/optimizely-sdk', () => ({
|
|
637
|
-
// createInstance: () => ({
|
|
638
|
-
// ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
|
|
639
|
-
// createUserContext: () => ({
|
|
640
|
-
// decideForKeys: jest
|
|
641
|
-
// .fn()
|
|
642
|
-
// .mockImplementation(
|
|
643
|
-
// (keys: string[], options?: OptimizelyDecideOption[]) => {
|
|
644
|
-
// const filtered: {
|
|
645
|
-
// [key: string]: Omit<OptimizelyDecision, 'userContext'>
|
|
646
|
-
// } = {}
|
|
647
|
-
// keys.forEach((k) => (filtered[k] = flagsMock[k]))
|
|
648
|
-
// return filtered
|
|
649
|
-
// }
|
|
650
|
-
// ),
|
|
651
|
-
// }),
|
|
652
|
-
// onReady: jest
|
|
653
|
-
// .fn()
|
|
654
|
-
// .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
|
|
655
|
-
// }),
|
|
656
|
-
// }))
|
|
657
|
-
// const { getFlagsByKeys } = require('../utils')
|
|
658
|
-
// const flagsByKeys = await getFlagsByKeys([
|
|
659
|
-
// 'another_test_flag_1',
|
|
660
|
-
// 'qualtrics_flag',
|
|
661
|
-
// ])
|
|
662
|
-
// expect(flagsByKeys).toEqual({})
|
|
663
|
-
// })
|
|
664
|
-
// })
|
|
665
513
|
//# sourceMappingURL=utils.tests.js.map
|