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 DecideIncludeReasonsDecideOptions()
        {
            var flagKey = "invalid_key";
            var user    = Optimizely.CreateUserContext(UserID);

            user.SetAttribute("browser_type", "chrome");

            var decision = user.Decide(flagKey);

            Assert.True(decision.Reasons.Length == 1);
            Assert.AreEqual(decision.Reasons[0], DecisionMessage.Reason(DecisionMessage.FLAG_KEY_INVALID, flagKey));

            var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.INCLUDE_REASONS };

            decision = user.Decide(flagKey, decideOptions);
            Assert.True(decision.Reasons.Length == 1);
            Assert.AreEqual(decision.Reasons[0], DecisionMessage.Reason(DecisionMessage.FLAG_KEY_INVALID, flagKey));

            flagKey  = "multi_variate_feature";
            decision = user.Decide(flagKey);
            Assert.True(decision.Reasons.Length == 0);

            Assert.AreEqual(decision.VariationKey, "Gred");
            Assert.False(decision.Enabled);
            Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
            Assert.AreEqual(decision.FlagKey, flagKey);
            Assert.AreNotEqual(decision.UserContext, user);
            Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
            Assert.True(decision.Reasons.IsNullOrEmpty());

            decision = user.Decide(flagKey, decideOptions);
            Assert.True(decision.Reasons.Length > 0);
            Assert.AreEqual("User [testUserID] is in variation [Gred] of experiment [test_experiment_multivariate].", decision.Reasons[1]);
            Assert.AreEqual("The user \"testUserID\" is bucketed into experiment \"test_experiment_multivariate\" of feature \"multi_variate_feature\".", decision.Reasons[2]);
        }
        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 TestNewDecisionReasonWithIncludeReasons()
        {
            var decisionReasons = new DecisionReasons();
            var decideOptions   = new OptimizelyDecideOption[] { OptimizelyDecideOption.INCLUDE_REASONS };

            decisionReasons.AddError(DecisionMessage.Reason(DecisionMessage.FLAG_KEY_INVALID, "invalid_key"));

            Assert.AreEqual(decisionReasons.ToReport(decideOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS))[0], "No flag was found for key \"invalid_key\".");
            decisionReasons.AddError(DecisionMessage.Reason(DecisionMessage.VARIABLE_VALUE_INVALID, "invalid_key"));
            Assert.AreEqual(decisionReasons.ToReport(decideOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS))[1], "Variable value for key \"invalid_key\" is invalid or wrong type.");
            decisionReasons.AddInfo("Some info message.");
            Assert.AreEqual(decisionReasons.ToReport(decideOptions.Contains(OptimizelyDecideOption.INCLUDE_REASONS))[2], "Some info message.");
        }
        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 void DecideExcludeVariablesDecideOptions()
        {
            var flagKey           = "multi_variate_feature";
            var variablesExpected = new Dictionary <string, object>();
            var user = Optimizely.CreateUserContext(UserID);

            user.SetAttribute("browser_type", "chrome");
            var decideOptions = new OptimizelyDecideOption[] { OptimizelyDecideOption.EXCLUDE_VARIABLES };

            var decision = user.Decide(flagKey, decideOptions);

            Assert.AreEqual(decision.VariationKey, "Gred");
            Assert.False(decision.Enabled);
            Assert.AreEqual(decision.Variables.ToDictionary(), variablesExpected);
            Assert.AreEqual(decision.RuleKey, "test_experiment_multivariate");
            Assert.AreEqual(decision.FlagKey, flagKey);
            Assert.AreNotEqual(decision.UserContext, user);
            Assert.IsTrue(TestData.CompareObjects(decision.UserContext, user));
            Assert.True(decision.Reasons.IsNullOrEmpty());
        }