public void JsonLightTaupoSerializerEntryTest() { var testCases = new JsonLightSerializerTestCase[] { // Entry with only ID new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.Entity() .PrimitiveProperty("ID", (long)42) .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", ""ID"":42 }" }, // Entry with ID and typename new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.Entity("TestModel.Customer") .PrimitiveProperty("ID", (long)42) .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Customer"", ""ID"":42 }" }, // Entry with all metadata expanded new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.Entity("TestModel.CustomerWithImage") .Id("CustomerId") .ETag("etag") .WithEditLink("http://odata.org/editlink") .WithSelfLink("http://odata.org/readlink") .WithStreamContentType("image/jpg") .WithStreamEditLink("http://odata.org/streameditlink") .WithStreamSourceLink("http://odata.org/streamreadlink") .WithStreamETag("stream-etag") .PrimitiveProperty("ID", (long)42) .Operation(new ServiceOperationDescriptor { IsAction = true, Metadata = "./metadata", Target = "http://odata.org/target", Title = "ActionTitle" }) .Operation(new ServiceOperationDescriptor { IsAction = true, Metadata = "./metadata2", Target = "http://odata.org/target2", Title = "ActionTitle2" }) .Operation(new ServiceOperationDescriptor { IsAction = false, Metadata = "./metadata", Target = "http://odata.org/target", Title = "ActionTitle" }) .Operation(new ServiceOperationDescriptor { IsAction = false, Metadata = "./metadata", Target = "http://odata.org/target2", Title = "ActionTitle2" }) .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.CustomerWithImage"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataIdAnnotationName + @""":""CustomerId"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataETagAnnotationName + @""":""etag"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataEditLinkAnnotationName + @""":""http://odata.org/editlink"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataReadLinkAnnotationName + @""":""http://odata.org/readlink"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataMediaEditLinkAnnotationName + @""":""http://odata.org/streameditlink"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataMediaReadLinkAnnotationName + @""":""http://odata.org/streamreadlink"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataMediaContentTypeAnnotationName + @""":""image/jpg"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataMediaETagAnnotationName + @""":""stream-etag"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataActionsAnnotationName + @""":{ ""./metadata"":[{ ""title"":""ActionTitle"", ""target"":""http://odata.org/target""}], ""./metadata2"":[{ ""title"":""ActionTitle2"", ""target"":""http://odata.org/target2""}]}, """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataFunctionsAnnotationName + @""":{ ""./metadata"":[{ ""title"":""ActionTitle"", ""target"":""http://odata.org/target""}, { ""title"":""ActionTitle2"", ""target"":""http://odata.org/target2""}]}, ""ID"":42 }" }, // Entry with deferred navigation and association properties new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.Entity("TestModel.Customer") .PrimitiveProperty("ID", (long)42) .NavigationProperty("NavProp1", "http://odata.org/NavProp1", "http://odata.org/AssocProp1") .NavigationProperty("NavProp2", "http://odata.org/NavProp2") .NavigationProperty("NavProp3", null, "http://odata.org/AssocProp3") .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Customer"", ""ID"":42, """ + JsonLightUtils.GetPropertyAnnotationName("NavProp1", JsonLightConstants.ODataNavigationLinkUrlAnnotationName) + @""":""http://odata.org/NavProp1"", """ + JsonLightUtils.GetPropertyAnnotationName("NavProp1", JsonLightConstants.ODataAssociationLinkUrlAnnotationName) + @""":""http://odata.org/AssocProp1"", """ + JsonLightUtils.GetPropertyAnnotationName("NavProp2", JsonLightConstants.ODataNavigationLinkUrlAnnotationName) + @""":""http://odata.org/NavProp2"", """ + JsonLightUtils.GetPropertyAnnotationName("NavProp3", JsonLightConstants.ODataAssociationLinkUrlAnnotationName) + @""":""http://odata.org/AssocProp3"" }" }, // Entry with navigation link with expanded entry new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.Entity("TestModel.Customer") .PrimitiveProperty("ID", (long)42) .ExpandedNavigationProperty("NavProp1", PayloadBuilder.Entity("TestModel.Order").PrimitiveProperty("ID", ((long)43))) .ExpandedNavigationProperty("NavProp2", PayloadBuilder.Entity("TestModel.Order").PrimitiveProperty("ID", ((long)43)), "http://odata.org/NavProp2") .ExpandedNavigationProperty("NavProp3", PayloadBuilder.Entity("TestModel.Order").PrimitiveProperty("ID", ((long)43)), new DeferredLink { UriString = "http://odata.org/AssocProp3" }) .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Customer"", ""ID"":42, ""NavProp1"":{ """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Order"",""ID"":43 }, """ + JsonLightUtils.GetPropertyAnnotationName("NavProp2", JsonLightConstants.ODataNavigationLinkUrlAnnotationName) + @""":""http://odata.org/NavProp2"", ""NavProp2"":{ """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Order"",""ID"":43 }, """ + JsonLightUtils.GetPropertyAnnotationName("NavProp3", JsonLightConstants.ODataAssociationLinkUrlAnnotationName) + @""":""http://odata.org/AssocProp3"", ""NavProp3"":{ """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Order"",""ID"":43 } }" }, // Entry with navigation link with expanded feed new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.Entity("TestModel.Customer") .PrimitiveProperty("ID", (long)42) .ExpandedNavigationProperty("NavProp1", PayloadBuilder.EntitySet()) .ExpandedNavigationProperty("NavProp2", PayloadBuilder.EntitySet(), "http://odata.org/NavProp2") .ExpandedNavigationProperty("NavProp3", PayloadBuilder.EntitySet(), new DeferredLink { UriString = "http://odata.org/AssocProp3" }) .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + @""":""TestModel.Customer"", ""ID"":42, ""NavProp1"":[], """ + JsonLightUtils.GetPropertyAnnotationName("NavProp2", JsonLightConstants.ODataNavigationLinkUrlAnnotationName) + @""":""http://odata.org/NavProp2"", ""NavProp2"":[], """ + JsonLightUtils.GetPropertyAnnotationName("NavProp3", JsonLightConstants.ODataAssociationLinkUrlAnnotationName) + @""":""http://odata.org/AssocProp3"", ""NavProp3"":[] }" }, }; this.CombinatorialEngineProvider.RunCombinations( testCases, (testCase) => { PayloadFormatVersionAnnotatingVisitor.AnnotateJsonLight(testCase.PayloadElement, DataServiceProtocolVersion.Unspecified, false); JsonValue actualValue = this.JsonLightSerializer.ConvertToJsonLightValue(testCase.PayloadElement); JsonValue expectedValue = JsonTextPreservingParser.ParseValue(new StringReader(testCase.ExpectedJson)); this.JsonValueComparer.Compare(expectedValue, actualValue); }); }
public void JsonLightTaupoSerializerEntityReferenceLinkTest() { var testCases = new JsonLightSerializerTestCase[] { // Single entity reference link new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.DeferredLink("http://odata.org/erl") .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataIdAnnotationName + @""":""http://odata.org/erl"" }" }, // Collection of entity reference links new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.LinkCollection() .Item(PayloadBuilder.DeferredLink("http://odata.org/erl1")) .Item(PayloadBuilder.DeferredLink("http://odata.org/erl2")) .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataValuePropertyName + @""":[ { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataIdAnnotationName + @""":""http://odata.org/erl1"" }, { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataIdAnnotationName + @""":""http://odata.org/erl2"" } ] }" }, // Collection of entity reference links with inline count and next link new JsonLightSerializerTestCase { PayloadElement = PayloadBuilder.LinkCollection() .Item(PayloadBuilder.DeferredLink("http://odata.org/erl1")) .Item(PayloadBuilder.DeferredLink("http://odata.org/erl2")) .InlineCount(42) .NextLink("http://odata.org/nextlink") .WithContextUri("http://odata.org/metadatauri"), ExpectedJson = @" { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + @""":""http://odata.org/metadatauri"", """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataCountAnnotationName + @""": 42, """ + JsonLightConstants.ODataValuePropertyName + @""":[ { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataIdAnnotationName + @""":""http://odata.org/erl1"" }, { """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataIdAnnotationName + @""":""http://odata.org/erl2"" } ], """ + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataNextLinkAnnotationName + @""":""http://odata.org/nextlink"" }" }, }; this.CombinatorialEngineProvider.RunCombinations( testCases, (testCase) => { PayloadFormatVersionAnnotatingVisitor.AnnotateJsonLight(testCase.PayloadElement, DataServiceProtocolVersion.Unspecified, false); JsonValue actualValue = this.JsonLightSerializer.ConvertToJsonLightValue(testCase.PayloadElement); JsonValue expectedValue = JsonTextPreservingParser.ParseValue(new StringReader(testCase.ExpectedJson)); this.JsonValueComparer.Compare(expectedValue, actualValue); }); }
/// <summary> /// Returns the payload to be used for this test case and the specified test configuration. /// </summary> /// <param name="testConfiguration">The test configuration to use.</param> /// <returns>The payload to use for testing.</returns> public static byte[] GetPayload( ReaderTestConfiguration testConfiguration, List <Func <ReaderTestConfiguration, Func <ODataPayloadElement, ODataPayloadElement> > > payloadNormalizers, PayloadReaderTestDescriptor.Settings settings, ODataPayloadElement payloadElement) { IPayloadSerializer payloadSerializer = null; // Apply all payload element transforms before serialization. IPayloadTransform <ODataPayloadElement> payloadElementTransform = settings.PayloadTransformFactory.GetTransform <ODataPayloadElement>(); ODataPayloadElement transformedODataElement = null; if (payloadElementTransform.TryTransform(payloadElement, out transformedODataElement)) { payloadElement = transformedODataElement; } ODataPayloadElement payloadElementToSerialize = payloadElement; // Apply all normalizers/fixups before serialization if (payloadNormalizers != null) { ODataPayloadElement payloadElementCopy = null; foreach (var getPayloadNormalizerFunc in payloadNormalizers) { var normalizer = getPayloadNormalizerFunc(testConfiguration); if (normalizer != null) { if (payloadElementCopy == null) { payloadElementCopy = payloadElementToSerialize.DeepCopy(); } payloadElementCopy = normalizer(payloadElementCopy); } } payloadElementToSerialize = payloadElementCopy ?? payloadElementToSerialize; } if (testConfiguration.Format == ODataFormat.Atom) { payloadSerializer = new XmlPayloadSerializer(settings.PayloadElementToXmlConverter); } else if (testConfiguration.Format == ODataFormat.Json) { // Create a copy of the payload element so that we can add annotations to it. payloadElementToSerialize = payloadElementToSerialize.DeepCopy(); // Annotate elements with version and response/request as appropriate PayloadFormatVersionAnnotatingVisitor.AnnotateJsonLight( payloadElementToSerialize, testConfiguration.Version.ToDataServiceProtocolVersion(), testConfiguration.IsRequest); payloadSerializer = new JsonPayloadSerializer(settings.PayloadElementToJsonLightConverter.ConvertToJsonLight); } else if (testConfiguration.Format == null) { if (payloadElementToSerialize.ElementType == ODataPayloadElementType.PrimitiveValue) { PrimitiveValue primitiveValue = (PrimitiveValue)payloadElementToSerialize; if (primitiveValue.ClrValue == null) { throw new NotSupportedException("Reading null values is not supported (since we don't support writing null values)."); } else if (primitiveValue.ClrValue.GetType() == typeof(byte[])) { payloadSerializer = settings.BinaryValuePayloadElementConverter; } else { payloadSerializer = settings.TextValuePayloadElementConverter; } } else if (payloadElementToSerialize.ElementType == ODataPayloadElementType.BatchRequestPayload || payloadElementToSerialize.ElementType == ODataPayloadElementType.BatchResponsePayload) { return(SerializeBatchPayload(payloadElementToSerialize, settings)); } else { throw new NotImplementedException("Default format not yet implemented for payload test descriptor and payload element type '" + payloadElementToSerialize.ElementType + "'."); } } else { throw new NotSupportedException("Unexpected format."); } // Default encoding is UTF8 return(payloadSerializer.SerializeToBinary(payloadElementToSerialize, null)); }