コード例 #1
0
        public void TopBatchReturingODataError()
        {
            const string payload = @"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?>
<error xmlns=""http://docs.oasis-open.org/odata/ns/metadata"">
  <code></code>
  <message xml:lang=""en-US"">This error must show up in the error returned below</message>
</error>";

            IODataRequestMessage requestMessage = new ODataTestMessage();
            var responseMessage = new ODataTestMessage();

            responseMessage.SetHeader("Content-Type", "application\atom+xml");
            responseMessage.SetHeader("OData-Version", "4.0");
            responseMessage.StatusCode = 400;
            responseMessage.WriteToStream(payload);
            responseMessage.SetHeader("Content-Length", "0");

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, requestMessage, responseMessage);

            context.AddObject("Products", new SimpleNorthwind.Product()
            {
                ID = 1
            });
            Action test = () => context.SaveChanges(SaveChangesOptions.BatchWithSingleChangeset);

            // we should be returning an ODataErrorException instead of the full contents
            test.ShouldThrow <DataServiceRequestException>()
            .WithInnerException <DataServiceClientException>()
            .And.InnerException.Message.Should().Be("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\r\n<error xmlns=\"http://docs.oasis-open.org/odata/ns/metadata\">\r\n  <code></code>\r\n  <message xml:lang=\"en-US\">This error must show up in the error returned below</message>\r\n</error>");
        }
コード例 #2
0
        private static void RunClientRequest(Action <DataServiceContext> runTest, string expectedRequestPayload = null, string responsePayload = null, Action <IODataResponseMessage> setupResponse = null)
        {
            using (var requestStream = new MemoryStream())
                using (var responseStream = responsePayload == null ? new MemoryStream() : new MemoryStream(Encoding.UTF8.GetBytes(responsePayload)))
                {
                    responseStream.Position = 0;
                    var requestMessage = new InMemoryMessage {
                        Stream = requestStream
                    };
                    var responseMessage = new InMemoryMessage {
                        Stream = responseStream
                    };
                    if (setupResponse != null)
                    {
                        setupResponse(responseMessage);
                    }

                    DataServiceContext ctx = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, requestMessage, responseMessage);
                    runTest(ctx);

                    if (expectedRequestPayload != null)
                    {
                        var actualRequestPayload = Encoding.UTF8.GetString(requestStream.ToArray());
                        Assert.AreEqual(expectedRequestPayload, actualRequestPayload);
                    }
                }
        }
コード例 #3
0
        private static DataServiceQueryException TopLevelErrorPayloadWithTransportException(int statusCode, Action <DataServiceContextWithCustomTransportLayer> contextAction)
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();

            TopLevelBatchResponseMessage topLevelResponse = new TopLevelBatchResponseMessage();

            byte[] payload = Encoding.UTF8.GetBytes("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\r\n<error xmlns=\"http://docs.oasis-open.org/odata/ns/metadata\">\r\n  <code></code>\r\n  <message xml:lang=\"en-US\">This error must show up in the error returned below</message>\r\n</error>");
            topLevelResponse.SetHeader("OData-Version", "4.0");
            topLevelResponse.SetHeader("Content-Type", "application/xml");
            topLevelResponse.SetHeader("Content-Length", payload.Length.ToString());
            topLevelResponse.StatusCode    = statusCode;
            topLevelResponse.GetStreamFunc = () =>
            {
                return(new MemoryStream(payload));
            };

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => requestMessage, () => { throw new DataServiceTransportException(topLevelResponse, new WebException()); });

            context.EnableAtom = true;
            Action test = () => contextAction(context);

            var exception = test.ShouldThrow <DataServiceQueryException>().And;

            return(exception);
        }
コード例 #4
0
        public void Init()
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();

            context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => requestMessage, () => { throw new WebException("web exception on getting response"); });
            context.Format.UseJson(new EdmModel());
        }
