Skip to content

Commit f5b9516

Browse files
authored
Fix impression sent from feature experiment variation toggled off. (#193)
1 parent 727bfc3 commit f5b9516

File tree

2 files changed

+47
-11
lines changed

2 files changed

+47
-11
lines changed

core-api/src/main/java/com/optimizely/ab/Optimizely.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,7 @@ else if (userId == null) {
355355
Map<String, String> filteredAttributes = filterAttributes(projectConfig, attributes);
356356

357357
FeatureDecision featureDecision = decisionService.getVariationForFeature(featureFlag, userId, filteredAttributes);
358-
if (featureDecision.variation == null || !featureDecision.variation.getFeatureEnabled()) {
359-
logger.info("Feature \"{}\" is not enabled for user \"{}\".", featureKey, userId);
360-
return false;
361-
} else {
358+
if (featureDecision.variation != null) {
362359
if (featureDecision.decisionSource.equals(FeatureDecision.DecisionSource.EXPERIMENT)) {
363360
sendImpression(
364361
projectConfig,
@@ -370,9 +367,14 @@ else if (userId == null) {
370367
logger.info("The user \"{}\" is not included in an experiment for feature \"{}\".",
371368
userId, featureKey);
372369
}
373-
logger.info("Feature \"{}\" is enabled for user \"{}\".", featureKey, userId);
374-
return true;
370+
if (featureDecision.variation.getFeatureEnabled()) {
371+
logger.info("Feature \"{}\" is enabled for user \"{}\".", featureKey, userId);
372+
return true;
373+
}
375374
}
375+
376+
logger.info("Feature \"{}\" is not enabled for user \"{}\".", featureKey, userId);
377+
return false;
376378
}
377379

378380
/**

core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java

+39-5
Original file line numberDiff line numberDiff line change
@@ -3436,15 +3436,13 @@ public void isFeatureEnabledReturnsTrueButDoesNotSendWhenUserIsBucketedIntoVaria
34363436
* false so feature enabled will return false
34373437
*/
34383438
@Test
3439-
public void isFeatureEnabledWithExperimentKeyForcedOfFeatureEnabledFalse() throws Exception {
3439+
public void isFeatureEnabledWithExperimentKeyForcedOffFeatureEnabledFalse() throws Exception {
34403440
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
34413441
Experiment activatedExperiment = validProjectConfig.getExperimentKeyMapping().get(EXPERIMENT_MULTIVARIATE_EXPERIMENT_KEY);
34423442
Variation forcedVariation = activatedExperiment.getVariations().get(2);
3443-
EventBuilder mockEventBuilder = mock(EventBuilder.class);
34443443

34453444
Optimizely optimizely = Optimizely.builder(validDatafile, mockEventHandler)
34463445
.withBucketing(mockBucketer)
3447-
.withEventBuilder(mockEventBuilder)
34483446
.withConfig(validProjectConfig)
34493447
.withErrorHandler(mockErrorHandler)
34503448
.build();
@@ -3463,11 +3461,9 @@ public void isFeatureEnabledWithExperimentKeyForcedWithNoFeatureEnabledSet() thr
34633461
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
34643462
Experiment activatedExperiment = validProjectConfig.getExperimentKeyMapping().get(EXPERIMENT_DOUBLE_FEATURE_EXPERIMENT_KEY);
34653463
Variation forcedVariation = activatedExperiment.getVariations().get(1);
3466-
EventBuilder mockEventBuilder = mock(EventBuilder.class);
34673464

34683465
Optimizely optimizely = Optimizely.builder(validDatafile, mockEventHandler)
34693466
.withBucketing(mockBucketer)
3470-
.withEventBuilder(mockEventBuilder)
34713467
.withConfig(validProjectConfig)
34723468
.withErrorHandler(mockErrorHandler)
34733469
.build();
@@ -3541,6 +3537,44 @@ public void isFeatureEnabledFalseWhenFeatureEnabledOfVariationIsFalse() throws E
35413537

35423538
}
35433539

3540+
/**
3541+
* Verify {@link Optimizely#isFeatureEnabled(String, String)} calls into
3542+
* {@link Optimizely#isFeatureEnabled(String, String, Map)} and they both
3543+
* return False
3544+
* when the user is bucketed an feature test variation that is turned off.
3545+
* @throws Exception
3546+
*/
3547+
@Test
3548+
public void isFeatureEnabledReturnsFalseAndDispatchesWhenUserIsBucketedIntoAnExperimentVariationToggleOff() throws Exception {
3549+
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
3550+
3551+
String validFeatureKey = FEATURE_MULTI_VARIATE_FEATURE_KEY;
3552+
3553+
Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler)
3554+
.withConfig(validProjectConfig)
3555+
.withDecisionService(mockDecisionService)
3556+
.build());
3557+
3558+
Experiment activatedExperiment = validProjectConfig.getExperimentKeyMapping().get(EXPERIMENT_MULTIVARIATE_EXPERIMENT_KEY);
3559+
Variation variation = new Variation("2", "variation_toggled_off", false, null);
3560+
3561+
FeatureDecision featureDecision = new FeatureDecision(activatedExperiment, variation, FeatureDecision.DecisionSource.EXPERIMENT);
3562+
doReturn(featureDecision).when(mockDecisionService).getVariationForFeature(
3563+
any(FeatureFlag.class),
3564+
anyString(),
3565+
anyMapOf(String.class, String.class)
3566+
);
3567+
3568+
assertFalse(spyOptimizely.isFeatureEnabled(validFeatureKey, genericUserId));
3569+
3570+
logbackVerifier.expectMessage(
3571+
Level.INFO,
3572+
"Feature \"" + validFeatureKey +
3573+
"\" is not enabled for user \"" + genericUserId + "\"."
3574+
);
3575+
verify(mockEventHandler, times(1)).dispatchEvent(any(LogEvent.class));
3576+
}
3577+
35443578
/** Integration Test
35453579
* Verify {@link Optimizely#isFeatureEnabled(String, String, Map)}
35463580
* returns True

0 commit comments

Comments
 (0)