예제 #1
0
        public void TestGetAttributeIdWithReservedPrefix()
        {
            // Verify that attribute key is returned for reserved attribute key.
            Assert.AreEqual(Config.GetAttributeId(ControlAttributes.USER_AGENT_ATTRIBUTE), ControlAttributes.USER_AGENT_ATTRIBUTE);

            // Verify that attribute Id is returned for attribute key with reserved prefix that does not exist in datafile.
            Assert.AreEqual(Config.GetAttributeId("$opt_reserved_prefix_attribute"), "$opt_reserved_prefix_attribute");

            // Create config file copy with additional resered prefix attribute.
            string  reservedPrefixAttrKey = "$opt_user_defined_attribute";
            JObject projConfig            = JObject.Parse(TestData.Datafile);
            var     attributes            = (JArray)projConfig["attributes"];

            var reservedAttr = new Entity.Attribute {
                Id = "7723348204", Key = reservedPrefixAttrKey
            };

            attributes.Add((JObject)JToken.FromObject(reservedAttr));

            // Verify that attribute Id is returned and warning is logged for attribute key with reserved prefix that exists in datafile.
            var reservedAttrConfig = ProjectConfig.Create(JsonConvert.SerializeObject(projConfig), LoggerMock.Object, ErrorHandlerMock.Object);

            Assert.AreEqual(reservedAttrConfig.GetAttributeId(reservedPrefixAttrKey), reservedAttrConfig.GetAttribute(reservedPrefixAttrKey).Id);
            LoggerMock.Verify(l => l.Log(LogLevel.WARN, $@"Attribute {reservedPrefixAttrKey} unexpectedly has reserved prefix {ProjectConfig.RESERVED_ATTRIBUTE_PREFIX}; using attribute ID instead of reserved attribute name."));
        }
예제 #2
0
        /// <summary>
        /// Create Visitor Attributes list
        /// </summary>
        /// <param name="userAttributes">The user's attributes</param>
        /// <param name="config">ProjectConfig instance</param>
        /// <returns>VisitorAttribute array if config is valid, null otherwise</returns>
        public static VisitorAttribute[] BuildAttributeList(UserAttributes userAttributes, ProjectConfig config)
        {
            if (config == null)
            {
                return(null);
            }

            List <VisitorAttribute> attributesList = new List <VisitorAttribute>();

            if (userAttributes != null)
            {
                foreach (var validUserAttribute in userAttributes.Where(attribute => Validator.IsUserAttributeValid(attribute)))
                {
                    var attributeId = config.GetAttributeId(validUserAttribute.Key);
                    if (!string.IsNullOrEmpty(attributeId))
                    {
                        attributesList.Add(new VisitorAttribute(entityId: attributeId, key: validUserAttribute.Key,
                                                                type: CUSTOM_ATTRIBUTE_FEATURE_TYPE, value: validUserAttribute.Value));
                    }
                }
            }

            //checks if botFiltering value is not set in the project config file.
            if (config.BotFiltering.HasValue)
            {
                attributesList.Add(new VisitorAttribute(entityId: ControlAttributes.BOT_FILTERING_ATTRIBUTE,
                                                        key: ControlAttributes.BOT_FILTERING_ATTRIBUTE, type: CUSTOM_ATTRIBUTE_FEATURE_TYPE, value: config.BotFiltering));
            }

            return(attributesList.ToArray());
        }
예제 #3
0
        /// <summary>
        /// Helper function to set parameters common to impression and conversion event
        /// </summary>
        /// <param name="config">ProjectConfig Configuration for the project</param>
        /// <param name="userId">string ID of user</param>
        /// <param name="userAttributes">associative array of Attributes for the user</param>
        private Dictionary <string, object> GetCommonParams(ProjectConfig config, string userId, UserAttributes userAttributes)
        {
            var comonParams = new Dictionary <string, object>();

            var visitor = new Dictionary <string, object>
            {
                { "snapshots", new object[0] },
                { "visitor_id", userId },
                { "attributes", new object[0] }
            };

            comonParams[Params.VISITORS]         = new object[] { visitor };
            comonParams[Params.PROJECT_ID]       = config.ProjectId;
            comonParams[Params.ACCOUNT_ID]       = config.AccountId;
            comonParams[Params.CLIENT_ENGINE]    = Optimizely.SDK_TYPE;
            comonParams[Params.CLIENT_VERSION]   = Optimizely.SDK_VERSION;
            comonParams[Params.REVISION]         = config.Revision;
            comonParams[Params.ANONYMIZE_IP]     = config.AnonymizeIP;
            comonParams[Params.ENRICH_DECISIONS] = true;

            var userFeatures = new List <Dictionary <string, object> >();

            //Omit attribute values that are not supported by the log endpoint.
            foreach (var validUserAttribute in userAttributes.Where(attribute => Validator.IsUserAttributeValid(attribute)))
            {
                var attributeId = config.GetAttributeId(validUserAttribute.Key);
                if (!string.IsNullOrEmpty(attributeId))
                {
                    userFeatures.Add(new Dictionary <string, object>
                    {
                        { "entity_id", attributeId },
                        { "key", validUserAttribute.Key },
                        { "type", CUSTOM_ATTRIBUTE_FEATURE_TYPE },
                        { "value", validUserAttribute.Value }
                    });
                }
            }

            if (config.BotFiltering.HasValue)
            {
                userFeatures.Add(new Dictionary <string, object>
                {
                    { "entity_id", ControlAttributes.BOT_FILTERING_ATTRIBUTE },
                    { "key", ControlAttributes.BOT_FILTERING_ATTRIBUTE },
                    { "type", CUSTOM_ATTRIBUTE_FEATURE_TYPE },
                    { "value", config.BotFiltering }
                });
            }

            visitor["attributes"] = userFeatures;

            return(comonParams);
        }