From 2c8c42c22fed943d0201f3a77db5be0896e959d9 Mon Sep 17 00:00:00 2001 From: aliabbasrizvi Date: Thu, 2 May 2019 23:12:16 -0700 Subject: [PATCH 1/2] Adding toString for DecisionNotification --- .../optimizely/ab/config/FeatureVariable.java | 5 ++++ .../ab/notification/DecisionNotification.java | 13 +++++++++- .../com/optimizely/ab/OptimizelyTest.java | 12 +++++----- .../DecisionNotificationTest.java | 24 ++++++++++++++----- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/core-api/src/main/java/com/optimizely/ab/config/FeatureVariable.java b/core-api/src/main/java/com/optimizely/ab/config/FeatureVariable.java index 35a36cb78..0ca48b84b 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/FeatureVariable.java +++ b/core-api/src/main/java/com/optimizely/ab/config/FeatureVariable.java @@ -96,6 +96,11 @@ public static VariableType fromString(String variableTypeString) { return null; } + + @Override + public String toString() { + return variableType; + } } private final String id; diff --git a/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java b/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java index 10cac3c24..cf132f033 100644 --- a/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java +++ b/core-api/src/main/java/com/optimizely/ab/notification/DecisionNotification.java @@ -79,6 +79,17 @@ public String getUserId() { return decisionInfo; } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("DecisionNotification{"); + sb.append("type='").append(type).append('\''); + sb.append(", userId='").append(userId).append('\''); + sb.append(", attributes=").append(attributes); + sb.append(", decisionInfo=").append(decisionInfo); + sb.append('}'); + return sb.toString(); + } + public static ExperimentDecisionNotificationBuilder newExperimentDecisionNotificationBuilder() { return new ExperimentDecisionNotificationBuilder(); } @@ -303,7 +314,7 @@ public DecisionNotification build() { decisionInfo.put(FEATURE_KEY, featureKey); decisionInfo.put(FEATURE_ENABLED, featureEnabled); decisionInfo.put(VARIABLE_KEY, variableKey); - decisionInfo.put(VARIABLE_TYPE, variableType); + decisionInfo.put(VARIABLE_TYPE, variableType.toString()); decisionInfo.put(VARIABLE_VALUE, variableValue); SourceInfo sourceInfo = new RolloutSourceInfo(); 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 f13fec1a3..56ab7e80a 100644 --- a/core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java +++ b/core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java @@ -3095,7 +3095,7 @@ public void getFeatureVariableWithListenerUserInExperimentFeatureOn() throws Exc testDecisionInfoMap.put(FEATURE_KEY, validFeatureKey); testDecisionInfoMap.put(FEATURE_ENABLED, true); testDecisionInfoMap.put(VARIABLE_KEY, validVariableKey); - testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.STRING); + testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.STRING.toString()); testDecisionInfoMap.put(VARIABLE_VALUE, expectedValue); testDecisionInfoMap.put(SOURCE, FeatureDecision.DecisionSource.FEATURE_TEST.toString()); testDecisionInfoMap.put(SOURCE_INFO, testSourceInfo); @@ -3148,7 +3148,7 @@ public void getFeatureVariableWithListenerUserInExperimentFeatureOff() { testDecisionInfoMap.put(FEATURE_KEY, validFeatureKey); testDecisionInfoMap.put(FEATURE_ENABLED, false); testDecisionInfoMap.put(VARIABLE_KEY, validVariableKey); - testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.STRING); + testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.STRING.toString()); testDecisionInfoMap.put(VARIABLE_VALUE, expectedValue); testDecisionInfoMap.put(SOURCE, FeatureDecision.DecisionSource.FEATURE_TEST.toString()); testDecisionInfoMap.put(SOURCE_INFO, testSourceInfo); @@ -3198,7 +3198,7 @@ public void getFeatureVariableWithListenerUserInRollOutFeatureOn() throws Except testDecisionInfoMap.put(FEATURE_KEY, validFeatureKey); testDecisionInfoMap.put(FEATURE_ENABLED, true); testDecisionInfoMap.put(VARIABLE_KEY, validVariableKey); - testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.STRING); + testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.STRING.toString()); testDecisionInfoMap.put(VARIABLE_VALUE, expectedValue); testDecisionInfoMap.put(SOURCE, FeatureDecision.DecisionSource.ROLLOUT.toString()); testDecisionInfoMap.put(SOURCE_INFO, Collections.EMPTY_MAP); @@ -3248,7 +3248,7 @@ public void getFeatureVariableWithListenerUserNotInRollOutFeatureOff() { testDecisionInfoMap.put(FEATURE_KEY, validFeatureKey); testDecisionInfoMap.put(FEATURE_ENABLED, false); testDecisionInfoMap.put(VARIABLE_KEY, validVariableKey); - testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.BOOLEAN); + testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.BOOLEAN.toString()); testDecisionInfoMap.put(VARIABLE_VALUE, expectedValue); testDecisionInfoMap.put(SOURCE, FeatureDecision.DecisionSource.ROLLOUT.toString()); testDecisionInfoMap.put(SOURCE_INFO, Collections.EMPTY_MAP); @@ -3297,7 +3297,7 @@ public void getFeatureVariableIntegerWithListenerUserInRollOutFeatureOn() { testDecisionInfoMap.put(FEATURE_KEY, validFeatureKey); testDecisionInfoMap.put(FEATURE_ENABLED, true); testDecisionInfoMap.put(VARIABLE_KEY, validVariableKey); - testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.INTEGER); + testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.INTEGER.toString()); testDecisionInfoMap.put(VARIABLE_VALUE, expectedValue); testDecisionInfoMap.put(SOURCE, FeatureDecision.DecisionSource.ROLLOUT.toString()); testDecisionInfoMap.put(SOURCE_INFO, Collections.EMPTY_MAP); @@ -3349,7 +3349,7 @@ public void getFeatureVariableDoubleWithListenerUserInExperimentFeatureOn() thro testDecisionInfoMap.put(FEATURE_KEY, validFeatureKey); testDecisionInfoMap.put(FEATURE_ENABLED, true); testDecisionInfoMap.put(VARIABLE_KEY, validVariableKey); - testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.DOUBLE); + testDecisionInfoMap.put(VARIABLE_TYPE, FeatureVariable.VariableType.DOUBLE.toString()); testDecisionInfoMap.put(VARIABLE_VALUE, 3.14); testDecisionInfoMap.put(SOURCE, FeatureDecision.DecisionSource.FEATURE_TEST.toString()); testDecisionInfoMap.put(SOURCE_INFO, testSourceInfo); diff --git a/core-api/src/test/java/com/optimizely/ab/notification/DecisionNotificationTest.java b/core-api/src/test/java/com/optimizely/ab/notification/DecisionNotificationTest.java index 860b4340d..58ab5b5d9 100644 --- a/core-api/src/test/java/com/optimizely/ab/notification/DecisionNotificationTest.java +++ b/core-api/src/test/java/com/optimizely/ab/notification/DecisionNotificationTest.java @@ -39,11 +39,14 @@ public class DecisionNotificationTest { private static final String EXPERIMENT_KEY = "experimentKey"; private static final String FEATURE_KEY = "featureKey"; private static final String FEATURE_VARIABLE_KEY = "featureVariableKey"; + private static final String FEATURE_TEST = "featureTest"; + private static final String FEATURE_TEST_VARIATION = "featureTestVariation"; private static final String USER_ID = "userID"; private static final Map USER_ATTRIBUTES = Collections.singletonMap("user", "attr"); - private static final RolloutSourceInfo rolloutSourceInfo = mock(RolloutSourceInfo.class); private static final Variation VARIATION = mock(Variation.class); + private FeatureTestSourceInfo featureTestSourceInfo; + private RolloutSourceInfo rolloutSourceInfo; private DecisionNotification experimentDecisionNotification; private DecisionNotification featureDecisionNotification; private DecisionNotification featureVariableDecisionNotification; @@ -57,13 +60,15 @@ public void setUp() { .withVariation(VARIATION) .withType(NotificationCenter.DecisionNotificationType.AB_TEST.toString()) .build(); + featureTestSourceInfo = new FeatureTestSourceInfo(FEATURE_TEST, FEATURE_TEST_VARIATION); + rolloutSourceInfo = new RolloutSourceInfo(); featureDecisionNotification = DecisionNotification.newFeatureDecisionNotificationBuilder() .withUserId(USER_ID) .withFeatureKey(FEATURE_KEY) .withFeatureEnabled(FEATURE_ENABLED) - .withSource(FeatureDecision.DecisionSource.ROLLOUT) + .withSource(FeatureDecision.DecisionSource.FEATURE_TEST) .withAttributes(USER_ATTRIBUTES) - .withSourceInfo(rolloutSourceInfo) + .withSourceInfo(featureTestSourceInfo) .build(); featureVariableDecisionNotification = DecisionNotification.newFeatureVariableDecisionNotificationBuilder() .withUserId(USER_ID) @@ -108,19 +113,26 @@ public void testGetDecisionInfo() { Map actualFeatureDecisionInfo = featureDecisionNotification.getDecisionInfo(); assertFalse((Boolean) actualFeatureDecisionInfo.get(DecisionNotification.FeatureDecisionNotificationBuilder.FEATURE_ENABLED)); assertEquals(FEATURE_KEY, actualFeatureDecisionInfo.get(DecisionNotification.FeatureDecisionNotificationBuilder.FEATURE_KEY)); - assertEquals(FeatureDecision.DecisionSource.ROLLOUT.toString(), actualFeatureDecisionInfo.get(DecisionNotification.FeatureDecisionNotificationBuilder.SOURCE)); - assertEquals(rolloutSourceInfo.get(), actualFeatureDecisionInfo.get(DecisionNotification.FeatureDecisionNotificationBuilder.SOURCE_INFO)); + assertEquals(FeatureDecision.DecisionSource.FEATURE_TEST.toString(), actualFeatureDecisionInfo.get(DecisionNotification.FeatureDecisionNotificationBuilder.SOURCE)); + assertEquals(featureTestSourceInfo.get(), actualFeatureDecisionInfo.get(DecisionNotification.FeatureDecisionNotificationBuilder.SOURCE_INFO)); // Assert for Feature Variable's DecisionInfo Map actualFeatureVariableDecisionInfo = featureVariableDecisionNotification.getDecisionInfo(); assertTrue((Boolean) actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.FEATURE_ENABLED)); assertEquals(FEATURE_KEY, actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.FEATURE_KEY)); assertEquals(FEATURE_VARIABLE_KEY, actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.VARIABLE_KEY)); - assertEquals(FeatureVariable.VariableType.STRING, actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.VARIABLE_TYPE)); + assertEquals(FeatureVariable.VariableType.STRING.toString(), actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.VARIABLE_TYPE)); assertEquals(FeatureDecision.DecisionSource.ROLLOUT.toString(), actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.SOURCE)); assertEquals(rolloutSourceInfo.get(), actualFeatureVariableDecisionInfo.get(DecisionNotification.FeatureVariableDecisionNotificationBuilder.SOURCE_INFO)); } + @Test + public void testToString() { + assertEquals("DecisionNotification{type='ab-test', userId='userID', attributes={user=attr}, decisionInfo={experimentKey=experimentKey, variationKey=null}}", experimentDecisionNotification.toString()); + assertEquals("DecisionNotification{type='feature', userId='userID', attributes={user=attr}, decisionInfo={featureEnabled=false, sourceInfo={experimentKey=featureTest, variationKey=featureTestVariation}, source=feature-test, featureKey=featureKey}}", featureDecisionNotification.toString()); + assertEquals("DecisionNotification{type='feature-variable', userId='userID', attributes={user=attr}, decisionInfo={variableType=string, featureEnabled=true, sourceInfo={}, variableValue=null, variableKey=featureVariableKey, source=rollout, featureKey=featureKey}}", featureVariableDecisionNotification.toString()); + } + @Test(expected = OptimizelyRuntimeException.class) public void nullTypeFailsExperimentNotificationBuild() { DecisionNotification.newExperimentDecisionNotificationBuilder() From f27befa911c24db278469547405d10fb89b09bbf Mon Sep 17 00:00:00 2001 From: aliabbasrizvi Date: Fri, 3 May 2019 15:21:57 -0700 Subject: [PATCH 2/2] triggering tests