public void TestAfterDisposeGetOptimizelyConfigIsNoLongerValid() { var httpManager = new HttpProjectConfigManager.Builder() .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z") .WithDatafile(TestData.Datafile) .WithPollingInterval(TimeSpan.FromMilliseconds(50000)) .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500)) .Build(true); var optimizely = new Optimizely(httpManager); httpManager.Start(); var optimizelyConfig = optimizely.GetOptimizelyConfig(); Assert.NotNull(optimizelyConfig); Assert.NotNull(optimizelyConfig.ExperimentsMap); Assert.NotNull(optimizelyConfig.FeaturesMap); Assert.NotNull(optimizelyConfig.Revision); optimizely.Dispose(); var optimizelyConfigAfterDispose = optimizely.GetOptimizelyConfig(); Assert.Null(optimizelyConfigAfterDispose); }
public void DecideAllEnabledFlagsDefaultDecideOptionsPlusApiOptions() { var flagKey1 = "string_single_variable_feature"; var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.ENABLED_FLAGS_ONLY }; var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object, defaultDecideOptions: decideOptions); var user = optimizely.CreateUserContext(UserID); user.SetAttribute("browser_type", "chrome"); decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.EXCLUDE_VARIABLES }; var decisions = user.DecideAll(decideOptions); Assert.True(decisions.Count == 1); var expectedOptlyJson = new Dictionary <string, object>(); OptimizelyDecision expDecision1 = new OptimizelyDecision( "control", true, new OptimizelyJSON(expectedOptlyJson, ErrorHandlerMock.Object, LoggerMock.Object), "test_experiment_with_feature_rollout", flagKey1, user, new string[] { }); Assert.IsTrue(TestData.CompareObjects(decisions[flagKey1], expDecision1)); }
public void DecideAllEnabledFlagsDefaultDecideOptions() { var flagKey1 = "string_single_variable_feature"; var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.ENABLED_FLAGS_ONLY }; var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object, defaultDecideOptions: decideOptions); var variablesExpected1 = Optimizely.GetAllFeatureVariables(flagKey1, UserID); var user = optimizely.CreateUserContext(UserID); user.SetAttribute("browser_type", "chrome"); var decisions = user.DecideAll(); Assert.True(decisions.Count == 1); OptimizelyDecision expDecision1 = new OptimizelyDecision( "control", true, variablesExpected1, "test_experiment_with_feature_rollout", flagKey1, user, new string[0]); Assert.IsTrue(TestData.CompareObjects(decisions[flagKey1], expDecision1)); }
public void TestDefaultDecideOptions() { var flagKey = "multi_variate_feature"; var variablesExpected = Optimizely.GetAllFeatureVariables(flagKey, UserID); var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.DISABLE_DECISION_EVENT }; var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object, defaultDecideOptions: decideOptions); var user = optimizely.CreateUserContext(UserID); user.SetAttribute("browser_type", "chrome"); var decision = user.Decide(flagKey); EventDispatcherMock.Verify(dispatcher => dispatcher.DispatchEvent(It.IsAny <LogEvent>()), Times.Never); Assert.AreEqual(decision.VariationKey, "Gred"); Assert.False(decision.Enabled); Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected.ToDictionary()); Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate"); Assert.AreEqual(decision.FlagKey, flagKey); Assert.AreNotEqual(decision.UserContext, user); Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user)); }
public void TestDecideOptionsByPassUPS() { var userProfileServiceMock = new Mock <UserProfileService>(); var flagKey = "string_single_variable_feature"; var experimentId = "122235"; var userId = "testUser3"; var variationKey = "control"; var fbVariationId = "122237"; var fbVariationKey = "variation"; var userProfile = new UserProfile(userId, new Dictionary <string, Decision> { { experimentId, new Decision(fbVariationId) } }); userProfileServiceMock.Setup(_ => _.Lookup(userId)).Returns(userProfile.ToMap()); var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object, userProfileServiceMock.Object); var user = optimizely.CreateUserContext(userId); var projectConfig = DatafileProjectConfig.Create(TestData.Datafile, LoggerMock.Object, ErrorHandlerMock.Object); var variationUserProfile = user.Decide(flagKey); Assert.AreEqual(fbVariationKey, variationUserProfile.VariationKey); var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.IGNORE_USER_PROFILE_SERVICE }; variationUserProfile = user.Decide(flagKey, decideOptions); Assert.AreEqual(variationKey, variationUserProfile.VariationKey); }
public void TestPollingGivenOnlySdkKeyGetOptimizelyConfig() { HttpProjectConfigManager httpManager = new HttpProjectConfigManager.Builder() .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z") .WithLogger(LoggerMock.Object) .WithPollingInterval(TimeSpan.FromMilliseconds(1000)) .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500)) .WithStartByDefault() .Build(true); Assert.NotNull(httpManager.GetConfig()); var optimizely = new Optimizely(httpManager); var optimizelyConfig = optimizely.GetOptimizelyConfig(); Assert.NotNull(optimizelyConfig); Assert.NotNull(optimizelyConfig.ExperimentsMap); Assert.NotNull(optimizelyConfig.FeaturesMap); Assert.NotNull(optimizelyConfig.Revision); optimizely.Dispose(); var optimizelyConfigAfterDispose = optimizely.GetOptimizelyConfig(); Assert.Null(optimizelyConfigAfterDispose); }
public void TestSetGetForcedVariation() { var userId = "test_user"; var invalidUserId = "invalid_user"; var experimentKey = "test_experiment"; var experimentKey2 = "group_experiment_1"; var invalidExperimentKey = "invalid_experiment"; var expectedVariationKey = "control"; var expectedVariationKey2 = "group_exp_1_var_1"; var invalidVariationKey = "invalid_variation"; var userAttributes = new UserAttributes { { "device_type", "iPhone" }, { "location", "San Francisco" } }; var optlyObject = new Optimizely(TestData.Datafile, new ValidEventDispatcher(), LoggerMock.Object); optlyObject.Activate("test_experiment", "test_user", userAttributes); // invalid experiment key should return a null variation Assert.False(Config.SetForcedVariation(invalidExperimentKey, userId, expectedVariationKey)); Assert.Null(Config.GetForcedVariation(invalidExperimentKey, userId)); // setting a null variation should return a null variation Assert.True(Config.SetForcedVariation(experimentKey, userId, null)); Assert.Null(Config.GetForcedVariation(experimentKey, userId)); // setting an invalid variation should return a null variation Assert.False(Config.SetForcedVariation(experimentKey, userId, invalidVariationKey)); Assert.Null(Config.GetForcedVariation(experimentKey, userId)); // confirm the forced variation is returned after a set Assert.True(Config.SetForcedVariation(experimentKey, userId, expectedVariationKey)); var actualForcedVariation = Config.GetForcedVariation(experimentKey, userId); Assert.AreEqual(expectedVariationKey, actualForcedVariation.Key); // check multiple sets Assert.True(Config.SetForcedVariation(experimentKey2, userId, expectedVariationKey2)); var actualForcedVariation2 = Config.GetForcedVariation(experimentKey2, userId); Assert.AreEqual(expectedVariationKey2, actualForcedVariation2.Key); // make sure the second set does not overwrite the first set actualForcedVariation = Config.GetForcedVariation(experimentKey, userId); Assert.AreEqual(expectedVariationKey, actualForcedVariation.Key); // make sure unsetting the second experiment-to-variation mapping does not unset the // first experiment-to-variation mapping Assert.True(Config.SetForcedVariation(experimentKey2, userId, null)); actualForcedVariation = Config.GetForcedVariation(experimentKey, userId); Assert.AreEqual(expectedVariationKey, actualForcedVariation.Key); // an invalid user ID should return a null variation Assert.Null(Config.GetForcedVariation(experimentKey, invalidUserId)); }
public void TestGetForcedDecisionReturnsNullIfInvalidConfig() { var optly = new Optimizely(new FallbackProjectConfigManager(null)); var user = optly.CreateUserContext(UserID); var context = new OptimizelyDecisionContext("flag", null); var decision = new OptimizelyForcedDecision("variationKey"); var result = user.GetForcedDecision(context); Assert.IsNull(result); }
public void SetUp() { LoggerMock = new Mock <ILogger>(); LoggerMock.Setup(i => i.Log(It.IsAny <LogLevel>(), It.IsAny <string>())); NotificationCallbackMock = new Mock <TestNotificationCallbacks>(); ErrorHandlerMock = new Mock <IErrorHandler>(); ErrorHandlerMock.Setup(e => e.HandleError(It.IsAny <Exception>())); EventDispatcherMock = new Mock <IEventDispatcher>(); Optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object); }
public OptimizelyRunner() { string configFileContent; var assembly = Assembly.GetExecutingAssembly(); // Reading Config file content. using (var stream = assembly.GetManifestResourceStream(assembly.GetName().Name + ".TestData.json")) using (var reader = new StreamReader(stream)) configFileContent = reader.ReadToEnd(); // Initializing the Optimizely client. OptimizelyClient = new Optimizely(configFileContent, null, AppLogger); OptimizelyTests = new OptimizelyTests(OptimizelyClient); }
static OptimizelyManager() { string relativePath = Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\TestData.json"); var configFilePath = Path.GetFullPath(relativePath); if (!File.Exists(configFilePath)) { throw new Exception("Config file not found."); } string configFileContent = File.ReadAllText(configFilePath); OptimizelyClient = new Optimizely(configFileContent); }
public void TrackEventEmptyAttributesWithEventTags() { var OptimizelyWithTypedAudiences = new Optimizely(TestData.TypedAudienceDatafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object); var user = OptimizelyWithTypedAudiences.CreateUserContext(UserID); // Should be excluded as exact match boolean audience with id '3468206643' does not match so the overall conditions fail. user.TrackEvent("user_signed_up", new EventTags { { "revenue", 42 }, { "wont_send_null", null } }); EventDispatcherMock.Verify(dispatcher => dispatcher.DispatchEvent(It.IsAny <LogEvent>()), Times.Once); }
public void DecideWhenConfigIsNull() { Optimizely optimizely = new Optimizely(TestData.UnsupportedVersionDatafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object); var flagKey = "multi_variate_feature"; var decisionExpected = OptimizelyDecision.NewErrorDecision( flagKey, new OptimizelyUserContext(optimizely, UserID, new UserAttributes(), ErrorHandlerMock.Object, LoggerMock.Object), DecisionMessage.SDK_NOT_READY, ErrorHandlerMock.Object, LoggerMock.Object); var user = optimizely.CreateUserContext(UserID); var decision = user.Decide(flagKey); Assert.IsTrue(TestData.CompareObjects(decision, decisionExpected)); }
public void TestTrackEventWithAudienceConditions() { var OptimizelyWithTypedAudiences = new Optimizely(TestData.TypedAudienceDatafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object); var userAttributes = new UserAttributes { { "house", "Gryffindor" }, { "should_do_it", false } }; var user = OptimizelyWithTypedAudiences.CreateUserContext(UserID, userAttributes); // Should be excluded as exact match boolean audience with id '3468206643' does not match so the overall conditions fail. user.TrackEvent("user_signed_up"); EventDispatcherMock.Verify(dispatcher => dispatcher.DispatchEvent(It.IsAny <LogEvent>()), Times.Once); }
public void TestDecideOptionsByPassUPSNeverCallsSaveVariation() { var userProfileServiceMock = new Mock <UserProfileService>(); var flagKey = "string_single_variable_feature"; var userId = "testUser3"; var variationKey = "control"; var optimizely = new Optimizely(TestData.Datafile, EventDispatcherMock.Object, LoggerMock.Object, ErrorHandlerMock.Object, userProfileServiceMock.Object); var user = optimizely.CreateUserContext(userId); var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.IGNORE_USER_PROFILE_SERVICE }; var variationUserProfile = user.Decide(flagKey, decideOptions); userProfileServiceMock.Verify(l => l.Save(It.IsAny <Dictionary <string, object> >()), Times.Never); Assert.AreEqual(variationKey, variationUserProfile.VariationKey); }
public ActionResult Config(Models.Config config) { ConfigRepo = config; string url = string.Format("https://cdn.optimizely.com/json/{0}.json", config.ProjectId); // will throw exception if invalid ProjectId using (var client = new System.Net.WebClient()) config.ProjectConfigJson = FormatJson(client.DownloadString(url)); Optimizely = new Optimizely( datafile: config.ProjectConfigJson, eventDispatcher: null, logger: Logger, errorHandler: InMemoryHandler, skipJsonValidation: false); return(RedirectToAction("Config")); }
public void TestGetVariationUserWithSetForcedVariation() { var experimentKey = "test_experiment"; var pausedExperimentKey = "paused_experiment"; var userId = "test_user"; var expectedForcedVariationKey = "variation"; var optlyObject = new Optimizely(TestData.Datafile, new ValidEventDispatcher(), LoggerMock.Object); var userAttributes = new UserAttributes { { "device_type", "iPhone" }, { "location", "San Francisco" } }; optlyObject.Activate(experimentKey, userId, userAttributes); // confirm normal bucketing occurs before setting the forced variation var actualVariation = optlyObject.GetVariation(experimentKey, userId, userAttributes); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation)); // test valid experiment Assert.IsTrue(optlyObject.SetForcedVariation(experimentKey, userId, expectedForcedVariationKey), string.Format(@"Set variation to ""{0}"" failed.", expectedForcedVariationKey)); var actualForcedVariation = optlyObject.GetVariation(experimentKey, userId, userAttributes); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyVariation, actualForcedVariation)); // clear forced variation and confirm that normal bucketing occurs Assert.IsTrue(optlyObject.SetForcedVariation(experimentKey, userId, null)); actualVariation = optlyObject.GetVariation(experimentKey, userId, userAttributes); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation)); // check that a paused experiment returns null Assert.IsTrue(optlyObject.SetForcedVariation(pausedExperimentKey, userId, expectedForcedVariationKey), string.Format(@"Set variation to ""{0}"" failed.", expectedForcedVariationKey)); actualForcedVariation = optlyObject.GetVariation(pausedExperimentKey, userId, userAttributes); Assert.IsNull(actualForcedVariation); }
public OptimizelyTests(Optimizely optimizelyClient) { OptimizelyClient = optimizelyClient; }
public void TestGetVariationWithBucketingId() { var pausedExperimentKey = "paused_experiment"; var userId = "test_user"; var testUserIdWhitelisted = "user1"; var experimentKey = "test_experiment"; var testBucketingIdControl = "testBucketingIdControl!"; // generates bucketing number 3741 var testBucketingIdVariation = "123456789"; // generates bucketing number 4567 var variationKeyControl = "control"; var testUserAttributes = new UserAttributes { { "device_type", "iPhone" }, { "company", "Optimizely" }, { "location", "San Francisco" } }; var userAttributesWithBucketingId = new UserAttributes { { "device_type", "iPhone" }, { "company", "Optimizely" }, { "location", "San Francisco" }, { ControlAttributes.BUCKETING_ID_ATTRIBUTE, testBucketingIdVariation } }; var userAttributesWithInvalidBucketingId = new UserAttributes { { "device_type", "iPhone" }, { "company", "Optimizely" }, { "location", "San Francisco" }, { ControlAttributes.BUCKETING_ID_ATTRIBUTE, 1.59 } }; var invalidUserAttributesWithBucketingId = new UserAttributes { { "company", "Optimizely" }, { ControlAttributes.BUCKETING_ID_ATTRIBUTE, testBucketingIdControl } }; var optlyObject = new Optimizely(TestData.Datafile, new ValidEventDispatcher(), LoggerMock.Object); // confirm normal bucketing occurs before setting the bucketing ID var actualVariation = optlyObject.GetVariation(experimentKey, userId, testUserAttributes); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation)); // confirm valid bucketing with bucketing ID set in attributes actualVariation = optlyObject.GetVariation(experimentKey, userId, userAttributesWithBucketingId); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyVariation, actualVariation)); LoggerMock.Verify(l => l.Log(LogLevel.DEBUG, $"BucketingId is valid: \"{testBucketingIdVariation}\"")); // check audience with invalid bucketing Id actualVariation = optlyObject.GetVariation(experimentKey, userId, userAttributesWithInvalidBucketingId); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation)); LoggerMock.Verify(l => l.Log(LogLevel.WARN, "BucketingID attribute is not a string. Defaulted to userId")); // check invalid audience with bucketing ID actualVariation = optlyObject.GetVariation(experimentKey, userId, invalidUserAttributesWithBucketingId); Assert.Null(actualVariation); // check null audience with bucketing Id actualVariation = optlyObject.GetVariation(experimentKey, userId, null); Assert.Null(actualVariation); // test that an experiment that's not running returns a null variation actualVariation = optlyObject.GetVariation(pausedExperimentKey, userId, userAttributesWithBucketingId); Assert.Null(actualVariation); // check forced variation Assert.IsTrue(optlyObject.SetForcedVariation(experimentKey, userId, variationKeyControl), string.Format("Set variation to \"{0}\" failed.", variationKeyControl)); actualVariation = optlyObject.GetVariation(experimentKey, userId, userAttributesWithBucketingId); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation)); // check whitelisted variation actualVariation = optlyObject.GetVariation(experimentKey, testUserIdWhitelisted, userAttributesWithBucketingId); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation)); var bucketerMock = new Mock <Bucketer>(LoggerMock.Object); var decision = new Decision("7722370027"); UserProfile storedUserProfile = new UserProfile(userId, new Dictionary <string, Decision> { { "7716830082", decision } }); UserProfileServiceMock.Setup(up => up.Lookup(userId)).Returns(storedUserProfile.ToMap()); DecisionService decisionService = new DecisionService(bucketerMock.Object, ErrorHandlerMock.Object, ProjectConfig, UserProfileServiceMock.Object, LoggerMock.Object); actualVariation = optlyObject.GetVariation(experimentKey, userId, userAttributesWithBucketingId); Assert.IsTrue(TestData.CompareObjects(VariationWithKeyControl, actualVariation), string.Format("Variation \"{0}\" does not match expected user profile variation \"{1}\".", actualVariation?.Key, variationKeyControl)); }