@newskit-render/feature-flags 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,326 +45,597 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
45
45
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
46
  }
47
47
  };
48
- import optimizelySDK from '@optimizely/optimizely-sdk';
49
- import { createFeatureFlagsInstance, getFeatureFlags, getFlattenFeatureFlags, initAndGetFeatureFlag, userIdentity, userAttributes, defaultFeatureFlags, _resetInstance, } from '../utils';
50
- import { defaultUserId, defaultUserAttributes } from '../config';
51
- import { MissingConfigurationError, MissingInstanceError } from '../types';
52
- var mockFeaturesMap = {
53
- test_flag: {
54
- key: 'test_flag',
48
+ import { setLogLevel, setLogger,
49
+ // createInstance
50
+ } from '@optimizely/optimizely-sdk';
51
+ import { _resetInstance, closeFlagsInstance, getFlag, getFlagsAll, getFlagsByKeys, } from '../utils';
52
+ import { MissingConfigurationError, MissingInstanceError, MissingUserContextError, } from '../types';
53
+ var originalEnv = process.env;
54
+ 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 ({
55
+ decide: jest
56
+ .fn()
57
+ .mockImplementation(function (key, options) {
58
+ return flagsMock[key];
59
+ }),
60
+ decideForKeys: jest
61
+ .fn()
62
+ .mockImplementation(function (keys, options) {
63
+ var filtered = {};
64
+ keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
65
+ return filtered;
66
+ }),
67
+ decideAll: jest
68
+ .fn()
69
+ .mockImplementation(function (options) {
70
+ return flagsMock;
71
+ }),
72
+ }); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); }, setLogLevel: jest.fn(), setLogger: jest.fn() })); });
73
+ var flagsMock = {
74
+ qualtrics_flag: {
75
+ variationKey: 'on',
76
+ enabled: true,
77
+ variables: {},
78
+ ruleKey: 'default-rollout-216689-29200910123',
79
+ flagKey: 'qualtrics_flag',
80
+ userContext: {
81
+ _qualifiedSegments: null,
82
+ // optimizely: [e],
83
+ userId: 'user123',
84
+ attributes: {},
85
+ forcedDecisionsMap: {},
86
+ },
87
+ reasons: [],
88
+ },
89
+ testing_flag: {
90
+ variationKey: 'max_10',
91
+ enabled: true,
92
+ variables: { max_family_members: 10 },
93
+ ruleKey: 'default-rollout-223709-29200910123',
94
+ flagKey: 'testing_flag',
95
+ userContext: {
96
+ _qualifiedSegments: null,
97
+ // optimizely: [e],
98
+ userId: 'user123',
99
+ attributes: {},
100
+ forcedDecisionsMap: {},
101
+ },
102
+ reasons: [],
103
+ },
104
+ another_test_flag_1: {
105
+ variationKey: 'off',
55
106
  enabled: false,
107
+ variables: {},
108
+ ruleKey: 'default-rollout-225089-29200910123',
109
+ flagKey: 'another_test_flag_1',
110
+ userContext: {
111
+ _qualifiedSegments: null,
112
+ // optimizely: [e],
113
+ userId: 'user123',
114
+ attributes: {},
115
+ forcedDecisionsMap: {},
116
+ },
117
+ reasons: [],
56
118
  },
57
- test_flag2: {
58
- key: 'test_flag2',
119
+ testing_flag_with_variations_and_variables: {
120
+ variationKey: 'primary_with_new_weclome_message_and_max_accounts',
59
121
  enabled: true,
122
+ variables: {
123
+ family_primary_welcome_message: 'This is the new message',
124
+ family_primary_enable_secondary_accounts: true,
125
+ family_primary_max_secondary_accounts: 10,
126
+ family_primary_metadata_json: {
127
+ metadata1: 'a',
128
+ },
129
+ },
130
+ ruleKey: 'default-rollout-225097-29200910123',
131
+ flagKey: 'testing_flag_with_variations_and_variables',
132
+ userContext: {
133
+ _qualifiedSegments: null,
134
+ // optimizely: [e],
135
+ userId: 'user123',
136
+ attributes: {},
137
+ forcedDecisionsMap: {},
138
+ },
139
+ reasons: [],
60
140
  },
61
141
  };
62
- jest.mock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return ({
63
- isFeatureEnabled: jest
64
- .fn()
65
- .mockImplementation(function (featureKey, userId) {
66
- return mockFeaturesMap[featureKey].enabled;
67
- }),
68
- onReady: jest.fn().mockResolvedValue({ success: true }),
69
- getOptimizelyConfig: jest
70
- .fn()
71
- .mockReturnValue({ featuresMap: mockFeaturesMap }),
72
- }); } })); });
73
- jest
74
- .spyOn(optimizelySDK, 'setLogLevel')
75
- .mockImplementation(function (logLevel) { return logLevel; });
76
- jest.spyOn(optimizelySDK, 'setLogger');
77
142
  beforeEach(function () {
78
143
  jest.resetModules();
144
+ process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: 'optimizely-sdk-key' });
79
145
  });
