public void WriteExample30FromV4SpecWithModel() { this.TestInit(this.GetModel()); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(feedWithoutInfo); writer.WriteStart(customerUpdated); writer.WriteEnd(); writer.WriteDeltaDeletedLink(linkToOrder10643); writer.WriteDeltaLink(linkToOrder10645); writer.WriteStart(order10643); writer.WriteEnd(); writer.WriteDeltaDeletedEntry(customerDeleted); writer.WriteEnd(); writer.Flush(); this.TestPayload().Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Customers/$delta\",\"@odata.count\":5,\"@odata.deltaLink\":\"Customers?$expand=Orders&$deltatoken=8015\",\"value\":[{\"@odata.id\":\"Customers('BOTTM')\",\"ContactName\":\"Susan Halvenstern\"},{\"@odata.context\":\"http://host/service/$metadata#Customers/$deletedLink\",\"source\":\"Customers('ALFKI')\",\"relationship\":\"Orders\",\"target\":\"Orders('10643')\"},{\"@odata.context\":\"http://host/service/$metadata#Customers/$link\",\"source\":\"Customers('BOTTM')\",\"relationship\":\"Orders\",\"target\":\"Orders('10645')\"},{\"@odata.context\":\"http://host/service/$metadata#Orders/$entity\",\"@odata.id\":\"Orders(10643)\",\"ShippingAddress\":{\"Street\":\"23 Tsawassen Blvd.\",\"City\":\"Tsawassen\",\"Region\":\"BC\",\"PostalCode\":\"T2F 8M4\"}},{\"@odata.context\":\"http://host/service/$metadata#Customers/$deletedEntity\",\"id\":\"Customers('ANTON')\",\"reason\":\"deleted\"}]}"); }
public void CannotWriteExpandedFeedOutsideDeltaEntry() { this.TestInit(this.GetModel()); Action writeAction = () => { ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(deltaFeed); writer.WriteStart(ordersFeed); }; writeAction.ShouldThrow<ODataException>().WithMessage(Strings.ODataJsonLightDeltaWriter_WriteStartExpandedFeedCalledInInvalidState("DeltaFeed")); }
public void WriteExpandedSingleton() { this.TestInit(this.GetModel()); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(deltaFeed); writer.WriteStart(customerEntry); writer.WriteStart(productBeingViewedNavigationLink); writer.WriteStart(productEntry); writer.WriteStart(detailsNavigationLink); writer.WriteStart(detailsFeed); writer.WriteStart(productDetailEntry); writer.WriteEnd(); // productDetailEntry writer.WriteEnd(); // detailsFeed writer.WriteEnd(); // detailsNavigationLink writer.WriteEnd(); // productEntry writer.WriteEnd(); // productBeingViewedNavigationLink writer.WriteEnd(); // customerEntry writer.WriteEnd(); // deltaFeed writer.Flush(); this.TestPayload().Should().Be( "{" + "\"@odata.context\":\"http://host/service/$metadata#Customers/$delta\"," + "\"value\":" + "[" + "{" + "\"@odata.id\":\"http://host/service/Customers('BOTTM')\"," + "\"ContactName\":\"Susan Halvenstern\"," + "\"ProductBeingViewed\":" + "{" + "\"@odata.id\":\"http://host/service/Product(1)\"," + "\"Id\":1," + "\"Name\":\"Car\"," + "\"Details\":" + "[" + "{" + "\"@odata.type\":\"#MyNS.ProductDetail\"," + "\"Id\":1," + "\"Detail\":\"made in china\"" + "}" + "]" + "}" + "}" + "]" + "}"); }
public void WriteMultipleExpandedFeeds() { this.TestInit(this.GetModel()); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(deltaFeed); writer.WriteStart(customerEntry); writer.WriteStart(ordersNavigationLink); writer.WriteStart(ordersFeed); writer.WriteStart(orderEntry); writer.WriteEnd(); // orderEntry writer.WriteEnd(); // ordersFeed writer.WriteEnd(); // ordersNavigationLink writer.WriteStart(favouriteProductsNavigationLink); writer.WriteStart(favouriteProductsFeed); writer.WriteStart(productEntry); writer.WriteEnd(); // productEntry writer.WriteEnd(); // favouriteProductsFeed writer.WriteEnd(); // favouriteProductsNavigationLink writer.WriteEnd(); // customerEntry writer.WriteEnd(); // deltaFeed writer.Flush(); this.TestPayload().Should().Be( "{" + "\"@odata.context\":\"http://host/service/$metadata#Customers/$delta\"," + "\"value\":" + "[" + "{" + "\"@odata.id\":\"http://host/service/Customers('BOTTM')\"," + "\"ContactName\":\"Susan Halvenstern\"," + "\"Orders\":" + "[" + "{" + "\"@odata.id\":\"http://host/service/Orders(10643)\"," + "\"Id\":10643," + "\"ShippingAddress\":" + "{" + "\"Street\":\"23 Tsawassen Blvd.\"," + "\"City\":\"Tsawassen\"," + "\"Region\":\"BC\"," + "\"PostalCode\":\"T2F 8M4\"" + "}" + "}" + "]," + "\"FavouriteProducts\":" + "[" + "{" + "\"@odata.id\":\"http://host/service/Product(1)\"," + "\"Id\":1," + "\"Name\":\"Car\"" + "}" + "]" + "}" + "]" + "}"); }
public void CannotWriteDeltaItemWhileWritingExpandedNavigationProperty() { this.TestInit(this.GetModel()); Action writeAction = () => { ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(deltaFeed); writer.WriteStart(customerEntry); writer.WriteStart(ordersNavigationLink); writer.WriteStart(ordersFeed); writer.WriteDeltaDeletedEntry(customerDeleted); }; writeAction.ShouldThrow<ODataException>().WithMessage(Strings.ODataJsonLightDeltaWriter_InvalidTransitionFromExpandedNavigationProperty("ExpandedNavigationProperty", "DeltaDeletedEntry")); }
private void WriteExpandedFeedWithModelImplementation() { ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(deltaFeed); writer.WriteStart(customerEntry); writer.WriteStart(ordersNavigationLink); writer.WriteStart(ordersFeed); writer.WriteStart(orderEntry); writer.WriteEnd(); // orderEntry writer.WriteEnd(); // ordersFeed writer.WriteEnd(); // ordersNavigationLink writer.WriteEnd(); // customerEntry writer.WriteEnd(); // deltaFeed writer.Flush(); }
public void WriteExpandedFeedWithSerializationInfoMinimalMetadata() { this.TestInit(); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, null, null); writer.WriteStart(deltaFeedWithInfo); writer.WriteStart(customerEntryWithInfo); writer.WriteStart(ordersNavigationLink); writer.WriteStart(ordersFeed); writer.WriteStart(orderEntryWithInfo); writer.WriteEnd(); // orderEntryWithInfo writer.WriteEnd(); // ordersFeed writer.WriteEnd(); // ordersNavigationLink writer.WriteEnd(); // customerEntry writer.WriteEnd(); // deltaFeedWithInfo writer.Flush(); this.TestPayload().Should().Be( "{" + "\"@odata.context\":\"http://host/service/$metadata#Customers/$delta\"," + "\"value\":" + "[" + "{" + "\"@odata.id\":\"http://host/service/Customers('BOTTM')\"," + "\"ContactName\":\"Susan Halvenstern\"," + "\"Orders\":" + "[" + "{" + "\"@odata.id\":\"http://host/service/Orders(10643)\"," + "\"Id\":10643," + "\"ShippingAddress\":" + "{" + "\"Street\":\"23 Tsawassen Blvd.\"," + "\"City\":\"Tsawassen\"," + "\"Region\":\"BC\"," + "\"PostalCode\":\"T2F 8M4\"" + "}" + "}" + "]" + "}" + "]" + "}"); }
public void WriteEntityInDeltaFeedWithSelectExpand() { this.TestInit(this.GetModel()); ODataDeltaFeed feed = new ODataDeltaFeed(); ODataEntry orderEntry= new ODataEntry() { Properties = new List<ODataProperty> { new ODataProperty { Name = "ShippingAddress", Value = new ODataComplexValue { Properties = new List<ODataProperty> { new ODataProperty { Name = "City", Value = "Shanghai" }, } } } }, SerializationInfo = new ODataFeedAndEntrySerializationInfo { NavigationSourceEntityTypeName = "Order", NavigationSourceKind = EdmNavigationSourceKind.EntitySet, NavigationSourceName = "Orders" }, }; var result = new ODataQueryOptionParser(this.GetModel(), this.GetCustomerType(), this.GetCustomers(), new Dictionary<string, string> { { "$expand", "Orders($select=ShippingAddress)" }, { "$select", "ContactName" } }).ParseSelectAndExpand(); ODataUri odataUri = new ODataUri() { ServiceRoot = new Uri("http://host/service"), SelectAndExpand = result }; var outputContext = CreateJsonLightOutputContext(this.stream, this.GetModel(), false, odataUri); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetProducts(), this.GetProductType()); writer.WriteStart(feed); writer.WriteStart(orderEntry); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); this.TestPayload().Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Products(ContactName,Orders,Orders(ShippingAddress))/$delta\",\"value\":[{\"@odata.context\":\"http://host/service/$metadata#Orders/$entity\",\"ShippingAddress\":{\"City\":\"Shanghai\"}}]}"); }
public void WriteDerivedEntityWithSerilizationInfo() { this.TestInit(this.GetModel()); ODataDeltaFeed feed = new ODataDeltaFeed(); ODataEntry derivedEntity = new ODataEntry() { TypeName = "MyNS.PhysicalProduct", Properties = new[] { new ODataProperty {Name = "Id", Value = new ODataPrimitiveValue(1)}, new ODataProperty {Name = "Name", Value = new ODataPrimitiveValue("car")}, new ODataProperty {Name = "Material", Value = new ODataPrimitiveValue("gold")}, }, SerializationInfo = new ODataFeedAndEntrySerializationInfo() { ExpectedTypeName = "MyNS.Product", NavigationSourceEntityTypeName = "MyNS.Product", NavigationSourceName = "Products", } }; ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetCustomers(), this.GetCustomerType()); writer.WriteStart(feed); writer.WriteStart(derivedEntity); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); this.TestPayload().Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Customers/$delta\",\"value\":[{\"@odata.context\":\"http://host/service/$metadata#Products/$entity\",\"@odata.type\":\"#MyNS.PhysicalProduct\",\"Id\":1,\"Name\":\"car\",\"Material\":\"gold\"}]}"); }
public void WriteContainedEntityInDeltaFeedWithSelectExpand() { this.TestInit(this.GetModel()); ODataDeltaFeed feed = new ODataDeltaFeed(); ODataEntry entry = new ODataEntry() { TypeName = "MyNS.Product", Properties = new[] { new ODataProperty {Name = "Id", Value = new ODataPrimitiveValue(1)}, new ODataProperty {Name = "Name", Value = new ODataPrimitiveValue("Car")}, }, }; ODataEntry containedEntry = new ODataEntry() { TypeName = "MyNS.ProductDetail", Properties = new[] { new ODataProperty {Name = "Id", Value = new ODataPrimitiveValue(1)}, new ODataProperty {Name = "Detail", Value = new ODataPrimitiveValue("made in china")}, }, }; containedEntry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceEntityTypeName = "MyNS.ProductDetail", NavigationSourceName = "Products(1)/Details", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); var result = new ODataQueryOptionParser(this.GetModel(), this.GetProductType(), this.GetProducts(), new Dictionary<string, string> { { "$expand", "Details($select=Detail)" }, { "$select", "Name" } }).ParseSelectAndExpand(); ODataUri odataUri = new ODataUri() { ServiceRoot = new Uri("http://host/service"), SelectAndExpand = result }; var outputContext = CreateJsonLightOutputContext(this.stream, this.GetModel(), false, odataUri); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetProducts(), this.GetProductType()); writer.WriteStart(feed); writer.WriteStart(containedEntry); writer.WriteEnd(); writer.WriteStart(entry); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); this.TestPayload().Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Products(Name,Details,Details(Detail))/$delta\",\"value\":[{\"@odata.context\":\"http://host/service/$metadata#Products(1)/Details/$entity\",\"Id\":1,\"Detail\":\"made in china\"},{\"Id\":1,\"Name\":\"Car\"}]}"); }
public void WriteContainedEntityInDeltaFeed() { this.TestInit(this.GetModel()); ODataDeltaFeed feed = new ODataDeltaFeed(); ODataEntry containedEntry = new ODataEntry() { TypeName = "MyNS.ProductDetail", Properties = new[] { new ODataProperty {Name = "Id", Value = new ODataPrimitiveValue(1)}, new ODataProperty {Name = "Detail", Value = new ODataPrimitiveValue("made in china")}, }, }; containedEntry.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceEntityTypeName = "MyNS.ProductDetail", NavigationSourceName = "Products(1)/Details", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); ODataEntry containedInContainedEntity = new ODataEntry() { TypeName = "MyNS.ProductDetailItem", Properties = new[] { new ODataProperty {Name = "ItemId", Value = new ODataPrimitiveValue(1)}, new ODataProperty {Name = "Description", Value = new ODataPrimitiveValue("made by HCC")}, }, }; containedInContainedEntity.SetSerializationInfo(new ODataFeedAndEntrySerializationInfo() { NavigationSourceEntityTypeName = "MyNS.ProductDetailItem", NavigationSourceName = "Products(1)/Details(1)/Items", NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet }); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetProducts(), this.GetProductType()); writer.WriteStart(feed); writer.WriteStart(containedEntry); writer.WriteEnd(); writer.WriteStart(containedInContainedEntity); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); this.TestPayload().Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Products/$delta\",\"value\":[{\"@odata.context\":\"http://host/service/$metadata#Products(1)/Details/$entity\",\"Id\":1,\"Detail\":\"made in china\"},{\"@odata.context\":\"http://host/service/$metadata#Products(1)/Details(1)/Items/$entity\",\"ItemId\":1,\"Description\":\"made by HCC\"}]}"); }
public void WriteEmptyDeltaFeed() { this.TestInit(); ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, null, null); writer.WriteStart(feed); writer.WriteEnd(); writer.Flush(); this.TestPayload().Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Customers/$delta\",\"@odata.count\":5,\"@odata.deltaLink\":\"Customers?$expand=Orders&$deltatoken=8015\",\"value\":[]}"); }
/// <summary> /// Creates an <see cref="ODataDeltaWriter" /> to write a delta response. /// </summary> /// <param name="entitySet">The entity set we are going to write entities for.</param> /// <param name="entityType">The entity type for the entries in the feed to be written (or null if the entity set base type should be used).</param> /// <returns>The created writer.</returns> private ODataDeltaWriter CreateODataDeltaWriterImplementation(IEdmEntitySetBase entitySet, IEdmEntityType entityType) { ODataJsonLightDeltaWriter odataJsonDeltaWriter = new ODataJsonLightDeltaWriter(this, entitySet, entityType); this.outputInStreamErrorListener = odataJsonDeltaWriter; return odataJsonDeltaWriter; }
public void WriteDerivedEntity() { this.TestInit(this.GetModel()); ODataDeltaFeed feed = new ODataDeltaFeed(); ODataEntry derivedEntity = new ODataEntry() { TypeName = "MyNS.PhysicalProduct", Properties = new[] { new ODataProperty {Name = "Id", Value = new ODataPrimitiveValue(1)}, new ODataProperty {Name = "Name", Value = new ODataPrimitiveValue("car")}, new ODataProperty {Name = "Material", Value = new ODataPrimitiveValue("gold")}, }, }; ODataJsonLightDeltaWriter writer = new ODataJsonLightDeltaWriter(outputContext, this.GetProducts(), this.GetProductType()); writer.WriteStart(feed); writer.WriteStart(derivedEntity); writer.WriteEnd(); writer.WriteEnd(); writer.Flush(); string payload = this.TestFinish(); payload.Should().Be("{\"@odata.context\":\"http://host/service/$metadata#Products/$delta\",\"value\":[{\"@odata.type\":\"#MyNS.PhysicalProduct\",\"Id\":1,\"Name\":\"car\",\"Material\":\"gold\"}]}"); }