コード例 #5
0
        public void BindTwoEntitiesSaveChanges()
        {
            var odataRequestMessage  = new ODataTestMessage();
            var odataResponseMessage = new ODataTestMessage()
            {
                StatusCode = 204
            };
            DataServiceContextWithCustomTransportLayer context = new DataServiceContextWithCustomTransportLayer(DataServiceProtocolVersion.V3, () => odataRequestMessage, () => odataResponseMessage);

            WritingEntityReferenceLinkArgs args = null;

            context.Configurations.RequestPipeline.OnEntityReferenceLink((r => args = r));

            SimpleNorthwind.Product product = new SimpleNorthwind.Product()
            {
                ID = 1
            };
            SimpleNorthwind.Supplier supplier = new SimpleNorthwind.Supplier()
            {
                ID = 2
            };

            context.AttachTo("Products", product);
            context.AttachTo("Suppliers", supplier);

            context.SetLink(product, "Supplier", supplier);
            context.SaveChanges();

            // Note writing entity links is not triggered here as its not in the payload
            args.Should().BeNull();
            odataRequestMessage.Method.Should().Be("PUT");
            odataRequestMessage.Url.AbsoluteUri.Should().Be("http://somedummyuri/myService.svc/Products(1)/$links/Supplier");
        }
コード例 #6
0
        public void AttachEntityAddEntityAndBindSaveChanges()
        {
            var odataRequestMessage  = new ODataTestMessage();
            var odataResponseMessage = new ODataTestMessage()
            {
                StatusCode   = 202,
                MemoryStream = new MemoryStream(Encoding.UTF8.GetBytes(@"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?>
<entry xml:base=""http://services.odata.org/OData/OData.svc/"" xmlns:d=""http://schemas.microsoft.com/ado/2007/08/dataservices"" xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"" xmlns=""http://www.w3.org/2005/Atom"">
    <id>http://services.odata.org/OData/OData.svc/Suppliers(2)</id>
    <category term=""ODataDemo.Product"" scheme=""http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"" />
    <link rel=""edit"" title=""AnnotationTests_Product"" href=""Products(2)"" />
    <title />
    <updated>2012-11-15T19:29:45Z</updated>
    <author>
      <name />
    </author>
    <content type=""application/xml"">
      <m:properties>
        <d:ID m:type=""Edm.Int32"">1</d:ID>
      </m:properties>
    </content>
  </entry>"))
            };

            odataResponseMessage.SetHeader("DataServiceId", "http://service/foo/Products(2)");
            odataResponseMessage.SetHeader("Location", "http://service/foo/Products(2)");
            odataResponseMessage.SetHeader("Content-Type", "application/atom+xml");

            DataServiceContextWithCustomTransportLayer context = new DataServiceContextWithCustomTransportLayer(DataServiceProtocolVersion.V3, () => odataRequestMessage, () => odataResponseMessage);

            WritingNavigationLinkArgs      startingNavigLinkArgs = null;
            WritingNavigationLinkArgs      endingNavigLinkArgs   = null;
            WritingEntityReferenceLinkArgs args = null;

            context.Configurations.RequestPipeline.OnNavigationLinkStarting((r => startingNavigLinkArgs = r));
            context.Configurations.RequestPipeline.OnNavigationLinkEnding((r => endingNavigLinkArgs = r));
            context.Configurations.RequestPipeline.OnEntityReferenceLink((r => args = r));

            SimpleNorthwind.Product product = new SimpleNorthwind.Product()
            {
                ID = 1
            };
            SimpleNorthwind.Supplier supplier = new SimpleNorthwind.Supplier()
            {
                ID = 2
            };

            context.AddObject("Products", product);
            context.AttachTo("Suppliers", supplier);

            context.SetLink(product, "Supplier", supplier);
            context.SaveChanges();

            VerifyWritingNavigationLinkArgs(startingNavigLinkArgs, null, product, supplier, "Supplier");
            VerifyWritingNavigationLinkArgs(endingNavigLinkArgs, null, product, supplier, "Supplier");

            args.Should().NotBeNull();
            args.EntityReferenceLink.Url.AbsoluteUri.Should().Be("http://somedummyuri/myService.svc/Suppliers(2)");
        }
コード例 #7
0
        public void WebExceptionShouldNotBeSurfacedWhenGetResponseThrowsOnBatch()
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();

            var    context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => requestMessage, () => { throw new WebException("web exception on getting response"); });
            Action test    = () => context.ExecuteBatch(context.CreateQuery <NorthwindModel.Products>("Products"));

            test.ShouldThrow <WebException>().WithMessage("web exception on getting response");
        }
