Skip to content

Commit 9c9699b

Browse files
committed
Removed cloning from the project config
1 parent 340738e commit 9c9699b

File tree

8 files changed

+39
-36
lines changed

8 files changed

+39
-36
lines changed

packages/optimizely-sdk/lib/core/bucketer/index.tests.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
var bucketer = require('./');
1717
var enums = require('../../utils/enums');
1818
var logger = require('../../plugins/logger');
19+
var fns = require('../../utils/fns');
1920
var projectConfig = require('../project_config');
2021
var sprintf = require('@optimizely/js-sdk-utils').sprintf;
2122
var testData = require('../../tests/test_data').getTestProjectConfig();
@@ -46,7 +47,7 @@ describe('lib/core/bucketer', function() {
4647

4748
describe('return values for bucketing (excluding groups)', function() {
4849
beforeEach(function() {
49-
configObj = projectConfig.createProjectConfig(testData);
50+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
5051
bucketerParams = {
5152
experimentId: configObj.experiments[0].id,
5253
experimentKey: configObj.experiments[0].key,
@@ -91,7 +92,7 @@ describe('lib/core/bucketer', function() {
9192
describe('return values for bucketing (including groups)', function() {
9293
var bucketerStub;
9394
beforeEach(function() {
94-
configObj = projectConfig.createProjectConfig(testData);
95+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
9596
bucketerParams = {
9697
experimentId: configObj.experiments[0].id,
9798
experimentKey: configObj.experiments[0].key,
@@ -236,7 +237,7 @@ describe('lib/core/bucketer', function() {
236237

237238
describe('when the bucket value falls into empty traffic allocation ranges', function() {
238239
beforeEach(function() {
239-
configObj = projectConfig.createProjectConfig(testData);
240+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
240241
bucketerParams = {
241242
experimentId: configObj.experiments[0].id,
242243
experimentKey: configObj.experiments[0].key,
@@ -263,7 +264,7 @@ describe('lib/core/bucketer', function() {
263264

264265
describe('when the traffic allocation has invalid variation ids', function() {
265266
beforeEach(function() {
266-
configObj = projectConfig.createProjectConfig(testData);
267+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
267268
bucketerParams = {
268269
experimentId: configObj.experiments[0].id,
269270
experimentKey: configObj.experiments[0].key,
@@ -317,7 +318,7 @@ describe('lib/core/bucketer', function() {
317318
});
318319

319320
beforeEach(function() {
320-
configObj = projectConfig.createProjectConfig(testData);
321+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
321322
bucketerParams = {
322323
trafficAllocationConfig: configObj.experiments[0].trafficAllocation,
323324
variationIdMap: configObj.variationIdMap,

packages/optimizely-sdk/lib/core/decision_service/index.tests.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ var DECISION_SOURCES = enums.DECISION_SOURCES;
4040

4141
describe('lib/core/decision_service', function() {
4242
describe('APIs', function() {
43-
var configObj = projectConfig.createProjectConfig(testData);
43+
var configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
4444
var decisionServiceInstance;
4545
var mockLogger = logger.createLogger({logLevel: LOG_LEVEL.INFO});
4646
var bucketerStub;
@@ -642,7 +642,7 @@ describe('lib/core/decision_service', function() {
642642
it('should return null when a variation was previously set, and that variation\'s experiment no longer exists on the config object', function() {
643643
var didSetVariation = decisionServiceInstance.setForcedVariation(configObj, 'testExperiment', 'user1', 'control');
644644
assert.strictEqual(didSetVariation, true);
645-
var newConfigObj = projectConfig.createProjectConfig(testDataWithFeatures);
645+
var newConfigObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testDataWithFeatures));
646646
var forcedVar = decisionServiceInstance.getForcedVariation(newConfigObj, 'testExperiment', 'user1');
647647
assert.strictEqual(forcedVar, null);
648648
});
@@ -658,7 +658,7 @@ describe('lib/core/decision_service', function() {
658658

659659
// TODO: Move tests that test methods of Optimizely to lib/optimizely/index.tests.js
660660
describe('when a bucketingID is provided', function() {
661-
var configObj = projectConfig.createProjectConfig(testData);
661+
var configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
662662
var createdLogger = logger.createLogger({
663663
logLevel: LOG_LEVEL.DEBUG,
664664
logToConsole: false,
@@ -667,7 +667,7 @@ describe('lib/core/decision_service', function() {
667667
beforeEach(function () {
668668
optlyInstance = new Optimizely({
669669
clientEngine: 'node-sdk',
670-
datafile: testData,
670+
datafile: fns.cloneJsonObject(testData),
671671
jsonSchemaValidator: jsonSchemaValidator,
672672
isValidInstance: true,
673673
logger: createdLogger,
@@ -805,7 +805,7 @@ describe('lib/core/decision_service', function() {
805805

806806
beforeEach(function() {
807807
sinon.stub(mockLogger, 'log');
808-
configObj = projectConfig.createProjectConfig(testData);
808+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
809809
decisionService = DecisionService.createDecisionService({
810810
logger: mockLogger,
811811
});
@@ -840,7 +840,7 @@ describe('lib/core/decision_service', function() {
840840
var sandbox;
841841
var mockLogger = logger.createLogger({logLevel: LOG_LEVEL.INFO});
842842
beforeEach(function() {
843-
configObj = projectConfig.createProjectConfig(testDataWithFeatures);
843+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testDataWithFeatures));
844844
sandbox = sinon.sandbox.create();
845845
sandbox.stub(mockLogger, 'log');
846846
decisionServiceInstance = DecisionService.createDecisionService({
@@ -1622,7 +1622,7 @@ describe('lib/core/decision_service', function() {
16221622
var __buildBucketerParamsSpy;
16231623

16241624
beforeEach(function() {
1625-
configObj = projectConfig.createProjectConfig(testDataWithFeatures);
1625+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testDataWithFeatures));
16261626
feature = configObj.featureKeyMap.test_feature;
16271627
decisionService = DecisionService.createDecisionService({
16281628
logger: logger.createLogger({logLevel: LOG_LEVEL.INFO}),

packages/optimizely-sdk/lib/core/optimizely_config/index.tests.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616
var assert = require('chai').assert;
17-
17+
var fns = require('../../utils/fns');
1818
var datafile = require('../../tests/test_data').getTestProjectConfigWithFeatures();
1919
var projectConfig = require('../project_config');
2020
var optimizelyConfig = require('./index');
@@ -37,15 +37,15 @@ describe('lib/core/optimizely_config', function() {
3737
var optimizelyConfigObject;
3838
var projectConfigObject;
3939
beforeEach(function() {
40-
projectConfigObject = projectConfig.createProjectConfig(datafile);
40+
projectConfigObject = projectConfig.createProjectConfig(fns.cloneJsonObject(datafile));
4141
optimizelyConfigObject = optimizelyConfig.getOptimizelyConfig(projectConfigObject);
4242
});
4343

4444
it('should return all experiments except rollouts', function() {
4545
var experimentsMap = optimizelyConfigObject.experimentsMap;
4646
var experimentsCount = Object.keys(optimizelyConfigObject.experimentsMap).length;
4747
assert.equal(experimentsCount, 6);
48-
48+
4949
var allExperiments = getAllExperimentsFromDatafile(datafile);
5050
allExperiments.forEach(function(experiment) {
5151
assert.include(experimentsMap[experiment.key], {
@@ -61,11 +61,11 @@ describe('lib/core/optimizely_config', function() {
6161
});
6262
});
6363
});
64-
64+
6565
it('should return all the feature flags', function() {
6666
var featureFlagsCount = Object.keys(optimizelyConfigObject.featuresMap).length;
6767
assert.equal(featureFlagsCount, 7);
68-
68+
6969
var featuresMap = optimizelyConfigObject.featuresMap;
7070
datafile.featureFlags.forEach(function(featureFlag) {
7171
assert.include(featuresMap[featureFlag.key], {
@@ -87,7 +87,7 @@ describe('lib/core/optimizely_config', function() {
8787
});
8888
});
8989
});
90-
90+
9191
it('should correctly merge all feature variables', function() {
9292
var featureFlags = datafile.featureFlags;
9393
var datafileExperimentsMap = getAllExperimentsFromDatafile(datafile)
@@ -111,9 +111,9 @@ describe('lib/core/optimizely_config', function() {
111111
type: variableToAssert.type,
112112
});
113113
if (!variation.featureEnabled) {
114-
assert.equal(variable.defaultValue, variableToAssert.value);
114+
assert.equal(variable.defaultValue, variableToAssert.value);
115115
}
116-
});
116+
});
117117
})
118118
});
119119
});

packages/optimizely-sdk/lib/core/project_config/index.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ module.exports = {
3535
* @return {Object} Object representing project configuration
3636
*/
3737
createProjectConfig: function(datafile) {
38-
var projectConfig = fns.cloneJsonObject(datafile);
39-
38+
var projectConfig = datafile;
4039
/*
4140
* Conditions of audiences in projectConfig.typedAudiences are not
4241
* expected to be string-encoded as they are here in projectConfig.audiences.
@@ -53,7 +52,7 @@ module.exports = {
5352

5453
var experiments;
5554
Object.keys(projectConfig.groupIdMap || {}).forEach(function(Id) {
56-
experiments = fns.cloneJsonObject(projectConfig.groupIdMap[Id].experiments);
55+
experiments = projectConfig.groupIdMap[Id].experiments;
5756
(experiments || []).forEach(function(experiment) {
5857
projectConfig.experiments.push(fns.assign(experiment, {groupId: Id}));
5958
});
@@ -62,7 +61,7 @@ module.exports = {
6261
projectConfig.rolloutIdMap = fns.keyBy(projectConfig.rollouts || [], 'id');
6362
jsSdkUtils.objectValues(projectConfig.rolloutIdMap || {}).forEach(function (rollout) {
6463
(rollout.experiments || []).forEach(function(experiment) {
65-
projectConfig.experiments.push(fns.cloneJsonObject(experiment));
64+
projectConfig.experiments.push(experiment);
6665
// Creates { <variationKey>: <variation> } map inside of the experiment
6766
experiment.variationKeyMap = fns.keyBy(experiment.variations, 'key');
6867
});

packages/optimizely-sdk/lib/core/project_config/index.tests.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ describe('lib/core/project_config', function() {
4141
var configObj = projectConfig.createProjectConfig(testData);
4242

4343
_.forEach(testData.audiences, function(audience) {
44-
audience.conditions = JSON.parse(audience.conditions);
44+
audience.conditions = JSON.parse(JSON.stringify(audience.conditions));
4545
});
4646

4747
assert.strictEqual(configObj.accountId, testData.accountId);
@@ -230,7 +230,7 @@ describe('lib/core/project_config', function() {
230230
var createdLogger = loggerPlugin.createLogger({logLevel: LOG_LEVEL.INFO});
231231

232232
beforeEach(function() {
233-
configObj = projectConfig.createProjectConfig(testData);
233+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
234234
sinon.stub(createdLogger, 'log');
235235
});
236236

@@ -531,13 +531,13 @@ describe('lib/core/project_config', function() {
531531

532532
describe('#getExperimentAudienceConditions', function() {
533533
it('should retrieve audiences for valid experiment key', function() {
534-
configObj = projectConfig.createProjectConfig(testData);
534+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
535535
assert.deepEqual(projectConfig.getExperimentAudienceConditions(configObj, testData.experiments[1].key),
536536
['11154']);
537537
});
538538

539539
it('should throw error for invalid experiment key', function() {
540-
configObj = projectConfig.createProjectConfig(testData);
540+
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
541541
assert.throws(function() {
542542
projectConfig.getExperimentAudienceConditions(configObj, 'invalidExperimentKey');
543543
}, sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, 'PROJECT_CONFIG', 'invalidExperimentKey'));

packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var assert = require('chai').assert;
1818
var datafileManager = require('@optimizely/js-sdk-datafile-manager');
1919
var logging = require('@optimizely/js-sdk-logging');
2020
var sinon = require('sinon');
21+
var fns = require('../../utils/fns');
2122
var sprintf = require('@optimizely/js-sdk-utils').sprintf;
2223
var enums = require('../../utils/enums');
2324
var jsonSchemaValidator = require('../../utils/json_schema_validator');
@@ -153,7 +154,7 @@ describe('lib/core/project_config/project_config_manager', function() {
153154
it('should return a valid datafile from getConfig and resolve onReady with a successful result', function() {
154155
var configWithFeatures = testData.getTestProjectConfigWithFeatures();
155156
var manager = new projectConfigManager.ProjectConfigManager({
156-
datafile: configWithFeatures,
157+
datafile: fns.cloneJsonObject(configWithFeatures),
157158
});
158159
assert.deepEqual(
159160
manager.getConfig(),
@@ -180,8 +181,9 @@ describe('lib/core/project_config/project_config_manager', function() {
180181

181182
describe('with a datafile manager', function() {
182183
it('passes the correct options to datafile manager', function() {
184+
var config = testData.getTestProjectConfig()
183185
new projectConfigManager.ProjectConfigManager({
184-
datafile: testData.getTestProjectConfig(),
186+
datafile: config,
185187
sdkKey: '12345',
186188
datafileOptions: {
187189
autoUpdate: true,
@@ -190,7 +192,7 @@ describe('lib/core/project_config/project_config_manager', function() {
190192
});
191193
sinon.assert.calledOnce(datafileManager.HttpPollingDatafileManager);
192194
sinon.assert.calledWithExactly(datafileManager.HttpPollingDatafileManager, sinon.match({
193-
datafile: testData.getTestProjectConfig(),
195+
datafile: config,
194196
sdkKey: '12345',
195197
autoUpdate: true,
196198
updateInterval: 10000,
@@ -203,7 +205,7 @@ describe('lib/core/project_config/project_config_manager', function() {
203205
datafileManager.HttpPollingDatafileManager.returns({
204206
start: sinon.stub(),
205207
stop: sinon.stub(),
206-
get: sinon.stub().returns(configWithFeatures),
208+
get: sinon.stub().returns(fns.cloneJsonObject(configWithFeatures)),
207209
on: sinon.stub().returns(function() {}),
208210
onReady: sinon.stub().returns(Promise.resolve())
209211
});
@@ -233,7 +235,7 @@ describe('lib/core/project_config/project_config_manager', function() {
233235
});
234236
nextDatafile.revision = '36';
235237
var fakeDatafileManager = datafileManager.HttpPollingDatafileManager.getCall(0).returnValue;
236-
fakeDatafileManager.get.returns(nextDatafile);
238+
fakeDatafileManager.get.returns(fns.cloneJsonObject(nextDatafile));
237239
var updateListener = fakeDatafileManager.on.getCall(0).args[1];
238240
updateListener({ datafile: nextDatafile });
239241
assert.deepEqual(

packages/optimizely-sdk/lib/optimizely/index.tests.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,10 @@ describe('lib/optimizely', function() {
215215
});
216216

217217
it('passes datafile, datafileOptions, sdkKey, and other options to the project config manager', function() {
218+
var config = testData.getTestProjectConfig();
218219
new Optimizely({
219220
clientEngine: 'node-sdk',
220-
datafile: testData.getTestProjectConfig(),
221+
datafile: config,
221222
datafileOptions: {
222223
autoUpdate: true,
223224
updateInterval: 2 * 60 * 1000,
@@ -232,7 +233,7 @@ describe('lib/optimizely', function() {
232233
});
233234
sinon.assert.calledOnce(projectConfigManager.ProjectConfigManager);
234235
sinon.assert.calledWithExactly(projectConfigManager.ProjectConfigManager, {
235-
datafile: testData.getTestProjectConfig(),
236+
datafile: config,
236237
datafileOptions: {
237238
autoUpdate: true,
238239
updateInterval: 2 * 60 * 1000,

packages/optimizely-sdk/lib/tests/test_data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2437,7 +2437,7 @@ var typedAudiencesConfig = {
24372437
};
24382438

24392439
var getTypedAudiencesConfig = function() {
2440-
return typedAudiencesConfig;
2440+
return fns.cloneJsonObject(typedAudiencesConfig);
24412441
};
24422442

24432443
var typedAudiencesById = {

0 commit comments

Comments
 (0)