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