コード例 #8
0
        private static Action AddObjectWithInjectedObjectDisposedOnGetStreamO(SaveChangesOptions saveChangesOptions)
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();
            var responseMessage = CreateResponseMessageWithGetStreamThrowingObjectDisposeException();

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, requestMessage, responseMessage);

            context.AddObject("Products", new SimpleNorthwind.Product()
            {
                ID = 1
            });
            return(() => context.SaveChanges(saveChangesOptions));
        }
コード例 #9
0
        public void WebExceptionShouldeSurfacedWhenGetResponseThrowsOnNonBatch()
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();

            var    context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => requestMessage, () => { throw new WebException("web exception on getting response"); });
            Action test    = () => context.CreateQuery <NorthwindModel.Products>("Products").ToList();

            var exception = test.ShouldThrow <Exception>().And;

            // Should not be surfacing an internal exception
            exception.Should().BeOfType <WebException>();
            exception.Message.Should().Be("web exception on getting response");
        }
コード例 #10
0
        public void WebExceptionShouldNotBeSurfacedWhenSaveChangesWithBatch()
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => requestMessage, () => { throw new WebException("web exception on getting response"); });

            context.AddObject("Products", new SimpleNorthwind.Product()
            {
                ID = 1
            });
            Action test = () => context.SaveChanges(SaveChangesOptions.BatchWithSingleChangeset);

            test.ShouldThrow <WebException>().WithMessage("web exception on getting response");
        }
コード例 #11
0
        private static Action GetQueryWithInjectedObjectDisposedOnGetStream(bool useExecuteBatch)
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();
            var responseMessage = CreateResponseMessageWithGetStreamThrowingObjectDisposeException();

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, requestMessage, responseMessage);

            if (useExecuteBatch)
            {
                return(() => context.ExecuteBatch(context.CreateQuery <NorthwindModel.Products>("Products")));
            }
            else
            {
                return(() => context.CreateQuery <NorthwindModel.Products>("Products").ToList());
            }
        }
コード例 #12
0
        public void NotModifiedTest()
        {
            var odataRequestMessage  = new ODataTestMessage();
            var odataResponseMessage = new ODataTestMessage()
            {
                StatusCode   = 304,
                MemoryStream = new MemoryStream(Encoding.UTF8.GetBytes(@""))
            };

            odataResponseMessage.SetHeader("Content-Type", "0");

            DataServiceContextWithCustomTransportLayer context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => odataRequestMessage, () => odataResponseMessage);

            Action test = () => context.CreateQuery <SimpleNorthwind.Product>("Products").ToList();

            test.ShouldThrow <DataServiceQueryException>().WithInnerMessage("NotModified");
        }
コード例 #13
0
        public void WebExceptionShouldNotBeSurfacedWhenSaveChangesWithNonBatch()
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, () => requestMessage, () => { throw new WebException("web exception on getting response"); });

            context.AddObject("Products", new SimpleNorthwind.Product()
            {
                ID = 1
            });
            Action test = () => context.SaveChanges(SaveChangesOptions.None);

            var innerInnerException = test.ShouldThrow <DataServiceRequestException>().WithInnerException <DataServiceClientException>().And.InnerException.InnerException;

            innerInnerException.Should().BeOfType <WebException>();
            innerInnerException.Message.Should().Be("web exception on getting response");
        }
コード例 #14
0
        private DataServiceContextWithCustomTransportLayer CreateTransportLayerContext(string payload, string odataVersion)
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();
            var responseMessage = new ODataTestMessage();

            responseMessage.SetHeader("Content-Type", "application/json");
            responseMessage.SetHeader("OData-Version", odataVersion);
            responseMessage.StatusCode = 200;
            responseMessage.WriteToStream(payload);
            responseMessage.SetHeader("Content-Length", responseMessage.MemoryStream.Length.ToString());

            var context = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, requestMessage, responseMessage);

            context.ResolveName = ResolveName;
            context.ResolveType = ResolveType;
            context.Format.UseJson(Model);
            return(context);
        }
