Skip to content

Commit c43046f

Browse files
mnoman09thomaszurkan-optimizely
authored andcommitted
Added GetEnabledFeatures method and its unit tests (#172)
* Added GetEnabledFeatures method and its unit tests
1 parent 7e76897 commit c43046f

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,29 @@ else if (userId == null) {
590590
return variableValue;
591591
}
592592

593+
/**
594+
* Get the list of features that are enabled for the user.
595+
* @param userId The ID of the user.
596+
* @param attributes The user's attributes.
597+
* @return List of the feature keys that are enabled for the user if the userId is empty it will
598+
* return Empty List.
599+
*/
600+
public List<String> getEnabledFeatures(@Nonnull String userId,@Nonnull Map<String, String> attributes) {
601+
List<String> enabledFeaturesList = new ArrayList<String>();
602+
603+
if (!validateUserId(userId)){
604+
return enabledFeaturesList;
605+
}
606+
607+
for (FeatureFlag featureFlag : projectConfig.getFeatureFlags()){
608+
String featureKey = featureFlag.getKey();
609+
if(isFeatureEnabled(featureKey, userId, attributes))
610+
enabledFeaturesList.add(featureKey);
611+
}
612+
613+
return enabledFeaturesList;
614+
}
615+
593616
//======== getVariation calls ========//
594617

595618
public @Nullable

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3615,6 +3615,69 @@ public void isFeatureEnabledReturnsTrueAndDispatchesEventWhenUserIsBucketedIntoA
36153615
verify(mockEventHandler, times(1)).dispatchEvent(any(LogEvent.class));
36163616
}
36173617

3618+
/**
3619+
* Verify {@link Optimizely#getEnabledFeatures(String, Map)} calls into
3620+
* {@link Optimizely#isFeatureEnabled(String, String, Map)} for each featureFlag
3621+
* return List of FeatureFlags that are enabled
3622+
*/
3623+
@Test
3624+
public void getEnabledFeatureWithValidUserId() throws ConfigParseException{
3625+
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
3626+
3627+
Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler)
3628+
.withConfig(validProjectConfig)
3629+
.build());
3630+
ArrayList<String> featureFlags = (ArrayList<String>) spyOptimizely.getEnabledFeatures(genericUserId,
3631+
new HashMap<String, String>());
3632+
assertFalse(featureFlags.isEmpty());
3633+
3634+
}
3635+
3636+
3637+
/**
3638+
* Verify {@link Optimizely#getEnabledFeatures(String, Map)} calls into
3639+
* {@link Optimizely#isFeatureEnabled(String, String, Map)} for each featureFlag sending
3640+
* userId as empty string
3641+
* return empty List of FeatureFlags without checking further.
3642+
*/
3643+
@Test
3644+
public void getEnabledFeatureWithEmptyUserId() throws ConfigParseException{
3645+
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
3646+
3647+
Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler)
3648+
.withConfig(validProjectConfig)
3649+
.build());
3650+
ArrayList<String> featureFlags = (ArrayList<String>) spyOptimizely.getEnabledFeatures("",
3651+
new HashMap<String, String>());
3652+
logbackVerifier.expectMessage(Level.ERROR, "Non-empty user ID required");
3653+
assertTrue(featureFlags.isEmpty());
3654+
3655+
}
3656+
3657+
/**
3658+
* Verify {@link Optimizely#getEnabledFeatures(String, Map)} calls into
3659+
* {@link Optimizely#isFeatureEnabled(String, String, Map)} for each featureFlag sending
3660+
* userId and emptyMap and Mocked {@link Optimizely#isFeatureEnabled(String, String, Map)}
3661+
* to return false so {@link Optimizely#getEnabledFeatures(String, Map)} will
3662+
* return empty List of FeatureFlags.
3663+
*/
3664+
@Test
3665+
public void getEnabledFeatureWithMockIsFeatureEnabledToReturnFalse() throws ConfigParseException{
3666+
assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString()));
3667+
3668+
Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler)
3669+
.withConfig(validProjectConfig)
3670+
.build());
3671+
doReturn(false).when(spyOptimizely).isFeatureEnabled(
3672+
any(String.class),
3673+
eq(genericUserId),
3674+
eq(Collections.<String, String>emptyMap())
3675+
);
3676+
ArrayList<String> featureFlags = (ArrayList<String>) spyOptimizely.getEnabledFeatures(genericUserId,
3677+
Collections.<String, String>emptyMap());
3678+
assertTrue(featureFlags.isEmpty());
3679+
}
3680+
36183681
/**
36193682
* Verify {@link Optimizely#getFeatureVariableString(String, String, String)}
36203683
* calls through to {@link Optimizely#getFeatureVariableString(String, String, String, Map)}

0 commit comments

Comments
 (0)