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