From d7a27df2030d5127209ea562e5757816df96e272 Mon Sep 17 00:00:00 2001 From: mnoman09 Date: Fri, 2 Mar 2018 20:36:09 +0500 Subject: [PATCH] Added GetEnabledFeatures method and its unit tests * Added GetEnabledFeatures method and its unit tests --- .../java/com/optimizely/ab/Optimizely.java | 23 +++++++ .../com/optimizely/ab/OptimizelyTest.java | 63 +++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/core-api/src/main/java/com/optimizely/ab/Optimizely.java b/core-api/src/main/java/com/optimizely/ab/Optimizely.java index 061b0d78d..0de0c591b 100644 --- a/core-api/src/main/java/com/optimizely/ab/Optimizely.java +++ b/core-api/src/main/java/com/optimizely/ab/Optimizely.java @@ -590,6 +590,29 @@ else if (userId == null) { return variableValue; } + /** + * Get the list of features that are enabled for the user. + * @param userId The ID of the user. + * @param attributes The user's attributes. + * @return List of the feature keys that are enabled for the user if the userId is empty it will + * return Empty List. + */ + public List getEnabledFeatures(@Nonnull String userId,@Nonnull Map attributes) { + List enabledFeaturesList = new ArrayList(); + + if (!validateUserId(userId)){ + return enabledFeaturesList; + } + + for (FeatureFlag featureFlag : projectConfig.getFeatureFlags()){ + String featureKey = featureFlag.getKey(); + if(isFeatureEnabled(featureKey, userId, attributes)) + enabledFeaturesList.add(featureKey); + } + + return enabledFeaturesList; + } + //======== getVariation calls ========// public @Nullable diff --git a/core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java b/core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java index f09aa8a8c..b84f319e4 100644 --- a/core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java +++ b/core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java @@ -3615,6 +3615,69 @@ public void isFeatureEnabledReturnsTrueAndDispatchesEventWhenUserIsBucketedIntoA verify(mockEventHandler, times(1)).dispatchEvent(any(LogEvent.class)); } + /** + * Verify {@link Optimizely#getEnabledFeatures(String, Map)} calls into + * {@link Optimizely#isFeatureEnabled(String, String, Map)} for each featureFlag + * return List of FeatureFlags that are enabled + */ + @Test + public void getEnabledFeatureWithValidUserId() throws ConfigParseException{ + assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())); + + Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler) + .withConfig(validProjectConfig) + .build()); + ArrayList featureFlags = (ArrayList) spyOptimizely.getEnabledFeatures(genericUserId, + new HashMap()); + assertFalse(featureFlags.isEmpty()); + + } + + + /** + * Verify {@link Optimizely#getEnabledFeatures(String, Map)} calls into + * {@link Optimizely#isFeatureEnabled(String, String, Map)} for each featureFlag sending + * userId as empty string + * return empty List of FeatureFlags without checking further. + */ + @Test + public void getEnabledFeatureWithEmptyUserId() throws ConfigParseException{ + assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())); + + Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler) + .withConfig(validProjectConfig) + .build()); + ArrayList featureFlags = (ArrayList) spyOptimizely.getEnabledFeatures("", + new HashMap()); + logbackVerifier.expectMessage(Level.ERROR, "Non-empty user ID required"); + assertTrue(featureFlags.isEmpty()); + + } + + /** + * Verify {@link Optimizely#getEnabledFeatures(String, Map)} calls into + * {@link Optimizely#isFeatureEnabled(String, String, Map)} for each featureFlag sending + * userId and emptyMap and Mocked {@link Optimizely#isFeatureEnabled(String, String, Map)} + * to return false so {@link Optimizely#getEnabledFeatures(String, Map)} will + * return empty List of FeatureFlags. + */ + @Test + public void getEnabledFeatureWithMockIsFeatureEnabledToReturnFalse() throws ConfigParseException{ + assumeTrue(datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())); + + Optimizely spyOptimizely = spy(Optimizely.builder(validDatafile, mockEventHandler) + .withConfig(validProjectConfig) + .build()); + doReturn(false).when(spyOptimizely).isFeatureEnabled( + any(String.class), + eq(genericUserId), + eq(Collections.emptyMap()) + ); + ArrayList featureFlags = (ArrayList) spyOptimizely.getEnabledFeatures(genericUserId, + Collections.emptyMap()); + assertTrue(featureFlags.isEmpty()); + } + /** * Verify {@link Optimizely#getFeatureVariableString(String, String, String)} * calls through to {@link Optimizely#getFeatureVariableString(String, String, String, Map)}