public void GetBindableProperties_WorksOnlyFor_PublicInstanceProperties_WithPublicGettersAndSetters() { // Arrange ApiParameterDescription parameter = new ApiParameterDescription(); Mock<HttpParameterDescriptor> parameterDescriptorMock = new Mock<HttpParameterDescriptor>(); parameterDescriptorMock.SetupGet(p => p.ParameterType).Returns(typeof(ClassWithAllKindsOfProperties)); parameter.ParameterDescriptor = parameterDescriptorMock.Object; // Act IEnumerable<PropertyInfo> bindableProperties = parameter.GetBindableProperties(); // Assert Assert.Equal(1, bindableProperties.Count()); Assert.Equal("ValidProperty", bindableProperties.Single().Name); }
public void GetBindableProperties_WorksOnlyFor_PublicInstanceProperties_WithPublicGettersAndSetters() { // Arrange ApiParameterDescription parameter = new ApiParameterDescription(); Mock <HttpParameterDescriptor> parameterDescriptorMock = new Mock <HttpParameterDescriptor>(); parameterDescriptorMock.SetupGet(p => p.ParameterType).Returns(typeof(ClassWithAllKindsOfProperties)); parameter.ParameterDescriptor = parameterDescriptorMock.Object; // Act IEnumerable <PropertyInfo> bindableProperties = parameter.GetBindableProperties(); // Assert Assert.Equal(1, bindableProperties.Count()); Assert.Equal("ValidProperty", bindableProperties.Single().Name); }
// Set as internal for the unit test. internal static bool TryExpandUriParameters(IHttpRoute route, HttpParsedRoute parsedRoute, ICollection <ApiParameterDescription> parameterDescriptions, out string expandedRouteTemplate) { Dictionary <string, object> parameterValuesForRoute = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); bool emitPrefixes = ShouldEmitPrefixes(parameterDescriptions); string prefix = String.Empty; foreach (ApiParameterDescription parameterDescription in parameterDescriptions) { if (parameterDescription.Source == ApiParameterSource.FromUri) { if (parameterDescription.ParameterDescriptor == null) { // Undeclared route parameter handling generates query string like // "?name={name}" AddPlaceholder(parameterValuesForRoute, parameterDescription.Name); } else if (TypeHelper.CanConvertFromString(parameterDescription.ParameterDescriptor.ParameterType)) { // Simple type generates query string like // "?name={name}" AddPlaceholder(parameterValuesForRoute, parameterDescription.Name); } else if (IsBindableCollection(parameterDescription.ParameterDescriptor.ParameterType)) { string parameterName = parameterDescription.ParameterDescriptor.ParameterName; Type innerType = GetCollectionElementType(parameterDescription.ParameterDescriptor.ParameterType); PropertyInfo[] innerTypeProperties = ApiParameterDescription.GetBindableProperties(innerType).ToArray(); if (innerTypeProperties.Any()) { // Complex array and collection generate query string like // "?name[0].foo={name[0].foo}&name[0].bar={name[0].bar} // &name[1].foo={name[1].foo}&name[1].bar={name[1].bar}" AddPlaceholderForProperties(parameterValuesForRoute, innerTypeProperties, parameterName + "[0]."); AddPlaceholderForProperties(parameterValuesForRoute, innerTypeProperties, parameterName + "[1]."); } else { // Simple array and collection generate query string like // "?name[0]={name[0]}&name[1]={name[1]}". AddPlaceholder(parameterValuesForRoute, parameterName + "[0]"); AddPlaceholder(parameterValuesForRoute, parameterName + "[1]"); } } else if (IsBindableKeyValuePair(parameterDescription.ParameterDescriptor.ParameterType)) { // KeyValuePair generates query string like // "?key={key}&value={value}" AddPlaceholder(parameterValuesForRoute, "key"); AddPlaceholder(parameterValuesForRoute, "value"); } else if (IsBindableDictionry(parameterDescription.ParameterDescriptor.ParameterType)) { // Dictionary generates query string like // "?dict[0].key={dict[0].key}&dict[0].value={dict[0].value} // &dict[1].key={dict[1].key}&dict[1].value={dict[1].value}" string parameterName = parameterDescription.ParameterDescriptor.ParameterName; AddPlaceholder(parameterValuesForRoute, parameterName + "[0].key"); AddPlaceholder(parameterValuesForRoute, parameterName + "[0].value"); AddPlaceholder(parameterValuesForRoute, parameterName + "[1].key"); AddPlaceholder(parameterValuesForRoute, parameterName + "[1].value"); } else if (parameterDescription.CanConvertPropertiesFromString()) { if (emitPrefixes) { prefix = parameterDescription.Name + "."; } // Inserting the individual properties of the object in the query string // as all the complex object can not be converted from string, but all its // individual properties can. AddPlaceholderForProperties(parameterValuesForRoute, parameterDescription.GetBindableProperties(), prefix); } } } BoundRouteTemplate boundRouteTemplate = parsedRoute.Bind(null, parameterValuesForRoute, new HttpRouteValueDictionary(route.Defaults), new HttpRouteValueDictionary(route.Constraints)); if (boundRouteTemplate == null) { expandedRouteTemplate = null; return(false); } expandedRouteTemplate = Uri.UnescapeDataString(boundRouteTemplate.BoundTemplate); return(true); }
internal static bool CanConvertPropertiesFromString(this ApiParameterDescription description) => description.GetBindableProperties().All(p => p.PropertyType.CanConvertFromString());