public IActionResult PostSimpleOpenCustomer([FromBody] SimpleOpenCustomer customer) { // Verify there is a string dynamic property object countryValue; customer.CustomerProperties.TryGetValue("Place", out countryValue); Assert.NotNull(countryValue); Assert.Equal(typeof(String), countryValue.GetType()); Assert.Equal("My Dynamic Place", countryValue); // Verify there is a Guid dynamic property object tokenValue; customer.CustomerProperties.TryGetValue("Token", out tokenValue); Assert.NotNull(tokenValue); Assert.Equal(typeof(Guid), tokenValue.GetType()); Assert.Equal(new Guid("2c1f450a-a2a7-4fe1-a25d-4d9332fc0694"), tokenValue); // Verify there is an dynamic collection property object value; customer.CustomerProperties.TryGetValue("DoubleList", out value); Assert.NotNull(value); List <double> doubleValues = Assert.IsType <List <double> >(value); Assert.Equal(new[] { 5.5, 4.4, 3.3 }, doubleValues); // special test cases to test the complex type property value is null. if (customer.CustomerId == 99) { Assert.Null(customer.Address); } return(Ok()); }
public IActionResult Put(int key, [FromBody] SimpleOpenCustomer changedCustomer) { Assert.Equal(99, changedCustomer.CustomerId); Assert.Equal("ChangedName", changedCustomer.Name); Assert.Null(changedCustomer.Address); Assert.Null(changedCustomer.Website); Assert.Single(changedCustomer.CustomerProperties); return(Updated(changedCustomer)); // Updated(customer); }
public IActionResult GetAddress(int key) { IList <SimpleOpenCustomer> customers = CreateCustomers(); SimpleOpenCustomer customer = customers.FirstOrDefault(c => c.CustomerId == key); if (customer == null) { return(NotFound()); } return(Ok(customer.Address)); }
public IActionResult Patch(int key, Delta <SimpleOpenCustomer> patch) { IList <SimpleOpenCustomer> customers = CreateCustomers(); SimpleOpenCustomer customer = customers.FirstOrDefault(c => c.CustomerId == key); if (customer == null) { return(NotFound()); } patch.Patch(customer); // As normal, return Updated(customer) for *PATCH*. // But, Here returns the *Ok* to test the payload return(Ok(customer)); }
public IActionResult Get(int key) { IList <SimpleOpenCustomer> customers = CreateCustomers(); SimpleOpenCustomer customer = customers.FirstOrDefault(c => c.CustomerId == key); if (customer == null) { return(NotFound()); } if (customer.CustomerProperties == null) { customer.CustomerProperties = new Dictionary <string, object>(); customer.CustomerProperties.Add("Token", new Guid("2C1F450A-A2A7-4FE1-A25D-4D9332FC0694")); IList <int> lists = new List <int> { 1, 2, 3, 4, 5, 6, 7 }; customer.CustomerProperties.Add("MyList", lists); } return(Ok(customer)); }
public void ReadEntry_CanReadDynamicPropertiesForOpenEntityType() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntityType <SimpleOpenCustomer>(); builder.EnumType <SimpleEnum>(); IEdmModel model = builder.GetEdmModel(); IEdmEntityTypeReference customerTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenCustomer)).AsEntity(); var deserializerProvider = new DefaultODataDeserializerProvider(); var deserializer = new ODataEntityDeserializer(deserializerProvider); ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName); ODataComplexValue[] complexValues = { new ODataComplexValue { TypeName = typeof(SimpleOpenAddress).FullName, Properties = new[] { // declared properties new ODataProperty { Name = "Street", Value = "Street 1" }, new ODataProperty { Name = "City", Value = "City 1" }, // dynamic properties new ODataProperty { Name = "DateTimeProperty", Value = new DateTimeOffset(new DateTime(2014, 5, 6)) } } }, new ODataComplexValue { TypeName = typeof(SimpleOpenAddress).FullName, Properties = new[] { // declared properties new ODataProperty { Name = "Street", Value = "Street 2" }, new ODataProperty { Name = "City", Value = "City 2" }, // dynamic properties new ODataProperty { Name = "ArrayProperty", Value = new ODataCollectionValue{ TypeName = "Collection(Edm.Int32)", Items = new[]{ 1, 2, 3, 4 } } } } } }; ODataCollectionValue collectionValue = new ODataCollectionValue { TypeName = "Collection(" + typeof(SimpleOpenAddress).FullName + ")", Items = complexValues }; ODataEntry odataEntry = new ODataEntry { Properties = new[] { // declared properties new ODataProperty { Name = "CustomerId", Value = 991 }, new ODataProperty { Name = "Name", Value = "Name #991" }, // dynamic properties new ODataProperty { Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA") }, new ODataProperty { Name = "EnumValue", Value = enumValue }, new ODataProperty { Name = "CollectionProperty", Value = collectionValue } }, TypeName = typeof(SimpleOpenCustomer).FullName }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = model }; ODataEntryWithNavigationLinks entry = new ODataEntryWithNavigationLinks(odataEntry); // Act SimpleOpenCustomer customer = deserializer.ReadEntry(entry, customerTypeReference, readContext) as SimpleOpenCustomer; // Assert Assert.NotNull(customer); // Verify the declared properties Assert.Equal(991, customer.CustomerId); Assert.Equal("Name #991", customer.Name); // Verify the dynamic properties Assert.NotNull(customer.CustomerProperties); Assert.Equal(3, customer.CustomerProperties.Count()); Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]); Assert.Equal(SimpleEnum.Third, customer.CustomerProperties["EnumValue"]); // Verify the dynamic collection property var collectionValues = Assert.IsType <List <SimpleOpenAddress> >(customer.CustomerProperties["CollectionProperty"]); Assert.NotNull(collectionValues); Assert.Equal(2, collectionValues.Count()); Assert.Equal(new DateTimeOffset(new DateTime(2014, 5, 6)), collectionValues[0].Properties["DateTimeProperty"]); Assert.Equal(new List <int> { 1, 2, 3, 4 }, collectionValues[1].Properties["ArrayProperty"]); }
public void ReadResource_CanReadDynamicPropertiesForOpenEntityType() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntityType <SimpleOpenCustomer>(); builder.EnumType <SimpleEnum>(); IEdmModel model = builder.GetEdmModel(); IEdmEntityTypeReference customerTypeReference = model.GetEdmTypeReference(typeof(SimpleOpenCustomer)).AsEntity(); var deserializer = new ODataResourceDeserializer(_deserializerProvider); ODataEnumValue enumValue = new ODataEnumValue("Third", typeof(SimpleEnum).FullName); ODataResource[] complexResources = { new ODataResource { TypeName = typeof(SimpleOpenAddress).FullName, Properties = new[] { // declared properties new ODataProperty { Name = "Street", Value = "Street 1" }, new ODataProperty { Name = "City", Value = "City 1" }, // dynamic properties new ODataProperty { Name = "DateTimeProperty", Value = new DateTimeOffset(new DateTime(2014, 5, 6)) } } }, new ODataResource { TypeName = typeof(SimpleOpenAddress).FullName, Properties = new[] { // declared properties new ODataProperty { Name = "Street", Value = "Street 2" }, new ODataProperty { Name = "City", Value = "City 2" }, // dynamic properties new ODataProperty { Name = "ArrayProperty", Value = new ODataCollectionValue{ TypeName = "Collection(Edm.Int32)", Items = new[]{ 1, 2, 3, 4 }.Cast <object>() } } } } }; ODataResource odataResource = new ODataResource { Properties = new[] { // declared properties new ODataProperty { Name = "CustomerId", Value = 991 }, new ODataProperty { Name = "Name", Value = "Name #991" }, // dynamic properties new ODataProperty { Name = "GuidProperty", Value = new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA") }, new ODataProperty { Name = "EnumValue", Value = enumValue }, }, TypeName = typeof(SimpleOpenCustomer).FullName }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = model }; ODataResourceWrapper topLevelResourceWrapper = new ODataResourceWrapper(odataResource); ODataNestedResourceInfo resourceInfo = new ODataNestedResourceInfo { IsCollection = true, Name = "CollectionProperty" }; ODataNestedResourceInfoWrapper resourceInfoWrapper = new ODataNestedResourceInfoWrapper(resourceInfo); ODataResourceSetWrapper resourceSetWrapper = new ODataResourceSetWrapper(new ODataResourceSet { TypeName = String.Format("Collection({0})", typeof(SimpleOpenAddress).FullName) }); foreach (var complexResource in complexResources) { resourceSetWrapper.Resources.Add(new ODataResourceWrapper(complexResource)); } resourceInfoWrapper.NestedItems.Add(resourceSetWrapper); topLevelResourceWrapper.NestedResourceInfos.Add(resourceInfoWrapper); // Act SimpleOpenCustomer customer = deserializer.ReadResource(topLevelResourceWrapper, customerTypeReference, readContext) as SimpleOpenCustomer; // Assert Assert.NotNull(customer); // Verify the declared properties Assert.Equal(991, customer.CustomerId); Assert.Equal("Name #991", customer.Name); // Verify the dynamic properties Assert.NotNull(customer.CustomerProperties); Assert.Equal(3, customer.CustomerProperties.Count()); Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), customer.CustomerProperties["GuidProperty"]); Assert.Equal(SimpleEnum.Third, customer.CustomerProperties["EnumValue"]); // Verify the dynamic collection property var collectionValues = Assert.IsType <List <SimpleOpenAddress> >(customer.CustomerProperties["CollectionProperty"]); Assert.NotNull(collectionValues); Assert.Equal(2, collectionValues.Count()); Assert.Equal(new DateTimeOffset(new DateTime(2014, 5, 6)), collectionValues[0].Properties["DateTimeProperty"]); Assert.Equal(new List <int> { 1, 2, 3, 4 }, collectionValues[1].Properties["ArrayProperty"]); }
public void CreateEntry_Works_ToAppendDynamicProperties_ForOpenEntityType() { // Arrange IEdmModel model = SerializationTestsHelpers.SimpleOpenTypeModel(); IEdmEntitySet customers = model.EntityContainer.FindEntitySet("Customers"); IEdmEntityType customerType = model.FindDeclaredType("Default.Customer") as IEdmEntityType; Type simpleOpenCustomer = typeof(SimpleOpenCustomer); model.SetAnnotationValue(customerType, new ClrTypeAnnotation(simpleOpenCustomer)); IEdmComplexType addressType = model.FindDeclaredType("Default.Address") as IEdmComplexType; Type simpleOpenAddress = typeof(SimpleOpenAddress); model.SetAnnotationValue(addressType, new ClrTypeAnnotation(simpleOpenAddress)); IEdmEnumType enumType = model.FindDeclaredType("Default.SimpleEnum") as IEdmEnumType; Type simpleEnumType = typeof(SimpleEnum); model.SetAnnotationValue(enumType, new ClrTypeAnnotation(simpleEnumType)); model.SetAnnotationValue(customerType, new DynamicPropertyDictionaryAnnotation( simpleOpenCustomer.GetProperty("CustomerProperties"))); model.SetAnnotationValue(addressType, new DynamicPropertyDictionaryAnnotation( simpleOpenAddress.GetProperty("Properties"))); ODataSerializerProvider serializerProvider = new DefaultODataSerializerProvider(); ODataEntityTypeSerializer serializer = new ODataEntityTypeSerializer(serializerProvider); SelectExpandNode selectExpandNode = new SelectExpandNode(null, customerType, model); ODataSerializerContext writeContext = new ODataSerializerContext { Model = model, Path = new ODataPath(new EntitySetPathSegment(customers)) }; SimpleOpenCustomer customer = new SimpleOpenCustomer() { CustomerId = 991, Name = "Name #991", Address = new SimpleOpenAddress { City = "a city", Street = "a street", Properties = new Dictionary<string, object> { {"ArrayProperty", new[] { "15", "14", "13" } } } }, CustomerProperties = new Dictionary<string, object>() }; customer.CustomerProperties.Add("EnumProperty", SimpleEnum.Fourth); customer.CustomerProperties.Add("GuidProperty", new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA")); customer.CustomerProperties.Add("ListProperty", new List<int>{5,4,3,2,1}); customer.CustomerProperties.Add("DateTimeProperty", new DateTime(2014, 10, 24)); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(writeContext, customerType.ToEdmTypeReference(false) as IEdmEntityTypeReference, customer); // Act ODataEntry entry = serializer.CreateEntry(selectExpandNode, entityInstanceContext); // Assert Assert.Equal(entry.TypeName, "Default.Customer"); Assert.Equal(7, entry.Properties.Count()); // Verify the declared properties ODataProperty street = Assert.Single(entry.Properties.Where(p => p.Name == "CustomerId")); Assert.Equal(991, street.Value); ODataProperty city = Assert.Single(entry.Properties.Where(p => p.Name == "Name")); Assert.Equal("Name #991", city.Value); // Verify the nested open complex property ODataProperty address = Assert.Single(entry.Properties.Where(p => p.Name == "Address")); ODataComplexValue addressComplexValue = Assert.IsType<ODataComplexValue>(address.Value); ODataProperty addressDynamicProperty = Assert.Single(addressComplexValue.Properties.Where(p => p.Name == "ArrayProperty")); ODataCollectionValue addressCollectionValue = Assert.IsType<ODataCollectionValue>(addressDynamicProperty.Value); Assert.Equal(new[] { "15", "14", "13" }, addressCollectionValue.Items.OfType<string>().ToList()); Assert.Equal("Collection(Edm.String)", addressCollectionValue.TypeName); // Verify the dynamic properties ODataProperty enumProperty = Assert.Single(entry.Properties.Where(p => p.Name == "EnumProperty")); ODataEnumValue enumValue = Assert.IsType<ODataEnumValue>(enumProperty.Value); Assert.Equal("Fourth", enumValue.Value); Assert.Equal("Default.SimpleEnum", enumValue.TypeName); ODataProperty guidProperty = Assert.Single(entry.Properties.Where(p => p.Name == "GuidProperty")); Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), guidProperty.Value); ODataProperty listProperty = Assert.Single(entry.Properties.Where(p => p.Name == "ListProperty")); ODataCollectionValue collectionValue = Assert.IsType<ODataCollectionValue>(listProperty.Value); Assert.Equal(new List<int>{5,4,3,2,1}, collectionValue.Items.OfType<int>().ToList()); Assert.Equal("Collection(Edm.Int32)", collectionValue.TypeName); ODataProperty dateTimeProperty = Assert.Single(entry.Properties.Where(p => p.Name == "DateTimeProperty")); Assert.Equal(new DateTimeOffset(new DateTime(2014, 10, 24)), dateTimeProperty.Value); }
public void CreateEntry_Works_ToAppendNullDynamicProperties_ForOpenEntityType(bool enableNullDynamicProperty, int count) { // Arrange IEdmModel model = SerializationTestsHelpers.SimpleOpenTypeModel(); IEdmEntitySet customers = model.EntityContainer.FindEntitySet("Customers"); IEdmEntityType customerType = model.FindDeclaredType("Default.Customer") as IEdmEntityType; Type simpleOpenCustomer = typeof(SimpleOpenCustomer); model.SetAnnotationValue(customerType, new ClrTypeAnnotation(simpleOpenCustomer)); IEdmComplexType addressType = model.FindDeclaredType("Default.Address") as IEdmComplexType; Type simpleOpenAddress = typeof(SimpleOpenAddress); model.SetAnnotationValue(addressType, new ClrTypeAnnotation(simpleOpenAddress)); IEdmEnumType enumType = model.FindDeclaredType("Default.SimpleEnum") as IEdmEnumType; Type simpleEnumType = typeof(SimpleEnum); model.SetAnnotationValue(enumType, new ClrTypeAnnotation(simpleEnumType)); model.SetAnnotationValue(customerType, new DynamicPropertyDictionaryAnnotation( simpleOpenCustomer.GetProperty("CustomerProperties"))); model.SetAnnotationValue(addressType, new DynamicPropertyDictionaryAnnotation( simpleOpenAddress.GetProperty("Properties"))); ODataSerializerProvider serializerProvider = new DefaultODataSerializerProvider(); ODataEntityTypeSerializer serializer = new ODataEntityTypeSerializer(serializerProvider); HttpConfiguration config = new HttpConfiguration(); config.SetSerializeNullDynamicProperty(enableNullDynamicProperty); HttpRequestMessage request = new HttpRequestMessage(); request.SetConfiguration(config); SelectExpandNode selectExpandNode = new SelectExpandNode(null, customerType, model); ODataSerializerContext writeContext = new ODataSerializerContext { Model = model, Path = new ODataPath(new EntitySetPathSegment(customers)), Request = request }; SimpleOpenCustomer customer = new SimpleOpenCustomer() { CustomerId = 991, Name = "Name #991", Address = new SimpleOpenAddress { City = "a city", Street = "a street", Properties = new Dictionary<string, object> { { "ArrayProperty", new[] { "15", "14", "13" } } } }, CustomerProperties = new Dictionary<string, object>() }; customer.CustomerProperties.Add("GuidProperty", new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA")); customer.CustomerProperties.Add("NullProperty", null); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(writeContext, customerType.ToEdmTypeReference(false) as IEdmEntityTypeReference, customer); // Act ODataEntry entry = serializer.CreateEntry(selectExpandNode, entityInstanceContext); // Assert Assert.Equal(entry.TypeName, "Default.Customer"); Assert.Equal(count, entry.Properties.Count()); // Verify the declared properties ODataProperty street = Assert.Single(entry.Properties.Where(p => p.Name == "CustomerId")); Assert.Equal(991, street.Value); ODataProperty city = Assert.Single(entry.Properties.Where(p => p.Name == "Name")); Assert.Equal("Name #991", city.Value); // Verify the nested open complex property ODataProperty address = Assert.Single(entry.Properties.Where(p => p.Name == "Address")); ODataComplexValue addressComplexValue = Assert.IsType<ODataComplexValue>(address.Value); ODataProperty addressDynamicProperty = Assert.Single(addressComplexValue.Properties.Where(p => p.Name == "ArrayProperty")); ODataCollectionValue addressCollectionValue = Assert.IsType<ODataCollectionValue>(addressDynamicProperty.Value); Assert.Equal(new[] { "15", "14", "13" }, addressCollectionValue.Items.OfType<string>().ToList()); Assert.Equal("Collection(Edm.String)", addressCollectionValue.TypeName); // Verify the dynamic properties ODataProperty guidProperty = Assert.Single(entry.Properties.Where(p => p.Name == "GuidProperty")); Assert.Equal(new Guid("181D3A20-B41A-489F-9F15-F91F0F6C9ECA"), guidProperty.Value); ODataProperty nullProperty = entry.Properties.SingleOrDefault(p => p.Name == "NullProperty"); if (enableNullDynamicProperty) { Assert.NotNull(nullProperty); Assert.Null(nullProperty.Value); } else { Assert.Null(nullProperty); } }