Skip to content

Commit e1bf59c

Browse files
authored
fix: Change experimentKey and variationKey to be null in rollout in decisionInfo payload (#644)
* Change experimentKey and variationKey from empty string to null in rollout * Change OptimizelyDecideOptions[] to OptimizelyDecideOption[] to be consistent with other sdks
1 parent dc47f71 commit e1bf59c

File tree

9 files changed

+59
-59
lines changed

9 files changed

+59
-59
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import * as enums from '../../utils/enums';
2121
import projectConfig from '../project_config';
2222
import AudienceEvaluator from '../audience_evaluator';
2323
import * as stringValidator from '../../utils/string_value_validator';
24-
import { OptimizelyDecideOptions } from '../../shared_types';
24+
import { OptimizelyDecideOption } from '../../shared_types';
2525

2626
var MODULE_NAME = 'DECISION_SERVICE';
2727
var ERROR_MESSAGES = enums.ERROR_MESSAGES;
@@ -100,7 +100,7 @@ DecisionService.prototype.getVariation = function(configObj, experimentKey, user
100100
};
101101
}
102102

103-
var shouldIgnoreUPS = options[OptimizelyDecideOptions.IGNORE_USER_PROFILE_SERVICE];
103+
var shouldIgnoreUPS = options[OptimizelyDecideOption.IGNORE_USER_PROFILE_SERVICE];
104104