80
146
  afterEach(function () {
81
147
  _resetInstance();
82
148
  });
83
- describe('createFeatureFlagsInstance', function () {
84
- it('should throw error when called without sdk key', function () {
85
- expect(function () { return createFeatureFlagsInstance({ optimizelyConfig: {} }); }).toThrow(new MissingConfigurationError());
86
- });
87
- it('should use default userId when creating instance', function () { return __awaiter(void 0, void 0, void 0, function () {
149
+ describe('getFlagsAll', function () {
150
+ it('should return all flags with default options', function () { return __awaiter(void 0, void 0, void 0, function () {
151
+ var flagsAll;
88
152
  return __generator(this, function (_a) {
89
153
  switch (_a.label) {
90
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({ optimizelyConfig: { sdkKey: 'sdkkey' } })];
154
+ case 0: return [4 /*yield*/, getFlagsAll()];
91
155
  case 1:
92
- _a.sent();
93
- expect(userIdentity).toEqual(defaultUserId);
156
+ flagsAll = _a.sent();
157
+ expect(flagsAll).toEqual({
158
+ qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
159
+ testing_flag: {
160
+ variationKey: 'max_10',
161
+ enabled: true,
162
+ variables: { max_family_members: 10 },
163
+ },
164
+ another_test_flag_1: {
165
+ variationKey: 'off',
166
+ enabled: false,
167
+ variables: {},
168
+ },
169
+ testing_flag_with_variations_and_variables: {
170
+ variationKey: 'primary_with_new_weclome_message_and_max_accounts',
171
+ enabled: true,
172
+ variables: {
173
+ family_primary_welcome_message: 'This is the new message',
174
+ family_primary_enable_secondary_accounts: true,
175
+ family_primary_max_secondary_accounts: 10,
176
+ family_primary_metadata_json: {
177
+ metadata1: 'a',
178
+ },
179
+ },
180
+ },
181
+ });
94
182
  return [2 /*return*/];
95
183
  }
96
184
  });
97
185
  }); });
98
- it('should use default attributes when creating instance', function () { return __awaiter(void 0, void 0, void 0, function () {
186
+ it('should return all flags with custom options', function () { return __awaiter(void 0, void 0, void 0, function () {
187
+ var options, flagsAll;
99
188
  return __generator(this, function (_a) {
100
189
  switch (_a.label) {
101
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({ optimizelyConfig: { sdkKey: 'sdkkey' } })];
190
+ case 0:
191
+ process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
192
+ options = {
193
+ sdkConfig: {
194
+ sdkKey: 'custom-optimizely-sdk',
195
+ },
196
+ userData: {
197
+ userId: 'user456',
198
+ attributes: { logged_in: true, cpn: 'AAA123', subs_type: 'digi-print' },
199
+ },
200
+ };
201
+ return [4 /*yield*/, getFlagsAll(options)];
102
202
  case 1:
103
- _a.sent();
104
- expect(userAttributes).toEqual(defaultUserAttributes);
203
+ flagsAll = _a.sent();
204
+ expect(flagsAll).toEqual({
205
+ qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
206
+ testing_flag: {
207
+ variationKey: 'max_10',
208
+ enabled: true,
209
+ variables: { max_family_members: 10 },
210
+ },
211
+ another_test_flag_1: {
212
+ variationKey: 'off',
213
+ enabled: false,
214
+ variables: {},
215
+ },
216
+ testing_flag_with_variations_and_variables: {
217
+ variationKey: 'primary_with_new_weclome_message_and_max_accounts',
218
+ enabled: true,
219
+ variables: {
220
+ family_primary_welcome_message: 'This is the new message',
221
+ family_primary_enable_secondary_accounts: true,
222
+ family_primary_max_secondary_accounts: 10,
223
+ family_primary_metadata_json: {
224
+ metadata1: 'a',
225
+ },
226
+ },
227
+ },
228
+ });
105
229
  return [2 /*return*/];
106
230
  }
107
231
  });
108
232
  }); });
109
- it('should set userId when creating instance and passing userId', function () { return __awaiter(void 0, void 0, void 0, function () {
233
+ it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
234
+ var getFlagsAll, flagsAll;
110
235
  return __generator(this, function (_a) {
111
236
  switch (_a.label) {
112
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({
113
- optimizelyConfig: { sdkKey: 'sdkkey' },
114
- userId: 'user123',
115
- })];
237
+ case 0:
238
+ 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 ({
239
+ decideAll: jest
240
+ .fn()
241
+ .mockImplementation(function (options) {
242
+ return undefined;
243
+ }),
244
+ }); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); } })); });
245
+ getFlagsAll = require('../utils').getFlagsAll;
246
+ return [4 /*yield*/, getFlagsAll()];
116
247
  case 1:
117
- _a.sent();
118
- expect(userIdentity).toEqual('user123');
248
+ flagsAll = _a.sent();
249
+ expect(flagsAll).toEqual({});
119
250
  return [2 /*return*/];
120
251
  }
121
252
  });
122
253
  }); });
123
- it('should set attributes when creating instance and passing attributes', function () { return __awaiter(void 0, void 0, void 0, function () {
254
+ it('should throw error when called without sdk key', function () { return __awaiter(void 0, void 0, void 0, function () {
255
+ return __generator(this, function (_a) {
256
+ process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
257
+ expect(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
258
+ switch (_a.label) {
259
+ case 0: return [4 /*yield*/, getFlagsAll()];
260
+ case 1: return [2 /*return*/, _a.sent()];
261
+ }
262
+ }); }); }).rejects.toThrow(new MissingConfigurationError());
263
+ return [2 /*return*/];
264
+ });
265
+ }); });
266
+ it('should throw error when sdk not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
267
+ var getFlagsAll;
268
+ return __generator(this, function (_a) {
269
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
270
+ createInstance: jest.fn().mockReturnValue(null),
271
+ }); });
272
+ getFlagsAll = require('../utils').getFlagsAll;
273
+ expect(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
274
+ switch (_a.label) {
275
+ case 0: return [4 /*yield*/, getFlagsAll()];
276
+ case 1: return [2 /*return*/, _a.sent()];
277
+ }
278
+ }); }); }).rejects.toThrow(new MissingInstanceError());
279
+ return [2 /*return*/];
280
+ });
281
+ }); });
282
+ it('should throw error when user context not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
283
+ var getFlagsAll;
284
+ return __generator(this, function (_a) {
285
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
286
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: jest.fn().mockReturnValue(null), onReady: jest.fn().mockResolvedValue({ success: true }) })); },
287
+ }); });
288
+ getFlagsAll = require('../utils').getFlagsAll;
289
+ expect(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
290
+ switch (_a.label) {
291
+ case 0: return [4 /*yield*/, getFlagsAll()];
292
+ case 1: return [2 /*return*/, _a.sent()];
293
+ }
294
+ }); }); }).rejects.toThrow(new MissingUserContextError());
295
+ return [2 /*return*/];
296
+ });
297
+ }); });
298
+ it('should instantiate logger with log level', function () { return __awaiter(void 0, void 0, void 0, function () {
299
+ var options;
124
300
  return __generator(this, function (_a) {
125
301
  switch (_a.label) {
126
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({
127
- optimizelyConfig: { sdkKey: 'sdkkey' },
128
- userAttributes: {
129
- cpn: '4AAA039156221',
130
- billingDetails: {
131
- paymentMethod: {
132
- type: 'CreditCard',
133
- cardType: 'Visa',
134
- cardNumber: '************4321',
135
- expirationYear: 2028,
136
- expirationMonth: 2,
137
- },
138
- },
139
- },
140
- })];
302
+ case 0:
303
+ options = {
304
+ logLevel: 'critical',
305
+ };
306
+ return [4 /*yield*/, getFlagsAll(options)];
141
307
  case 1:
142
308
  _a.sent();
143
- expect(userAttributes).toEqual({
144
- cpn: '4AAA039156221',
145
- billingDetails: {
146
- paymentMethod: {
147
- type: 'CreditCard',
148
- cardType: 'Visa',
149
- cardNumber: '************4321',
150
- expirationYear: 2028,
151
- expirationMonth: 2,
152
- },
153
- },
154
- });
309
+ expect(setLogLevel).toBeCalledWith('critical');
310
+ expect(setLogger).toHaveBeenCalled();
155
311
  return [2 /*return*/];
156
312
  }
157
313
  });
158
314
  }); });