コード例 #15
0
        private DataServiceContextWithCustomTransportLayer CreateTransportLayerContext(string payload, string odataVersion, ODataProtocolVersion maxDataServiceVersion, string contentTypeHeaderValue = MimeApplicationAtom)
        {
            IODataRequestMessage requestMessage = new ODataTestMessage();
            var responseMessage = new ODataTestMessage();

            responseMessage.SetHeader("Content-Type", contentTypeHeaderValue);
            responseMessage.SetHeader("OData-Version", odataVersion);
            responseMessage.StatusCode = 200;
            responseMessage.WriteToStream(payload);
            responseMessage.SetHeader("Content-Length", responseMessage.MemoryStream.Length.ToString());

            var context = new DataServiceContextWithCustomTransportLayer(maxDataServiceVersion, requestMessage, responseMessage);

            //context.EnableAtom = true;
            context.ResolveName = ResolveName;
            context.ResolveType = ResolveType;
            context.Format.UseJson(Model);
            return(context);
        }
コード例 #16
0
        private DataServiceContext CreateContextWithHardcodedResponse <TServer, TClient>(TServer serverPropertyValue, string contentType, bool complex, bool collection)
        {
            var payload = GeneratePayload <TServer, TClient>(serverPropertyValue, contentType, complex, collection);

            var requestMessage  = new ODataTestMessage();
            var responseMessage = new ODataTestMessage {
                StatusCode = 200, MemoryStream = new MemoryStream(Encoding.UTF8.GetBytes(payload))
            };

            responseMessage.SetHeader("Content-Type", contentType);
            responseMessage.SetHeader("Content-Length", responseMessage.MemoryStream.Length.ToString());
            responseMessage.SetHeader("OData-Version", "4.0");

            var ctx = new DataServiceContextWithCustomTransportLayer(ODataProtocolVersion.V4, requestMessage, responseMessage);

            //ctx.EnableAtom = true;

            if (contentType == UnitTestsUtil.JsonLightMimeType || contentType == UnitTestsUtil.JsonLightMimeTypeIeee754Compatible)
            {
                var model         = new EdmModel();
                var edmEntityType = new EdmEntityType("Fake", "ServerType");
                edmEntityType.AddKeys(edmEntityType.AddStructuralProperty("ID", EdmPrimitiveTypeKind.Int32));
                model.AddElement(edmEntityType);

                EdmPrimitiveTypeKind kind = GetPrimitiveTypeKind <TServer>();

                if (!complex)
                {
                    if (!collection)
                    {
                        edmEntityType.AddStructuralProperty("Property", kind, true);
                    }
                    else
                    {
                        edmEntityType.AddStructuralProperty("Property", new EdmCollectionTypeReference(new EdmCollectionType(EdmCoreModel.Instance.GetPrimitive(kind, false))));
                    }
                }
                else
                {
                    var complexType = new EdmComplexType("Fake", "ComplexType");
                    complexType.AddStructuralProperty("Property", kind, true);
                    model.AddElement(complexType);

                    if (!collection)
                    {
                        edmEntityType.AddStructuralProperty("Property", new EdmComplexTypeReference(complexType, true));
                    }
                    else
                    {
                        edmEntityType.AddStructuralProperty("Property", new EdmCollectionTypeReference(new EdmCollectionType(new EdmComplexTypeReference(complexType, false))));
                    }
                }

                var entityContainer = new EdmEntityContainer("Fake", "Container");
                entityContainer.AddEntitySet("Entities", edmEntityType);
                model.AddElement(entityContainer);

                ctx.Format.UseJson(model);
                ctx.ResolveType = n => n == "Fake.ServerType" ? typeof(ClientEntityType <TClient>) : null;
                ctx.ResolveName = t => t == typeof(ClientEntityType <TClient>) ? "Fake.ServerType" : null;
            }

            return(ctx);
        }