public void Can_deserialize_payload_with_complex_parameters() { string actionName = "Complex"; string body = @"{ ""Quantity"": 1 , ""Address"": { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(typeof(ODataActionParameters), new DefaultODataDeserializerProvider(model)); string url = "http://server/service/Customers(10)/" + actionName; HttpRequestMessage request = GetPostRequest(url); ODataDeserializerContext context = new ODataDeserializerContext { Request = request, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.Same(model.EntityContainers().Single().FunctionImports().SingleOrDefault(f => f.Name == "Complex"), payload.GetFunctionImport(context)); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(1, payload["Quantity"]); Assert.True(payload.ContainsKey("Address")); MyAddress address = payload["Address"] as MyAddress; Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void Can_deserialize_payload_with_primitive_collection_parameters() { string actionName = "PrimitiveCollection"; string body = @"{ ""Name"": ""Avatar"", ""Ratings"": [ 5, 5, 3, 4, 5, 5, 4, 5, 5, 4 ] }"; int[] expectedRatings = new int[] { 5, 5, 3, 4, 5, 5, 4, 5, 5, 4 }; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(typeof(ODataActionParameters), new DefaultODataDeserializerProvider(model)); string url = "http://server/service/EntitySet(key)/" + actionName; HttpRequestMessage request = GetPostRequest(url); ODataDeserializerContext context = new ODataDeserializerContext { Request = request, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.Same(model.EntityContainers().Single().FunctionImports().SingleOrDefault(f => f.Name == "PrimitiveCollection"), payload.GetFunctionImport(context)); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Avatar", payload["Name"]); Assert.True(payload.ContainsKey("Ratings")); IList<int> ratings = payload["Ratings"] as IList<int>; Assert.Equal(10, ratings.Count); Assert.True(expectedRatings.Zip(ratings, (expected, actual) => expected - actual).All(diff => diff == 0)); }
public void Read_Roundtrip_EnumCollection() { // Arrange Color[] colors = { Color.Blue, Color.Green }; ODataCollectionSerializer serializer = new ODataCollectionSerializer(SerializerProvider); ODataCollectionDeserializer deserializer = new ODataCollectionDeserializer(DeserializerProvider); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, settings, Model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), Model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = Model }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = Model }; // Act serializer.WriteObject(colors, colors.GetType(), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); IEnumerable readAddresses = deserializer.Read(messageReader, typeof(Color[]), readContext) as IEnumerable; // Assert Assert.Equal(colors, readAddresses.Cast <Color>()); }
public void WriteObject_Calls_CreateODataComplexValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataComplexTypeSerializer> serializer = new Mock<ODataComplexTypeSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "ComplexPropertyName", Model = _model }; object graph = new object(); ODataComplexValue complexValue = new ODataComplexValue { TypeName = "NS.Name", Properties = new[] { new ODataProperty { Name = "Property1", Value = 42 } } }; serializer.CallBase = true; serializer.Setup(s => s.CreateODataComplexValue(graph, It.Is<IEdmComplexTypeReference>(e => e.Definition == _addressType), writeContext)) .Returns(complexValue).Verifiable(); // Act serializer.Object.WriteObject(graph, typeof(Address), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Equal("{\"@odata.context\":\"http://any/$metadata#NS.Name\",\"Property1\":42}", result); }
public void WriteObject_WritesValueReturnedFrom_CreateODataCollectionValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings() { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataCollectionSerializer> serializer = new Mock<ODataCollectionSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "CollectionName", Model = _model }; IEnumerable enumerable = new object[0]; ODataCollectionValue collectionValue = new ODataCollectionValue { TypeName = "NS.Name", Items = new[] { 0, 1, 2 } }; serializer.CallBase = true; serializer .Setup(s => s.CreateODataCollectionValue(enumerable, It.Is<IEdmTypeReference>(e => e.Definition == _edmIntType.Definition), writeContext)) .Returns(collectionValue).Verifiable(); // Act serializer.Object.WriteObject(enumerable, typeof(int[]), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Equal("{\"@odata.context\":\"http://any/$metadata#Collection(Edm.Int32)\",\"value\":[0,1,2]}", result); }
public void WriteObject_WritesValueReturnedFrom_CreateODataCollectionValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriter messageWriter = new ODataMessageWriter(message); Mock<ODataCollectionSerializer> serializer = new Mock<ODataCollectionSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "CollectionName", Model = _model }; IEnumerable enumerable = new object[0]; ODataCollectionValue collectionValue = new ODataCollectionValue { TypeName = "NS.Name", Items = new[] { 0, 1, 2 } }; serializer.CallBase = true; serializer .Setup(s => s.CreateODataCollectionValue(enumerable, It.Is<IEdmTypeReference>(e => e.Definition == _edmIntType.Definition), writeContext)) .Returns(collectionValue).Verifiable(); // Act serializer.Object.WriteObject(enumerable, typeof(int[]), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("CollectionName", element.Name.LocalName); Assert.Equal(3, element.Descendants().Count()); Assert.Equal(new[] { "0", "1", "2" }, element.Descendants().Select(e => e.Value)); }
public void WriteResponseAsync_WritesChangeSet() { HttpResponseMessage[] responses = new HttpResponseMessage[] { new HttpResponseMessage(HttpStatusCode.Accepted), new HttpResponseMessage(HttpStatusCode.NoContent) }; ChangeSetResponseItem responseItem = new ChangeSetResponseItem(responses); MemoryStream memoryStream = new MemoryStream(); IODataResponseMessage responseMessage = new ODataMessageWrapper(memoryStream); ODataMessageWriter writer = new ODataMessageWriter(responseMessage); ODataBatchWriter batchWriter = writer.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); responseItem.WriteResponseAsync(batchWriter, CancellationToken.None).Wait(); batchWriter.WriteEndBatch(); memoryStream.Position = 0; string responseString = new StreamReader(memoryStream).ReadToEnd(); Assert.Contains("changesetresponse", responseString); Assert.Contains("Accepted", responseString); Assert.Contains("No Content", responseString); }
public void Can_deserialize_payload_with_primitive_parameters() { string actionName = "Primitive"; int quantity = 1; string productCode = "PCode"; string body = "{" + string.Format(@" ""Quantity"": {0} , ""ProductCode"": ""{1}"" ", quantity, productCode) + "}"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(new DefaultODataDeserializerProvider()); ODataPath path = CreatePath(model, actionName); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.Same( model.EntityContainers().Single().FunctionImports().SingleOrDefault(f => f.Name == "Primitive"), ODataActionPayloadDeserializer.GetFunctionImport(context)); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(quantity, payload["Quantity"]); Assert.True(payload.ContainsKey("ProductCode")); Assert.Equal(productCode, payload["ProductCode"]); }
public void ODataEntityReferenceLinkSerializer_Serializes_UrisAndEntityReferenceLinks_WithCount(object uris) { // Arrange ODataEntityReferenceLinksSerializer serializer = new ODataEntityReferenceLinksSerializer(); IEdmNavigationProperty navigationProperty = _customerSet.ElementType.NavigationProperties().First(); ODataPath path = new ODataPath(new EntitySetPathSegment(_customerSet), new NavigationPathSegment(navigationProperty)); ODataSerializerContext writeContext = new ODataSerializerContext { EntitySet = _customerSet, Path = path }; MemoryStream stream = new MemoryStream(); writeContext.Request = new HttpRequestMessage(); writeContext.Request.ODataProperties().TotalCount = 1; IODataResponseMessage message = new ODataMessageWrapper(stream); // Act serializer.WriteObject(uris, typeof(ODataEntityReferenceLinks), new ODataMessageWriter(message), writeContext); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal(2, element.Elements().Count()); Assert.Equal("1", element.Elements().ElementAt(0).Value); Assert.Equal("http://uri1/", element.Elements().ElementAt(1).Value); }
public async Task Can_DeserializePayload_WithEntityCollectionParameters_InUntypedMode(IEdmAction expectedAction, ODataPath path) { // Arrange ODataMessageWrapper message = new ODataMessageWrapper(await GetStringAsStreamAsync(EntityCollectionPayload)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = await _deserializer.ReadAsync(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.Same(expectedAction, payload.Action); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Id")); Assert.Equal(1, payload["Id"]); IEnumerable <IEdmObject> customers = payload["Customers"] as EdmEntityObjectCollection; Assert.Equal(2, customers.Count()); dynamic customer = customers.First(); Assert.NotNull(customer); Assert.Equal(109, customer.Id); Assert.Equal("Avatar", customer.Name); customer = customers.Last(); Assert.NotNull(customer); Assert.Equal(901, customer.Id); Assert.Equal("Robot", customer.Name); }
public void Read_Roundtrip_PrimitiveCollection() { // Arrange int[] numbers = Enumerable.Range(0, 100).ToArray(); ODataCollectionSerializer serializer = new ODataCollectionSerializer(SerializerProvider); ODataCollectionDeserializer deserializer = new ODataCollectionDeserializer(DeserializerProvider); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, settings, Model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), Model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = Model }; ODataDeserializerContext readContext = new ODataDeserializerContext() { Model = Model }; // Act serializer.WriteObject(numbers, numbers.GetType(), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); IEnumerable readnumbers = deserializer.Read(messageReader, typeof(int[]), readContext) as IEnumerable; // Assert Assert.Equal(numbers, readnumbers.Cast <int>()); }
public async Task WriteObjectAsync_CanWrite_TopLevelResourceSet_ContainsEmptyCollectionOfDynamicComplexElement() { // Arrange ODataSerializerProvider serializerProvider = GetServiceProvider().GetService <ODataSerializerProvider>(); ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(serializerProvider); MemoryStream stream = new MemoryStream(); IODataResponseMessageAsync message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); IList <SimpleOpenAddress> addresses = new[] { new SimpleOpenAddress { City = "Redmond", Street = "Microsoft Rd", Properties = new Dictionary <string, object> { { "StringProp", "abc" }, { "Locations", new SimpleOpenAddress[] {} } // empty collection of complex } } }; var builder = new ODataConventionModelBuilder(); builder.ComplexType <SimpleOpenAddress>(); IEdmModel model = builder.GetEdmModel(); ODataSerializerContext writeContext = new ODataSerializerContext { Model = model }; // Act await serializer.WriteObjectAsync(addresses, typeof(IList <SimpleOpenAddress>), writer, writeContext); stream.Seek(0, SeekOrigin.Begin); JObject result = JObject.Parse(await new StreamReader(stream).ReadToEndAsync());//.ToString(); // Assert Assert.Equal(JObject.Parse(@"{ ""@odata.context"": ""http://any/$metadata#Collection(Microsoft.AspNetCore.OData.Tests.Formatter.Models.SimpleOpenAddress)"", ""value"": [ { ""Street"": ""Microsoft Rd"", ""City"": ""Redmond"", ""StringProp"": ""abc"", ""*****@*****.**"": ""#Collection(Microsoft.AspNetCore.OData.Tests.Formatter.Models.SimpleOpenAddress)"", ""Locations"": [] } ] }"), result); }
public void Read_MappedPrimitive(object obj, object expected) { // Arrange IEdmPrimitiveTypeReference primitive = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(int)); IEdmModel model = EdmCoreModel.Instance; ODataPrimitiveSerializer serializer = new ODataPrimitiveSerializer(); ODataPrimitiveDeserializer deserializer = new ODataPrimitiveDeserializer(); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); ODataMessageWriter messageWriter = new ODataMessageWriter(message as IODataResponseMessage, new ODataMessageWriterSettings(), model); ODataMessageReader messageReader = new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), model); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = model }; ODataDeserializerContext readContext = new ODataDeserializerContext { Model = model }; serializer.WriteObject(obj, typeof(int), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); // Act && Assert Assert.Equal(expected, deserializer.Read(messageReader, typeof(int), readContext)); }
public async Task SpatialModelMetadataTest() { string requestUri = string.Format("{0}/odata/$metadata", this.BaseAddress); HttpResponseMessage response = await this.Client.GetAsync(requestUri); var stream = await response.Content.ReadAsStreamAsync(); IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers); var reader = new ODataMessageReader(message); var edmModel = reader.ReadMetadataDocument(); var customer = edmModel.SchemaElements.OfType <IEdmEntityType>().Single(et => et.Name == "SpatialCustomer"); Assert.Equal(5, customer.Properties().Count()); var locationProperty = customer.DeclaredProperties.Single(p => p.Name == "Location"); Assert.Equal("Edm.GeographyPoint", locationProperty.Type.FullName()); var regionProperty = customer.DeclaredProperties.Single(p => p.Name == "Region"); Assert.Equal("Edm.GeographyLineString", regionProperty.Type.FullName()); var homePointProperty = customer.DeclaredProperties.Single(p => p.Name == "HomePoint"); Assert.Equal("Edm.GeometryPoint", homePointProperty.Type.FullName()); }
public void Can_DeserializePayload_WithEntityParameters_InUntypedMode(IEdmAction expectedAction, ODataPath path) { // Arrange ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(EntityPayload)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = _deserializer.Read(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.NotNull(payload); Assert.Same(expectedAction, payload.Action); Assert.True(payload.ContainsKey("Id")); Assert.Equal(1, payload["Id"]); Assert.True(payload.ContainsKey("Customer")); dynamic customer = payload["Customer"] as EdmEntityObject; Assert.IsType <EdmEntityObject>(customer); Assert.Equal(109, customer.Id); Assert.Equal("Avatar", customer.Name); Assert.False(payload.ContainsKey("NullableCustomer")); }
public void WriteObject_Calls_WriteDeltaFeedInline() { // Arrange object graph = new object(); Mock <ODataDeltaFeedSerializer> serializer = new Mock <ODataDeltaFeedSerializer>(_serializerProvider); serializer.CallBase = true; serializer .Setup(s => s.WriteDeltaFeedInline(graph, It.Is <IEdmTypeReference>(e => _customersType.IsEquivalentTo(e)), It.IsAny <ODataWriter>(), _writeContext)) .Verifiable(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings() { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings, _model); // Act serializer.Object.WriteObject(graph, typeof(Customer[]), messageWriter, _writeContext); // Assert serializer.Verify(); }
public void Can_DeserializePayload_WithComplexCollections_InUntypedMode(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Name"": ""Avatar"" , ""Addresses"": [{ ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 }] }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = _deserializer.Read(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.Same(expectedAction, payload.Action); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Avatar", payload["Name"]); Assert.True(payload.ContainsKey("Addresses")); IEnumerable <IEdmObject> addresses = payload["Addresses"] as EdmComplexObjectCollection; dynamic address = addresses.SingleOrDefault(); Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void Can_DeserializePayload_WithEnumCollections_InUntypedMode(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Colors"": [ ""Red"", ""Green""] }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = _deserializer.Read(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.Same(expectedAction, payload.Action); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Colors")); EdmEnumObjectCollection colors = payload["Colors"] as EdmEnumObjectCollection; EdmEnumObject color = colors[0] as EdmEnumObject; Assert.NotNull(color); Assert.Equal("Red", color.Value); }
public void Can_DeserializePayload_WithComplexParameters(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Quantity"": 1 , ""Address"": { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext() { Path = path, Model = _model }; // Act ODataActionParameters payload = _deserializer.Read(reader, typeof(ODataActionParameters), context) as ODataActionParameters; IEdmAction action = ODataActionPayloadDeserializer.GetAction(context); // Assert Assert.Same(expectedAction, action); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(1, payload["Quantity"]); Assert.True(payload.ContainsKey("Address")); MyAddress address = payload["Address"] as MyAddress; Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void Can_deserialize_payload_with_primitive_collection_parameters() { string actionName = "PrimitiveCollection"; string body = @"{ ""Name"": ""Avatar"", ""Ratings"": [ 5, 5, 3, 4, 5, 5, 4, 5, 5, 4 ] }"; int[] expectedRatings = new int[] { 5, 5, 3, 4, 5, 5, 4, 5, 5, 4 }; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(typeof(ODataActionParameters), new DefaultODataDeserializerProvider(model)); string url = "http://server/service/EntitySet(key)/" + actionName; HttpRequestMessage request = GetPostRequest(url); ODataDeserializerContext context = new ODataDeserializerContext { Request = request, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.Same(model.EntityContainers().Single().FunctionImports().SingleOrDefault(f => f.Name == "PrimitiveCollection"), payload.GetFunctionImport(context)); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Avatar", payload["Name"]); Assert.True(payload.ContainsKey("Ratings")); IList <int> ratings = payload["Ratings"] as IList <int>; Assert.Equal(10, ratings.Count); Assert.True(expectedRatings.Zip(ratings, (expected, actual) => expected - actual).All(diff => diff == 0)); }
public void Can_deserialize_payload_with_complex_parameters() { string actionName = "Complex"; string body = @"{ ""Quantity"": 1 , ""Address"": { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(typeof(ODataActionParameters), new DefaultODataDeserializerProvider(model)); string url = "http://server/service/EntitySet(key)/" + actionName; HttpRequestMessage request = GetPostRequest(url); ODataDeserializerContext context = new ODataDeserializerContext { Request = request, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.Same(model.EntityContainers().Single().FunctionImports().SingleOrDefault(f => f.Name == "Complex"), payload.GetFunctionImport(context)); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(1, payload["Quantity"]); Assert.True(payload.ContainsKey("Address")); MyAddress address = payload["Address"] as MyAddress; Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void Can_deserialize_payload_with_primitive_parameters() { string actionName = "Primitive"; int quantity = 1; string productCode = "PCode"; string body = "{" + string.Format(@" ""Quantity"": {0} , ""ProductCode"": ""{1}"" ", quantity, productCode) + "}"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(typeof(ODataActionParameters), new DefaultODataDeserializerProvider(model)); string url = "http://server/service/EntitySet(key)/" + actionName; HttpRequestMessage request = GetPostRequest(url); ODataDeserializerContext context = new ODataDeserializerContext { Request = request, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.Same(model.EntityContainers().Single().FunctionImports().SingleOrDefault(f => f.Name == "Primitive"), payload.GetFunctionImport(context)); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(quantity, payload["Quantity"]); Assert.True(payload.ContainsKey("ProductCode")); Assert.Equal(productCode, payload["ProductCode"]); }
public async Task WriteResponseAsync_AsynchronouslyWritesOperation() { // Arrange HttpContext context = HttpContextHelper.Create(StatusCodes.Status202Accepted); OperationResponseItem responseItem = new OperationResponseItem(context); MemoryStream memoryStream = new MemoryStream(); IODataResponseMessage responseMessage = new ODataMessageWrapper(memoryStream); ODataMessageWriter writer = new ODataMessageWriter(responseMessage); // Act ODataBatchWriter batchWriter = await writer.CreateODataBatchWriterAsync(); await batchWriter.WriteStartBatchAsync(); await responseItem.WriteResponseAsync(batchWriter); await batchWriter.WriteEndBatchAsync(); memoryStream.Position = 0; string responseString = new StreamReader(memoryStream).ReadToEnd(); // Assert Assert.Contains("Accepted", responseString); }
public async Task MetaDataTest() { // Arrange var requestUri = "odata/$metadata"; HttpClient client = CreateClient(); // Act var response = await client.GetAsync(requestUri); var stream = await response.Content.ReadAsStreamAsync(); // Assert IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers); var reader = new ODataMessageReader(message); var edmModel = reader.ReadMetadataDocument(); #region functions // Function GetAllConventionCustomers var typeOfConventionCustomer = typeof(ConventionCustomer); var function1 = edmModel.FindDeclaredOperations(typeOfConventionCustomer.Namespace + ".GetAllConventionCustomers").FirstOrDefault(); Assert.Equal(string.Format("Collection({0})", typeOfConventionCustomer.FullName), function1.ReturnType.Definition.FullTypeName()); Assert.Empty(function1.Parameters); // Function GetConventionCustomerById var function2 = edmModel.FindDeclaredOperations(typeof(ConventionCustomer).Namespace + ".GetConventionCustomerById").FirstOrDefault(); Assert.Equal(typeOfConventionCustomer.FullName, function2.ReturnType.Definition.FullTypeName()); Assert.Single(function2.Parameters); // Function GetConventionOrderByCustomerIdAndOrderName var typeOfConventionOrder = typeof(ConventionOrder); var function3 = edmModel.FindDeclaredOperations(typeOfConventionOrder.Namespace + ".GetConventionOrderByCustomerIdAndOrderName").FirstOrDefault(); Assert.Equal(typeOfConventionOrder.FullName, function3.ReturnType.Definition.FullTypeName()); Assert.Equal(2, function3.Parameters.Count()); #endregion #region function imports var container = edmModel.EntityContainer; Assert.Equal("Container", container.Name); var functionImport1 = container.FindOperationImports("GetAllConventionCustomers"); Assert.Equal(2, functionImport1.Count()); var functionImport2 = container.FindOperationImports("GetConventionCustomerById"); Assert.Single(functionImport2); var functionImport3 = container.FindOperationImports("GetConventionOrderByCustomerIdAndOrderName"); Assert.Single(functionImport3); #endregion #region actions var action2 = edmModel.FindDeclaredOperations(typeOfConventionCustomer.Namespace + ".UpdateAddress").FirstOrDefault(); Assert.Equal(string.Format("Collection({0})", typeOfConventionCustomer.FullName), action2.ReturnType.Definition.FullTypeName()); Assert.Equal(2, action2.Parameters.Count()); #endregion #region action imports var actionImport2 = container.FindOperationImports("UpdateAddress"); Assert.Single(actionImport2); #endregion }
public async Task Can_DeserializePayload_WithComplexParameters_InUntypedMode(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Quantity"": 1 , ""Address"": { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } }"; ODataMessageWrapper message = new ODataMessageWrapper(await GetStringAsStreamAsync(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = await _deserializer.ReadAsync(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.NotNull(actionName); Assert.NotNull(payload); Assert.Same(expectedAction, payload.Action); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(1, payload["Quantity"]); Assert.True(payload.ContainsKey("Address")); dynamic address = payload["Address"] as EdmComplexObject; Assert.IsType <EdmComplexObject>(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public async Task WriteResponseAsync_WritesChangeSet() { // Arrange HttpContext context1 = HttpContextHelper.Create(StatusCodes.Status202Accepted); HttpContext context2 = HttpContextHelper.Create(StatusCodes.Status204NoContent); ChangeSetResponseItem responseItem = new ChangeSetResponseItem(new[] { context1, context2 }); MemoryStream memoryStream = new MemoryStream(); IODataResponseMessage responseMessage = new ODataMessageWrapper(memoryStream); ODataMessageWriter writer = new ODataMessageWriter(responseMessage); // Act ODataBatchWriter batchWriter = await writer.CreateODataBatchWriterAsync(); await batchWriter.WriteStartBatchAsync(); await responseItem.WriteResponseAsync(batchWriter); await batchWriter.WriteEndBatchAsync(); memoryStream.Position = 0; string responseString = new StreamReader(memoryStream).ReadToEnd(); // Assert Assert.Contains("changesetresponse", responseString); Assert.Contains("Accepted", responseString); Assert.Contains("No Content", responseString); }
public async Task Can_DeserializePayload_WithEnumParameters_InUntypedMode(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Color"": ""Red""}"; ODataMessageWrapper message = new ODataMessageWrapper(await GetStringAsStreamAsync(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = await _deserializer.ReadAsync(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.NotNull(actionName); Assert.NotNull(payload); Assert.Same(expectedAction, payload.Action); Assert.True(payload.ContainsKey("Color")); EdmEnumObject color = payload["Color"] as EdmEnumObject; Assert.IsType <EdmEnumObject>(color); Assert.Equal("Red", color.Value); }
public void ODataEntityReferenceLinkSerializer_Serializes_Uri(object link) { // Arrange ODataEntityReferenceLinkSerializer serializer = new ODataEntityReferenceLinkSerializer(); ODataSerializerContext writeContext = new ODataSerializerContext(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(link, typeof(ODataEntityReferenceLink), writer, writeContext); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"@odata.context\":\"http://any/$metadata#$ref\",\"@odata.id\":\"http://sampleuri/\"}", result); }
public async Task Can_DeserializePayload_WithComplexCollectionParameters(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Name"": ""Microsoft"", ""Addresses"": [ { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } ] }"; ODataMessageWrapper message = new ODataMessageWrapper(await GetStringAsStreamAsync(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model }; // Act ODataActionParameters payload = await _deserializer.ReadAsync(reader, typeof(ODataActionParameters), context) as ODataActionParameters; // Assert Assert.NotNull(actionName); Assert.NotNull(expectedAction); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Microsoft", payload["Name"]); Assert.True(payload.ContainsKey("Addresses")); IList <MyAddress> addresses = (payload["Addresses"] as IEnumerable <MyAddress>).ToList(); Assert.NotNull(addresses); Assert.Single(addresses); MyAddress address = addresses[0]; Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void ODataEntityReferenceLinkSerializer_Serializes_UrisAndEntityReferenceLinks(object uris) { // Arrange ODataEntityReferenceLinksSerializer serializer = new ODataEntityReferenceLinksSerializer(); ODataSerializerContext writeContext = new ODataSerializerContext(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(uris, typeof(ODataEntityReferenceLinks), writer, writeContext); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"@odata.context\":\"http://any/$metadata#Collection($ref)\"," + "\"value\":[{\"@odata.id\":\"http://uri1/\"},{\"@odata.id\":\"http://uri2/\"}]}", result); }
public async Task Can_DeserializePayload_WithEntityParameters(IEdmAction expectedAction, ODataPath path) { // Arrange ODataMessageWrapper message = new ODataMessageWrapper(await GetStringAsStreamAsync(EntityPayload)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext() { Path = path, Model = _model }; // Act ODataActionParameters payload = await _deserializer.ReadAsync(reader, typeof(ODataActionParameters), context) as ODataActionParameters; IEdmAction action = ODataActionPayloadDeserializer.GetAction(context); // Assert Assert.Same(expectedAction, action); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Id")); Assert.Equal(1, payload["Id"]); Assert.True(payload.ContainsKey("Customer")); Customer customer = payload["Customer"] as Customer; Assert.NotNull(customer); Assert.Equal(109, customer.Id); Assert.Equal("Avatar", customer.Name); Assert.False(payload.ContainsKey("NullableCustomer")); }
public void WriteObject_Calls_CreateODataComplexValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetServiceDocumentUri(new Uri("http://any/")); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings); Mock<ODataComplexTypeSerializer> serializer = new Mock<ODataComplexTypeSerializer>(new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "ComplexPropertyName", Model = _model }; object graph = new object(); ODataComplexValue complexValue = new ODataComplexValue { TypeName = "NS.Name", Properties = new[] { new ODataProperty { Name = "Property1", Value = 42 } } }; serializer.CallBase = true; serializer.Setup(s => s.CreateODataComplexValue(graph, It.Is<IEdmComplexTypeReference>(e => e.Definition == _addressType), writeContext)) .Returns(complexValue).Verifiable(); // Act serializer.Object.WriteObject(graph, typeof(Address), messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("value", element.Name.LocalName); Assert.Equal("#NS.Name", element.Attributes().Single(a => a.Name.LocalName == "type").Value); Assert.Equal(1, element.Descendants().Count()); Assert.Equal("42", element.Descendants().Single().Value); Assert.Equal("Property1", element.Descendants().Single().Name.LocalName); }
public async Task ServiceDocumentTest() { // Arrange var requestUri = "odata"; HttpClient client = CreateClient(); // Act var response = await client.GetAsync(requestUri); var stream = await response.Content.ReadAsStreamAsync(); //Assert var oDataMessageReaderSettings = new ODataMessageReaderSettings(); IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers); var reader = new ODataMessageReader(message, oDataMessageReaderSettings, UnboundFunctionEdmModel.GetEdmModel()); var oDataWorkSpace = reader.ReadServiceDocument(); var function1 = oDataWorkSpace.FunctionImports.Where(odataResourceCollectionInfo => odataResourceCollectionInfo.Name == "GetAllConventionCustomers"); Assert.Single(function1); var function2 = oDataWorkSpace.FunctionImports.Where(odataResourceCollectionInfo => odataResourceCollectionInfo.Name == "GetConventionOrderByCustomerIdAndOrderName"); // ODL spec says: // The edm:FunctionImport for a parameterless function MAY include the IncludeInServiceDocument attribute // whose Boolean value indicates whether the function import is advertised in the service document. // So the below 2 FunctionImports are not displayed in ServiceDocument. Assert.Empty(function2); var function3 = oDataWorkSpace.FunctionImports.Where(odataResourceCollectionInfo => odataResourceCollectionInfo.Name == "GetConventionCustomerById"); Assert.Empty(function3); }
public void ODataEntityReferenceLinkSerializer_Serializes_UrisAndEntityReferenceLinks_Json(object uris) { // Arrange ODataEntityReferenceLinksSerializer serializer = new ODataEntityReferenceLinksSerializer(); IEdmNavigationProperty navigationProperty = _customerSet.ElementType.NavigationProperties().First(); ODataPath path = new ODataPath(new EntitySetPathSegment(_customerSet), new KeyValuePathSegment("1"), new NavigationPathSegment(navigationProperty)); ODataSerializerContext writeContext = new ODataSerializerContext { Path = path }; MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { BaseUri = new Uri("http://any/") }; settings.SetMetadataDocumentUri(new Uri("http://any/$metadata")); settings.SetContentType(ODataFormat.Json); // Act serializer.WriteObject(uris, typeof(ODataEntityReferenceLinks), new ODataMessageWriter(message, settings), writeContext); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal( string.Format("{0},{1}", "{\"odata.metadata\":\"http://any/$metadata#Default.Container.Customers/$links/Orders\"", "\"value\":[{\"url\":\"http://uri1/\"},{\"url\":\"http://uri2/\"}]}"), result); }
public async Task ModelBuilderTest() { string requestUri = string.Format("{0}/odata/$metadata", this.BaseAddress); HttpResponseMessage response = await this.Client.GetAsync(requestUri); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var stream = await response.Content.ReadAsStreamAsync(); IODataResponseMessage message = new ODataMessageWrapper(stream, response.Content.Headers); var reader = new ODataMessageReader(message); var edmModel = reader.ReadMetadataDocument(); var container = edmModel.EntityContainer; Assert.Equal("Container", container.Name); var employeeType = edmModel.SchemaElements.Single(e => e.Name == "Employee") as IEdmEntityType; employeeType.Properties().All(p => this.IsCamelCase(p.Name)); var managerType = edmModel.SchemaElements.Single(e => e.Name == "Manager") as IEdmEntityType; Assert.Equal(7, managerType.Properties().Count()); managerType.Properties().All(p => this.IsCamelCase(p.Name)); var addressType = edmModel.SchemaElements.Single(e => e.Name == "Address") as IEdmComplexType; addressType.Properties().All(p => this.IsCamelCase(p.Name)); }
public void WriteMessageAsync_ResponseContainsContentId_IfHasContentIdInRequestChangeSet() { MemoryStream ms = new MemoryStream(); HttpContent content = new StringContent(String.Empty, Encoding.UTF8, "multipart/mixed"); content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundary", Guid.NewGuid().ToString())); IODataResponseMessage odataResponse = new ODataMessageWrapper(ms, content.Headers); var batchWriter = new ODataMessageWriter(odataResponse).CreateODataBatchWriter(); HttpResponseMessage response = new HttpResponseMessage { Content = new StringContent("any", Encoding.UTF8, "text/example") }; var request = new HttpRequestMessage(); var contentId = Guid.NewGuid().ToString(); request.SetODataContentId(contentId); response.RequestMessage = request; batchWriter.WriteStartBatch(); batchWriter.WriteStartChangeset(); ODataBatchResponseItem.WriteMessageAsync(batchWriter, response, CancellationToken.None).Wait(); batchWriter.WriteEndChangeset(); batchWriter.WriteEndBatch(); ms.Position = 0; string result = new StreamReader(ms).ReadToEnd(); Assert.Contains("any", result); Assert.Contains("text/example", result); Assert.Contains("Content-ID", result); Assert.Contains(contentId, result); }
public void WriteMessageAsync_WritesResponseMessage() { MemoryStream ms = new MemoryStream(); HttpContent content = new StringContent(String.Empty, Encoding.UTF8, "multipart/mixed"); content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("boundary", Guid.NewGuid().ToString())); IODataResponseMessage odataResponse = new ODataMessageWrapper(ms, content.Headers); var batchWriter = new ODataMessageWriter(odataResponse).CreateODataBatchWriter(); HttpResponseMessage response = new HttpResponseMessage() { Content = new StringContent("example content", Encoding.UTF8, "text/example") }; response.Headers.Add("customHeader", "bar"); batchWriter.WriteStartBatch(); ODataBatchResponseItem.WriteMessageAsync(batchWriter, response, CancellationToken.None).Wait(); batchWriter.WriteEndBatch(); ms.Position = 0; string result = new StreamReader(ms).ReadToEnd(); Assert.Contains("example content", result); Assert.Contains("text/example", result); Assert.Contains("customHeader", result); Assert.Contains("bar", result); }
public async Task WriteObjectAsync_Calls_WriteDeltaResourceSetInline() { // Arrange object graph = new object(); Mock <ODataSerializerProvider> provider = new Mock <ODataSerializerProvider>(); Mock <ODataDeltaResourceSetSerializer> serializer = new Mock <ODataDeltaResourceSetSerializer>(provider.Object); serializer.CallBase = true; serializer .Setup(s => s.WriteDeltaResourceSetInlineAsync(graph, It.Is <IEdmTypeReference>(e => _customersType.IsEquivalentTo(e)), It.IsAny <ODataWriter>(), _writeContext)) .Returns(Task.CompletedTask) .Verifiable(); MemoryStream stream = new MemoryStream(); IODataResponseMessageAsync message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings() { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; ODataMessageWriter messageWriter = new ODataMessageWriter(message, settings, _model); // Act await serializer.Object.WriteObjectAsync(graph, typeof(Customer[]), messageWriter, _writeContext); // Assert serializer.Verify(); }
public void ODataWorkspaceSerializer_Works() { // Arrange ODataWorkspaceSerializer serializer = new ODataWorkspaceSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); // Act serializer.WriteObject(new ODataWorkspace(), _workspaceType, new ODataMessageWriter(message), new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("service", element.Name.LocalName); }
public void ODataErrorSerializer_Works() { // Arrange ODataErrorSerializer serializer = new ODataErrorSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataError error = new ODataError { Message = "Error!!!" }; // Act serializer.WriteObject(error, new ODataMessageWriter(message), new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("Error!!!", element.Descendants().Single(e => e.Name.LocalName == "message").Value); }
public void ODataMetadataSerializer_Works() { // Arrange ODataMetadataSerializer serializer = new ODataMetadataSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); IEdmModel model = new EdmModel(); // Act serializer.WriteObject("42", typeof(IEdmModel), new ODataMessageWriter(message, settings, model), new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("Edmx", element.Name.LocalName); }
public void ODataWorkspaceSerializer_Works() { // Arrange ODataServiceDocumentSerializer serializer = new ODataServiceDocumentSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetServiceDocumentUri(new Uri("http://any/")); settings.SetContentType(ODataFormat.Atom); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(new ODataServiceDocument(), _workspaceType, writer, new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("service", element.Name.LocalName); }
public void ODataErrorSerializer_Works() { // Arrange ODataErrorSerializer serializer = new ODataErrorSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataError error = new ODataError { Message = "Error!!!" }; ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(error, typeof(ODataError), writer, new ODataSerializerContext()); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"error\":{\"code\":\"\",\"message\":\"Error!!!\"}}", result); }
public void ODataMetadataSerializer_Works_ForSingleton() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.Singleton<Customer>("Me"); builder.EntitySet<Order>("MyOrders"); IEdmModel model = builder.GetEdmModel(); ODataMetadataSerializer serializer = new ODataMetadataSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); // Act serializer.WriteObject(model, typeof(IEdmModel), new ODataMessageWriter(message, settings, model), new ODataSerializerContext()); // Assert stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Contains("<Singleton Name=\"Me\" Type=\"System.Web.OData.Formatter.Serialization.Models.Customer\">", result); }
public void Read_Primitive(object obj) { // Arrange IEdmPrimitiveTypeReference primitive = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(int)); ODataPrimitiveSerializer serializer = new ODataPrimitiveSerializer(primitive); ODataPrimitiveDeserializer deserializer = new ODataPrimitiveDeserializer(primitive); MemoryStream stream = new MemoryStream(); ODataMessageWrapper message = new ODataMessageWrapper(stream); serializer.WriteObject( obj, new ODataMessageWriter(message as IODataResponseMessage, new ODataMessageWriterSettings(), EdmCoreModel.Instance), new ODataSerializerContext { RootElementName = "Property" }); stream.Seek(0, SeekOrigin.Begin); Assert.Equal( obj, deserializer.Read( new ODataMessageReader(message as IODataResponseMessage, new ODataMessageReaderSettings(), EdmCoreModel.Instance), new ODataDeserializerContext())); }
public void ODataEntityReferenceLinkSerializer_Serializes_Uri(object link) { // Arrange ODataEntityReferenceLinkSerializer serializer = new ODataEntityReferenceLinkSerializer(); ODataSerializerContext writeContext = new ODataSerializerContext(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(link, typeof(ODataEntityReferenceLink), writer, writeContext); // Assert stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); Assert.Equal("{\"@odata.context\":\"http://any/$metadata#$ref\",\"@odata.id\":\"http://sampleuri/\"}", result); }
public void ODataServiceDocumentSerializer_Works() { // Arrange ODataServiceDocumentSerializer serializer = new ODataServiceDocumentSerializer(); MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriterSettings settings = new ODataMessageWriterSettings { ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), } }; settings.SetContentType(ODataFormat.Json); ODataMessageWriter writer = new ODataMessageWriter(message, settings); // Act serializer.WriteObject(new ODataServiceDocument(), _workspaceType, writer, new ODataSerializerContext()); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"@odata.context\":\"http://any/$metadata\",\"value\":[]}", result); }
private ODataMessageWriter GetODataMessageWriter(IEdmModel model, MemoryStream bufferedStream) { HttpContent content = new StringContent(""); content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings() { PayloadBaseUri = new Uri("http://localhost/odata"), Version = ODataVersion.V4, ODataUri = new ODataUri { ServiceRoot = new Uri("http://localhost/odata") } }; IODataResponseMessage responseMessage = new ODataMessageWrapper(bufferedStream, content.Headers); return new ODataMessageWriter(responseMessage, writerSettings, model); }
public void Throws_ODataException_When_Parameter_Notfound(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Quantity"": 1 , ""ProductCode"": ""PCode"", ""MissingParameter"": 1 }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model }; // Act & Assert Assert.Throws<ODataException>(() => { ODataActionParameters payload = _deserializer.Read(reader, typeof(ODataActionParameters), context) as ODataActionParameters; }, "The parameter 'MissingParameter' in the request payload is not a valid parameter for the operation '" + actionName + "'."); }
public void Can_DeserializePayload_WithComplexCollectionParameters(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Name"": ""Microsoft"", ""Addresses"": [ { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } ] }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model }; // Act ODataActionParameters payload = _deserializer.Read(reader, typeof(ODataActionParameters), context) as ODataActionParameters; // Assert Assert.NotNull(payload); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Microsoft", payload["Name"]); Assert.True(payload.ContainsKey("Addresses")); IList<MyAddress> addresses = (payload["Addresses"] as IEnumerable<MyAddress>).ToList(); Assert.NotNull(addresses); Assert.Equal(1, addresses.Count); MyAddress address = addresses[0]; Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void Can_DeserializePayload_WithPrimitiveCollectionParameters(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Name"": ""Avatar"", ""Ratings"": [ 5, 5, 3, 4, 5, 5, 4, 5, 5, 4 ] }"; int[] expectedRatings = new int[] { 5, 5, 3, 4, 5, 5, 4, 5, 5, 4 }; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model }; // Act ODataActionParameters payload = _deserializer.Read(reader, typeof(ODataActionParameters), context) as ODataActionParameters; IEdmAction action = ODataActionPayloadDeserializer.GetAction(context); // Assert Assert.NotNull(payload); Assert.Same(expectedAction, action); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Avatar", payload["Name"]); Assert.True(payload.ContainsKey("Ratings")); IEnumerable<int> ratings = payload["Ratings"] as IEnumerable<int>; Assert.Equal(10, ratings.Count()); Assert.True(expectedRatings.Zip(ratings, (expected, actual) => expected - actual).All(diff => diff == 0)); }
public void Throws_ODataException_when_parameter_not_found() { string body = @"{ ""Quantity"": 1 , ""ProductCode"": ""PCode"", ""MissingParameter"": 1 }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(new DefaultODataDeserializerProvider()); ODataPath path = CreatePath(model, "Primitive"); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = model }; Assert.Throws<ODataException>(() => { ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; }, "The parameter 'MissingParameter' in the request payload is not a valid parameter for the function import 'Primitive'."); }
public void Can_DeserializePayload_InUntypedMode() { // Arrange IEdmModel model = GetModel(); IEdmActionImport action = model.EntityContainers().Single().OperationImports() .SingleOrDefault(o => o.Name == "Complex") as IEdmActionImport; string body = @"{ ""Quantity"": 1 , ""Address"": { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(new DefaultODataDeserializerProvider()); ODataPath path = CreatePath(model, action.Name); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = deserializer.Read(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.NotNull(payload); Assert.Same(action, payload.Action); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(1, payload["Quantity"]); Assert.True(payload.ContainsKey("Address")); dynamic address = payload["Address"] as EdmComplexObject; Assert.IsType<EdmComplexObject>(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void WriteObject_Calls_CreateODataComplexValue() { // Arrange MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); ODataMessageWriter messageWriter = new ODataMessageWriter(message); Mock<ODataComplexTypeSerializer> serializer = new Mock<ODataComplexTypeSerializer>(_serializer.ComplexType, new DefaultODataSerializerProvider()); ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "ComplexPropertyName" }; object graph = new object(); ODataComplexValue complexValue = new ODataComplexValue { TypeName = "NS.Name", Properties = new[] { new ODataProperty { Name = "Property1", Value = 42 } } }; serializer.CallBase = true; serializer.Setup(s => s.CreateODataComplexValue(graph, writeContext)).Returns(complexValue).Verifiable(); // Act serializer.Object.WriteObject(graph, messageWriter, writeContext); // Assert serializer.Verify(); stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("ComplexPropertyName", element.Name.LocalName); Assert.Equal("NS.Name", element.Attributes().Single(a => a.Name.LocalName == "type").Value); Assert.Equal(1, element.Descendants().Count()); Assert.Equal("42", element.Descendants().Single().Value); Assert.Equal("Property1", element.Descendants().Single().Name.LocalName); }
public void ODataEntityReferenceLinkSerializer_Serializes_Uri(object link) { // Arrange ODataEntityReferenceLinkSerializer serializer = new ODataEntityReferenceLinkSerializer(); IEdmNavigationProperty navigationProperty = _customerSet.ElementType.NavigationProperties().First(); ODataPath path = new ODataPath(new NavigationPathSegment(navigationProperty)); ODataSerializerContext writeContext = new ODataSerializerContext { EntitySet = _customerSet, Path = path }; MemoryStream stream = new MemoryStream(); IODataResponseMessage message = new ODataMessageWrapper(stream); // Act serializer.WriteObject(link, typeof(ODataEntityReferenceLink), new ODataMessageWriter(message), writeContext); // Assert stream.Seek(0, SeekOrigin.Begin); XElement element = XElement.Load(stream); Assert.Equal("http://sampleuri/", element.Value); }
public void Can_DeserializePayload_WithPrimitiveParameters(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const int Quantity = 1; const string ProductCode = "PCode"; string body = "{" + string.Format(@" ""Quantity"": {0} , ""ProductCode"": ""{1}"" ", Quantity, ProductCode) + "}"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), _model); ODataDeserializerContext context = new ODataDeserializerContext() { Path = path, Model = _model }; // Act ODataActionParameters payload = _deserializer.Read(reader, typeof(ODataActionParameters), context) as ODataActionParameters; IEdmAction action = ODataActionPayloadDeserializer.GetAction(context); // Assert Assert.Same(expectedAction, action); Assert.NotNull(payload); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(Quantity, payload["Quantity"]); Assert.True(payload.ContainsKey("ProductCode")); Assert.Equal(ProductCode, payload["ProductCode"]); }
public void Can_DeserializePayload_WithComplexParameters_InUntypedMode(string actionName, IEdmAction expectedAction, ODataPath path) { // Arrange const string Body = @"{ ""Quantity"": 1 , ""Address"": { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(Body)); message.SetHeader("Content-Type", "application/json"); ODataMessageReaderSettings settings = new ODataMessageReaderSettings(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, settings, _model); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = _model, ResourceType = typeof(ODataUntypedActionParameters) }; // Act ODataUntypedActionParameters payload = _deserializer.Read(reader, typeof(ODataUntypedActionParameters), context) as ODataUntypedActionParameters; // Assert Assert.NotNull(payload); Assert.Same(expectedAction, payload.Action); Assert.True(payload.ContainsKey("Quantity")); Assert.Equal(1, payload["Quantity"]); Assert.True(payload.ContainsKey("Address")); dynamic address = payload["Address"] as EdmComplexObject; Assert.IsType<EdmComplexObject>(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }
public void Can_deserialize_payload_with_complex_collection_parameters() { string actionName = "ComplexCollection"; string body = @"{ ""Name"": ""Microsoft"", ""Addresses"": [ { ""StreetAddress"":""1 Microsoft Way"", ""City"": ""Redmond"", ""State"": ""WA"", ""ZipCode"": 98052 } ] }"; ODataMessageWrapper message = new ODataMessageWrapper(GetStringAsStream(body)); message.SetHeader("Content-Type", "application/json;odata=verbose"); IEdmModel model = GetModel(); ODataMessageReader reader = new ODataMessageReader(message as IODataRequestMessage, new ODataMessageReaderSettings(), model); ODataActionPayloadDeserializer deserializer = new ODataActionPayloadDeserializer(new DefaultODataDeserializerProvider()); ODataPath path = CreatePath(model, actionName); ODataDeserializerContext context = new ODataDeserializerContext { Path = path, Model = model }; ODataActionParameters payload = deserializer.Read(reader, context) as ODataActionParameters; Assert.NotNull(payload); Assert.True(payload.ContainsKey("Name")); Assert.Equal("Microsoft", payload["Name"]); Assert.True(payload.ContainsKey("Addresses")); IList<MyAddress> addresses = payload["Addresses"] as IList<MyAddress>; Assert.NotNull(addresses); Assert.Equal(1, addresses.Count); MyAddress address = addresses[0]; Assert.NotNull(address); Assert.Equal("1 Microsoft Way", address.StreetAddress); Assert.Equal("Redmond", address.City); Assert.Equal("WA", address.State); Assert.Equal(98052, address.ZipCode); }