示例#1
0
        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);
        }
示例#6
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#16
0
        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"));
        }
示例#17
0
        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;
 }
示例#19
0
        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));
        }