Skip to content

Commit e9588e8

Browse files
mikeproeng37Tyler Brandt
authored andcommitted
Fix impression sent from feature experiment variation toggled off. (#193)
1 parent 060bca7 commit e9588e8

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -347,10 +347,7 @@ else if (userId == null) {
347347
Map<String, String> filteredAttributes = filterAttributes(projectConfig, attributes);
348348

349349
FeatureDecision featureDecision = decisionService.getVariationForFeature(featureFlag, userId, filteredAttributes);
350-
if (featureDecision.variation == null || !featureDecision.variation.getFeatureEnabled()) {
351-
logger.info("Feature \"{}\" is not enabled for user \"{}\".", featureKey, userId);
352-
return false;
353-
} else {
350+
if (featureDecision.variation != null) {
354351
if (featureDecision.decisionSource.equals(FeatureDecision.DecisionSource.EXPERIMENT)) {
355352
sendImpression(
356353
projectConfig,
@@ -362,9 +359,14 @@ else if (userId == null) {
362359
logger.info("The user \"{}\" is not included in an experiment for feature \"{}\".",
363360
userId, featureKey);
364361
}
365-
logger.info("Feature \"{}\" is enabled for user \"{}\".", featureKey, userId);
366-
return true;
362+
if (featureDecision.variation.getFeatureEnabled()) {
363+
logger.info("Feature \"{}\" is enabled for user \"{}\".", featureKey, userId);
364+
return true;
365+
}
367366
}
367+
368+
logger.info("Feature \"{}\" is not enabled for user \"{}\".", featureKey, userId);
369+
return false;
368370
}
369371

370372
/**

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

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3479,15 +3479,13 @@ public void isFeatureEnabledReturnsTrueButDoesNotSendWhenUserIsBucketedIntoVaria
34793479
* false so feature enabled will return false
34803480
*/
34813481
@Test
3482-
public void isFeatureEnabledWithExperimentKeyForcedOfFeatureEnabledFalse() throws Exception {
3482+
public void isFeatureEnabledWithExperimentKeyForcedOffFeatureEnabledFalse() throws Exception {
34833483
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
34843484
Experiment activatedExperiment = validProjectConfig.getExperimentKeyMapping().get(EXPERIMENT_MULTIVARIATE_EXPERIMENT_KEY);
34853485
Variation forcedVariation = activatedExperiment.getVariations().get(2);
3486-
EventBuilder mockEventBuilder = mock(EventBuilder.class);
34873486

34883487
Optimizely optimizely = Optimizely.builder(validDatafile, mockEventHandler)
34893488
.withBucketing(mockBucketer)
3490-
.withEventBuilder(mockEventBuilder)
34913489
.withConfig(validProjectConfig)
34923490
.withErrorHandler(mockErrorHandler)
34933491
.build();
@@ -3506,11 +3504,9 @@ public void isFeatureEnabledWithExperimentKeyForcedWithNoFeatureEnabledSet() thr
35063504
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
35073505
Experiment activatedExperiment = validProjectConfig.getExperimentKeyMapping().get(EXPERIMENT_DOUBLE_FEATURE_EXPERIMENT_KEY);
35083506
Variation forcedVariation = activatedExperiment.getVariations().get(1);
3509-
EventBuilder mockEventBuilder = mock(EventBuilder.class);
35103507

35113508
Optimizely optimizely = Optimizely.builder(validDatafile, mockEventHandler)
35123509
.withBucketing(mockBucketer)
3513-
.withEventBuilder(mockEventBuilder)
35143510
.withConfig(validProjectConfig)
35153511
.withErrorHandler(mockErrorHandler)
35163512
.build();
@@ -3584,6 +3580,44 @@ public void isFeatureEnabledFalseWhenFeatureEnabledOfVariationIsFalse() throws E
35843580

35853581
}
35863582

3583+
/**
3584+
* Verify {@link Optimizely#isFeatureEnabled(String, String)} calls into
3585+
* {@link Optimizely#isFeatureEnabled(String, String, Map)} and they both
3586+
* return False
3587+
* when the user is bucketed an feature test variation that is turned off.
3588+
* @throws Exception
3589+
*/
3590+
@Test
3591+
public void isFeatureEnabledReturnsFalseAndDispatchesWhenUserIsBucketedIntoAnExperimentVariationToggleOff() throws Exception {
3592+
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
3593+
3594+
String validFeatureKey = FEATURE_MULTI_VARIATE_FEATURE_KEY;
3595+
3596+
Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler)
3597+
.withConfig(validProjectConfig)
3598+
.withDecisionService(mockDecisionService)
3599+
.build());
3600+
3601+
Experiment activatedExperiment = validProjectConfig.getExperimentKeyMapping().get(EXPERIMENT_MULTIVARIATE_EXPERIMENT_KEY);
3602+
Variation variation = new Variation("2", "variation_toggled_off", false, null);
3603+
3604+
FeatureDecision featureDecision = new FeatureDecision(activatedExperiment, variation, FeatureDecision.DecisionSource.EXPERIMENT);
3605+
doReturn(featureDecision).when(mockDecisionService).getVariationForFeature(
3606+
any(FeatureFlag.class),
3607+
anyString(),
3608+
anyMapOf(String.class, String.class)
3609+
);
3610+
3611+
assertFalse(spyOptimizely.isFeatureEnabled(validFeatureKey, genericUserId));
3612+
3613+
logbackVerifier.expectMessage(
3614+
Level.INFO,
3615+
"Feature \"" + validFeatureKey +
3616+
"\" is not enabled for user \"" + genericUserId + "\"."
3617+
);
3618+
verify(mockEventHandler, times(1)).dispatchEvent(any(LogEvent.class));
3619+
}
3620+
35873621
/** Integration Test
35883622
* Verify {@link Optimizely#isFeatureEnabled(String, String, Map)}
35893623
* returns True

0 commit comments

Comments
 (0)