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