public static void PerClassCleanUp() { OpenWebDataServiceHelper.ForceVerboseErrors = false; if (web != null) { web.StopService(); } if (changeScope != null) { changeScope.Dispose(); } }
public void AllowRedefiningConcurrencyTokenOnDerivedType() { var metadataProvider = new DSPMetadata("DefaultContainer", "Default"); var entityType = metadataProvider.AddEntityType("EntityType", null, null, false /*isAbstract*/); metadataProvider.AddKeyProperty(entityType, "ID", typeof(int)); metadataProvider.AddPrimitiveProperty(entityType, "LastUpdatedAuthor", typeof(string), true /*eTag*/); var derivedType = metadataProvider.AddEntityType("DerivedType", null, entityType, false /*isAbstract*/); metadataProvider.AddPrimitiveProperty(derivedType, "LastModifiedAuthor", typeof(string), true /*eTag*/); metadataProvider.AddResourceSet("Customers", entityType); var wrapper = new DataServiceMetadataProviderWrapper(metadataProvider); DSPResource baseTypeInstance = new DSPResource(entityType); baseTypeInstance.SetValue("ID", 1); baseTypeInstance.SetValue("LastUpdatedAuthor", "Phani"); DSPResource derivedTypeInstance = new DSPResource(derivedType); derivedTypeInstance.SetValue("ID", 1); derivedTypeInstance.SetValue("LastModifiedAuthor", "Raj"); DSPContext dataContext = new DSPContext(); var entities = dataContext.GetResourceSetEntities("Customers"); entities.AddRange(new object[] { baseTypeInstance, derivedTypeInstance }); var service = new DSPUnitTestServiceDefinition(metadataProvider, DSPDataProviderKind.Reflection, dataContext); using (TestWebRequest request = service.CreateForInProcess()) { try { request.StartService(); request.RequestUriString = "/$metadata"; request.SendRequestAndCheckResponse(); } finally { request.StopService(); } } }
public void MetadataProviderContainerNameAndNamespaceCalledOnlyOnceDuringSerialization() { CallCountMetadataProvider metadataProvider; DSPServiceDefinition service; CreateCallCounterService(out metadataProvider, out service); using (TestWebRequest request = service.CreateForInProcess()) { try { request.StartService(); request.RequestUriString = "/$metadata"; request.SendRequestAndCheckResponse(); } finally { request.StopService(); } } Assert.AreEqual(1, metadataProvider.ContainerNameCallCount, "ContainerName called more than once"); Assert.AreEqual(1, metadataProvider.ContainerNamespaceCallCount, "ContainerNamespace called more than once"); }
public void OperationDescriptorsShouldBeUpdatedForEachRequest() { #region Response payload var response = @"HTTP/1.1 200 OK Connection: Keep-Alive Content-Length: 2011 Date: Thu, 06 Jun 2013 22:07:07 GMT Content-Type: application/atom+xml;type=entry;charset=utf-8 Server: Microsoft-IIS/7.5 Cache-Control: no-cache X-Content-Type-Options: nosniff OData-Version: 4.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET <?xml version='1.0' encoding='utf-8'?> <entry xml:base='http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/' xmlns='http://www.w3.org/2005/Atom' xmlns:d='http://docs.oasis-open.org/odata/ns/data' xmlns:m='http://docs.oasis-open.org/odata/ns/metadata' xmlns:georss='http://www.georss.org/georss' xmlns:gml='http://www.opengis.net/gml'> <id>http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/Products(0)</id> <category term='ODataDemo.Product' scheme='http://docs.oasis-open.org/odata/ns/scheme' /> <link rel='edit' title='Product' href='Products(0)' /> <link rel='http://docs.oasis-open.org/odata/ns/related/Category' type='application/atom+xml;type=entry' title='Category' href='Products(0)/Category' /> <link rel='http://docs.oasis-open.org/odata/ns/related/Supplier' type='application/atom+xml;type=entry' title='Supplier' href='Products(0)/Supplier' /> <title type='text'>Bread</title> <summary type='text'>Whole grain bread</summary> <updated>2013-06-06T22:07:08Z</updated> <author> <name /> </author> <link rel='http://docs.oasis-open.org/odata/ns/relatedlinks/OrderDetails' type='application/xml' title='OrderDetails' href='Products(0)/OrderDetails/$ref' /> <m:action metadata='http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/$metadata#DemoService.{0}' title='{0}' target='http://services.odata.org/V3/(S(imdxx1ujw4ludze1t3k2wmgs))/OData/OData.svc/Products(0)/{0}' /> <content type='application/xml'> <m:properties> <d:ID m:type='Edm.Int32'>0</d:ID> <d:ProductName m:type='Edm.String'>Demo Product</d:ProductName> <d:Discontinued m:type='Edm.Boolean'>false</d:Discontinued> </m:properties> </content> </entry> "; #endregion // Consider two actions that an entity Product supports, and they are mutually exclusive, i.e. only one action // is returned in the response string action1 = "Discount"; string action2 = "Discount1234"; // Create two responses with each of above actions var response1 = string.Format(response, action1); var response2 = string.Format(response, action2); PlaybackServiceDefinition playbackService = new PlaybackServiceDefinition(); using (TestWebRequest request = playbackService.CreateForInProcessWcf()) { request.ServiceType = typeof(PlaybackService); request.ForceVerboseErrors = true; request.StartService(); DataServiceContext ctx = new DataServiceContext(request.ServiceRoot, ODataProtocolVersion.V4); ctx.EnableAtom = true; try { for (int i = 0; i < 2; i++) { playbackService.OverridingPlayback = (i % 2 == 0) ? response1 : response2; Product product = ctx.Execute <Product>(new Uri("Products(0)", UriKind.Relative)).First(); EntityDescriptor descriptor = ctx.GetEntityDescriptor(product); descriptor.OperationDescriptors.Count.Should().Be(1); var actionName = descriptor.OperationDescriptors.First().Title; if (i % 2 == 0) { actionName.Should().Be(action1); } else { actionName.Should().Be(action2); } } } finally { request.StopService(); } } }
public void PrimitiveTypes_Generated_WithIncorrectNullability() { string orderPayloadWithNullableProperties = @"HTTP/1.1 200 OK Proxy-Connection: Keep-Alive Connection: Keep-Alive Content-Length: 2542 Via: 1.1 TK5-PRXY-08 Expires: Wed, 04 Jan 2012 23:39:02 GMT Date: Wed, 04 Jan 2012 23:38:02 GMT Content-Type: application/atom+xml;charset=utf-8 Server: Microsoft-IIS/7.5 Cache-Control: private Vary: * OData-Version: 4.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET <?xml version='1.0' encoding='utf-8' standalone='yes'?> <feed xml:base='http://services.odata.org/Northwind/Northwind.svc/' xmlns:d='http://docs.oasis-open.org/odata/ns/data' xmlns:m='http://docs.oasis-open.org/odata/ns/metadata' xmlns='http://www.w3.org/2005/Atom'> <title type='text'>OrderDetails</title> <id>http://services.odata.org/Northwind/Northwind.svc/OrderDetails</id> <updated>2012-01-04T23:32:26Z</updated> <link rel='self' title='OrderDetails' href='OrderDetails' /> <entry> <id>http://services.odata.org/Northwind/Northwind.svc/OrderDetails(10248)</id> <title type='text'></title> <updated>2012-01-04T23:32:26Z</updated> <author> <name /> </author> <link rel='edit' title='OrderDetail' href='OrderDetails(10248)' /> <link rel='http://docs.oasis-open.org/odata/ns/related/Customer' type='application/atom+xml;type=entry' title='Customer' href='OrderDetails(10248)/Customer' /> <link rel='http://docs.oasis-open.org/odata/ns/related/Employee' type='application/atom+xml;type=entry' title='Employee' href='OrderDetails(10248)/Employee' /> <link rel='http://docs.oasis-open.org/odata/ns/related/OrderDetail_Details' type='application/atom+xml;type=feed' title='OrderDetail_Details' href='OrderDetails(10248)/OrderDetail_Details' /> <link rel='http://docs.oasis-open.org/odata/ns/related/Shipper' type='application/atom+xml;type=entry' title='Shipper' href='OrderDetails(10248)/Shipper' /> <category term='NorthwindModel.OrderDetail' scheme='http://docs.oasis-open.org/odata/ns/scheme' /> <content type='application/xml'> <m:properties> <d:OrderID m:type='Edm.Int32'>10248</d:OrderID> <d:ProductID m:type='Edm.Int32'>10248</d:ProductID> <d:UnitPrice m:null='true'/> <d:Quantity m:null='true'/> </m:properties> </content> </entry> </feed>"; PlaybackServiceDefinition playbackService = new PlaybackServiceDefinition(); using (TestWebRequest request = playbackService.CreateForInProcessWcf()) { request.ServiceType = typeof(PlaybackService); request.ForceVerboseErrors = true; request.StartService(); DataServiceContext ctx = new DataServiceContext(request.ServiceRoot); ctx.EnableAtom = true; playbackService.OverridingPlayback = orderPayloadWithNullableProperties; InvalidOperationException nullAssignmentError = null; try { foreach (var orderDetail in ctx.CreateQuery <OrderDetail>("OrderDetails")) { } } catch (InvalidOperationException ioException) { nullAssignmentError = ioException; } finally { request.StopService(); } Assert.IsNotNull(nullAssignmentError, "Client library should not allow assignment of null values to non-nullable properties"); Assert.AreEqual(ODataLibResourceUtil.GetString("ReaderValidationUtils_NullNamedValueForNonNullableType", "UnitPrice", "Edm.Double"), nullAssignmentError.Message); } }