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 async Task WriteObjectAsync_ThrowsArgumentNull_WriteContext() { // Arrange & Act Mock <ODataSerializerProvider> serializerProvider = new Mock <ODataSerializerProvider>(); ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(serializerProvider.Object); // Assert await ExceptionAssert.ThrowsArgumentNullAsync( () => serializer.WriteObjectAsync(graph: null, type: null, messageWriter: ODataTestUtil.GetMockODataMessageWriter(), writeContext: null), "writeContext"); }
public async Task WriteObjectAsync_CanWriteTopLevelResourceSetContainsNullComplexElement() { // 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 <Address> addresses = new[] { new Address { City = "Redmond" }, null, new Address { City = "Shanghai" } }; ODataSerializerContext writeContext = new ODataSerializerContext { Model = _model }; // Act await serializer.WriteObjectAsync(addresses, typeof(IList <Address>), writer, writeContext); stream.Seek(0, SeekOrigin.Begin); string result = new StreamReader(stream).ReadToEnd(); // Assert Assert.Equal("{\"@odata.context\":\"http://any/$metadata#Collection(Default.Address)\"," + "\"value\":[" + "{\"Street\":null,\"City\":\"Redmond\",\"State\":null,\"CountryOrRegion\":null,\"ZipCode\":null}," + "null," + "{\"Street\":null,\"City\":\"Shanghai\",\"State\":null,\"CountryOrRegion\":null,\"ZipCode\":null}" + "]}", result); }
public async Task ReadAsync_Roundtrip_ComplexCollection() { // Arrange Address[] addresses = new[] { new Address { City = "Redmond", StreetAddress = "A", State = "123" }, new Address { City = "Seattle", StreetAddress = "S", State = "321" } }; ODataResourceSetSerializer serializer = new ODataResourceSetSerializer(_serializerProvider); ODataResourceSetDeserializer deserializer = new ODataResourceSetDeserializer(_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 await serializer.WriteObjectAsync(addresses, addresses.GetType(), messageWriter, writeContext); stream.Seek(0, SeekOrigin.Begin); IEnumerable readAddresses = await deserializer.ReadAsync(messageReader, typeof(Address[]), readContext) as IEnumerable; // Assert Assert.Equal(addresses, readAddresses.Cast <Address>(), new AddressComparer()); }