public void GetKeysFromPrefixAsync_ReturnsResultFromFirstValueProviderThatReturnsValues()
    {
        // Arrange
        var provider1  = Mock.Of <IValueProvider>();
        var dictionary = new Dictionary <string, string>(StringComparer.Ordinal)
        {
            { "prefix-test", "some-value" },
        };
        var provider2 = new Mock <IEnumerableValueProvider>();

        provider2.Setup(p => p.GetKeysFromPrefix("prefix"))
        .Returns(dictionary)
        .Verifiable();
        var provider = new CompositeValueProvider()
        {
            provider1, provider2.Object
        };

        // Act
        var values = provider.GetKeysFromPrefix("prefix");

        // Assert
        var result = Assert.Single(values);

        Assert.Equal("prefix-test", result.Key);
        Assert.Equal("some-value", result.Value);
        provider2.Verify();
    }
示例#2
0
        public void GetKeysFromPrefixAsync_ReturnsEmptyDictionaryIfNoValueProviderReturnsValues()
        {
            // Arrange
            var provider1 = Mock.Of<IValueProvider>();
            var provider2 = Mock.Of<IValueProvider>();
            var provider = new CompositeValueProvider() { provider1, provider2 };

            // Act
            var values = provider.GetKeysFromPrefix("prefix");

            // Assert
            Assert.Empty(values);
        }
    public void GetKeysFromPrefixAsync_ReturnsEmptyDictionaryIfNoValueProviderReturnsValues()
    {
        // Arrange
        var provider1 = Mock.Of <IValueProvider>();
        var provider2 = Mock.Of <IValueProvider>();
        var provider  = new CompositeValueProvider()
        {
            provider1, provider2
        };

        // Act
        var values = provider.GetKeysFromPrefix("prefix");

        // Assert
        Assert.Empty(values);
    }
        public void GetKeysFromPrefixAsync_ReturnsResultFromFirstValueProviderThatReturnsValues()
        {
            // Arrange
            var provider1 = Mock.Of<IValueProvider>();
            var dictionary = new Dictionary<string, string>(StringComparer.Ordinal)
            {
                { "prefix-test", "some-value" },
            };
            var provider2 = new Mock<IEnumerableValueProvider>();
            provider2.Setup(p => p.GetKeysFromPrefix("prefix"))
                     .Returns(dictionary)
                     .Verifiable();
            var provider = new CompositeValueProvider() { provider1, provider2.Object };

            // Act
            var values = provider.GetKeysFromPrefix("prefix");

            // Assert
            var result = Assert.Single(values);
            Assert.Equal("prefix-test", result.Key);
            Assert.Equal("some-value", result.Value);
            provider2.Verify();
        }
示例#5
0
        public JObject ParseProperties(string modelName, CompositeValueProvider valueProvider, JObject model)
        {
            IDictionary <string, string> properties = valueProvider.GetKeysFromPrefix(modelName);

            _logger.LogDebug("DynamicModelBinder property count is " + properties.Count() + " for " + modelName);

            List <string> subModelNames = new List <string>();
            List <string> arrModelNames = new List <string>();

            foreach (var property in properties)
            {
                var subProperties = valueProvider.GetKeysFromPrefix(property.Value);

                var key      = property.Value;
                var propName = property.Key;

                if (subProperties.Count == 0)
                {
                    if (!propName.Contains("RequestVerification"))
                    {
                        if (!model.ContainsKey(propName))
                        {
                            model.Add(propName, GetValue(valueProvider, key));
                        }
                        else
                        {
                            model[propName] = GetValue(valueProvider, key);
                        }
                    }
                }
                else if (subProperties.Any(sp => sp.Value.Contains("[")))
                {
                    if (!arrModelNames.Contains(propName))
                    {
                        arrModelNames.Add(propName);
                    }
                }
                else
                {
                    if (!subModelNames.Contains(propName))
                    {
                        subModelNames.Add(propName);
                    }
                }
            }

            foreach (var subModelName in subModelNames)
            {
                var key = properties[subModelName];

                JObject val = ParseProperties(key, valueProvider, model.ContainsKey(subModelName) ? (JObject)model[subModelName] : new JObject());
                if (!model.ContainsKey(subModelName))
                {
                    model.Add(subModelName, val);
                }
                else
                {
                    model[subModelName] = val;
                }
            }

            foreach (var arrModelName in arrModelNames)
            {
                var key            = properties[arrModelName];
                var arrKeys        = valueProvider.GetKeysFromPrefix(key);
                var isComplexArray = false;
                foreach (var arrKey in arrKeys)
                {
                    var subProperties = valueProvider.GetKeysFromPrefix(arrKey.Value);
                    if (subProperties.Count > 0)
                    {
                        isComplexArray = true;
                    }
                }

                JToken arrResult = null;

                List <object> vals = new List <object>();

                vals.Cast <Object>().ToList();
                if (isComplexArray)
                {
                    foreach (var arrKey in arrKeys)
                    {
                        var arrItemKey = arrKey.Value;

                        var subProperties = valueProvider.GetKeysFromPrefix(arrItemKey);
                        if (subProperties.Count > 0)
                        {
                            object val = ParseProperties(arrItemKey, valueProvider, new JObject());
                            vals.Add(val);
                        }
                    }

                    arrResult = new JArray(vals);
                }
                else
                {
                    foreach (var arrKey in arrKeys)
                    {
                        var arrItemKey = arrKey.Value;
                        vals.Add(GetValue(valueProvider, arrItemKey));
                    }

                    arrResult = new JArray(vals);

                    bool castToType = true;
                    Type itemType   = vals[0].GetType();
                    foreach (var item in vals)
                    {
                        if (item.GetType() != itemType)
                        {
                            castToType = false;
                            break;
                        }
                    }

                    if (castToType)
                    {
                        var ienumerable = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(itemType).Invoke(null, new object[] { vals });
                        arrResult = new JArray(typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(itemType).Invoke(null, new object[] { ienumerable }));
                    }
                }

                if (!model.ContainsKey(arrModelName))
                {
                    model.Add(arrModelName, arrResult);
                }
                else
                {
                    model[arrModelName] = arrResult;
                }
            }

            return(model);
        }