159
- it('should set defaultFeatureFlags when they have been passed', function () { return __awaiter(void 0, void 0, void 0, function () {
315
+ 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 () {
316
+ var getFlagsAll, options, flagsAll;
160
317
  return __generator(this, function (_a) {
161
318
  switch (_a.label) {
162
319
  case 0:
163
- expect(defaultFeatureFlags).toEqual({});
164
- return [4 /*yield*/, createFeatureFlagsInstance({
165
- optimizelyConfig: { sdkKey: 'sdkkey' },
166
- defaultFeatureFlags: { default_flag: true, default_flag2: false },
167
- })];
320
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
321
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
322
+ decideAll: jest
323
+ .fn()
324
+ .mockImplementation(function (options) {
325
+ return flagsMock;
326
+ }),
327
+ }); }, onReady: jest
328
+ .fn()
329
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
330
+ }); });
331
+ getFlagsAll = require('../utils').getFlagsAll;
332
+ options = {
333
+ defaultFeatureFlags: {
334
+ default_flag: {
335
+ variationKey: 'off',
336
+ enabled: true,
337
+ variables: {},
338
+ },
339
+ },
340
+ };
341
+ return [4 /*yield*/, getFlagsAll(options)];
168
342
  case 1:
169
- _a.sent();
170
- expect(optimizelySDK.setLogLevel).not.toHaveBeenCalled();
171
- expect(defaultFeatureFlags).toEqual({
172
- default_flag: true,
173
- default_flag2: false,
174
- });
343
+ flagsAll = _a.sent();
344
+ expect(flagsAll).toEqual(options.defaultFeatureFlags);
175
345
  return [2 /*return*/];
176
346
  }
