public void WriteForEntityReferenceLinksWithDuplicateAnnotationNameShouldThrow() { ODataEntityReferenceLink link1 = new ODataEntityReferenceLink { Url = new Uri("http://host/Customers(1)") }; link1.InstanceAnnotations.Add(new ODataInstanceAnnotation("Is.New", new ODataPrimitiveValue(true))); ODataEntityReferenceLink link2 = new ODataEntityReferenceLink { Url = new Uri("http://host/Customers(2)") }; link2.InstanceAnnotations.Add(new ODataInstanceAnnotation("TestNamespace.unknown", new ODataPrimitiveValue(123))); link2.InstanceAnnotations.Add(new ODataInstanceAnnotation("custom.annotation", new ODataPrimitiveValue(456))); ODataEntityReferenceLinks referencelinks = new ODataEntityReferenceLinks() { Links = new[] { link1, link2 } }; referencelinks.InstanceAnnotations.Add(new ODataInstanceAnnotation("TestNamespace.name", new ODataPrimitiveValue(321))); referencelinks.InstanceAnnotations.Add(new ODataInstanceAnnotation("TestNamespace.name", new ODataPrimitiveValue(654))); string expectedPayload = "{\"@odata.context\":\"http://odata.org/test/$metadata#Collection($ref)\",\"@TestNamespace.name\":321,\"@TestNamespace.name\":654,\"value\":[{\"@odata.id\":\"http://host/Customers(1)\",\"@Is.New\":true},{\"@odata.id\":\"http://host/Customers(2)\",\"@TestNamespace.unknown\":123,\"@custom.annotation\":456}]}"; Action writeResult = () => WriteAndValidate(referencelinks, expectedPayload, writingResponse: false); writeResult.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.JsonLightInstanceAnnotationWriter_DuplicateAnnotationNameInCollection("TestNamespace.name")); writeResult = () => WriteAndValidate(referencelinks, expectedPayload, writingResponse: true); writeResult.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.JsonLightInstanceAnnotationWriter_DuplicateAnnotationNameInCollection("TestNamespace.name")); }
public void WriteForEntityReferenceLinkWithDuplicateAnnotationNameShouldThrow() { ODataEntityReferenceLink referencelink = new ODataEntityReferenceLink { Url = new Uri("http://host/Customers(1)") }; referencelink.InstanceAnnotations.Add(new ODataInstanceAnnotation("TestNamespace.unknown", new ODataPrimitiveValue(123))); referencelink.InstanceAnnotations.Add(new ODataInstanceAnnotation("TestNamespace.unknown", new ODataPrimitiveValue(456))); string expectedPayload = "{\"@odata.context\":\"http://odata.org/test/$metadata#$ref\",\"@odata.id\":\"http://host/Customers(1)\",\"@TestNamespace.unknown\":123,\"@TestNamespace.unknown\":456}"; Action writeResult = () => WriteAndValidate(referencelink, expectedPayload, writingResponse: false); writeResult.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.JsonLightInstanceAnnotationWriter_DuplicateAnnotationNameInCollection("TestNamespace.unknown")); writeResult = () => WriteAndValidate(referencelink, expectedPayload, writingResponse: true); writeResult.ShouldThrow <ODataException>().WithMessage(ODataErrorStrings.JsonLightInstanceAnnotationWriter_DuplicateAnnotationNameInCollection("TestNamespace.unknown")); }
/// <summary> /// Writes a collection of instance annotations in ATOM format. /// </summary> /// <param name="instanceAnnotations">Instance annotation collection to write.</param> /// <param name="tracker">The tracker to track which instance annotations have been written.</param> internal void WriteInstanceAnnotations(IEnumerable <AtomInstanceAnnotation> instanceAnnotations, InstanceAnnotationWriteTracker tracker) { Debug.Assert(instanceAnnotations != null, "instanceAnnotations should not be null if we called this"); Debug.Assert(tracker != null, "tracker should not be null if we called this"); HashSet <string> instanceAnnotationNames = new HashSet <string>(StringComparer.Ordinal); foreach (var annotation in instanceAnnotations) { if (!instanceAnnotationNames.Add(annotation.TermName)) { throw new ODataException(ODataErrorStrings.JsonLightInstanceAnnotationWriter_DuplicateAnnotationNameInCollection(annotation.TermName)); } if (!tracker.IsAnnotationWritten(annotation.TermName)) { this.WriteInstanceAnnotation(annotation); tracker.MarkAnnotationWritten(annotation.TermName); } } }