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.")); }
/// <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()); }
/// <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); }