105105
// check for sticky bucketing if decide options do not include shouldIgnoreUPS
106106
if (!shouldIgnoreUPS) {

packages/optimizely-sdk/lib/index.browser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import * as enums from './utils/enums';
2929
import loggerPlugin from './plugins/logger';
3030
import Optimizely from './optimizely';
3131
import eventProcessorConfigValidator from './utils/event_processor_config_validator';
32-
import { SDKOptions, OptimizelyDecideOptions } from './shared_types';
32+
import { SDKOptions, OptimizelyDecideOption } from './shared_types';
3333

3434
const logger = getLogger();
3535
setLogHandler(loggerPlugin.createLogger());
@@ -153,7 +153,7 @@ export {
153153
setLogLevel,
154154
createInstance,
155155
__internalResetRetryState,
156-
OptimizelyDecideOptions,
156+
OptimizelyDecideOption,
157157
};
158158

159159
export default {
@@ -165,5 +165,5 @@ export default {
165165
setLogLevel,
166166
createInstance,
167167
__internalResetRetryState,
168-
OptimizelyDecideOptions,
168+
OptimizelyDecideOption,
169169
};

packages/optimizely-sdk/lib/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ declare module '@optimizely/optimizely-sdk' {
6565

6666
export type OptimizelyDecision = import('./optimizely_decision').OptimizelyDecision;
6767

68-
export enum OptimizelyDecideOptions {
68+
export enum OptimizelyDecideOption {
6969
DISABLE_DECISION_EVENT = 'DISABLE_DECISION_EVENT',
7070
ENABLED_FLAGS_ONLY = 'ENABLED_FLAGS_ONLY',
7171
IGNORE_USER_PROFILE_SERVICE = 'IGNORE_USER_PROFILE_SERVICE',

packages/optimizely-sdk/lib/index.node.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import configValidator from './utils/config_validator';
2828
import defaultErrorHandler from './plugins/error_handler';
2929
import defaultEventDispatcher from './plugins/event_dispatcher/index.node';
3030
import eventProcessorConfigValidator from './utils/event_processor_config_validator';
31-
import { SDKOptions, OptimizelyDecideOptions } from './shared_types';
31+
import { SDKOptions, OptimizelyDecideOption } from './shared_types';
3232

3333
const logger = getLogger();
3434
setLogLevel(LogLevel.ERROR);
@@ -116,7 +116,7 @@ export {
116116
setLogHandler as setLogger,
117117
setLogLevel,
118118
createInstance,
119-
OptimizelyDecideOptions,
119+
OptimizelyDecideOption,
120120
};
121121

122122
export default {
@@ -127,5 +127,5 @@ export default {
127127
setLogger: setLogHandler,
128128
setLogLevel,
129129
createInstance,
130-
OptimizelyDecideOptions,
130+
OptimizelyDecideOption,
131131
};

packages/optimizely-sdk/lib/index.react_native.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import defaultErrorHandler from './plugins/error_handler';
2828
import loggerPlugin from './plugins/logger/index.react_native';
2929
import defaultEventDispatcher from './plugins/event_dispatcher/index.browser';
3030
import eventProcessorConfigValidator from './utils/event_processor_config_validator';
31-
import { SDKOptions, OptimizelyDecideOptions } from './shared_types';
31+
import { SDKOptions, OptimizelyDecideOption } from './shared_types';
3232

3333
const logger = getLogger();
3434
setLogHandler(loggerPlugin.createLogger());
@@ -112,7 +112,7 @@ export {
112112
setLogHandler as setLogger,
113113
setLogLevel,
114114
createInstance,
115-
OptimizelyDecideOptions,
115+
OptimizelyDecideOption,
116116
};
117117

118118
export default {
@@ -123,5 +123,5 @@ export default {
123123
setLogger: setLogHandler,
124124
setLogLevel,
125125
createInstance,
126-
OptimizelyDecideOptions,
126+
OptimizelyDecideOption,
127127
};

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

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import * as logging from '@optimizely/js-sdk-logging';
2121

2222
import Optimizely from './';
2323
import OptimizelyUserContext from '../optimizely_user_context';
24-
import { OptimizelyDecideOptions } from '../shared_types';
24+
import { OptimizelyDecideOption } from '../shared_types';
2525
import AudienceEvaluator from '../core/audience_evaluator';
2626
import bluebird from 'bluebird';
2727
import bucketer from '../core/bucketer';
@@ -4707,7 +4707,7 @@ describe('lib/optimizely', function() {
47074707
optimizely: optlyInstance,
47084708
userId,
47094709
});
4710-
var decision = optlyInstance.decide(user, flagKey, [ OptimizelyDecideOptions.DISABLE_DECISION_EVENT ]);
4710+
var decision = optlyInstance.decide(user, flagKey, [ OptimizelyDecideOption.DISABLE_DECISION_EVENT ]);
47114711
var expectedDecision = {
47124712
variationKey: 'variation_with_traffic',
47134713
enabled: true,
@@ -4747,7 +4747,7 @@ describe('lib/optimizely', function() {
47474747
optimizely: optlyInstance,
47484748
userId,
47494749
});
4750-
var decision = optlyInstance.decide(user, flagKey, [ OptimizelyDecideOptions.DISABLE_DECISION_EVENT, OptimizelyDecideOptions.EXCLUDE_VARIABLES ]);
4750+
var decision = optlyInstance.decide(user, flagKey, [ OptimizelyDecideOption.DISABLE_DECISION_EVENT, OptimizelyDecideOption.EXCLUDE_VARIABLES ]);
47514751
var expectedDecision = {
47524752
variationKey: 'variation_with_traffic',
47534753
enabled: true,
@@ -4875,10 +4875,10 @@ describe('lib/optimizely', function() {
48754875
});
48764876
var decision = optlyInstance.decide(user, flagKey);
48774877
var expectedDecision = {
4878-
variationKey: '',
4878+
variationKey: null,
48794879
enabled: false,
48804880
variables: expectedVariables,
4881-
ruleKey: '',
4881+
ruleKey: null,
48824882
flagKey: flagKey,
48834883
userContext: user,
48844884
reasons: [],
@@ -4896,8 +4896,8 @@ describe('lib/optimizely', function() {
48964896
decisionInfo: {
48974897
flagKey: 'feature_3',
48984898
enabled: false,
4899-
ruleKey: '',
4900-
variationKey: '',
4899+
ruleKey: null,
4900+
variationKey: null,
49014901
variables: expectedVariables,
49024902
decisionEventDispatched: true,
49034903
reasons: [],
@@ -4919,7 +4919,7 @@ describe('lib/optimizely', function() {
49194919
logger: createdLogger,
49204920
isValidInstance: true,
49214921
eventBatchSize: 1,
4922-
defaultDecideOptions: [ OptimizelyDecideOptions.EXCLUDE_VARIABLES ],
4922+
defaultDecideOptions: [ OptimizelyDecideOption.EXCLUDE_VARIABLES ],
49234923
});
49244924

49254925
sinon.stub(optlyInstance.notificationCenter, 'sendNotifications');
@@ -4981,7 +4981,7 @@ describe('lib/optimizely', function() {
49814981
optimizely: optlyInstance,
49824982
userId
49834983
});
4984-
var decision = optlyInstance.decide(user, flagKey, [ OptimizelyDecideOptions.DISABLE_DECISION_EVENT ]);
4984+
var decision = optlyInstance.decide(user, flagKey, [ OptimizelyDecideOption.DISABLE_DECISION_EVENT ]);
49854985
var expectedDecisionObj = {
49864986
variationKey: 'variation_with_traffic',
49874987
enabled: true,
@@ -5027,7 +5027,7 @@ describe('lib/optimizely', function() {
50275027
logger: createdLogger,
50285028
isValidInstance: true,
50295029
eventBatchSize: 1,
5030-
defaultDecideOptions: [ OptimizelyDecideOptions.DISABLE_DECISION_EVENT ],
5030+
defaultDecideOptions: [ OptimizelyDecideOption.DISABLE_DECISION_EVENT ],
50315031
});
50325032

50335033
sinon.stub(optlyInstance.notificationCenter, 'sendNotifications');
@@ -5090,7 +5090,7 @@ describe('lib/optimizely', function() {
50905090
logger: createdLogger,
50915091
isValidInstance: true,
50925092
eventBatchSize: 1,
5093-
defaultDecideOptions: [ OptimizelyDecideOptions.INCLUDE_REASONS ],
5093+
defaultDecideOptions: [ OptimizelyDecideOption.INCLUDE_REASONS ],
50945094
});
50955095

50965096
sinon.stub(optlyInstance.notificationCenter, 'sendNotifications');
@@ -5145,7 +5145,7 @@ describe('lib/optimizely', function() {
51455145
logger: createdLogger,
51465146
isValidInstance: true,
51475147
eventBatchSize: 1,
5148-
defaultDecideOptions: [ OptimizelyDecideOptions.INCLUDE_REASONS ],
5148+
defaultDecideOptions: [ OptimizelyDecideOption.INCLUDE_REASONS ],
51495149
});
51505150
var user = new OptimizelyUserContext({
51515151
optimizely: optlyInstanceWithUserProfile,
@@ -5694,7 +5694,7 @@ describe('lib/optimizely', function() {
56945694
var decision1 = optlyInstanceWithUserProfile.decide(user, flagKey);
56955695
// should return variationId2 set by UPS
56965696
assert.equal(variationKey2, decision1.variationKey);
5697-
var decision2 = optlyInstanceWithUserProfile.decide(user, flagKey, [ OptimizelyDecideOptions.IGNORE_USER_PROFILE_SERVICE ]);
5697+
var decision2 = optlyInstanceWithUserProfile.decide(user, flagKey, [ OptimizelyDecideOption.IGNORE_USER_PROFILE_SERVICE ]);
56985698
// should ignore variationId2 set by UPS and return variationId1
56995699
assert.equal(variationKey1, decision2.variationKey);
57005700
// also should not save either
@@ -5728,7 +5728,7 @@ describe('lib/optimizely', function() {
57285728
logger: createdLogger,
57295729
isValidInstance: true,
57305730
eventBatchSize: 1,
5731-
defaultDecideOptions: [ OptimizelyDecideOptions.IGNORE_USER_PROFILE_SERVICE ]
5731+
defaultDecideOptions: [ OptimizelyDecideOption.IGNORE_USER_PROFILE_SERVICE ]
57325732
});
57335733
var user = new OptimizelyUserContext({
57345734
optimizely: optlyInstanceWithUserProfile,
@@ -5827,7 +5827,7 @@ describe('lib/optimizely', function() {
58275827
var flagKey2 = 'feature_3';
58285828
var user = optlyInstance.createUserContext(userId, { gender: 'female' });
58295829
var expectedVariables = optlyInstance.getAllFeatureVariables(flagKey1, userId);
5830-
var decisionsMap = optlyInstance.decideForKeys(user, [ flagKey1, flagKey2 ], [ OptimizelyDecideOptions.ENABLED_FLAGS_ONLY ]);
5830+
var decisionsMap = optlyInstance.decideForKeys(user, [ flagKey1, flagKey2 ], [ OptimizelyDecideOption.ENABLED_FLAGS_ONLY ]);
58315831
var decision = decisionsMap[flagKey1];
58325832
var expectedDecision = {
58335833
variationKey: 'variation_with_traffic',
@@ -5897,10 +5897,10 @@ describe('lib/optimizely', function() {
58975897
reasons: [],
58985898
}
58995899
var expectedDecision3 = {
5900-
variationKey: '',
5900+
variationKey: null,
59015901
enabled: false,
59025902
variables: expectedVariables3,
5903-
ruleKey: '',
5903+
ruleKey: null,
59045904
flagKey: allFlagKeysArray[2],
59055905
userContext: user,
59065906
reasons: [],
@@ -5918,7 +5918,7 @@ describe('lib/optimizely', function() {
59185918
var user = optlyInstance.createUserContext(userId, { gender: 'female' });
59195919
var expectedVariables1 = optlyInstance.getAllFeatureVariables(flagKey1, userId);
59205920
var expectedVariables2 = optlyInstance.getAllFeatureVariables(flagKey2, userId);
5921-
var decisionsMap = optlyInstance.decideAll(user, [ OptimizelyDecideOptions.ENABLED_FLAGS_ONLY ]);
5921+
var decisionsMap = optlyInstance.decideAll(user, [ OptimizelyDecideOption.ENABLED_FLAGS_ONLY ]);
59225922
var decision1 = decisionsMap[flagKey1];
59235923
var decision2 = decisionsMap[flagKey2];
59245924
var expectedDecision1 = {
@@ -5957,7 +5957,7 @@ describe('lib/optimizely', function() {
59575957
logger: createdLogger,
59585958
isValidInstance: true,
59595959
eventBatchSize: 1,
5960-
defaultDecideOptions: [ OptimizelyDecideOptions.ENABLED_FLAGS_ONLY ],
5960+
defaultDecideOptions: [ OptimizelyDecideOption.ENABLED_FLAGS_ONLY ],
59615961
});
59625962

59635963
sinon.stub(optlyInstance.notificationCenter, 'sendNotifications');
@@ -6004,7 +6004,7 @@ describe('lib/optimizely', function() {
60046004
var flagKey1 = 'feature_1';
60056005
var flagKey2 = 'feature_2';
60066006
var user = optlyInstance.createUserContext(userId, { gender: 'female' });
6007-
var decisionsMap = optlyInstance.decideAll(user, [ OptimizelyDecideOptions.EXCLUDE_VARIABLES ]);
6007+
var decisionsMap = optlyInstance.decideAll(user, [ OptimizelyDecideOption.EXCLUDE_VARIABLES ]);
60086008
var decision1 = decisionsMap[flagKey1];
60096009
var decision2 = decisionsMap[flagKey2];
60106010
var expectedDecision1 = {

packages/optimizely-sdk/lib/optimizely/index.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
FeatureFlag,
2727
FeatureVariable,
2828
OptimizelyOptions,
29-
OptimizelyDecideOptions
29+
OptimizelyDecideOption
3030
} from '../shared_types';
3131
import { OptimizelyDecision, newErrorDecision } from '../optimizely_decision';
3232
import OptimizelyUserContext from '../optimizely_user_context';
@@ -122,8 +122,8 @@ export default class Optimizely {
122122

123123
const defaultDecideOptions: { [key: string]: boolean } = {};
124124
decideOptionsArray.forEach((option) => {
125-
// Filter out all provided default decide options that are not in OptimizelyDecideOptions[]
126-
if (OptimizelyDecideOptions[option]) {
125+
// Filter out all provided default decide options that are not in OptimizelyDecideOption[]
126+
if (OptimizelyDecideOption[option]) {
127127
defaultDecideOptions[option] = true;
128128
} else {
129129
this.logger.log(
@@ -1466,7 +1466,7 @@ export default class Optimizely {
14661466
decide(
14671467
user: OptimizelyUserContext,
14681468
key: string,
1469-
options: OptimizelyDecideOptions[] = []
1469+
options: OptimizelyDecideOption[] = []
14701470
): OptimizelyDecision {
14711471
const configObj = this.projectConfigManager.getConfig();
14721472
const reasons: string[] = [];
@@ -1496,8 +1496,8 @@ export default class Optimizely {
14961496
reasons.push(...decisionVariation.reasons);
14971497
const decisionObj = decisionVariation.result;
14981498
const decisionSource = decisionObj.decisionSource;
1499-
const experimentKey = decision.getExperimentKey(decisionObj);
1500-
const variationKey = decision.getVariationKey(decisionObj);
1499+
const experimentKey = decisionObj.experiment?.key ?? null;
1500+
const variationKey = decisionObj.variation?.key ?? null;
15011501
const flagEnabled: boolean = decision.getFeatureEnabledFromVariation(decisionObj);
15021502
if (flagEnabled === true) {
15031503
this.logger.log(
@@ -1514,7 +1514,7 @@ export default class Optimizely {
15141514
const variablesMap: { [key: string]: unknown } = {};
15151515
let decisionEventDispatched = false;
15161516

1517-
if (!allDecideOptions[OptimizelyDecideOptions.EXCLUDE_VARIABLES]) {
1517+
if (!allDecideOptions[OptimizelyDecideOption.EXCLUDE_VARIABLES]) {
15181518
feature.variables.forEach(variable => {
15191519
variablesMap[variable.key] =
15201520
this.getFeatureVariableValueFromVariation(
@@ -1528,7 +1528,7 @@ export default class Optimizely {
15281528
}
15291529

15301530
if (
1531-
!allDecideOptions[OptimizelyDecideOptions.DISABLE_DECISION_EVENT] && (
1531+
!allDecideOptions[OptimizelyDecideOption.DISABLE_DECISION_EVENT] && (
15321532
decisionSource === DECISION_SOURCES.FEATURE_TEST ||
15331533
decisionSource === DECISION_SOURCES.ROLLOUT && projectConfig.getSendFlagDecisionsValue(configObj))
15341534
) {
@@ -1542,7 +1542,7 @@ export default class Optimizely {
15421542
decisionEventDispatched = true;
15431543
}
15441544

1545-
const shouldIncludeReasons = allDecideOptions[OptimizelyDecideOptions.INCLUDE_REASONS];
1545+
const shouldIncludeReasons = allDecideOptions[OptimizelyDecideOption.INCLUDE_REASONS];
15461546
const reportedReasons = shouldIncludeReasons ? reasons: [];
15471547

15481548
const featureInfo = {
@@ -1575,17 +1575,17 @@ export default class Optimizely {
15751575

15761576
/**
15771577
* Get all decide options.
1578-
* @param {OptimizelyDecideOptions[]} options decide options
1578+
* @param {OptimizelyDecideOption[]} options decide options
15791579
* @return {[key: string]: boolean} Map of all provided decide options including default decide options
15801580
*/
1581-
private getAllDecideOptions(options: OptimizelyDecideOptions[]): { [key: string]: boolean } {
1581+
private getAllDecideOptions(options: OptimizelyDecideOption[]): { [key: string]: boolean } {
15821582
const allDecideOptions = {...this.defaultDecideOptions};
15831583
if (!Array.isArray(options)) {
15841584
this.logger.log(LOG_LEVEL.DEBUG, sprintf(LOG_MESSAGES.INVALID_DECIDE_OPTIONS, MODULE_NAME));
15851585
} else {
15861586
options.forEach((option) => {
1587-
// Filter out all provided decide options that are not in OptimizelyDecideOptions[]
1588-
if (OptimizelyDecideOptions[option]) {
1587+
// Filter out all provided decide options that are not in OptimizelyDecideOption[]
1588+
if (OptimizelyDecideOption[option]) {
15891589
allDecideOptions[option] = true;
15901590
} else {
15911591
this.logger.log(
@@ -1605,13 +1605,13 @@ export default class Optimizely {
16051605
* The SDK will always return an object of decisions. When it cannot process requests, it will return an empty object after logging the errors.
16061606
* @param {OptimizelyUserContext} user A user context associated with this OptimizelyClient
16071607
* @param {string[]} keys An array of flag keys for which decisions will be made.
1608-
* @param {OptimizelyDecideOptions[]} options An array of options for decision-making.
1608+
* @param {OptimizelyDecideOption[]} options An array of options for decision-making.
16091609
* @return {[key: string]: OptimizelyDecision} An object of decision results mapped by flag keys.
16101610
*/
16111611
decideForKeys(
16121612
user: OptimizelyUserContext,
16131613
keys: string[],
1614-
options: OptimizelyDecideOptions[] = []
1614+
options: OptimizelyDecideOption[] = []
16151615
): { [key: string]: OptimizelyDecision } {
16161616
const decisionMap: { [key: string]: OptimizelyDecision } = {};
16171617
if (!this.isValidInstance()) {
@@ -1625,7 +1625,7 @@ export default class Optimizely {
16251625
const allDecideOptions = this.getAllDecideOptions(options);
16261626
keys.forEach(key => {
16271627
const optimizelyDecision: OptimizelyDecision = this.decide(user, key, options);
1628-
if (!allDecideOptions[OptimizelyDecideOptions.ENABLED_FLAGS_ONLY] || optimizelyDecision.enabled) {
1628+
if (!allDecideOptions[OptimizelyDecideOption.ENABLED_FLAGS_ONLY] || optimizelyDecision.enabled) {
16291629
decisionMap[key] = optimizelyDecision;
16301630
}
16311631
});
@@ -1636,12 +1636,12 @@ export default class Optimizely {
16361636
/**
16371637
* Returns an object of decision results for all active flag keys.
16381638
* @param {OptimizelyUserContext} user A user context associated with this OptimizelyClient
1639-
* @param {OptimizelyDecideOptions[]} options An array of options for decision-making.
1639+
* @param {OptimizelyDecideOption[]} options An array of options for decision-making.
16401640
* @return {[key: string]: OptimizelyDecision} An object of all decision results mapped by flag keys.
16411641
*/
16421642
decideAll(
16431643
user: OptimizelyUserContext,
1644-
options: OptimizelyDecideOptions[] = []
1644+
options: OptimizelyDecideOption[] = []
16451645
): { [key: string]: OptimizelyDecision } {
16461646
const configObj = this.projectConfigManager.getConfig();
16471647
const decisionMap: { [key: string]: OptimizelyDecision } = {};

0 commit comments

Comments
 (0)