@newskit-render/feature-flags 0.0.0-1fc471ad → 0.0.0-2609e2005

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.
@@ -10,69 +10,102 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
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 = 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
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
13
49
  Object.defineProperty(exports, "__esModule", { value: true });
50
+ var optimizely_sdk_1 = require("@optimizely/optimizely-sdk");
14
51
  var utils_1 = require("../utils");
15
- // import { SDKConfig } from '../types'
16
52
  var originalEnv = process.env;
17
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 ({
18
54
  decide: jest
19
55
  .fn()
20
- .mockImplementation(function (key, options) {
56
+ .mockImplementation(function (key, config) {
21
57
  return flagsMock[key];
22
58
  }),
23
59
  decideForKeys: jest
24
60
  .fn()
25
- .mockImplementation(function (keys, options) {
61
+ .mockImplementation(function (keys, config) {
26
62
  var filtered = {};
27
63
  keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
28
64
  return filtered;
29
65
  }),
30
66
  decideAll: jest
31
67
  .fn()
32
- .mockImplementation(function (options) {
68
+ .mockImplementation(function (config) {
33
69
  return flagsMock;
34
70
  }),
35
71
  }); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); }, setLogLevel: jest.fn(), setLogger: jest.fn() })); });
36
72
  var flagsMock = {
37
- qualtrics_flag: {
73
+ test_flag_1: {
38
74
  variationKey: 'on',
39
75
  enabled: true,
40
76
  variables: {},
41
77
  ruleKey: 'default-rollout-216689-29200910123',
42
- flagKey: 'qualtrics_flag',
78
+ flagKey: 'test_flag_1',
43
79
  userContext: {
44
80
  _qualifiedSegments: null,
45
- // optimizely: [e],
46
81
  userId: 'user123',
47
82
  attributes: {},
48
83
  forcedDecisionsMap: {},
49
84
  },
50
85
  reasons: [],
51
86
  },
52
- testing_flag: {
87
+ test_flag_2: {
53
88
  variationKey: 'max_10',
54
89
  enabled: true,
55
90
  variables: { max_family_members: 10 },
56
91
  ruleKey: 'default-rollout-223709-29200910123',
57
- flagKey: 'testing_flag',
92
+ flagKey: 'test_flag_2',
58
93
  userContext: {
59
94
  _qualifiedSegments: null,
60
- // optimizely: [e],
61
95
  userId: 'user123',
62
96
  attributes: {},
63
97
  forcedDecisionsMap: {},
64
98
  },
65
99
  reasons: [],
66
100
  },
67
- another_test_flag_1: {
101
+ test_flag_3: {
68
102
  variationKey: 'off',
69
103
  enabled: false,
70
104
  variables: {},
71
105
  ruleKey: 'default-rollout-225089-29200910123',
72
- flagKey: 'another_test_flag_1',
106
+ flagKey: 'test_flag_3',
73
107
  userContext: {
74
108
  _qualifiedSegments: null,
75
- // optimizely: [e],
76
109
  userId: 'user123',
77
110
  attributes: {},
78
111
  forcedDecisionsMap: {},
@@ -102,434 +135,381 @@ var flagsMock = {
102
135
  reasons: [],
103
136
  },
104
137
  };
105
- // TO DO: Improve test coverage
106
138
  beforeEach(function () {
107
139
  jest.resetModules();
108
140
  process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: 'optimizely-sdk-key' });
109
141
  });
110
- afterEach(function () {
111
- (0, utils_1._resetInstance)();
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
+ var flagsAll;
157
+ return __generator(this, function (_a) {
158
+ switch (_a.label) {
159
+ case 0: return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)()];
160
+ case 1:
161
+ flagsAll = _a.sent();
162
+ expect(flagsAll).toEqual({
163
+ test_flag_3: false,
164
+ test_flag_1: true,
165
+ test_flag_2: true,
166
+ testing_flag_with_variations_and_variables: true,
167
+ });
168
+ return [2 /*return*/];
169
+ }
170
+ });
171
+ }); });
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
+ return __generator(this, function (_a) {
175
+ switch (_a.label) {
176
+ case 0: return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(optionsWithIncludeFlagVariables)];
177
+ case 1:
178
+ flagsAll = _a.sent();
179
+ expect(flagsAll).toEqual({
180
+ test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
181
+ test_flag_2: {
182
+ variationKey: 'max_10',
183
+ enabled: true,
184
+ variables: { max_family_members: 10 },
185
+ },
186
+ test_flag_3: {
187
+ variationKey: 'off',
188
+ enabled: false,
189
+ variables: {},
190
+ },
191
+ testing_flag_with_variations_and_variables: {
192
+ variationKey: 'primary_with_new_weclome_message_and_max_accounts',
193
+ enabled: true,
194
+ variables: {
195
+ family_primary_welcome_message: 'This is the new message',
196
+ family_primary_enable_secondary_accounts: true,
197
+ family_primary_max_secondary_accounts: 10,
198
+ family_primary_metadata_json: {
199
+ metadata1: 'a',
200
+ },
201
+ },
202
+ },
203
+ });
204
+ return [2 /*return*/];
205
+ }
206
+ });
207
+ }); });
208
+ it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
209
+ var getAllFeatureFlags, flagsAll;
210
+ return __generator(this, function (_a) {
211
+ switch (_a.label) {
212
+ case 0:
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 ({
214
+ decideAll: jest
215
+ .fn()
216
+ .mockImplementation(function (config) {
217
+ return undefined;
218
+ }),
219
+ }); }, onReady: jest.fn().mockResolvedValue({ success: true }) })); } })); });
220
+ getAllFeatureFlags = require('../utils').getAllFeatureFlags;
221
+ return [4 /*yield*/, getAllFeatureFlags()];
222
+ case 1:
223
+ flagsAll = _a.sent();
224
+ expect(flagsAll).toEqual({});
225
+ return [2 /*return*/];
226
+ }
227
+ });
228
+ }); });
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;
252
+ return __generator(this, function (_a) {
253
+ switch (_a.label) {
254
+ case 0:
255
+ process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
256
+ config = {
257
+ sdkConfig: {
258
+ sdkKey: 'custom-optimizely-sdk',
259
+ },
260
+ userData: {
261
+ userId: 'user456',
262
+ attributes: { logged_in: true, cpn: 'AAA123', subs_type: 'digi-print' },
263
+ },
264
+ includeFlagVariables: true,
265
+ };
266
+ return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(config)];
267
+ case 1:
268
+ flagsAll = _a.sent();
269
+ expect(flagsAll).toEqual({
270
+ test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
271
+ test_flag_2: {
272
+ variationKey: 'max_10',
273
+ enabled: true,
274
+ variables: { max_family_members: 10 },
275
+ },
276
+ test_flag_3: {
277
+ variationKey: 'off',
278
+ enabled: false,
279
+ variables: {},
280
+ },
281
+ testing_flag_with_variations_and_variables: {
282
+ variationKey: 'primary_with_new_weclome_message_and_max_accounts',
283
+ enabled: true,
284
+ variables: {
285
+ family_primary_welcome_message: 'This is the new message',
286
+ family_primary_enable_secondary_accounts: true,
287
+ family_primary_max_secondary_accounts: 10,
288
+ family_primary_metadata_json: {
289
+ metadata1: 'a',
290
+ },
291
+ },
292
+ },
293
+ });
294
+ return [2 /*return*/];
295
+ }
296
+ });
297
+ }); });
298
+ it('should return empty object when called without sdk key', function () { return __awaiter(void 0, void 0, void 0, function () {
299
+ var flagsAll;
300
+ return __generator(this, function (_a) {
301
+ switch (_a.label) {
302
+ case 0:
303
+ process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
304
+ return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)()];
305
+ case 1:
306
+ flagsAll = _a.sent();
307
+ expect(flagsAll).toEqual({});
308
+ return [2 /*return*/];
309
+ }
310
+ });
311
+ }); });
312
+ it('should return empty object when sdk not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
313
+ var getAllFeatureFlags, flagsAll;
314
+ return __generator(this, function (_a) {
315
+ switch (_a.label) {
316
+ case 0:
317
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
318
+ createInstance: jest.fn().mockReturnValue(null),
319
+ }); });
320
+ getAllFeatureFlags = require('../utils').getAllFeatureFlags;
321
+ return [4 /*yield*/, getAllFeatureFlags()];
322
+ case 1:
323
+ flagsAll = _a.sent();
324
+ expect(flagsAll).toEqual({});
325
+ return [2 /*return*/];
326
+ }
327
+ });
328
+ }); });
329
+ it('should return empty object when user context not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
330
+ var getAllFeatureFlags, flagsAll;
331
+ return __generator(this, function (_a) {
332
+ switch (_a.label) {
333
+ case 0:
334
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
335
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: jest.fn().mockReturnValue(null), onReady: jest.fn().mockResolvedValue({ success: true }) })); },
336
+ }); });
337
+ getAllFeatureFlags = require('../utils').getAllFeatureFlags;
338
+ return [4 /*yield*/, getAllFeatureFlags()];
339
+ case 1:
340
+ flagsAll = _a.sent();
341
+ expect(flagsAll).toEqual({});
342
+ return [2 /*return*/];
343
+ }
344
+ });
345
+ }); });
346
+ it('should instantiate logger with log level', function () { return __awaiter(void 0, void 0, void 0, function () {
347
+ var config;
348
+ return __generator(this, function (_a) {
349
+ switch (_a.label) {
350
+ case 0:
351
+ config = {
352
+ logLevel: 'critical',
353
+ };
354
+ return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(config)];
355
+ case 1:
356
+ _a.sent();
357
+ expect(optimizely_sdk_1.setLogLevel).toBeCalledWith('critical');
358
+ expect(optimizely_sdk_1.setLogger).toHaveBeenCalled();
359
+ return [2 /*return*/];
360
+ }
361
+ });
362
+ }); });
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 () {
364
+ var getAllFeatureFlags, flagsAll;
365
+ return __generator(this, function (_a) {
366
+ switch (_a.label) {
367
+ case 0:
368
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
369
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
370
+ decideAll: jest
371
+ .fn()
372
+ .mockImplementation(function (config) {
373
+ return flagsMock;
374
+ }),
375
+ }); }, onReady: jest
376
+ .fn()
377
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
378
+ }); });
379
+ getAllFeatureFlags = require('../utils').getAllFeatureFlags;
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
+ }); });
112
388
  });
