public void ReadFeed_Calls_ReadInlineForEachEntry() { // Arrange Mock <ODataDeserializerProvider> deserializerProvider = new Mock <ODataDeserializerProvider>(); Mock <ODataEdmTypeDeserializer> entityDeserializer = new Mock <ODataEdmTypeDeserializer>(ODataPayloadKind.Resource); ODataResourceSetDeserializer deserializer = new ODataResourceSetDeserializer(deserializerProvider.Object); ODataResourceSetWrapper resourceSetWrapper = new ODataResourceSetWrapper(new ODataResourceSet()); resourceSetWrapper.Resources.Add(new ODataResourceWrapper(new ODataResource { Id = new Uri("http://a1/") })); resourceSetWrapper.Resources.Add(new ODataResourceWrapper(new ODataResource { Id = new Uri("http://a2/") })); ODataDeserializerContext readContext = new ODataDeserializerContext(); deserializerProvider.Setup(p => p.GetEdmTypeDeserializer(_customerType, false)).Returns(entityDeserializer.Object); entityDeserializer.Setup(d => d.ReadInline(resourceSetWrapper.Resources[0], _customerType, readContext)).Returns("entry1").Verifiable(); entityDeserializer.Setup(d => d.ReadInline(resourceSetWrapper.Resources[1], _customerType, readContext)).Returns("entry2").Verifiable(); // Act var result = deserializer.ReadResourceSet(resourceSetWrapper, _customerType, readContext); // Assert Assert.Equal(new[] { "entry1", "entry2" }, result.OfType <String>()); entityDeserializer.Verify(); }
public void ReadResourceSet_ThrowsArgumentNull_ResourceSet() { // Arrange & Act & Assert var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); ExceptionAssert.ThrowsArgumentNull(() => deserializer.ReadResourceSet(null, null, null).GetEnumerator().MoveNext(), "resourceSet"); }
public void ReadInline_ReturnsNull_IfItemIsNull() { // Arrange var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); // Act & Assert Assert.Null(deserializer.ReadInline(item: null, edmType: _customersType, readContext: new ODataDeserializerContext())); }
public async Task ReadAsync_ThrowsArgumentNull_MessageReader() { // Arrange var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); // Act & Assert await ExceptionAssert.ThrowsArgumentNullAsync(() => deserializer.ReadAsync(null, null, null), "messageReader"); }
public void ReadInline_Throws_ArgumentMustBeOfType() { var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); ExceptionAssert.ThrowsArgument( () => deserializer.ReadInline(item: 42, edmType: _customersType, readContext: new ODataDeserializerContext()), "item", "The argument must be of type 'ODataResourceSetWrapper'."); }
public async Task ReadAsync_ThrowsArgumentNull_ReadContext() { // Arrange var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); ODataMessageReader reader = ODataFormatterHelpers.GetMockODataMessageReader(); // Act & Assert await ExceptionAssert.ThrowsArgumentNullAsync(() => deserializer.ReadAsync(reader, null, null), "readContext"); }
public void ReadInline_ThrowsArgumentNull_ReadContext() { // Arrange var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); IEdmTypeReference typeReference = new Mock <IEdmTypeReference>().Object; // Act & Assert ExceptionAssert.ThrowsArgumentNull(() => deserializer.ReadInline(42, typeReference, null), "readContext"); }
private static object ConvertResourceSet(ODataMessageReader oDataMessageReader, IEdmTypeReference edmTypeReference, ODataDeserializerContext readContext) { IEdmCollectionTypeReference collectionType = edmTypeReference.AsCollection(); EdmEntitySet tempEntitySet = null; if (collectionType.ElementType().IsEntity()) { tempEntitySet = new EdmEntitySet(readContext.Model.EntityContainer, "temp", collectionType.ElementType().AsEntity().EntityDefinition()); } // TODO: Sam xu, can we use the parameter-less overload ODataReader odataReader = oDataMessageReader.CreateODataUriParameterResourceSetReader(tempEntitySet, collectionType.ElementType().AsStructured().StructuredDefinition()); ODataResourceSetWrapper resourceSet = odataReader.ReadResourceOrResourceSet() as ODataResourceSetWrapper; ODataDeserializerProvider deserializerProvider = readContext.Request.GetDeserializerProvider(); ODataResourceSetDeserializer resourceSetDeserializer = (ODataResourceSetDeserializer)deserializerProvider.GetEdmTypeDeserializer(collectionType); object result = resourceSetDeserializer.ReadInline(resourceSet, collectionType, readContext); IEnumerable enumerable = result as IEnumerable; if (enumerable != null) { IEnumerable newEnumerable = enumerable; if (collectionType.ElementType().IsEntity()) { newEnumerable = CovertResourceSetIds(enumerable, resourceSet, collectionType, readContext); } if (readContext.IsUntyped) { return(newEnumerable.ConvertToEdmObject(collectionType)); } else { IEdmTypeReference elementTypeReference = collectionType.ElementType(); Type elementClrType = EdmLibHelpers.GetClrType(elementTypeReference, readContext.Model); IEnumerable castedResult = CastMethodInfo.MakeGenericMethod(elementClrType) .Invoke(null, new object[] { newEnumerable }) as IEnumerable; return(castedResult); } } return(null); }
public void ReadInline_Throws_ArgumentTypeMustBeResourceSet() { // Arrange var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); IEdmTypeReference edmType = new EdmCollectionTypeReference(new EdmCollectionType(EdmCoreModel.Instance.GetString(false))); // Act & Assert ExceptionAssert.ThrowsArgument( () => deserializer.ReadInline(42, edmType, new ODataDeserializerContext()), "edmType", "'[Collection([Edm.String Nullable=False Unicode=True]) Nullable=False]' is not a resource set type. Only resource set are supported."); }
public void ReadFeed_Throws_TypeCannotBeDeserialized() { Mock <ODataDeserializerProvider> deserializerProvider = new Mock <ODataDeserializerProvider>(); ODataResourceSetDeserializer deserializer = new ODataResourceSetDeserializer(deserializerProvider.Object); ODataResourceSetWrapper feedWrapper = new ODataResourceSetWrapper(new ODataResourceSet()); ODataDeserializerContext readContext = new ODataDeserializerContext(); deserializerProvider.Setup(p => p.GetEdmTypeDeserializer(_customerType, false)).Returns <ODataEdmTypeDeserializer>(null); ExceptionAssert.Throws <SerializationException>( () => deserializer.ReadResourceSet(feedWrapper, _customerType, readContext).GetEnumerator().MoveNext(), "'Microsoft.AspNetCore.OData.Tests.Models.Customer' cannot be deserialized using the OData input formatter."); }
public void GetODataDeserializer_ResourceSet_ForComplexCollection(Type collectionType) { // Arrange var request = RequestFactory.CreateFromModel(_edmModel); // Act ODataDeserializer deserializer = _deserializerProvider.GetODataDeserializer(collectionType, request); // Assert Assert.NotNull(deserializer); ODataResourceSetDeserializer resourceSetDeserializer = Assert.IsType <ODataResourceSetDeserializer>(deserializer); Assert.Equal(ODataPayloadKind.ResourceSet, deserializer.ODataPayloadKind); Assert.Equal(resourceSetDeserializer.DeserializerProvider, _deserializerProvider); }
// [InlineData(typeof(PageResult<Product>))] public void GetODataDeserializer_ResourceSet_ForEntityCollection(Type collectionType) { // Arrange HttpRequest request = GetRequest(_edmModel); // Act IODataDeserializer deserializer = _deserializerProvider.GetODataDeserializer(collectionType, request); // Assert Assert.NotNull(deserializer); ODataResourceSetDeserializer resourceSetDeserializer = Assert.IsType <ODataResourceSetDeserializer>(deserializer); Assert.Equal(ODataPayloadKind.ResourceSet, deserializer.ODataPayloadKind); Assert.Equal(resourceSetDeserializer.DeserializerProvider, _deserializerProvider); }
public async Task ReadAsync_Throws_ArgumentMustBeOfType() { // Arrange var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); ODataMessageReader reader = ODataFormatterHelpers.GetMockODataMessageReader(); ODataDeserializerContext context = new ODataDeserializerContext { Model = EdmCoreModel.Instance }; IEdmTypeReference edmType = new EdmCollectionTypeReference(new EdmCollectionType(EdmCoreModel.Instance.GetString(false))); // Act & Assert await ExceptionAssert.ThrowsAsync <ArgumentException>( () => deserializer.ReadAsync(reader, typeof(IList <int>), context), "The argument must be of type 'Complex or Entity'. (Parameter 'edmType')"); }
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()); }
public async Task ReadAsync_ReturnsEdmComplexObjectCollection_TypelessMode() { // Arrange IEdmTypeReference addressType = _model.GetEdmTypeReference(typeof(Address)).AsComplex(); IEdmCollectionTypeReference addressCollectionType = new EdmCollectionTypeReference(new EdmCollectionType(addressType)); HttpContent content = new StringContent("{ 'value': [ {'@odata.type':'Microsoft.AspNetCore.OData.Tests.Models.Address', 'City' : 'Redmond' } ] }"); HeaderDictionary headerDict = new HeaderDictionary { { "Content-Type", "application/json" } }; IODataRequestMessage request = ODataMessageWrapperHelper.Create(await content.ReadAsStreamAsync(), headerDict); ODataMessageReader reader = new ODataMessageReader(request, new ODataMessageReaderSettings(), _model); var deserializer = new ODataResourceSetDeserializer(_deserializerProvider); ODataDeserializerContext readContext = new ODataDeserializerContext { Model = _model, ResourceType = typeof(IEdmObject), ResourceEdmType = addressCollectionType }; // Act IEnumerable result = await deserializer.ReadAsync(reader, typeof(IEdmObject), readContext) as IEnumerable; // Assert var addresses = result.Cast <EdmComplexObject>(); Assert.NotNull(addresses); EdmComplexObject address = Assert.Single(addresses); Assert.Equal(new[] { "City" }, address.GetChangedPropertyNames()); object city; Assert.True(address.TryGetPropertyValue("City", out city)); Assert.Equal("Redmond", city); }
public EnableNestedPathsTest() { _deserializerProvider = ODataDeserializerProviderFactory.Create(); _resourceSetDeserializer = new ODataResourceSetDeserializer(_deserializerProvider); _resourceDeserializer = new ODataResourceDeserializer(_deserializerProvider); _primitiveDeserializer = new ODataPrimitiveDeserializer(); ODataModelBuilder builder = ODataConventionModelBuilderFactory.Create(); builder.EntitySet <EnableNestedPathsCustomer>("EnableNestedPathsCustomers"); builder.EntitySet <EnableNestedPathsProduct>("EnableNestedPathsProducts"); builder.Singleton <EnableNestedPathsCustomer>("EnableNestedPathsTopCustomer"); builder.EntityType <EnableNestedPathsVipCustomer>(); builder.EntityType <EnableNestedPathsVipCustomer>() .Function("GetMostPurchasedProduct") .ReturnsFromEntitySet <EnableNestedPathsProduct>("EnableNestedPathsProduct"); builder.EntityType <EnableNestedPathsProduct>() .Collection .Action("SetDiscountRate"); _model = builder.GetEdmModel(); Type[] controllers = new Type[] { typeof(EnableNestedPathsCustomersController), typeof(EnableNestedPathsProductsController), typeof(EnableNestedPathsTopCustomerController) }; _server = TestServerFactory.Create(controllers, (config) => { config.MapODataServiceRoute("odata", "odata", _model); config.Count().OrderBy().Filter().Expand().MaxTop(null).Select(); }); _client = TestServerFactory.CreateClient(_server); _db = new EnableNestedPathsDatabase(); }