@newskit-render/feature-flags 0.0.0-767f0ff7 → 0.0.0-7ac5711ff
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 +177 -262
- package/dist/cjs/__tests__/utils.tests.js.map +1 -1
- package/dist/cjs/feature-flags-context.js.map +1 -1
- package/dist/cjs/optimizelyClient.d.ts +4 -0
- package/dist/cjs/optimizelyClient.js +41 -0
- package/dist/cjs/optimizelyClient.js.map +1 -0
- package/dist/cjs/types.d.ts +9 -11
- package/dist/cjs/types.js +1 -25
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils.d.ts +6 -6
- package/dist/cjs/utils.js +76 -167
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/__tests__/utils.tests.js +178 -263
- package/dist/esm/__tests__/utils.tests.js.map +1 -1
- package/dist/esm/feature-flags-context.js.map +1 -1
- package/dist/esm/optimizelyClient.d.ts +4 -0
- package/dist/esm/optimizelyClient.js +36 -0
- package/dist/esm/optimizelyClient.js.map +1 -0
- package/dist/esm/types.d.ts +9 -11
- package/dist/esm/types.js +0 -24
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils.d.ts +6 -6
- package/dist/esm/utils.js +71 -161
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -20,8 +20,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
20
20
|
});
|
|
21
21
|
};
|
|
22
22
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g =
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
25
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
26
|
function step(op) {
|
|
27
27
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -53,62 +53,59 @@ var originalEnv = process.env;
|
|
|
53
53
|
jest.mock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
54
54
|
decide: jest
|
|
55
55
|
.fn()
|
|
56
|
-
.mockImplementation(function (key,
|
|
56
|
+
.mockImplementation(function (key, config) {
|
|
57
57
|
return flagsMock[key];
|
|
58
58
|
}),
|
|
59
59
|
decideForKeys: jest
|
|
60
60
|
.fn()
|
|
61
|
-
.mockImplementation(function (keys,
|
|
61
|
+
.mockImplementation(function (keys, config) {
|
|
62
62
|
var filtered = {};
|
|
63
63
|
keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
|
|
64
64
|
return filtered;
|
|
65
65
|
}),
|
|
66
66
|
decideAll: jest
|
|
67
67
|
.fn()
|
|
68
|
-
.mockImplementation(function (
|
|
68
|
+
.mockImplementation(function (config) {
|
|
69
69
|
return flagsMock;
|
|
70
70
|
}),
|
|
71
71
|
}); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); }, setLogLevel: jest.fn(), setLogger: jest.fn() })); });
|
|
72
72
|
var flagsMock = {
|
|
73
|
-
|
|
73
|
+
test_flag_1: {
|
|
74
74
|
variationKey: 'on',
|
|
75
75
|
enabled: true,
|
|
76
76
|
variables: {},
|
|
77
77
|
ruleKey: 'default-rollout-216689-29200910123',
|
|
78
|
-
flagKey: '
|
|
78
|
+
flagKey: 'test_flag_1',
|
|
79
79
|
userContext: {
|
|
80
80
|
_qualifiedSegments: null,
|
|
81
|
-
// optimizely: [e],
|
|
82
81
|
userId: 'user123',
|
|
83
82
|
attributes: {},
|
|
84
83
|
forcedDecisionsMap: {},
|
|
85
84
|
},
|
|
86
85
|
reasons: [],
|
|
87
86
|
},
|
|
88
|
-
|
|
87
|
+
test_flag_2: {
|
|
89
88
|
variationKey: 'max_10',
|
|
90
89
|
enabled: true,
|
|
91
90
|
variables: { max_family_members: 10 },
|
|
92
91
|
ruleKey: 'default-rollout-223709-29200910123',
|
|
93
|
-
flagKey: '
|
|
92
|
+
flagKey: 'test_flag_2',
|
|
94
93
|
userContext: {
|
|
95
94
|
_qualifiedSegments: null,
|
|
96
|
-
// optimizely: [e],
|
|
97
95
|
userId: 'user123',
|
|
98
96
|
attributes: {},
|
|
99
97
|
forcedDecisionsMap: {},
|
|
100
98
|
},
|
|
101
99
|
reasons: [],
|
|
102
100
|
},
|
|
103
|
-
|
|
101
|
+
test_flag_3: {
|
|
104
102
|
variationKey: 'off',
|
|
105
103
|
enabled: false,
|
|
106
104
|
variables: {},
|
|
107
105
|
ruleKey: 'default-rollout-225089-29200910123',
|
|
108
|
-
flagKey: '
|
|
106
|
+
flagKey: 'test_flag_3',
|
|
109
107
|
userContext: {
|
|
110
108
|
_qualifiedSegments: null,
|
|
111
|
-
// optimizely: [e],
|
|
112
109
|
userId: 'user123',
|
|
113
110
|
attributes: {},
|
|
114
111
|
forcedDecisionsMap: {},
|
|
@@ -138,30 +135,55 @@ var flagsMock = {
|
|
|
138
135
|
reasons: [],
|
|
139
136
|
},
|
|
140
137
|
};
|
|
141
|
-
// TO DO: Improve test coverage
|
|
142
138
|
beforeEach(function () {
|
|
143
139
|
jest.resetModules();
|
|
144
140
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: 'optimizely-sdk-key' });
|
|
145
141
|
});
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
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 () {
|
|
151
156
|
var flagsAll;
|
|
152
157
|
return __generator(this, function (_a) {
|
|
153
158
|
switch (_a.label) {
|
|
154
|
-
case 0: return [4 /*yield*/, (0, utils_1.
|
|
159
|
+
case 0: return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)()];
|
|
155
160
|
case 1:
|
|
156
161
|
flagsAll = _a.sent();
|
|
157
162
|
expect(flagsAll).toEqual({
|
|
158
|
-
|
|
159
|
-
|
|
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: {
|
|
160
182
|
variationKey: 'max_10',
|
|
161
183
|
enabled: true,
|
|
162
184
|
variables: { max_family_members: 10 },
|
|
163
185
|
},
|
|
164
|
-
|
|
186
|
+
test_flag_3: {
|
|
165
187
|
variationKey: 'off',
|
|
166
188
|
enabled: false,
|
|
167
189
|
variables: {},
|
|
@@ -183,13 +205,55 @@ describe('getFlagsAll', function () {
|
|
|
183
205
|
}
|
|
184
206
|
});
|
|
185
207
|
}); });
|
|
186
|
-
it('should return
|
|
187
|
-
var
|
|
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;
|
|
188
252
|
return __generator(this, function (_a) {
|
|
189
253
|
switch (_a.label) {
|
|
190
254
|
case 0:
|
|
191
255
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
|
|
192
|
-
|
|
256
|
+
config = {
|
|
193
257
|
sdkConfig: {
|
|
194
258
|
sdkKey: 'custom-optimizely-sdk',
|
|
195
259
|
},
|
|
@@ -197,18 +261,19 @@ describe('getFlagsAll', function () {
|
|
|
197
261
|
userId: 'user456',
|
|
198
262
|
attributes: { logged_in: true, cpn: 'AAA123', subs_type: 'digi-print' },
|
|
199
263
|
},
|
|
264
|
+
includeFlagVariables: true,
|
|
200
265
|
};
|
|
201
|
-
return [4 /*yield*/, (0, utils_1.
|
|
266
|
+
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(config)];
|
|
202
267
|
case 1:
|
|
203
268
|
flagsAll = _a.sent();
|
|
204
269
|
expect(flagsAll).toEqual({
|
|
205
|
-
|
|
206
|
-
|
|
270
|
+
test_flag_1: { variationKey: 'on', enabled: true, variables: {} },
|
|
271
|
+
test_flag_2: {
|
|
207
272
|
variationKey: 'max_10',
|
|
208
273
|
enabled: true,
|
|
209
274
|
variables: { max_family_members: 10 },
|
|
210
275
|
},
|
|
211
|
-
|
|
276
|
+
test_flag_3: {
|
|
212
277
|
variationKey: 'off',
|
|
213
278
|
enabled: false,
|
|
214
279
|
variables: {},
|
|
@@ -230,34 +295,13 @@ describe('getFlagsAll', function () {
|
|
|
230
295
|
}
|
|
231
296
|
});
|
|
232
297
|
}); });
|
|
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;
|
|
235
|
-
return __generator(this, function (_a) {
|
|
236
|
-
switch (_a.label) {
|
|
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()];
|
|
247
|
-
case 1:
|
|
248
|
-
flagsAll = _a.sent();
|
|
249
|
-
expect(flagsAll).toEqual({});
|
|
250
|
-
return [2 /*return*/];
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
}); });
|
|
254
298
|
it('should return empty object when called without sdk key', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
255
299
|
var flagsAll;
|
|
256
300
|
return __generator(this, function (_a) {
|
|
257
301
|
switch (_a.label) {
|
|
258
302
|
case 0:
|
|
259
303
|
process.env = __assign(__assign({}, originalEnv), { OPTIMIZELY_SDK_KEY: undefined });
|
|
260
|
-
return [4 /*yield*/, (0, utils_1.
|
|
304
|
+
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)()];
|
|
261
305
|
case 1:
|
|
262
306
|
flagsAll = _a.sent();
|
|
263
307
|
expect(flagsAll).toEqual({});
|
|
@@ -266,15 +310,15 @@ describe('getFlagsAll', function () {
|
|
|
266
310
|
});
|
|
267
311
|
}); });
|
|
268
312
|
it('should return empty object when sdk not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
269
|
-
var
|
|
313
|
+
var getAllFeatureFlags, flagsAll;
|
|
270
314
|
return __generator(this, function (_a) {
|
|
271
315
|
switch (_a.label) {
|
|
272
316
|
case 0:
|
|
273
317
|
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
274
318
|
createInstance: jest.fn().mockReturnValue(null),
|
|
275
319
|
}); });
|
|
276
|
-
|
|
277
|
-
return [4 /*yield*/,
|
|
320
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
321
|
+
return [4 /*yield*/, getAllFeatureFlags()];
|
|
278
322
|
case 1:
|
|
279
323
|
flagsAll = _a.sent();
|
|
280
324
|
expect(flagsAll).toEqual({});
|
|
@@ -283,15 +327,15 @@ describe('getFlagsAll', function () {
|
|
|
283
327
|
});
|
|
284
328
|
}); });
|
|
285
329
|
it('should return empty object when user context not initialized', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
286
|
-
var
|
|
330
|
+
var getAllFeatureFlags, flagsAll;
|
|
287
331
|
return __generator(this, function (_a) {
|
|
288
332
|
switch (_a.label) {
|
|
289
333
|
case 0:
|
|
290
334
|
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
291
335
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: jest.fn().mockReturnValue(null), onReady: jest.fn().mockResolvedValue({ success: true }) })); },
|
|
292
336
|
}); });
|
|
293
|
-
|
|
294
|
-
return [4 /*yield*/,
|
|
337
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
338
|
+
return [4 /*yield*/, getAllFeatureFlags()];
|
|
295
339
|
case 1:
|
|
296
340
|
flagsAll = _a.sent();
|
|
297
341
|
expect(flagsAll).toEqual({});
|
|
@@ -300,14 +344,14 @@ describe('getFlagsAll', function () {
|
|
|
300
344
|
});
|
|
301
345
|
}); });
|
|
302
346
|
it('should instantiate logger with log level', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
303
|
-
var
|
|
347
|
+
var config;
|
|
304
348
|
return __generator(this, function (_a) {
|
|
305
349
|
switch (_a.label) {
|
|
306
350
|
case 0:
|
|
307
|
-
|
|
351
|
+
config = {
|
|
308
352
|
logLevel: 'critical',
|
|
309
353
|
};
|
|
310
|
-
return [4 /*yield*/, (0, utils_1.
|
|
354
|
+
return [4 /*yield*/, (0, utils_1.getAllFeatureFlags)(config)];
|
|
311
355
|
case 1:
|
|
312
356
|
_a.sent();
|
|
313
357
|
expect(optimizely_sdk_1.setLogLevel).toBeCalledWith('critical');
|
|
@@ -317,7 +361,7 @@ describe('getFlagsAll', function () {
|
|
|
317
361
|
});
|
|
318
362
|
}); });
|
|
319
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 () {
|
|
320
|
-
var
|
|
364
|
+
var getAllFeatureFlags, flagsAll;
|
|
321
365
|
return __generator(this, function (_a) {
|
|
322
366
|
switch (_a.label) {
|
|
323
367
|
case 0:
|
|
@@ -325,204 +369,75 @@ describe('getFlagsAll', function () {
|
|
|
325
369
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
326
370
|
decideAll: jest
|
|
327
371
|
.fn()
|
|
328
|
-
.mockImplementation(function (
|
|
372
|
+
.mockImplementation(function (config) {
|
|
329
373
|
return flagsMock;
|
|
330
374
|
}),
|
|
331
375
|
}); }, onReady: jest
|
|
332
376
|
.fn()
|
|
333
377
|
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
334
378
|
}); });
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
defaultFeatureFlags: {
|
|
338
|
-
default_flag: {
|
|
339
|
-
variationKey: 'off',
|
|
340
|
-
enabled: true,
|
|
341
|
-
variables: {},
|
|
342
|
-
},
|
|
343
|
-
},
|
|
344
|
-
};
|
|
345
|
-
return [4 /*yield*/, getFlagsAll(options)];
|
|
379
|
+
getAllFeatureFlags = require('../utils').getAllFeatureFlags;
|
|
380
|
+
return [4 /*yield*/, getAllFeatureFlags(optionsWithDefaultFlags)];
|
|
346
381
|
case 1:
|
|
347
382
|
flagsAll = _a.sent();
|
|
348
|
-
expect(flagsAll).toEqual(
|
|
349
|
-
return [2 /*return*/];
|
|
350
|
-
}
|
|
351
|
-
});
|
|
352
|
-
}); });
|
|
353
|
-
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 () {
|
|
354
|
-
var getFlagsAll, flagsAll;
|
|
355
|
-
return __generator(this, function (_a) {
|
|
356
|
-
switch (_a.label) {
|
|
357
|
-
case 0:
|
|
358
|
-
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
359
|
-
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
360
|
-
decideAll: jest
|
|
361
|
-
.fn()
|
|
362
|
-
.mockImplementation(function (options) {
|
|
363
|
-
return flagsMock;
|
|
364
|
-
}),
|
|
365
|
-
}); }, onReady: jest
|
|
366
|
-
.fn()
|
|
367
|
-
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
368
|
-
}); });
|
|
369
|
-
getFlagsAll = require('../utils').getFlagsAll;
|
|
370
|
-
return [4 /*yield*/, getFlagsAll()];
|
|
371
|
-
case 1:
|
|
372
|
-
flagsAll = _a.sent();
|
|
373
|
-
expect(flagsAll).toEqual({});
|
|
383
|
+
expect(flagsAll).toEqual(optionsWithDefaultFlags.defaultFeatureFlags);
|
|
374
384
|
return [2 /*return*/];
|
|
375
385
|
}
|
|
376
386
|
});
|
|
377
387
|
}); });
|
|
378
388
|
});
|
|
379
|
-
describe('
|
|
380
|
-
it('should return
|
|
381
|
-
var
|
|
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;
|
|
382
392
|
return __generator(this, function (_a) {
|
|
383
393
|
switch (_a.label) {
|
|
384
|
-
case 0: return [4 /*yield*/, (0, utils_1.
|
|
394
|
+
case 0: return [4 /*yield*/, (0, utils_1.getFeatureFlagsByKeys)(['test_flag_3', 'test_flag_1'], optionsWithIncludeFlagVariables)];
|
|
385
395
|
case 1:
|
|
386
|
-
|
|
387
|
-
expect(
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
family_primary_enable_secondary_accounts: true,
|
|
394
|
-
family_primary_max_secondary_accounts: 10,
|
|
395
|
-
family_primary_metadata_json: {
|
|
396
|
-
metadata1: 'a',
|
|
397
|
-
},
|
|
398
|
-
},
|
|
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: {},
|
|
399
403
|
},
|
|
400
404
|
});
|
|
401
405
|
return [2 /*return*/];
|
|
402
406
|
}
|
|
403
407
|
});
|
|
404
408
|
}); });
|
|
405
|
-
it('should return
|
|
406
|
-
var getFlag, flagsAll;
|
|
407
|
-
return __generator(this, function (_a) {
|
|
408
|
-
switch (_a.label) {
|
|
409
|
-
case 0:
|
|
410
|
-
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 ({
|
|
411
|
-
decide: jest
|
|
412
|
-
.fn()
|
|
413
|
-
.mockImplementation(function (options) {
|
|
414
|
-
return undefined;
|
|
415
|
-
}),
|
|
416
|
-
}); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest.fn().mockResolvedValue({ success: true }) })); } })); });
|
|
417
|
-
getFlag = require('../utils').getFlag;
|
|
418
|
-
return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
|
|
419
|
-
case 1:
|
|
420
|
-
flagsAll = _a.sent();
|
|
421
|
-
expect(flagsAll).toEqual({});
|
|
422
|
-
return [2 /*return*/];
|
|
423
|
-
}
|
|
424
|
-
});
|
|
425
|
-
}); });
|
|
426
|
-
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 () {
|
|
427
|
-
var getFlag, options, flag;
|
|
428
|
-
return __generator(this, function (_a) {
|
|
429
|
-
switch (_a.label) {
|
|
430
|
-
case 0:
|
|
431
|
-
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
432
|
-
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
433
|
-
decide: jest
|
|
434
|
-
.fn()
|
|
435
|
-
.mockImplementation(function (key, options) {
|
|
436
|
-
return flagsMock[key];
|
|
437
|
-
}),
|
|
438
|
-
}); }, onReady: jest
|
|
439
|
-
.fn()
|
|
440
|
-
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
441
|
-
}); });
|
|
442
|
-
getFlag = require('../utils').getFlag;
|
|
443
|
-
options = {
|
|
444
|
-
defaultFeatureFlags: {
|
|
445
|
-
default_flag: {
|
|
446
|
-
variationKey: 'off',
|
|
447
|
-
enabled: true,
|
|
448
|
-
variables: {},
|
|
449
|
-
},
|
|
450
|
-
},
|
|
451
|
-
};
|
|
452
|
-
return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables', options)];
|
|
453
|
-
case 1:
|
|
454
|
-
flag = _a.sent();
|
|
455
|
-
expect(flag).toEqual(options.defaultFeatureFlags);
|
|
456
|
-
return [2 /*return*/];
|
|
457
|
-
}
|
|
458
|
-
});
|
|
459
|
-
}); });
|
|
460
|
-
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 () {
|
|
461
|
-
var getFlag, flag;
|
|
462
|
-
return __generator(this, function (_a) {
|
|
463
|
-
switch (_a.label) {
|
|
464
|
-
case 0:
|
|
465
|
-
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
466
|
-
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
467
|
-
decide: jest
|
|
468
|
-
.fn()
|
|
469
|
-
.mockImplementation(function (key, options) {
|
|
470
|
-
return flagsMock[key];
|
|
471
|
-
}),
|
|
472
|
-
}); }, onReady: jest
|
|
473
|
-
.fn()
|
|
474
|
-
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
475
|
-
}); });
|
|
476
|
-
getFlag = require('../utils').getFlag;
|
|
477
|
-
return [4 /*yield*/, getFlag('testing_flag_with_variations_and_variables')];
|
|
478
|
-
case 1:
|
|
479
|
-
flag = _a.sent();
|
|
480
|
-
expect(flag).toEqual({});
|
|
481
|
-
return [2 /*return*/];
|
|
482
|
-
}
|
|
483
|
-
});
|
|
484
|
-
}); });
|
|
485
|
-
});
|
|
486
|
-
describe('getFlagsByKeys', function () {
|
|
487
|
-
it('should return flags by keys with default options', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
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 () {
|
|
488
410
|
var flagsByKeys;
|
|
489
411
|
return __generator(this, function (_a) {
|
|
490
412
|
switch (_a.label) {
|
|
491
|
-
case 0: return [4 /*yield*/, (0, utils_1.
|
|
492
|
-
'
|
|
493
|
-
'
|
|
413
|
+
case 0: return [4 /*yield*/, (0, utils_1.getFeatureFlagsByKeys)([
|
|
414
|
+
'test_flag_3',
|
|
415
|
+
'test_flag_1',
|
|
494
416
|
])];
|
|
495
417
|
case 1:
|
|
496
418
|
flagsByKeys = _a.sent();
|
|
497
419
|
expect(flagsByKeys).toEqual({
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
variationKey: 'off',
|
|
501
|
-
enabled: false,
|
|
502
|
-
variables: {},
|
|
503
|
-
},
|
|
420
|
+
test_flag_1: true,
|
|
421
|
+
test_flag_3: false,
|
|
504
422
|
});
|
|
505
423
|
return [2 /*return*/];
|
|
506
424
|
}
|
|
507
425
|
});
|
|
508
426
|
}); });
|
|
509
427
|
it('should return empty object if no flags are fetched', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
510
|
-
var
|
|
428
|
+
var getFeatureFlagsByKeys, flagsAll;
|
|
511
429
|
return __generator(this, function (_a) {
|
|
512
430
|
switch (_a.label) {
|
|
513
431
|
case 0:
|
|
514
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 ({
|
|
515
433
|
decideForKeys: jest
|
|
516
434
|
.fn()
|
|
517
|
-
.mockImplementation(function (
|
|
435
|
+
.mockImplementation(function (config) {
|
|
518
436
|
return undefined;
|
|
519
437
|
}),
|
|
520
|
-
}); }, onReady: jest.fn().mockResolvedValue({ success: true })
|
|
521
|
-
|
|
522
|
-
return [4 /*yield*/,
|
|
523
|
-
'another_test_flag_1',
|
|
524
|
-
'qualtrics_flag',
|
|
525
|
-
])];
|
|
438
|
+
}); }, onReady: jest.fn().mockResolvedValue({ success: true }) })); } })); });
|
|
439
|
+
getFeatureFlagsByKeys = require('../utils').getFeatureFlagsByKeys;
|
|
440
|
+
return [4 /*yield*/, getFeatureFlagsByKeys(['test_flag_3', 'test_flag_1'])];
|
|
526
441
|
case 1:
|
|
527
442
|
flagsAll = _a.sent();
|
|
528
443
|
expect(flagsAll).toEqual({});
|
|
@@ -530,8 +445,8 @@ describe('getFlagsByKeys', function () {
|
|
|
530
445
|
}
|
|
531
446
|
});
|
|
532
447
|
}); });
|
|
533
|
-
it('should return defaultFeatureFlags when they have been passed and optimizely client
|
|
534
|
-
var
|
|
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;
|
|
535
450
|
return __generator(this, function (_a) {
|
|
536
451
|
switch (_a.label) {
|
|
537
452
|
case 0:
|
|
@@ -539,7 +454,7 @@ describe('getFlagsByKeys', function () {
|
|
|
539
454
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
540
455
|
decideForKeys: jest
|
|
541
456
|
.fn()
|
|
542
|
-
.mockImplementation(function (keys,
|
|
457
|
+
.mockImplementation(function (keys, config) {
|
|
543
458
|
var filtered = {};
|
|
544
459
|
keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
|
|
545
460
|
return filtered;
|
|
@@ -548,8 +463,8 @@ describe('getFlagsByKeys', function () {
|
|
|
548
463
|
.fn()
|
|
549
464
|
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
550
465
|
}); });
|
|
551
|
-
|
|
552
|
-
|
|
466
|
+
getFeatureFlagsByKeys = require('../utils').getFeatureFlagsByKeys;
|
|
467
|
+
config = {
|
|
553
468
|
defaultFeatureFlags: {
|
|
554
469
|
default_flag: {
|
|
555
470
|
variationKey: 'off',
|
|
@@ -558,16 +473,16 @@ describe('getFlagsByKeys', function () {
|
|
|
558
473
|
},
|
|
559
474
|
},
|
|
560
475
|
};
|
|
561
|
-
return [4 /*yield*/,
|
|
476
|
+
return [4 /*yield*/, getFeatureFlagsByKeys(['test_flag_3', 'test_flag_1'], config)];
|
|
562
477
|
case 1:
|
|
563
478
|
flagsByKeys = _a.sent();
|
|
564
|
-
expect(flagsByKeys).toEqual(
|
|
479
|
+
expect(flagsByKeys).toEqual(config.defaultFeatureFlags);
|
|
565
480
|
return [2 /*return*/];
|
|
566
481
|
}
|
|
567
482
|
});
|
|
568
483
|
}); });
|
|
569
|
-
it('should return empty object when no default flag have been passed and optimizely client
|
|
570
|
-
var
|
|
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;
|
|
571
486
|
return __generator(this, function (_a) {
|
|
572
487
|
switch (_a.label) {
|
|
573
488
|
case 0:
|
|
@@ -575,7 +490,7 @@ describe('getFlagsByKeys', function () {
|
|
|
575
490
|
createInstance: function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk').createInstance), { createUserContext: function () { return ({
|
|
576
491
|
decideForKeys: jest
|
|
577
492
|
.fn()
|
|
578
|
-
.mockImplementation(function (keys,
|
|
493
|
+
.mockImplementation(function (keys, config) {
|
|
579
494
|
var filtered = {};
|
|
580
495
|
keys.forEach(function (k) { return (filtered[k] = flagsMock[k]); });
|
|
581
496
|
return filtered;
|
|
@@ -584,10 +499,10 @@ describe('getFlagsByKeys', function () {
|
|
|
584
499
|
.fn()
|
|
585
500
|
.mockResolvedValue({ success: false, reason: 'Promise rejected' }) })); },
|
|
586
501
|
}); });
|
|
587
|
-
|
|
588
|
-
return [4 /*yield*/,
|
|
589
|
-
'
|
|
590
|
-
'
|
|
502
|
+
getFeatureFlagsByKeys = require('../utils').getFeatureFlagsByKeys;
|
|
503
|
+
return [4 /*yield*/, getFeatureFlagsByKeys([
|
|
504
|
+
'test_flag_3',
|
|
505
|
+
'test_flag_1',
|
|
591
506
|
])];
|
|
592
507
|
case 1:
|
|
593
508
|
flagsByKeys = _a.sent();
|
|
@@ -597,49 +512,49 @@ describe('getFlagsByKeys', function () {
|
|
|
597
512
|
});
|
|
598
513
|
}); });
|
|
599
514
|
});
|
|
600
|
-
describe('
|
|
601
|
-
it('should
|
|
602
|
-
var
|
|
515
|
+
describe('trackEvent', function () {
|
|
516
|
+
it('should track event successfully when user context is available', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
517
|
+
var mockTrackEvent, trackEvent, eventName, tags, config;
|
|
603
518
|
return __generator(this, function (_a) {
|
|
604
519
|
switch (_a.label) {
|
|
605
520
|
case 0:
|
|
606
|
-
|
|
607
|
-
|
|
521
|
+
mockTrackEvent = jest.fn();
|
|
522
|
+
jest.doMock('@optimizely/optimizely-sdk', function () { return (__assign(__assign({}, jest.requireActual('@optimizely/optimizely-sdk')), { createInstance: function () { return ({
|
|
523
|
+
createUserContext: function () { return ({
|
|
524
|
+
trackEvent: mockTrackEvent,
|
|
525
|
+
}); },
|
|
526
|
+
onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
527
|
+
}); } })); });
|
|
528
|
+
trackEvent = require('../utils').trackEvent;
|
|
529
|
+
eventName = 'test_event';
|
|
530
|
+
tags = { userId: '123', action: 'click' };
|
|
531
|
+
config = { sdkKey: 'test_key' };
|
|
532
|
+
return [4 /*yield*/, trackEvent(eventName, tags, config)];
|
|
608
533
|
case 1:
|
|
609
534
|
_a.sent();
|
|
610
|
-
|
|
611
|
-
case 2:
|
|
612
|
-
_a.sent();
|
|
613
|
-
expect(spy).toHaveBeenCalledWith('optimizely instance closed successfully');
|
|
535
|
+
expect(mockTrackEvent).toHaveBeenCalledWith(eventName, tags);
|
|
614
536
|
return [2 /*return*/];
|
|
615
537
|
}
|
|
616
538
|
});
|
|
617
539
|
}); });
|
|
618
|
-
it('should
|
|
619
|
-
var
|
|
620
|
-
return __generator(this, function (
|
|
621
|
-
switch (
|
|
540
|
+
it('should throw error when user context is not available', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
541
|
+
var trackEvent, eventName, tags, config;
|
|
542
|
+
return __generator(this, function (_a) {
|
|
543
|
+
switch (_a.label) {
|
|
622
544
|
case 0:
|
|
623
|
-
spy = jest.spyOn(console, 'log');
|
|
624
545
|
jest.doMock('@optimizely/optimizely-sdk', function () { return ({
|
|
625
|
-
createInstance: function () { return (
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
return flagsMock[key];
|
|
630
|
-
}),
|
|
631
|
-
}); }, onReady: jest.fn().mockResolvedValue({ success: true }), close: jest
|
|
632
|
-
.fn()
|
|
633
|
-
.mockResolvedValue({ success: false, reason: 'Closing rejected' }) })); },
|
|
546
|
+
createInstance: function () { return ({
|
|
547
|
+
createUserContext: jest.fn().mockReturnValue(null),
|
|
548
|
+
onReady: jest.fn().mockResolvedValue({ success: true }),
|
|
549
|
+
}); },
|
|
634
550
|
}); });
|
|
635
|
-
|
|
636
|
-
|
|
551
|
+
trackEvent = require('../utils').trackEvent;
|
|
552
|
+
eventName = 'test_event';
|
|
553
|
+
tags = { userId: '123', action: 'click' };
|
|
554
|
+
config = { sdkKey: 'test_key' };
|
|
555
|
+
return [4 /*yield*/, expect(trackEvent(eventName, tags, config)).rejects.toThrow("Failed to track event 'test_event': User context is not available.")];
|
|
637
556
|
case 1:
|
|
638
|
-
|
|
639
|
-
return [4 /*yield*/, closeFlagsInstance()];
|
|
640
|
-
case 2:
|
|
641
|
-
_b.sent();
|
|
642
|
-
expect(spy).toHaveBeenCalledWith('closing Optimizely instance failed, reason: Closing rejected');
|
|
557
|
+
_a.sent();
|
|
643
558
|
return [2 /*return*/];
|
|
644
559
|
}
|
|
645
560
|
});
|