113
- describe('initAndGetFeatureFlag', function () {
114
- it('should return all feature flags', function () {
115
- expect(true).toBe(true);
116
- });
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 = {
468
+ defaultFeatureFlags: {
469
+ default_flag: {
470
+ variationKey: 'off',
471
+ enabled: true,
472
+ variables: {},
473
+ },
474
+ },
475
+ };
476
+ return [4 /*yield*/, getFeatureFlagsByKeys(['test_flag_3', 'test_flag_1'], config)];
477
+ case 1:
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
+ }); });
117
514
  });
118
- // describe('getFlagsAll', () => {
119
- // it('should return all flags with default options', async () => {
120
- // const flagsAll = await getFlagsAll()
121
- // expect(flagsAll).toEqual({
122
- // qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
123
- // testing_flag: {
124
- // variationKey: 'max_10',
125
- // enabled: true,
126
- // variables: { max_family_members: 10 },
127
- // },
128
- // another_test_flag_1: {
129
- // variationKey: 'off',
130
- // enabled: false,
131
- // variables: {},
132
- // },
133
- // testing_flag_with_variations_and_variables: {
134
- // variationKey: 'primary_with_new_weclome_message_and_max_accounts',
135
- // enabled: true,
136
- // variables: {
137
- // family_primary_welcome_message: 'This is the new message',
138
- // family_primary_enable_secondary_accounts: true,
139
- // family_primary_max_secondary_accounts: 10,
140
- // family_primary_metadata_json: {
141
- // metadata1: 'a',
142
- // },
143
- // },
144
- // },
145
- // })
146
- // })
147
- // it('should return all flags with custom options', async () => {
148
- // process.env = {
149
- // ...originalEnv,
150
- // OPTIMIZELY_SDK_KEY: undefined,
151
- // }
152
- // const options: SDKConfig = {
153
- // sdkConfig: {
154
- // sdkKey: 'custom-optimizely-sdk',
155
- // },
156
- // userData: {
157
- // userId: 'user456',
158
- // attributes: { logged_in: true, cpn: 'AAA123', subs_type: 'digi-print' },
159
- // },
160
- // includeFlagVariables: true,
161
- // }
162
- // const flagsAll = await getFlagsAll(options)
163
- // expect(flagsAll).toEqual({
164
- // qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
165
- // testing_flag: {
166
- // variationKey: 'max_10',
167
- // enabled: true,
168
- // variables: { max_family_members: 10 },
169
- // },
170
- // another_test_flag_1: {
171
- // variationKey: 'off',
172
- // enabled: false,
173
- // variables: {},
174
- // },
175
- // testing_flag_with_variations_and_variables: {
176
- // variationKey: 'primary_with_new_weclome_message_and_max_accounts',
177
- // enabled: true,
178
- // variables: {
179
- // family_primary_welcome_message: 'This is the new message',
180
- // family_primary_enable_secondary_accounts: true,
181
- // family_primary_max_secondary_accounts: 10,
182
- // family_primary_metadata_json: {
183
- // metadata1: 'a',
184
- // },
185
- // },
186
- // },
187
- // })
188
- // })
189
- // it('should return empty object if no flags are fetched', async () => {
190
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
191
- // ...jest.requireActual('@optimizely/optimizely-sdk'),
192
- // createInstance: () => ({
193
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
194
- // createUserContext: () => ({
195
- // decideAll: jest
196
- // .fn()
197
- // .mockImplementation((options?: OptimizelyDecideOption[]) => {
198
- // return undefined
199
- // }),
200
- // }),
201
- // onReady: jest.fn().mockResolvedValue({ success: true }),
202
- // close: jest.fn().mockResolvedValue({ success: true }),
203
- // }),
204
- // }))
205
- // const { getFlagsAll } = require('../utils')
206
- // const flagsAll = await getFlagsAll()
207
- // expect(flagsAll).toEqual({})
208
- // })
209
- // it('should return empty object when called without sdk key', async () => {
210
- // process.env = {
211
- // ...originalEnv,
212
- // OPTIMIZELY_SDK_KEY: undefined,
213
- // }
214
- // const flagsAll = await getFlagsAll()
215
- // expect(flagsAll).toEqual({})
216
- // })
217
- // it('should return empty object when sdk not initialized', async () => {
218
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
219
- // createInstance: jest.fn().mockReturnValue(null),
220
- // }))
221
- // const { getFlagsAll } = require('../utils')
222
- // const flagsAll = await getFlagsAll()
223
- // expect(flagsAll).toEqual({})
224
- // })
225
- // it('should return empty object when user context not initialized', async () => {
226
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
227
- // createInstance: () => ({
228
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
229
- // createUserContext: jest.fn().mockReturnValue(null),
230
- // onReady: jest.fn().mockResolvedValue({ success: true }),
231
- // }),
232
- // }))
233
- // const { getFlagsAll } = require('../utils')
234
- // const flagsAll = await getFlagsAll()
235
- // expect(flagsAll).toEqual({})
236
- // })
237
- // it('should instantiate logger with log level', async () => {
238
- // const options: SDKConfig = {
239
- // logLevel: 'critical',
240
- // }
241
- // await getFlagsAll(options)
242
- // expect(setLogLevel).toBeCalledWith('critical')
243
- // expect(setLogger).toHaveBeenCalled()
244
- // })
245
- // it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
246
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
247
- // createInstance: () => ({
248
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
249
- // createUserContext: () => ({
250
- // decideAll: jest
251
- // .fn()
252
- // .mockImplementation((options?: OptimizelyDecideOption[]) => {
253
- // return flagsMock as {
254
- // [key: string]: Omit<OptimizelyDecision, 'userContext'>
255
- // }
256
- // }),
257
- // }),
258
- // onReady: jest
259
- // .fn()
260
- // .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
261
- // }),
262
- // }))
263
- // const { getFlagsAll } = require('../utils')
264
- // const options: SDKConfig = {
265
- // defaultFeatureFlags: {
266
- // default_flag: {
267
- // variationKey: 'off',
268
- // enabled: true,
269
- // variables: {},
270
- // },
271
- // },
272
- // }
273
- // const flagsAll = await getFlagsAll(options)
274
- // expect(flagsAll).toEqual(options.defaultFeatureFlags)
275
- // })
276
- // it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
277
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
278
- // createInstance: () => ({
279
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
280
- // createUserContext: () => ({
281
- // decideAll: jest
282
- // .fn()
283
- // .mockImplementation((options?: OptimizelyDecideOption[]) => {
284
- // return flagsMock as {
285
- // [key: string]: Omit<OptimizelyDecision, 'userContext'>
286
- // }
287
- // }),
288
- // }),
289
- // onReady: jest
290
- // .fn()
291
- // .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
292
- // }),
293
- // }))
294
- // const { getFlagsAll } = require('../utils')
295
- // const flagsAll = await getFlagsAll()
296
- // expect(flagsAll).toEqual({})
297
- // })
298
- // })
299
- // describe('closeFlagsInstance', () => {
300
- // it('should close sdk instance successfully', async () => {
301
- // const spy = jest.spyOn(console, 'log')
302
- // await getFlagsAll()
303
- // await closeFlagsInstance()
304
- // expect(spy).toHaveBeenCalledWith('optimizely instance closed successfully')
305
- // })
306
- // it('should not close sdk instance sucessfully', async () => {
307
- // const spy = jest.spyOn(console, 'log')
308
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
309
- // createInstance: () => ({
310
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
311
- // createUserContext: () => ({
312
- // decide: jest
313
- // .fn()
314
- // .mockImplementation(
315
- // (key: string, options?: OptimizelyDecideOption[]) => {
316
- // return getFlagsAll as Omit<OptimizelyDecision, 'userContext'>
317
- // }
318
- // ),
319
- // }),
320
- // onReady: jest.fn().mockResolvedValue({ success: true }),
321
- // close: jest
322
- // .fn()
323
- // .mockResolvedValue({ success: false, reason: 'Closing rejected' }),
324
- // }),
325
- // }))
326
- // const { getFlagsAll, closeFlagsInstance } = require('../utils')
327
- // await getFlagsAll()
328
- // await closeFlagsInstance()
329
- // expect(spy).toHaveBeenCalledWith(
330
- // 'closing Optimizely instance failed, reason: Closing rejected'
331
- // )
332
- // })
333
- // })
334
- // describe('getFlag', () => {
335
- // it('should return a flag with default options', async () => {
336
- // const flag = await getFlag('testing_flag_with_variations_and_variables')
337
- // expect(flag).toEqual({
338
- // testing_flag_with_variations_and_variables: {
339
- // variationKey: 'primary_with_new_weclome_message_and_max_accounts',
340
- // enabled: true,
341
- // variables: {
342
- // family_primary_welcome_message: 'This is the new message',
343
- // family_primary_enable_secondary_accounts: true,
344
- // family_primary_max_secondary_accounts: 10,
345
- // family_primary_metadata_json: {
346
- // metadata1: 'a',
347
- // },
348
- // },
349
- // },
350
- // })
351
- // })
352
- // it('should return empty object if no flags are fetched', async () => {
353
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
354
- // ...jest.requireActual('@optimizely/optimizely-sdk'),
355
- // createInstance: () => ({
356
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
357
- // createUserContext: () => ({
358
- // decide: jest
359
- // .fn()
360
- // .mockImplementation((options?: OptimizelyDecideOption[]) => {
361
- // return undefined
362
- // }),
363
- // }),
364
- // onReady: jest.fn().mockResolvedValue({ success: true }),
365
- // close: jest.fn().mockResolvedValue({ success: true }),
366
- // }),
367
- // }))
368
- // const { getFlag } = require('../utils')
369
- // const flagsAll = await getFlag('testing_flag_with_variations_and_variables')
370
- // expect(flagsAll).toEqual({})
371
- // })
372
- // it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
373
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
374
- // createInstance: () => ({
375
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
376
- // createUserContext: () => ({
377
- // decide: jest
378
- // .fn()
379
- // .mockImplementation(
380
- // (key: string, options?: OptimizelyDecideOption[]) => {
381
- // return flagsMock[key] as Omit<OptimizelyDecision, 'userContext'>
382
- // }
383
- // ),
384
- // }),
385
- // onReady: jest
386
- // .fn()
387
- // .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
388
- // }),
389
- // }))
390
- // const { getFlag } = require('../utils')
391
- // const options: SDKConfig = {
392
- // defaultFeatureFlags: {
393
- // default_flag: {
394
- // variationKey: 'off',
395
- // enabled: true,
396
- // variables: {},
397
- // },
398
- // },
399
- // }
400
- // const flag = await getFlag(
401
- // 'testing_flag_with_variations_and_variables',
402
- // options
403
- // )
404
- // expect(flag).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
- // decide: jest
412
- // .fn()
413
- // .mockImplementation(
414
- // (key: string, options?: OptimizelyDecideOption[]) => {
415
- // return flagsMock[key] as Omit<OptimizelyDecision, 'userContext'>
416
- // }
417
- // ),
418
- // }),
419
- // onReady: jest
420
- // .fn()
421
- // .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
422
- // }),
423
- // }))
424
- // const { getFlag } = require('../utils')
425
- // const flag = await getFlag('testing_flag_with_variations_and_variables')
426
- // expect(flag).toEqual({})
427
- // })
428
- // })
429
- // describe('getFlagsByKeys', () => {
430
- // it('should return flags by keys with default options', async () => {
431
- // const flagsByKeys = await getFlagsByKeys([
432
- // 'another_test_flag_1',
433
- // 'qualtrics_flag',
434
- // ])
435
- // expect(flagsByKeys).toEqual({
436
- // qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
437
- // another_test_flag_1: {
438
- // variationKey: 'off',
439
- // enabled: false,
440
- // variables: {},
441
- // },
442
- // })
443
- // })
444
- // it('should return empty object if no flags are fetched', async () => {
445
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
446
- // ...jest.requireActual('@optimizely/optimizely-sdk'),
447
- // createInstance: () => ({
448
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
449
- // createUserContext: () => ({
450
- // decideForKeys: jest
451
- // .fn()
452
- // .mockImplementation((options?: OptimizelyDecideOption[]) => {
453
- // return undefined
454
- // }),
455
- // }),
456
- // onReady: jest.fn().mockResolvedValue({ success: true }),
457
- // close: jest.fn().mockResolvedValue({ success: true }),
458
- // }),
459
- // }))
460
- // const { getFlagsByKeys } = require('../utils')
461
- // const flagsAll = await getFlagsByKeys([
462
- // 'another_test_flag_1',
463
- // 'qualtrics_flag',
464
- // ])
465
- // expect(flagsAll).toEqual({})
466
- // })
467
- // it('should return defaultFeatureFlags when they have been passed and optimizely client is not ready', async () => {
468
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
469
- // createInstance: () => ({
470
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
471
- // createUserContext: () => ({
472
- // decideForKeys: jest
473
- // .fn()
474
- // .mockImplementation(
475
- // (keys: string[], options?: OptimizelyDecideOption[]) => {
476
- // const filtered: {
477
- // [key: string]: Omit<OptimizelyDecision, 'userContext'>
478
- // } = {}
479
- // keys.forEach((k) => (filtered[k] = flagsMock[k]))
480
- // return filtered
481
- // }
482
- // ),
483
- // }),
484
- // onReady: jest
485
- // .fn()
486
- // .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
487
- // }),
488
- // }))
489
- // const { getFlagsByKeys } = require('../utils')
490
- // const options: SDKConfig = {
491
- // defaultFeatureFlags: {
492
- // default_flag: {
493
- // variationKey: 'off',
494
- // enabled: true,
495
- // variables: {},
496
- // },
497
- // },
498
- // }
499
- // const flagsByKeys = await getFlagsByKeys(
500
- // ['another_test_flag_1', 'qualtrics_flag'],
501
- // options
502
- // )
503
- // expect(flagsByKeys).toEqual(options.defaultFeatureFlags)
504
- // })
505
- // it('should return empty object when no default flag have been passed and optimizely client is not ready', async () => {
506
- // jest.doMock('@optimizely/optimizely-sdk', () => ({
507
- // createInstance: () => ({
508
- // ...jest.requireActual('@optimizely/optimizely-sdk').createInstance,
509
- // createUserContext: () => ({
510
- // decideForKeys: jest
511
- // .fn()
512
- // .mockImplementation(
513
- // (keys: string[], options?: OptimizelyDecideOption[]) => {
514
- // const filtered: {
515
- // [key: string]: Omit<OptimizelyDecision, 'userContext'>
516
- // } = {}
517
- // keys.forEach((k) => (filtered[k] = flagsMock[k]))
518
- // return filtered
519
- // }
520
- // ),
521
- // }),
522
- // onReady: jest
523
- // .fn()
524
- // .mockResolvedValue({ success: false, reason: 'Promise rejected' }),
525
- // }),
526
- // }))
527
- // const { getFlagsByKeys } = require('../utils')
528
- // const flagsByKeys = await getFlagsByKeys([
529
- // 'another_test_flag_1',
530
- // 'qualtrics_flag',
531
- // ])
532
- // expect(flagsByKeys).toEqual({})
533
- // })
534
- // })
535
515
  //# sourceMappingURL=utils.tests.js.map