public void CanMergeNestedJson()
        {
            dynamic data1 = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(_jsonProfileAddress);
            dynamic data2 = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(_jsonProfileAddress2);

            var result = DynamicUtils.Merge(data1, data2);

            Assert.IsNotNull(result);
            Assert.IsNotNull(result.profile);
            Assert.AreEqual(result.profile.address.line1, "line 1", "profile.address.line1 doesn't contain expected values.");

            Assert.AreEqual(result.profile.address.line2, "line 2", "profile.address.line2 doesn't contain expected values.");
        }
        public void CanMergeJson()
        {
            dynamic data1 = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(_json);
            dynamic data2 = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(_json2);

            var result = DynamicUtils.Merge(data1, data2);

            Assert.IsNotNull(result);

            Assert.AreEqual(result.profile2.firstName, "new", "profile2.firstName doesn't contain expected values.");

            // check old properties remain
            Assert.AreEqual(result.profile.firstName, "Jason", "profile.firstName doesn't contain expected values.");
        }
        /// <summary>
        /// Merges the getAccountInfo model with the ds data and adds the DS mapping fields to <param name="mappingFields"></param>
        /// </summary>
        /// <param name="accountInfo"></param>
        /// <returns></returns>
        public dynamic Merge(dynamic accountInfo, List <MappingField> mappingFields)
        {
            // get ds data
            var data = GetOrSearch(accountInfo.UID);

            if (data == null)
            {
                return(accountInfo);
            }

            // merge with accountInfo
            accountInfo = DynamicUtils.Merge(accountInfo, data);
            AddMappingFields(mappingFields);
            return(accountInfo);
        }
        public void MergeSameProperty()
        {
            dynamic data1 = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(@"{
              ""profile"": {
                ""firstName"": ""original"",
                ""age"": 1
              }
            }");
            dynamic data2 = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(@"{
              ""profile"": {
                ""firstName"": ""new"",
                ""age"": 1
              }
            }");

            var result = DynamicUtils.Merge(data1, data2);

            Assert.AreEqual(result.profile.firstName, "new");
        }
        /// <summary>
        /// Uses the Gigya ds.search API call to retrieve data.
        /// FetchDSCompleted event will not be fired.
        /// </summary>
        /// <param name="uid">The user Id.</param>
        /// <param name="dsType">The ds type that is passed in the type param.</param>
        /// <param name="fields">A collection of field names or null to have them created from the settings.</param>
        /// <returns></returns>
        public dynamic Search(string uid, string dsType, IEnumerable <string> fields = null)
        {
            if (string.IsNullOrEmpty(uid))
            {
                throw new ArgumentException("uid");
            }

            if (string.IsNullOrEmpty(dsType))
            {
                throw new ArgumentException("dsType");
            }

            var query    = GigyaDsSearchHelper.BuildQuery(uid, dsType, fields);
            var response = _apiHelper.Search(_settings, query);

            if (response == null)
            {
                return(null);
            }

            dynamic model = JsonConvert.DeserializeObject <ExpandoObject>(response.GetResponseText());

            var modelDictionary = model as IDictionary <string, object>;

            if (!modelDictionary.ContainsKey("results") || model.results.Count == 0)
            {
                return(null);
            }

            var mergedResults = new ExpandoObject();

            foreach (var result in model.results)
            {
                var resultDictionary = result as IDictionary <string, object>;
                if (resultDictionary.ContainsKey("data"))
                {
                    mergedResults = DynamicUtils.Merge(mergedResults, result.data);
                }
            }

            return(mergedResults);
        }