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);
        }
예제 #4
0
        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());
        }