177
347
  });
178
348
  }); });
179
- it('should instantiate logger with log level', function () { return __awaiter(void 0, void 0, void 0, function () {
349
+ it('should return empty object when no default flag have been passed and optimizely client is not ready', function () { return __awaiter(void 0, void 0, void 0, function () {
350
+ var getFlagsAll, flagsAll;
180
351
  return __generator(this, function (_a) {
181
352
  switch (_a.label) {
182
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({
183
- optimizelyConfig: { sdkKey: 'sdkkey' },
184
- logLevel: 'critical',
185
- })];
353
+ case 0:
354
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
355
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
356
+ decideAll: jest
357
+ .fn()
358
+ .mockImplementation(function (options) {
359
+ return flagsMock;
360
+ }),
361
+ }); }, onReady: jest
362
+ .fn()
363
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
364
+ }); });
365
+ getFlagsAll = require('../utils').getFlagsAll;
366
+ return [4 /*yield*/, getFlagsAll()];
186
367
  case 1:
187
- _a.sent();
188
- expect(optimizelySDK.setLogLevel).toBeCalledWith('critical');
189
- expect(optimizelySDK.setLogger).toHaveBeenCalled();
368
+ flagsAll = _a.sent();
369
+ expect(flagsAll).toEqual({});
190
370
  return [2 /*return*/];
191
371
  }
192
372
  });
