public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { var entry = base.CreateEntry(selectExpandNode, entityInstanceContext); TryAnnotateV1FeedPackage(entry, entityInstanceContext); TryAnnotateV2FeedPackage(entry, entityInstanceContext); return entry; }
public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { ODataEntry entry = base.CreateEntry(selectExpandNode, entityInstanceContext); Document document = entityInstanceContext.EntityInstance as Document; if (entry != null && document != null) { // annotate the document with the score. entry.InstanceAnnotations.Add(new ODataInstanceAnnotation("org.northwind.search.score", new ODataPrimitiveValue(document.Score))); } return entry; }
[InlineData("ID,Orders/ID,Orders/Customer/ID", "Orders,Orders/Customer", true, "ID")] // deep expand and selects public void GetPropertiesToBeSelected_Selects_ExpectedProperties_OnCustomer( string select, string expand, bool specialCustomer, string structuralPropertiesToSelect) { // Arrange SelectExpandClause selectExpandClause = new ODataUriParser(_model.Model, serviceRoot: null).ParseSelectAndExpand(select, expand, _model.Customer, _model.Customers); IEdmEntityType entityType = specialCustomer ? _model.SpecialCustomer : _model.Customer; // Act SelectExpandNode selectExpandNode = new SelectExpandNode(selectExpandClause, entityType, _model.Model); var result = selectExpandNode.SelectedStructuralProperties; // Assert Assert.Equal(structuralPropertiesToSelect, String.Join(",", result.Select(p => p.Name).OrderBy(n => n))); }
/// <summary> /// Builds the <see cref="SelectExpandNode"/> describing the set of structural properties and navigation properties and actions to select /// and navigation properties to expand while writing an entry of type <paramref name="entityType"/> for the given /// <paramref name="selectExpandClause"/>. /// </summary> /// <param name="selectExpandClause">The parsed $select and $expand query options.</param> /// <param name="entityType">The entity type of the entry that would be written.</param> /// <param name="model">The <see cref="IEdmModel"/> that contains the given entity type.</param> /// <returns>The built <see cref="SelectExpandNode"/>.</returns> public static SelectExpandNode BuildSelectExpandNode(SelectExpandClause selectExpandClause, IEdmEntityTypeReference entityType, IEdmModel model) { if (entityType == null) { throw Error.ArgumentNull("entityType"); } if (model == null) { throw Error.ArgumentNull("model"); } SelectExpandNode selectExpandNode = new SelectExpandNode(); if (selectExpandClause != null && selectExpandClause.Expansion != null) { selectExpandNode.BuildExpansions(selectExpandClause.Expansion, entityType); } selectExpandNode.BuildSelections(selectExpandClause == null ? null : selectExpandClause.Selection, entityType, model); // remove expanded navigation properties from the selected navigation properties. IEnumerable<IEdmNavigationProperty> expandedNavigationProperties = selectExpandNode.ExpandedNavigationProperties.Keys; selectExpandNode.SelectedNavigationProperties.ExceptWith(expandedNavigationProperties); return selectExpandNode; }
public void CreateEntry_IgnoresProperty_IfCreateStructuralPropertyReturnsNull() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedStructuralProperties = { new Mock<IEdmStructuralProperty>().Object } }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.CallBase = true; serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(0), _entityInstanceContext)) .Returns<ODataProperty>(null); // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, _entityInstanceContext); // Assert serializer.Verify(); Assert.Empty(entry.Properties); }
public void CreateEntry_Calls_CreateStructuralProperty_ForEachSelectedStructuralProperty() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedStructuralProperties = { new Mock<IEdmStructuralProperty>().Object, new Mock<IEdmStructuralProperty>().Object } }; ODataProperty[] properties = new ODataProperty[] { new ODataProperty(), new ODataProperty() }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.CallBase = true; serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(0), _entityInstanceContext)) .Returns(properties[0]) .Verifiable(); serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(1), _entityInstanceContext)) .Returns(properties[1]) .Verifiable(); // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, _entityInstanceContext); // Assert serializer.Verify(); Assert.Equal(properties, entry.Properties); }
public void WriteObjectInline_CanExpandNavigationProperty_ContainingEdmObject() { // Arrange IEdmEntityType customerType = _customerSet.ElementType; IEdmNavigationProperty ordersProperty = customerType.NavigationProperties().Single(p => p.Name == "Orders"); Mock<IEdmObject> orders = new Mock<IEdmObject>(); orders.Setup(o => o.GetEdmType()).Returns(ordersProperty.Type); object ordersValue = orders.Object; Mock<IEdmEntityObject> customer = new Mock<IEdmEntityObject>(); customer.Setup(c => c.TryGetPropertyValue("Orders", out ordersValue)).Returns(true); customer.Setup(c => c.GetEdmType()).Returns(customerType.AsReference()); SelectExpandClause selectExpandClause = new ODataUriParser(_model, serviceRoot: null).ParseSelectAndExpand("Orders", "Orders", customerType, _customerSet); SelectExpandNode selectExpandNode = new SelectExpandNode(); selectExpandNode.ExpandedNavigationProperties[ordersProperty] = selectExpandClause.SelectedItems.OfType<ExpandedNavigationSelectItem>().Single().SelectAndExpand; Mock<ODataWriter> writer = new Mock<ODataWriter>(); Mock<ODataEdmTypeSerializer> ordersSerializer = new Mock<ODataEdmTypeSerializer>(_serializer.EdmType, ODataPayloadKind.Entry); ordersSerializer.Setup(s => s.WriteObjectInline(ordersValue, writer.Object, It.IsAny<ODataSerializerContext>())).Verifiable(); Mock<ODataSerializerProvider> serializerProvider = new Mock<ODataSerializerProvider>(); serializerProvider.Setup(p => p.GetEdmTypeSerializer(ordersProperty.Type)).Returns(ordersSerializer.Object); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, serializerProvider.Object); serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); serializer.CallBase = true; // Act serializer.Object.WriteObjectInline(customer.Object, writer.Object, _writeContext); //Assert ordersSerializer.Verify(); }
public void GetPropertiesToBeSelected_Selects_ExpectedProperties_OnExpandedOrders( string select, string expand, bool specialOrder, string structuralPropertiesToSelect) { // Arrange SelectExpandClause selectExpandClause = new ODataUriParser(_model.Model, serviceRoot: null).ParseSelectAndExpand(select, expand, _model.Customer, _model.Customers); SelectExpandClause nestedSelectExpandClause = selectExpandClause.SelectedItems.OfType<ExpandedNavigationSelectItem>().Single().SelectAndExpand; IEdmEntityTypeReference entityType = new EdmEntityTypeReference((specialOrder ? _model.SpecialOrder : _model.Order), false); // Act SelectExpandNode selectExpandNode = new SelectExpandNode(nestedSelectExpandClause, entityType, _model.Model); var result = selectExpandNode.SelectedStructuralProperties; // Assert Assert.Equal(structuralPropertiesToSelect, String.Join(",", result.Select(p => p.Name).OrderBy(n => n))); }
public void WriteObjectInline_WritesCorrectReadLink() { // Arrange EntityInstanceContext instanceContext = new EntityInstanceContext { SerializerContext = _writeContext }; bool customReadLinkbuilderCalled = false; EntitySetLinkBuilderAnnotation linkAnnotation = new MockEntitySetLinkBuilderAnnotation { ReadLinkBuilder = new SelfLinkBuilder<Uri>((EntityInstanceContext context) => { Assert.Same(instanceContext, context); customReadLinkbuilderCalled = true; return new Uri("http://sample_read_link"); }, followsConventions: false) }; _model.SetEntitySetLinkBuilder(_customerSet, linkAnnotation); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.CallBase = true; SelectExpandNode selectExpandNode = new SelectExpandNode(); // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, instanceContext); // Assert Assert.True(customReadLinkbuilderCalled); }
public void WriteObjectInline_SetsParentContext_ForExpandedNavigationProperties() { // Arrange ODataWriter mockWriter = new Mock<ODataWriter>().Object; IEdmNavigationProperty ordersProperty = _customerSet.ElementType.DeclaredNavigationProperties().Single(); Mock<ODataEdmTypeSerializer> expandedItemSerializer = new Mock<ODataEdmTypeSerializer>(ordersProperty.Type, ODataPayloadKind.Feed); Mock<ODataSerializerProvider> serializerProvider = new Mock<ODataSerializerProvider>(); serializerProvider.Setup(p => p.GetODataPayloadSerializer(_model, _customer.Orders.GetType())).Returns(expandedItemSerializer.Object); SelectExpandNode selectExpandNode = new SelectExpandNode { ExpandedNavigationProperties = { { ordersProperty, new SelectExpandClause(new SelectItem[0], allSelected: true) } } }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, serializerProvider.Object); serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); serializer.Setup(s => s.CreateEntry(selectExpandNode, _entityInstanceContext)).Returns(new ODataEntry()); serializer.CallBase = true; // Act serializer.Object.WriteObjectInline(_customer, mockWriter, _writeContext); // Assert expandedItemSerializer.Verify( s => s.WriteObjectInline(It.IsAny<object>(), mockWriter, It.Is<ODataSerializerContext>(c => c.ExpandedEntity.SerializerContext == _writeContext))); }
public void WriteObjectInline_Calls_CreateNavigationLink_ForEachSelectedNavigationProperty() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedNavigationProperties = { new Mock<IEdmNavigationProperty>().Object, new Mock<IEdmNavigationProperty>().Object } }; Mock<ODataWriter> writer = new Mock<ODataWriter>(); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializerProvider); serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); serializer.CallBase = true; serializer.Setup(s => s.CreateNavigationLink(selectExpandNode.SelectedNavigationProperties.ElementAt(0), It.IsAny<EntityInstanceContext>())).Verifiable(); serializer.Setup(s => s.CreateNavigationLink(selectExpandNode.SelectedNavigationProperties.ElementAt(1), It.IsAny<EntityInstanceContext>())).Verifiable(); // Act serializer.Object.WriteObjectInline(_customer, _customerType, writer.Object, _writeContext); // Assert serializer.Verify(); }
/// <summary> /// Creates the <see cref="SelectExpandNode"/> that describes the set of properties and actions to select and expand while writing this entity. /// </summary> /// <param name="entityInstanceContext">Contains the entity instance being written and the context.</param> /// <returns> /// The <see cref="SelectExpandNode"/> that describes the set of properties and actions to select and expand while writing this entity. /// </returns> public virtual SelectExpandNode CreateSelectExpandNode(EntityInstanceContext entityInstanceContext) { if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } ODataSerializerContext writeContext = entityInstanceContext.SerializerContext; IEdmEntityType entityType = entityInstanceContext.EntityType; object selectExpandNode; Tuple<SelectExpandClause, IEdmEntityType> key = Tuple.Create(writeContext.SelectExpandClause, entityType); if (!writeContext.Items.TryGetValue(key, out selectExpandNode)) { // cache the selectExpandNode so that if we are writing a feed we don't have to construct it again. selectExpandNode = new SelectExpandNode(writeContext.SelectExpandClause, entityType, writeContext.Model); writeContext.Items[key] = selectExpandNode; } return selectExpandNode as SelectExpandNode; }
public void CreateEntry_SetsEtagToNotNull_IfWithConcurrencyProperty() { // Arrange Mock<IEdmStructuralProperty> mockConcurrencyProperty = new Mock<IEdmStructuralProperty>(); mockConcurrencyProperty.SetupGet(s => s.ConcurrencyMode).Returns(EdmConcurrencyMode.Fixed); mockConcurrencyProperty.SetupGet(s => s.Name).Returns("City"); SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedStructuralProperties = { new Mock<IEdmStructuralProperty>().Object, mockConcurrencyProperty.Object } }; ODataProperty[] properties = new[] { new ODataProperty(), new ODataProperty() }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializerProvider); serializer.CallBase = true; serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(0), _entityInstanceContext)) .Returns(properties[0]); serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(1), _entityInstanceContext)) .Returns(properties[1]); MockHttpRequestMessage request = new MockHttpRequestMessage(); HttpConfiguration configuration = new HttpConfiguration(); Mock<IETagHandler> mockETagHandler = new Mock<IETagHandler>(); string tag = "\"'anycity'\""; EntityTagHeaderValue etagHeaderValue = new EntityTagHeaderValue(tag, isWeak: true); mockETagHandler.Setup(e => e.CreateETag(It.IsAny<IDictionary<string, object>>())).Returns(etagHeaderValue); configuration.SetETagHandler(mockETagHandler.Object); request.SetConfiguration(configuration); _entityInstanceContext.Request = request; // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, _entityInstanceContext); // Assert Assert.Equal(etagHeaderValue.ToString(), entry.ETag); }
public void CreateEntry_SetsETagToNull_IfModelDontHaveConcurrencyProperty() { // Arrange IEdmEntitySet orderSet = _model.FindDeclaredEntityContainer("Default.Container").FindEntitySet("Orders"); Order order = new Order() { Name = "Foo", Shipment = "Bar", ID = 10, }; _writeContext.EntitySet = orderSet; _entityInstanceContext = new EntityInstanceContext(_writeContext, orderSet.ElementType.AsReference(), order); SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedStructuralProperties = { new Mock<IEdmStructuralProperty>().Object, new Mock<IEdmStructuralProperty>().Object } }; ODataProperty[] properties = new[] { new ODataProperty(), new ODataProperty() }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializerProvider); serializer.CallBase = true; serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(0), _entityInstanceContext)) .Returns(properties[0]); serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(1), _entityInstanceContext)) .Returns(properties[1]); MockHttpRequestMessage request = new MockHttpRequestMessage(); request.SetConfiguration(new HttpConfiguration()); _entityInstanceContext.Request = request; // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, _entityInstanceContext); // Assert Assert.Null(entry.ETag); }
public void CreateEntry_SetsETagToNull_IfRequestIsNull() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedStructuralProperties = { new Mock<IEdmStructuralProperty>().Object, new Mock<IEdmStructuralProperty>().Object } }; ODataProperty[] properties = new[] { new ODataProperty(), new ODataProperty() }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializerProvider); serializer.CallBase = true; serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(0), _entityInstanceContext)) .Returns(properties[0]); serializer .Setup(s => s.CreateStructuralProperty(selectExpandNode.SelectedStructuralProperties.ElementAt(1), _entityInstanceContext)) .Returns(properties[1]); // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, _entityInstanceContext); // Assert Assert.Null(entry.ETag); }
public void CreateEntry_Calls_CreateODataAction_ForEachSelectAction() { // Arrange ODataAction[] actions = new ODataAction[] { new ODataAction(), new ODataAction() }; SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedActions = { new Mock<IEdmFunctionImport>().Object, new Mock<IEdmFunctionImport>().Object } }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.CallBase = true; serializer.Setup(s => s.CreateODataAction(selectExpandNode.SelectedActions.ElementAt(0), _entityInstanceContext)).Returns(actions[0]).Verifiable(); serializer.Setup(s => s.CreateODataAction(selectExpandNode.SelectedActions.ElementAt(1), _entityInstanceContext)).Returns(actions[1]).Verifiable(); // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, _entityInstanceContext); // Assert Assert.Equal(actions, entry.Actions); serializer.Verify(); }
public void CreateEntry_UsesCorrectTypeName() { EntityInstanceContext instanceContext = new EntityInstanceContext(); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.CallBase = true; SelectExpandNode selectExpandNode = new SelectExpandNode(); // Act ODataEntry entry = serializer.Object.CreateEntry(selectExpandNode, instanceContext); // Assert Assert.Equal("Default.Customer", entry.TypeName); }
public void WriteObjectInline_Calls_CreateEntry() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode(); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); ODataWriter writer = new Mock<ODataWriter>().Object; serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); serializer.Setup(s => s.CreateEntry(selectExpandNode, It.Is<EntityInstanceContext>(e => Verify(e, _customer, _writeContext)))).Verifiable(); serializer.CallBase = true; // Act serializer.Object.WriteObjectInline(_customer, writer, _writeContext); // Assert serializer.Verify(); }
[InlineData("ModelWithInheritance.*", null, true, "specialUpgrade,upgrade")] // select wild card actions -> select all public void GetActionsToBeSelected_Selects_ExpectedActions( string select, string expand, bool specialCustomer, string actionsToSelect) { // Arrange SelectExpandClause selectExpandClause = new ODataUriParser(_model.Model, serviceRoot: null).ParseSelectAndExpand(select, expand, _model.Customer, _model.Customers); IEdmEntityTypeReference entityType = new EdmEntityTypeReference(specialCustomer ? _model.SpecialCustomer : _model.Customer, false); // Act SelectExpandNode selectExpandNode = new SelectExpandNode(selectExpandClause, entityType, _model.Model); var result = selectExpandNode.SelectedActions; // Assert Assert.Equal(actionsToSelect, String.Join(",", result.Select(p => p.Name).OrderBy(n => n))); }
public void WriteObjectInline_WritesNavigationLinksReturnedBy_CreateNavigationLink_ForEachSelectedNavigationProperty() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode { SelectedNavigationProperties = { new Mock<IEdmNavigationProperty>().Object, new Mock<IEdmNavigationProperty>().Object } }; ODataNavigationLink[] navigationLinks = new[] { new ODataNavigationLink(), new ODataNavigationLink() }; Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); serializer .Setup(s => s.CreateNavigationLink(selectExpandNode.SelectedNavigationProperties.ElementAt(0), It.IsAny<EntityInstanceContext>())) .Returns(navigationLinks[0]); serializer .Setup(s => s.CreateNavigationLink(selectExpandNode.SelectedNavigationProperties.ElementAt(1), It.IsAny<EntityInstanceContext>())) .Returns(navigationLinks[1]); serializer.CallBase = true; Mock<ODataWriter> writer = new Mock<ODataWriter>(); writer.Setup(w => w.WriteStart(navigationLinks[0])).Verifiable(); writer.Setup(w => w.WriteStart(navigationLinks[1])).Verifiable(); // Act serializer.Object.WriteObjectInline(_customer, writer.Object, _writeContext); // Assert writer.Verify(); }
[InlineData(null, "NS.SpecialCustomer/SpecialOrders", true, "SpecialOrders")] // expand derived navigation property on derived type -> expand requested public void GetNavigationPropertiesToBeExpanded_Expands_ExpectedProperties( string select, string expand, bool specialCustomer, string navigationPropertiesToExpand) { // Arrange SelectExpandClause selectExpandClause = new ODataUriParser(_model.Model, serviceRoot: null).ParseSelectAndExpand(select, expand, _model.Customer, _model.Customers); IEdmEntityType entityType = specialCustomer ? _model.SpecialCustomer : _model.Customer; // Act SelectExpandNode selectExpandNode = new SelectExpandNode(selectExpandClause, entityType, _model.Model); var result = selectExpandNode.ExpandedNavigationProperties.Keys; // Assert Assert.Equal(navigationPropertiesToExpand, String.Join(",", result.Select(p => p.Name).OrderBy(n => n))); }
public void WriteObjectInline_Calls_CreateNavigationLink_ForEachExpandedNavigationProperty() { // Arrange SelectExpandNode selectExpandNode = new SelectExpandNode { ExpandedNavigationProperties = { { new Mock<IEdmNavigationProperty>().Object, null }, { new Mock<IEdmNavigationProperty>().Object, null } } }; Mock<ODataWriter> writer = new Mock<ODataWriter>(); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, _serializerProvider); serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); var expandedNavigationProperties = selectExpandNode.ExpandedNavigationProperties.ToList(); serializer.Setup(s => s.CreateNavigationLink(expandedNavigationProperties[0].Key, It.IsAny<EntityInstanceContext>())).Verifiable(); serializer.Setup(s => s.CreateNavigationLink(expandedNavigationProperties[1].Key, It.IsAny<EntityInstanceContext>())).Verifiable(); serializer.CallBase = true; // Act serializer.Object.WriteObjectInline(_customer, writer.Object, _writeContext); // Assert serializer.Verify(); }
/// <summary> /// Creates the <see cref="ODataEntry"/> to be written while writing this entity. /// </summary> /// <param name="selectExpandNode">The <see cref="SelectExpandNode"/> describing the response graph.</param> /// <param name="entityInstanceContext">The context for the entity instance being written.</param> /// <returns>The created <see cref="ODataEntry"/>.</returns> public virtual ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { if (selectExpandNode == null) { throw Error.ArgumentNull("selectExpandNode"); } if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } string typeName = EntityType.FullName(); ODataEntry entry = new ODataEntry { TypeName = typeName, Properties = CreateStructuralPropertyBag(selectExpandNode.SelectedStructuralProperties, entityInstanceContext), Actions = CreateODataActions(selectExpandNode.SelectedActions, entityInstanceContext) }; AddTypeNameAnnotationAsNeeded(entry, entityInstanceContext.EntitySet, entityInstanceContext.SerializerContext.MetadataLevel); if (entityInstanceContext.EntitySet != null) { IEdmModel model = entityInstanceContext.SerializerContext.Model; EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(entityInstanceContext.EntitySet); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityInstanceContext, entityInstanceContext.SerializerContext.MetadataLevel); if (selfLinks.IdLink != null) { entry.Id = selfLinks.IdLink; } if (selfLinks.ReadLink != null) { entry.ReadLink = selfLinks.ReadLink; } if (selfLinks.EditLink != null) { entry.EditLink = selfLinks.EditLink; } } return entry; }
public void WriteObjectInline_ExpandsUsingInnerSerializerUsingRightContext_ExpandedNavigationProperties() { // Arrange IEdmEntityType customerType = _customerSet.ElementType; IEdmNavigationProperty ordersProperty = customerType.NavigationProperties().Single(p => p.Name == "Orders"); SelectExpandClause selectExpandClause = new ODataUriParser(_model, serviceRoot: null).ParseSelectAndExpand("Orders", "Orders", customerType, _customerSet); SelectExpandNode selectExpandNode = new SelectExpandNode { ExpandedNavigationProperties = { { ordersProperty, selectExpandClause.SelectedItems.OfType<ExpandedNavigationSelectItem>().Single().SelectAndExpand } } }; Mock<ODataWriter> writer = new Mock<ODataWriter>(); Mock<ODataEdmTypeSerializer> innerSerializer = new Mock<ODataEdmTypeSerializer>(_serializer.EdmType, ODataPayloadKind.Entry); innerSerializer .Setup(s => s.WriteObjectInline(_customer.Orders, writer.Object, It.IsAny<ODataSerializerContext>())) .Callback((object o, ODataWriter w, ODataSerializerContext context) => { Assert.Same(context.EntitySet.Name, "Orders"); Assert.Same(context.SelectExpandClause, selectExpandNode.ExpandedNavigationProperties.Single().Value); }) .Verifiable(); Mock<ODataSerializerProvider> serializerProvider = new Mock<ODataSerializerProvider>(); serializerProvider.Setup(p => p.GetODataPayloadSerializer(_model, _customer.Orders.GetType())).Returns(innerSerializer.Object); Mock<ODataEntityTypeSerializer> serializer = new Mock<ODataEntityTypeSerializer>(_serializer.EdmType, serializerProvider.Object); serializer.Setup(s => s.CreateSelectExpandNode(It.IsAny<EntityInstanceContext>())).Returns(selectExpandNode); serializer.CallBase = true; _writeContext.SelectExpandClause = selectExpandClause; // Act serializer.Object.WriteObjectInline(_customer, writer.Object, _writeContext); // Assert innerSerializer.Verify(); // check that the context is rolled back Assert.Same(_writeContext.EntitySet.Name, "Customers"); Assert.Same(_writeContext.SelectExpandClause, selectExpandClause); }