public void AutoComputeETagWithOptimisticConcurrencyAnnotation() { const string expected = "{" + "\"@odata.context\":\"http://example.com/$metadata#People/$entity\"," + "\"@odata.id\":\"People(123)\"," + "\"@odata.etag\":\"W/\\\"'lucy',12306\\\"\"," + "\"@odata.editLink\":\"People(123)\"," + "\"@odata.mediaEditLink\":\"People(123)/$value\"," + "\"ID\":123," + "\"Name\":\"lucy\"," + "\"Class\":12306," + "\"Alias\":\"lily\"}"; EdmModel model = new EdmModel(); EdmEntityType personType = new EdmEntityType("MyNs", "Person", null, false, false, true); personType.AddKeys(personType.AddStructuralProperty("ID", EdmPrimitiveTypeKind.Int32)); var nameProperty = personType.AddStructuralProperty("Name", EdmCoreModel.Instance.GetString(isNullable: true)); var classProperty = personType.AddStructuralProperty("Class", EdmPrimitiveTypeKind.Int32); personType.AddStructuralProperty("Alias", EdmCoreModel.Instance.GetString(isNullable: true), null, EdmConcurrencyMode.Fixed); var container = new EdmEntityContainer("MyNs", "Container"); model.AddElement(personType); container.AddEntitySet("People", personType); model.AddElement(container); IEdmEntitySet peopleSet = model.FindDeclaredEntitySet("People"); model.SetOptimisticConcurrencyAnnotation(peopleSet, new[] { nameProperty, classProperty }); ODataEntry entry = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ID", Value = 123}, new ODataProperty {Name = "Name", Value = "lucy"}, new ODataProperty {Name = "Class", Value = 12306}, new ODataProperty {Name = "Alias", Value = "lily"}, } }; string actual = GetWriterOutputForContentTypeAndKnobValue(entry, model, peopleSet, personType); Assert.Equal(expected, actual); }
public void ExceptionThrowForInvalidPropertyPath() { EdmModel model = new EdmModel(); EdmEntityType personType = new EdmEntityType("MyNs", "Person", null, false, false, true); personType.AddKeys(personType.AddStructuralProperty("ID", EdmPrimitiveTypeKind.Int32)); personType.AddStructuralProperty("Name", EdmCoreModel.Instance.GetString(isNullable: true)); var container = new EdmEntityContainer("MyNs", "Container"); model.AddElement(personType); container.AddEntitySet("People", personType); model.AddElement(container); IEdmEntitySet peopleSet = model.FindDeclaredEntitySet("People"); IEdmPathExpression nameExpression = new EdmPropertyPathExpression("NameName"); IEdmCollectionExpression collection = new EdmCollectionExpression(new[] { nameExpression }); IEdmValueTerm term = null; foreach (var referencedModel in model.ReferencedModels) { term = referencedModel.FindDeclaredValueTerm("Org.OData.Core.V1.OptimisticConcurrencyControl"); if (term != null) { break; } } Assert.NotNull(term); EdmAnnotation valueAnnotationOnEntitySet = new EdmAnnotation(peopleSet, term, collection); valueAnnotationOnEntitySet.SetSerializationLocation(model, EdmVocabularyAnnotationSerializationLocation.Inline); model.AddVocabularyAnnotation(valueAnnotationOnEntitySet); ODataEntry entry = new ODataEntry { Properties = new[] { new ODataProperty {Name = "ID", Value = 123}, new ODataProperty {Name = "Name", Value = "lucy"}, } }; Action action = () => GetWriterOutputForContentTypeAndKnobValue(entry, model, peopleSet, personType); action.ShouldThrow<ODataException>().WithMessage(ErrorStrings.EdmValueUtils_PropertyDoesntExist("MyNs.Person", "NameName")); }
public void TestCapabilitiesChangeTrackingInlineAnnotationOnEntitySet() { EdmModel model = new EdmModel(); EdmEntityType deptType = new EdmEntityType("DefaultNamespace", "Dept"); EdmStructuralProperty deptId = deptType.AddStructuralProperty("Id", EdmCoreModel.Instance.GetInt32(false)); deptType.AddKeys(deptId); model.AddElement(deptType); EdmEntityType personType = new EdmEntityType("DefaultNamespace", "Person"); EdmStructuralProperty personId = personType.AddStructuralProperty("Id", EdmCoreModel.Instance.GetInt32(false)); personType.AddKeys(personId); IEdmStructuralProperty ageProperty = personType.AddStructuralProperty("Age", EdmCoreModel.Instance.GetInt32(true)); IEdmNavigationProperty myDeptProperty = personType.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo { Name = "MyDept", Target = deptType, TargetMultiplicity = EdmMultiplicity.One }); model.AddElement(personType); EdmEntityContainer container = new EdmEntityContainer("DefaultNamespace", "Container"); container.AddEntitySet("Depts", deptType); container.AddEntitySet("People", personType); model.AddElement(container); IEdmEntitySet peopleSet = model.FindDeclaredEntitySet("People"); IEdmEntitySet deptSet = model.FindDeclaredEntitySet("Depts"); model.SetChangeTrackingAnnotation(peopleSet, true, new[] { ageProperty }, new[] { myDeptProperty }); model.SetChangeTrackingAnnotation(deptSet, false, null, null); IEnumerable<EdmError> errors; StringWriter sw = new StringWriter(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.Encoding = System.Text.Encoding.UTF8; XmlWriter xw = XmlWriter.Create(sw, settings); model.TryWriteCsdl(xw, out errors); xw.Flush(); xw.Close(); var actual = sw.ToString(); const string expected = @"<?xml version=""1.0"" encoding=""utf-16""?> <Schema Namespace=""DefaultNamespace"" xmlns=""http://docs.oasis-open.org/odata/ns/edm""> <EntityType Name=""Dept""> <Key> <PropertyRef Name=""Id"" /> </Key> <Property Name=""Id"" Type=""Edm.Int32"" Nullable=""false"" /> </EntityType> <EntityType Name=""Person""> <Key> <PropertyRef Name=""Id"" /> </Key> <Property Name=""Id"" Type=""Edm.Int32"" Nullable=""false"" /> <Property Name=""Age"" Type=""Edm.Int32"" /> <NavigationProperty Name=""MyDept"" Type=""DefaultNamespace.Dept"" Nullable=""false"" /> </EntityType> <EntityContainer Name=""Container""> <EntitySet Name=""Depts"" EntityType=""DefaultNamespace.Dept""> <Annotation Term=""Org.OData.Capabilities.V1.ChangeTracking""> <Record> <PropertyValue Property=""Supported"" Bool=""false"" /> <PropertyValue Property=""FilterableProperties""> <Collection /> </PropertyValue> <PropertyValue Property=""ExpandableProperties""> <Collection /> </PropertyValue> </Record> </Annotation> </EntitySet> <EntitySet Name=""People"" EntityType=""DefaultNamespace.Person""> <Annotation Term=""Org.OData.Capabilities.V1.ChangeTracking""> <Record> <PropertyValue Property=""Supported"" Bool=""true"" /> <PropertyValue Property=""FilterableProperties""> <Collection> <PropertyPath>Age</PropertyPath> </Collection> </PropertyValue> <PropertyValue Property=""ExpandableProperties""> <Collection> <NavigationPropertyPath>MyDept</NavigationPropertyPath> </Collection> </PropertyValue> </Record> </Annotation> </EntitySet> </EntityContainer> </Schema>"; Assert.AreEqual(expected, actual); }
public void TestCoreOptimisticConcurrencyControlInlineAnnotation() { EdmModel model = new EdmModel(); EdmEntityContainer container = new EdmEntityContainer("DefaultNamespace", "Container"); EdmEntityType personType = new EdmEntityType("DefaultNamespace", "Person"); EdmStructuralProperty propertyId = personType.AddStructuralProperty("Id", EdmCoreModel.Instance.GetInt32(false)); personType.AddKeys(propertyId); IEdmStructuralProperty concurrencyProperty = personType.AddStructuralProperty("Concurrency", EdmCoreModel.Instance.GetInt32(true)); model.AddElement(personType); container.AddEntitySet("People", personType); model.AddElement(container); container.AddEntitySet("Students", personType); IEdmEntitySet peopleSet = model.FindDeclaredEntitySet("People"); model.SetOptimisticConcurrencyControlAnnotation(peopleSet, new[] { concurrencyProperty }); model.SetOptimisticConcurrencyControlAnnotation(peopleSet, new[] { concurrencyProperty }); IEdmEntitySet studentSet = model.FindDeclaredEntitySet("Students"); model.SetOptimisticConcurrencyControlAnnotation(studentSet, new[] { concurrencyProperty }); IEnumerable<EdmError> errors; StringWriter sw = new StringWriter(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.Encoding = System.Text.Encoding.UTF8; XmlWriter xw = XmlWriter.Create(sw, settings); model.TryWriteCsdl(xw, out errors); xw.Flush(); xw.Close(); var actual = sw.ToString(); const string expected = @"<?xml version=""1.0"" encoding=""utf-16""?> <Schema Namespace=""DefaultNamespace"" xmlns=""http://docs.oasis-open.org/odata/ns/edm""> <EntityType Name=""Person""> <Key> <PropertyRef Name=""Id"" /> </Key> <Property Name=""Id"" Type=""Edm.Int32"" Nullable=""false"" /> <Property Name=""Concurrency"" Type=""Edm.Int32"" /> </EntityType> <EntityContainer Name=""Container""> <EntitySet Name=""People"" EntityType=""DefaultNamespace.Person""> <Annotation Term=""Org.OData.Core.V1.OptimisticConcurrencyControl""> <Collection> <PropertyPath>Concurrency</PropertyPath> </Collection> </Annotation> </EntitySet> <EntitySet Name=""Students"" EntityType=""DefaultNamespace.Person""> <Annotation Term=""Org.OData.Core.V1.OptimisticConcurrencyControl""> <Collection> <PropertyPath>Concurrency</PropertyPath> </Collection> </Annotation> </EntitySet> </EntityContainer> </Schema>"; Assert.AreEqual(expected, actual); }