193
373
  }); });
194
374
  });
195
- describe('getFlattenFeatureFlags', function () {
196
- it('should transform the mockFeaturesMap into flattened object of features', function () { return __awaiter(void 0, void 0, void 0, function () {
197
- var _a;
198
- return __generator(this, function (_b) {
199
- switch (_b.label) {
200
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({ optimizelyConfig: { sdkKey: 'sdkkey' } })];
375
+ describe('getFlag', function () {
376
+ it('should return a flag with default options', function () { return __awaiter(void 0, void 0, void 0, function () {
377
+ var flag;
378
+ return __generator(this, function (_a) {
379
+ switch (_a.label) {
380
+ case 0: return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
201
381
  case 1:
202
- _b.sent();
203
- _a = expect;
204
- return [4 /*yield*/, getFlattenFeatureFlags(Object.keys(mockFeaturesMap), mockFeaturesMap)];
205
- case 2:
206
- _a.apply(void 0, [_b.sent()]).toEqual({
207
- test_flag: false,
208
- test_flag2: true,
382
+ flag = _a.sent();
383
+ expect(flag).toEqual({
384
+ testing_flag_with_variations_and_variables: {
385
+ variationKey: 'primary_with_new_weclome_message_and_max_accounts',
386
+ enabled: true,
387
+ variables: {
388
+ family_primary_welcome_message: 'This is the new message',
389
+ family_primary_enable_secondary_accounts: true,
390
+ family_primary_max_secondary_accounts: 10,
391
+ family_primary_metadata_json: {
392
+ metadata1: 'a',
393
+ },
394
+ },
395
+ },
209
396
  });
210
397
  return [2 /*return*/];
211
398
  }
212
399
  });
213
400
  }); });
214
- });
215
- describe('getFeatureFlags', function () {
216
- it('should throw error when called without optimizely instance', function () { return __awaiter(void 0, void 0, void 0, function () {
401
+ it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
402
+ var getFlag, flagsAll;
217
403
  return __generator(this, function (_a) {
218
- expect(function () { return getFeatureFlags(); }).rejects.toEqual(new MissingInstanceError());
219
- return [2 /*return*/];
404
+ switch (_a.label) {
405
+ case 0:
406
+ 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 ({
407
+ decide: jest
408
+ .fn()
409
+ .mockImplementation(function (options) {
410
+ return undefined;
411
+ }),
412
+ }); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); } })); });
413
+ getFlag = require('../utils').getFlag;
414
+ return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
415
+ case 1:
416
+ flagsAll = _a.sent();
417
+ expect(flagsAll).toEqual({});
418
+ return [2 /*return*/];
419
+ }
220
420
  });
221
421
  }); });
222
- it('should return flattened flags', function () { return __awaiter(void 0, void 0, void 0, function () {
223
- var _a;
224
- return __generator(this, function (_b) {
225
- switch (_b.label) {
226
- case 0: return [4 /*yield*/, createFeatureFlagsInstance({ optimizelyConfig: { sdkKey: 'sdkkey' } })];
422
+ 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 () {
423
+ var getFlag, options, flag;
424
+ return __generator(this, function (_a) {
425
+ switch (_a.label) {
426
+ case 0:
427
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
428
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
429
+ decide: jest
430
+ .fn()
431
+ .mockImplementation(function (key, options) {
432
+ return flagsMock[key];
433
+ }),
434
+ }); }, onReady: jest
435
+ .fn()
436
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
437
+ }); });
438
+ getFlag = require('../utils').getFlag;
439
+ options = {
440
+ defaultFeatureFlags: {
441
+ default_flag: {
442
+ variationKey: 'off',
443
+ enabled: true,
444
+ variables: {},
445
+ },
446
+ },
447
+ };
448
+ return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables', options)];
227
449
  case 1:
228
- _b.sent();
229
- _a = expect;
230
- return [4 /*yield*/, getFeatureFlags()];
231
- case 2:
232
- _a.apply(void 0, [_b.sent()]).toEqual({
233
- test_flag: false,
234
- test_flag2: true,
235
- });
450
+ flag = _a.sent();
451
+ expect(flag).toEqual(options.defaultFeatureFlags);
236
452
  return [2 /*return*/];
237
453
  }
238
454
  });
239
455
  }); });
240
- it('should return default feature flags object & optimizely.onReady returns success: false', function () { return __awaiter(void 0, void 0, void 0, function () {
241
- var utils, _a;
242
- return __generator(this, function (_b) {
243
- switch (_b.label) {
456
+ it('should return empty object when no default flag have been passed and optimizely client is not ready', function () { return __awaiter(void 0, void 0, void 0, function () {
457
+ var getFlag, flag;
458
+ return __generator(this, function (_a) {
459
+ switch (_a.label) {
244
460
  case 0:
245
461
  jest.doMock('@optimizely/optimizely-sdk', function () { return ({
246
- createInstance: function () { return ({
247
- isFeatureEnabled: jest
462
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
463
+ decide: jest
464
+ .fn()
465
+ .mockImplementation(function (key, options) {
466
+ return flagsMock[key];
467
+ }),
468
+ }); }, onReady: jest
248
469
  .fn()
249
- .mockImplementation(function (featureKey, userId) {
250
- return mockFeaturesMap[featureKey].enabled;
251
- }),
252
- onReady: jest.fn().mockResolvedValue({ success: false }),
253
- getOptimizelyConfig: jest
254
- .fn()
255
- .mockReturnValue({ featuresMap: mockFeaturesMap }),
256
- }); },
470
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
257
471
  }); });
258
- utils = require('../utils').default;
259
- return [4 /*yield*/, utils.createFeatureFlagsInstance({
260
- optimizelyConfig: { sdkKey: 'sdkkey' },
261
- defaultFeatureFlags: { defaultFlag: true },
262
- })];
472
+ getFlag = require('../utils').getFlag;
473
+ return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
263
474
  case 1:
264
- _b.sent();
265
- _a = expect;
266
- return [4 /*yield*/, utils.getFeatureFlags()];
267
- case 2:
268
- _a.apply(void 0, [_b.sent()]).toEqual({
269
- defaultFlag: true,
270
- });
475
+ flag = _a.sent();
476
+ expect(flag).toEqual({});
271
477
  return [2 /*return*/];
272
478
  }
273
479
  });
274
480
  }); });
275
481
  });
276
- describe('initAndGetFeatureFlag', function () {
277
- it('should return empty object', function () { return __awaiter(void 0, void 0, void 0, function () {
278
- var _a;
279
- return __generator(this, function (_b) {
280
- switch (_b.label) {
281
- case 0:
282
- _a = expect;
283
- return [4 /*yield*/, initAndGetFeatureFlag()];
482
+ describe('getFlagsByKeys', function () {
483
+ it('should return flags by keys with default options', function () { return __awaiter(void 0, void 0, void 0, function () {
484
+ var flagsByKeys;
485
+ return __generator(this, function (_a) {
486
+ switch (_a.label) {
487
+ case 0: return [4 /*yield*/, getFlagsByKeys([
488
+ 'another_test_flag_1',
489
+ 'qualtrics_flag',
490
+ ])];
284
491
  case 1:
285
- _a.apply(void 0, [_b.sent()]).toEqual({});
492
+ flagsByKeys = _a.sent();
493
+ expect(flagsByKeys).toEqual({
494
+ qualtrics_flag: { variationKey: 'on', enabled: true, variables: {} },
495
+ another_test_flag_1: {
496
+ variationKey: 'off',
497
+ enabled: false,
498
+ variables: {},
499
+ },
500
+ });
286
501
  return [2 /*return*/];
287
502
  }
288
503
  });
289
504
  }); });
290
- it('should return flag', function () { return __awaiter(void 0, void 0, void 0, function () {
291
- var _a;
292
- return __generator(this, function (_b) {
293
- switch (_b.label) {
505
+ it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
506
+ var getFlagsByKeys, flagsAll;
507
+ return __generator(this, function (_a) {
508
+ switch (_a.label) {
294
509
  case 0:
295
- _a = expect;
296
- return [4 /*yield*/, initAndGetFeatureFlag('sdkkey')];
510
+ 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 ({
511
+ decideForKeys: jest
512
+ .fn()
513
+ .mockImplementation(function (options) {
514
+ return undefined;
515
+ }),
516
+ }); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); } })); });
517
+ getFlagsByKeys = require('../utils').getFlagsByKeys;
518
+ return [4 /*yield*/, getFlagsByKeys([
519
+ 'another_test_flag_1',
520
+ 'qualtrics_flag',
521
+ ])];
297
522
  case 1:
298
- _a.apply(void 0, [_b.sent()]).toEqual({
299
- test_flag: false,
300
- test_flag2: true,
301
- });
523
+ flagsAll = _a.sent();
524
+ expect(flagsAll).toEqual({});
302
525
  return [2 /*return*/];
303
526
  }
304
527
  });
305
528
  }); });
306
- it('should return flags for specific attributes - feature is enabeled for this user', function () { return __awaiter(void 0, void 0, void 0, function () {
307
- var utils, _a;
308
- return __generator(this, function (_b) {
309
- switch (_b.label) {
529
+ 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 () {
530
+ var getFlagsByKeys, options, flagsByKeys;
531
+ return __generator(this, function (_a) {
532
+ switch (_a.label) {
310
533
  case 0:
311
534
  jest.doMock('@optimizely/optimizely-sdk', function () { return ({
312
- createInstance: function () { return ({
313
- isFeatureEnabled: jest
535
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
536
+ decideForKeys: jest
537
+ .fn()
538
+ .mockImplementation(function (keys, options) {
539
+ var filtered = {};
540
+ keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
541
+ return filtered;
542
+ }),
543
+ }); }, onReady: jest
314
544
  .fn()
315
- .mockImplementation(function (featureKey, userId, attributes) {
316
- if (attributes.cpn === '4AAA039156221') {
317
- return true;
318
- }
319
- return mockFeaturesMap[featureKey].enabled;
320
- }),
321
- onReady: jest.fn().mockResolvedValue({ success: true }),
322
- getOptimizelyConfig: jest
545
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
546
+ }); });
547
+ getFlagsByKeys = require('../utils').getFlagsByKeys;
548
+ options = {
549
+ defaultFeatureFlags: {
550
+ default_flag: {
551
+ variationKey: 'off',
552
+ enabled: true,
553
+ variables: {},
554
+ },
555
+ },
556
+ };
557
+ return [4 /*yield*/, getFlagsByKeys(['another_test_flag_1', 'qualtrics_flag'], options)];
558
+ case 1:
559
+ flagsByKeys = _a.sent();
560
+ expect(flagsByKeys).toEqual(options.defaultFeatureFlags);
561
+ return [2 /*return*/];
562
+ }
563
+ });
564
+ }); });
565
+ it('should return empty object when no default flag have been passed and optimizely client is not ready', function () { return __awaiter(void 0, void 0, void 0, function () {
566
+ var getFlagsByKeys, flagsByKeys;
567
+ return __generator(this, function (_a) {
568
+ switch (_a.label) {
569
+ case 0:
570
+ jest.doMock('@optimizely/optimizely-sdk', function () { return ({
571
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
572
+ decideForKeys: jest
573
+ .fn()
574
+ .mockImplementation(function (keys, options) {
575
+ var filtered = {};
576
+ keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
577
+ return filtered;
578
+ }),
579
+ }); }, onReady: jest
323
580
  .fn()
324
- .mockReturnValue({ featuresMap: mockFeaturesMap }),
325
- }); },
581
+ .mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
326
582
  }); });
327
- utils = require('../utils');
328
- _a = expect;
329
- return [4 /*yield*/, utils.initAndGetFeatureFlag('sdkkey', { cpn: '4AAA039156221' })];
583
+ getFlagsByKeys = require('../utils').getFlagsByKeys;
584
+ return [4 /*yield*/, getFlagsByKeys([
585
+ 'another_test_flag_1',
586
+ 'qualtrics_flag',
587
+ ])];
330
588
  case 1:
331
- _a.apply(void 0, [_b.sent()]).toEqual({
332
- test_flag: true,
333
- test_flag2: true,
334
- });
589
+ flagsByKeys = _a.sent();
590
+ expect(flagsByKeys).toEqual({});
335
591
  return [2 /*return*/];
336
592
  }
337
593
  });
338
594
  }); });
339
- it('should return flags for specific attributes - feature is not enabled for this user', function () { return __awaiter(void 0, void 0, void 0, function () {
340
- var utils, _a;
595
+ });
596
+ describe('closeFlagsInstance', function () {
597
+ it('should close sdk instance sucessfully', function () { return __awaiter(void 0, void 0, void 0, function () {
598
+ var spy;
599
+ return __generator(this, function (_a) {
600
+ switch (_a.label) {
601
+ case 0:
602
+ spy = jest.spyOn(console, 'log');
603
+ return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
604
+ case 1:
605
+ _a.sent();
606
+ return [4 /*yield*/, closeFlagsInstance()];
607
+ case 2:
608
+ _a.sent();
609
+ expect(spy).toHaveBeenCalledWith('optimizely instance closed successfully');
610
+ return [2 /*return*/];
611
+ }
612
+ });
613
+ }); });
614
+ it('should not close sdk instance sucessfully', function () { return __awaiter(void 0, void 0, void 0, function () {
615
+ var spy, _a, getFlag, closeFlagsInstance;
341
616
  return __generator(this, function (_b) {
342
617
  switch (_b.label) {
343
618
  case 0:
619
+ spy = jest.spyOn(console, 'log');
344
620
  jest.doMock('@optimizely/optimizely-sdk', function () { return ({
345
- createInstance: function () { return ({
346
- isFeatureEnabled: jest
347
- .fn()
348
- .mockImplementation(function (featureKey, userId, attributes) {
349
- if (attributes.cpn === '4AAA039156228') {
350
- return mockFeaturesMap[featureKey].enabled;
351
- }
352
- return false;
353
- }),
354
- onReady: jest.fn().mockResolvedValue({ success: true }),
355
- getOptimizelyConfig: jest
621
+ createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
622
+ decide: jest
623
+ .fn()
624
+ .mockImplementation(function (key, options) {
625
+ return flagsMock[key];
626
+ }),
627
+ }); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest
356
628
  .fn()
357
- .mockReturnValue({ featuresMap: mockFeaturesMap }),
358
- }); },
629
+ .mockResolvedValue({ success: false, reason: 'Closing rejected' }) })); },
359
630
  }); });
360
- utils = require('../utils');
361
- _a = expect;
362
- return [4 /*yield*/, utils.initAndGetFeatureFlag('sdkkey', { cpn: '4AAA039156221' })];
631
+ _a = require('../utils'), getFlag = _a.getFlag, closeFlagsInstance = _a.closeFlagsInstance;
632
+ return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
363
633
  case 1:
364
- _a.apply(void 0, [_b.sent()]).toEqual({
365
- test_flag: false,
366
- test_flag2: false,
367
- });
634
+ _b.sent();
635
+ return [4 /*yield*/, closeFlagsInstance()];
636
+ case 2:
637
+ _b.sent();
638
+ expect(spy).toHaveBeenCalledWith('closing Optimizely instance failed, reason: Closing rejected');
368
639
  return [2 /*return*/];
369
640
  }
370
641
  });