コード例 #1
0
        public void BuildOrderby_AliasInFunction()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$orderby=Fully.Qualified.Namespace.HasDog(inOffice%3D%40p1)&@p1=true");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;
            var expectedFunc = HardCodedTestModel.GetAllHasDogFunctionOverloadsForPeople().Single(s => s.Parameters.Count() == 2);

            odataUri.OrderBy.Expression.ShouldBeSingleValueFunctionCallQueryNode(expectedFunc).And.Parameters.Last().As <NamedFunctionParameterNode>().Value.ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetBoolean(false));
            aliasNodes["@p1"].ShouldBeConstantQueryNode(true);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #2
0
        public void BuildFilter_AliasInFunction_WithoutValue()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$filter=Fully.Qualified.Namespace.HasDog(inOffice%3D%40p1%2Cname%3D%40p2)");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.Filter.Expression.ShouldBeSingleValueFunctionCallQueryNode(HardCodedTestModel.GetHasDogOverloadForPeopleWithThreeParameters().As <IEdmFunction>()).And.Parameters.Last().As <NamedFunctionParameterNode>().Value.ShouldBeParameterAliasNode("@p2", null);
            aliasNodes["@p1"].Should().BeNull();
            aliasNodes["@p2"].Should().BeNull();

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #3
0
        public void BuildFilter_AliasInFunction_BuiltIn()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$filter=contains(%40p1%2CName)&@p1=Name");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.Filter.Expression.As <SingleValueFunctionCallNode>().Parameters.First().ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetString(true));
            aliasNodes["@p1"].ShouldBeSingleValuePropertyAccessQueryNode(HardCodedTestModel.GetPeopleSet().EntityType().FindProperty("Name"));

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #4
0
        public void BuildPath_AliasInFunctionImport_NullAsValue()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/GetPet4(id=@p1)?@p1=null");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.Path.LastSegment.ShouldBeOperationImportSegment(HardCodedTestModel.GetFunctionImportForGetPet4()).And.Parameters.First().ShouldHaveParameterAliasNode("id", "@p1", null);
            aliasNodes["@p1"].ShouldBeConstantQueryNode((object)null);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #5
0
        public void BuildPath_AliasInBoundFunction()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People(123)/Fully.Qualified.Namespace.HasHat(onCat=@p1)?@p1=true");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.Path.LastSegment.ShouldBeOperationSegment(HardCodedTestModel.TestModel.FindOperations("Fully.Qualified.Namespace.HasHat").Single(s => (s as IEdmFunction).Parameters.Count() == 2)).As <IEdmFunction>();
            aliasNodes["@p1"].ShouldBeConstantQueryNode(true);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.NotEqual(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #6
0
        /// <summary>
        /// Puts the specified <paramref name="payload"/> into a changeset.
        /// </summary>
        /// <param name="payload">The payload to be used as content for the expanded link.</param>
        /// <param name="verb">The verb associated with the payload.</param>
        /// <param name="random">Use of random makes this method non deterministic.</param>
        /// <param name="requestManager">Used to construct requests</param>
        /// <param name="operationsBefore">Number of extra operations before payload.</param>
        /// <param name="operationsAfter">Number of extra operations after payload.</param>
        /// <param name="version">Highest version of allowed features</param>
        /// <returns>An entry payload with an expanded link that contains the specified <paramref name="payload"/>.</returns>
        public static BatchRequestChangeset InRequestChangeset <T>(
            this T payload,
            HttpVerb verb,
            IRandomNumberGenerator random,
            IODataRequestManager requestManager,
            int operationsBefore = 0,
            int operationsAfter  = 0,
            ODataVersion version = ODataVersion.V4
            ) where T : PayloadTestDescriptor
        {
            ExceptionUtilities.CheckArgumentNotNull(payload, "payload");
            ExceptionUtilities.CheckArgumentNotNull(verb, "verb");
            ExceptionUtilities.CheckArgumentNotNull(random, "random");
            ExceptionUtilities.CheckArgumentNotNull(requestManager, "requestManager");

            var baseUri         = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org/service.svc")));
            var extraOperations = BatchUtils.ExtraRequestChangesetOperations(random, requestManager, (EdmModel)payload.PayloadEdmModel, baseUri, version);

            // Build the list of all properties
            IEnumerable <IHttpRequest> operations = Enumerable.Range(0, operationsBefore).Select(i => random.ChooseFrom(extraOperations));

            operations.ConcatSingle(payload.InRequestOperation(verb, baseUri, requestManager));
            operations = operations.Concat(Enumerable.Range(0, operationsAfter).Select(i => extraOperations[extraOperations.Length - 1 - (i % extraOperations.Length)]));

            var changeset = BatchPayloadBuilder.RequestChangeset("changeset_" + Guid.NewGuid().ToString(), Encoding.UTF8.WebName, operations.ToArray());

            return(changeset);
        }
コード例 #7
0
        public void BuildPath_AliasInPath_AliasInFunction()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/GetPet4(id=@p1)?$filter=ID%20eq%20%40p1&@p1=1.01M");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.Path.LastSegment.ShouldBeOperationImportSegment(HardCodedTestModel.GetFunctionImportForGetPet4()).And.Parameters.First().ShouldHaveParameterAliasNode("id", "@p1", EdmCoreModel.Instance.GetDecimal(false));
            odataUri.Filter.Expression.ShouldBeBinaryOperatorNode(BinaryOperatorKind.Equal).And.Right.ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetDecimal(false));
            aliasNodes["@p1"].ShouldBeConstantQueryNode(1.01M);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #8
0
        public void BuildFilter_AliasInFunction_PropertyAsValue_TypeMismatch()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$filter=Fully.Qualified.Namespace.HasDog(inOffice%3D%40p1%2Cname%3D%40p1)&@p2=Name&@p1=%40p2");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.Filter.Expression.ShouldBeSingleValueFunctionCallQueryNode(HardCodedTestModel.GetHasDogOverloadForPeopleWithThreeParameters().As <IEdmFunction>()).And.Parameters.Last().As <NamedFunctionParameterNode>().Value.ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetString(true));
            aliasNodes["@p1"].ShouldBeParameterAliasNode("@p2", EdmCoreModel.Instance.GetString(true));
            aliasNodes["@p2"].ShouldBeSingleValuePropertyAccessQueryNode(HardCodedTestModel.GetPeopleSet().EntityType().FindProperty("Name"));

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.AreEqual(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.AreEqual(fullUri, actualUri);
        }
コード例 #9
0
        /// <summary>
        /// Puts payload in a batch response.
        /// </summary>
        /// <typeparam name="T">T must be a PayloadTestDescriptor.</typeparam>
        /// <param name="originalPayload">Payload to be inserted into batch.</param>
        /// <param name="statusCode">Status code associated with payload</param>
        /// <param name="random">Use of random makes this method non deterministic</param>
        /// <param name="requestManager">Used to construct the response payload.</param>
        /// <param name="inChangeset">Specifies whether this is in a changeset or an operation.</param>
        /// <param name="operationsBefore">Number of operations/changesets to go before payload.</param>
        /// <param name="operationsAfter">Number of operations/changesets to go after payload.</param>
        /// <param name="version">Maximum version for extra generated payloads</param>
        /// <returns>Test descriptor for the new BatchResponsePayload.</returns>
        public static T InBatchResponse <T>(
            this T originalPayload,
            int statusCode,
            IRandomNumberGenerator random,
            IODataRequestManager requestManager,
            bool inChangeset     = false,
            int operationsBefore = 0,
            int operationsAfter  = 0,
            ODataVersion version = ODataVersion.V4
            ) where T : PayloadTestDescriptor
        {
            ExceptionUtilities.CheckArgumentNotNull(originalPayload, "originalPayload");
            ExceptionUtilities.CheckArgumentNotNull(statusCode, "statusCode");
            ExceptionUtilities.CheckArgumentNotNull(random, "random");
            ExceptionUtilities.CheckArgumentNotNull(requestManager, "requestManager");
            var payload = (T)originalPayload.Clone();

            var headers = new Dictionary <string, string> {
                { "ResponseHeader", "ResponseValue" }
            };
            var baseUri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org/service.svc")));

            IMimePart[] extraoperations = BatchUtils.ExtraResponseChangesets(random, (EdmModel)payload.PayloadEdmModel, version);  // add extraChangesets methods
            extraoperations.Concat(BatchUtils.ExtraResponseOperations(random, (EdmModel)payload.PayloadEdmModel, version));

            //Work out the operations and changesets to go before the payload
            var parts = Enumerable.Range(0, operationsBefore).Select(i => random.ChooseFrom(extraoperations));

            if (!inChangeset)
            {
                extraoperations.ConcatSingle(payload.InResponseOperation(statusCode, requestManager));
            }
            else
            {
                extraoperations.ConcatSingle(payload.InResponseChangeset(statusCode, random, requestManager, random.NextFromRange(0, 2), random.NextFromRange(0, 2), version));
            }

            parts.Concat(Enumerable.Range(0, operationsAfter).Select(i => random.ChooseFrom(extraoperations)));

            var batchResponse = new BatchResponsePayload();

            foreach (var part in parts)
            {
                HttpResponseData operation = part as HttpResponseData;
                if (operation != null)
                {
                    batchResponse.Add(operation.AsBatchFragment());
                }

                BatchResponseChangeset changeset = part as BatchResponseChangeset;
                if (changeset != null)
                {
                    batchResponse.Add(changeset);
                }
            }

            //payload.PayloadEdmModel.Fixup();
            payload.PayloadElement = batchResponse;
            return(payload);
        }
コード例 #10
0
        public void BuildFilter_AliasInFunction_enum_undefined()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$filter=null%20ne%20Fully.Qualified.Namespace.GetPetCount(colorPattern%3D%40p1)&@p1=Fully.Qualified.Namespace.ColorPattern'238563'");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            NamedFunctionParameterNode p = odataUri.Filter.Expression.As <BinaryOperatorNode>().Right.As <SingleEntityFunctionCallNode>().Parameters.First().As <NamedFunctionParameterNode>();

            p.Value.As <ParameterAliasNode>().Alias.ShouldBeEquivalentTo("@p1");
            p.Value.As <ParameterAliasNode>().TypeReference.IsEnum().Should().Be(true);
            p.Value.As <ParameterAliasNode>().TypeReference.Definition.FullTypeName().ShouldBeEquivalentTo("Fully.Qualified.Namespace.ColorPattern");

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            aliasNodes["@p1"].As <ConstantNode>().Value.As <ODataEnumValue>().TypeName.Should().Be("Fully.Qualified.Namespace.ColorPattern");
            aliasNodes["@p1"].As <ConstantNode>().Value.As <ODataEnumValue>().Value.Should().Be("238563");
            aliasNodes["@p1"].TypeReference.IsEnum().Should().Be(true);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.AreEqual(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.AreEqual(fullUri, actualUri);
        }
コード例 #11
0
        /// <summary>
        /// Generates extra request operations
        /// </summary>
        /// <param name="requestManager">RequestManager to build the operations.</param>
        /// <param name="baseUri">Base uri for the operations</param>
        /// <returns>An array of request operations.</returns>
        public static IMimePart[] ExtraRequestOperations(IODataRequestManager requestManager, ODataUri baseUri)
        {
            ExceptionUtilities.CheckArgumentNotNull(requestManager, "requestManager");
            ExceptionUtilities.CheckArgumentNotNull(baseUri, "baseUri");

            var headers = new Dictionary <string, string> {
                { "RequestHeader", "RequestHeaderValue" }
            };
            string mergeContentType      = HttpUtilities.BuildContentType(MimeTypes.ApplicationXml, Encoding.UTF8.WebName, null);
            List <IHttpRequest> requests = new List <IHttpRequest>();

            requests.Add(requestManager.BuildRequest(baseUri, HttpVerb.Get, headers));
            var segments = baseUri.Segments;

            ODataUriSegment[] segmentstoadd =
            {
                ODataUriBuilder.EntitySet(new EntitySet("Set1")),
                ODataUriBuilder.EntityType(new EntityType("EntityType")),
                ODataUriBuilder.EntitySet(new EntitySet("Set2")),
                ODataUriBuilder.EntityType(new EntityType("EntityType2")),
            };

            foreach (var segment in segmentstoadd)
            {
                requests.Add(requestManager.BuildRequest(new ODataUri(segments.ConcatSingle(segment)), HttpVerb.Get, headers));
            }

            return(requests.ToArray());
        }
コード例 #12
0
        private ODataUri BuildODataUri(ODataPayloadElement payload)
        {
            var entityInstance = payload as EntityInstance;

            if (entityInstance != null)
            {
                EntityModelTypeAnnotation type = entityInstance.GetAnnotation <EntityModelTypeAnnotation>();
                ExceptionUtilities.CheckObjectNotNull(type, "Type annotation was expected");

                var entityType = ((EntityDataType)type.EntityModelType).Definition;

                // First is OK because MEST doesnt matter
                var entitySet = entityType.Model.EntityContainers.SelectMany(c => c.EntitySets).First(s => s.EntityType == entityType);
                return(new ODataUri(ODataUriBuilder.EntitySet(entitySet)));
            }
            var complexProperty = payload as ComplexProperty;

            if (complexProperty != null)
            {
                EntityModelTypeAnnotation type = entityInstance.GetAnnotation <EntityModelTypeAnnotation>();
                ExceptionUtilities.CheckObjectNotNull(type, "Type annotation was expected");

                var entityType = ((EntityDataType)type.EntityModelType).Definition;

                // First is OK because MEST doesnt matter
                var entitySet = entityType.Model.EntityContainers.SelectMany(c => c.EntitySets).First(s => s.EntityType == entityType);
                return(new ODataUri(ODataUriBuilder.EntitySet(entitySet)));
            }

            // TODO: Add support for other types
            return(null);
        }
コード例 #13
0
        public void BuildOrderby_AliasInBinaryOp()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$orderby=ID%20mul%20%40p1%20asc&@p1=3 div 2");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            odataUri.OrderBy.Expression.ShouldBeBinaryOperatorNode(BinaryOperatorKind.Multiply).And.Right.ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetInt32(false));
            aliasNodes["@p1"].ShouldBeBinaryOperatorNode(BinaryOperatorKind.Divide).And.Right.ShouldBeConstantQueryNode(2);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(odataUriParser.UrlConventions, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(new Uri("http://gobbledygook/People?$orderby=ID%20mul%20%40p1&@p1=3 div 2"), actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(new Uri("http://gobbledygook/People?$orderby=ID%20mul%20%40p1&@p1=3 div 2"), actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(new Uri("http://gobbledygook/People?$orderby=ID%20mul%20%40p1&@p1=3 div 2"), actualUri);
        }
コード例 #14
0
        private static string GetUriRepresentationForKeyValue(PropertyInfo key, object entityInstance)
        {
            Contract.Assert(key != null);
            Contract.Assert(entityInstance != null);

            return(ODataUriBuilder.GetUriRepresentation(key.GetValue(entityInstance, null)));
        }
コード例 #15
0
        public void BuildPath_AliasInFunctionImport_enum()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/GetPetCount(colorPattern=@p1)?@p1=Fully.Qualified.Namespace.ColorPattern'BlueYellowStriped'");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();
            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;

            OperationSegmentParameter p = odataUri.Path.LastSegment.ShouldBeOperationImportSegment(HardCodedTestModel.GetFunctionImportForGetPetCount()).And.Parameters.First();

            p.Name.Should().Be("colorPattern");
            p.Value.As <ParameterAliasNode>().Alias.Should().Be("@p1");
            p.Value.As <ParameterAliasNode>().TypeReference.IsEnum().Should().Be(true);
            p.Value.As <ParameterAliasNode>().TypeReference.Definition.FullTypeName().ShouldBeEquivalentTo("Fully.Qualified.Namespace.ColorPattern");
            aliasNodes["@p1"].As <ConstantNode>().Value.As <ODataEnumValue>().TypeName.Should().Be("Fully.Qualified.Namespace.ColorPattern");
            aliasNodes["@p1"].As <ConstantNode>().Value.As <ODataEnumValue>().Value.Should().Be("22");
            aliasNodes["@p1"].TypeReference.IsEnum().Should().Be(true);

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal(fullUri, actualUri);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal(fullUri, actualUri);
        }
コード例 #16
0
        public void BuildExpandOrderby_AliasInFunction()
        {
            Uri            fullUri        = new Uri("http://gobbledygook/People?$expand=MyPet2Set($orderby=concat(Color, @p1 )asc )&@p1='abc'");
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, serviceRoot, fullUri);

            SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings);
            odataUriParser.UrlConventions = ODataUrlConventions.Default;
            ODataUri odataUri = odataUriParser.ParseUri();

            IDictionary <string, SingleValueNode> aliasNodes = odataUri.ParameterAliasNodes;
            SingleValueFunctionCallNode           node       = (odataUri.SelectAndExpand.SelectedItems.First() as ExpandedNavigationSelectItem).OrderByOption.Expression as SingleValueFunctionCallNode;

            node.Parameters.Last().ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetString(true));
            aliasNodes["@p1"].ShouldBeConstantQueryNode("abc");

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(odataUriParser.UrlConventions, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal("http://gobbledygook/People?$expand=" + Uri.EscapeDataString("MyPet2Set($orderby=concat(Color,@p1))") + "&@p1=" + Uri.EscapeDataString("'abc'"), actualUri.OriginalString);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);

            actualUri = uriBuilderWithKeyAsSegment.BuildUri();
            Assert.Equal("http://gobbledygook/People?$expand=" + Uri.EscapeDataString("MyPet2Set($orderby=concat(Color,@p1))") + "&@p1=" + Uri.EscapeDataString("'abc'"), actualUri.OriginalString);

            ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri);

            actualUri = uriBuilderWithODataSimplified.BuildUri();
            Assert.Equal("http://gobbledygook/People?$expand=" + Uri.EscapeDataString("MyPet2Set($orderby=concat(Color,@p1))") + "&@p1=" + Uri.EscapeDataString("'abc'"), actualUri.OriginalString);
        }
コード例 #17
0
        // gets the primitive odata uri representation.
        public static string GetUriRepresentationForValue(object value)
        {
            Contract.Assert(value != null);
            Contract.Assert(EdmLibHelpers.GetEdmPrimitiveTypeOrNull(value.GetType()) != null);

            value = ODataPrimitiveSerializer.ConvertUnsupportedPrimitives(value);
            return(ODataUriBuilder.GetUriRepresentation(value));
        }
コード例 #18
0
        private IEnumerable <PayloadReaderTestDescriptor> CreateCrossReferenceTestDescriptors(CrossReferenceTestCase testCase, ReaderTestConfiguration testConfiguration)
        {
            ExceptionUtilities.CheckArgumentNotNull(testCase, "testCase");

            var emptyPayload = new OData.Common.PayloadTestDescriptor()
            {
                PayloadEdmModel = new EdmModel().Fixup()
            };

            IEnumerable <OData.Common.PayloadTestDescriptor> operationPayloads = new[] { emptyPayload };

            // One of the operations in the test case may specify a reference link value to use to generate payloads
            string payloadReferenceLink = testCase.ChangeSets.SelectMany(cset => cset.Operations).Select(o => o.PayloadCrossReferenceLink).SingleOrDefault(s => !string.IsNullOrEmpty(s));

            if (payloadReferenceLink != null)
            {
                EdmModel testModel = Test.OData.Utils.Metadata.TestModels.BuildTestModel();
                operationPayloads =
                    GeneratePayloadElementsWithCrossReferenceLinks(payloadReferenceLink, testConfiguration).Select(
                        p => new OData.Common.PayloadTestDescriptor
                {
                    PayloadElement  = p,
                    PayloadEdmModel = testModel,
                });
            }

            var testDescriptors = new List <PayloadReaderTestDescriptor>();

            foreach (var payload in operationPayloads)
            {
                IEnumerable <IMimePart> requestChangesets = testCase.ChangeSets.Select(
                    c => (IMimePart)BatchUtils.GetRequestChangeset(
                        c.Operations.Select(o =>
                {
                    // check whether we need to inject a payload into this operation
                    var operationPayload = string.IsNullOrEmpty(o.PayloadCrossReferenceLink) ? emptyPayload : payload;

                    ODataUri operationUri = new ODataUri(new[] { ODataUriBuilder.Unrecognized(o.Uri.OriginalString) });
                    var requestOperation  = operationPayload.InRequestOperation(HttpVerb.Post, operationUri, this.RequestManager);
                    requestOperation.Headers.Add(HttpHeaders.ContentId, o.ContentId);

                    return((IMimePart)requestOperation);
                }).ToArray(),
                        this.RequestManager));

                var testDescriptor = new PayloadReaderTestDescriptor(this.PayloadReaderSettings)
                {
                    DebugDescription      = testCase.DebugDescription,
                    PayloadElement        = PayloadBuilder.BatchRequestPayload(requestChangesets.ToArray()).AddAnnotation(new BatchBoundaryAnnotation("batch_foo")),
                    ExpectedException     = testCase.ExpectedException,
                    SkipTestConfiguration = (testConfig) => !testConfig.IsRequest,
                };

                testDescriptors.Add(testDescriptor);
            }

            return(testDescriptors);
        }
コード例 #19
0
        public void ODataUriBuilderWithKeyAsSegment()
        {
            Uri            fullUri        = new Uri("http://www.example.com/People/1?$filter=MyDog%2FColor%20eq%20%27Brown%27&$select=ID&$expand=MyDog&$top=1&$skip=2&$count=false");
            ODataUriParser oDataUriParser = new ODataUriParser(this.GetModel(), serviceRoot, fullUri);

            oDataUriParser.UrlConventions = ODataUrlConventions.KeyAsSegment;
            SetODataUriParserSettingsTo(this.settings, oDataUriParser.Settings);
            ODataUri odataUri = oDataUriParser.ParseUri();

            //verify path
            EntitySetSegment entitySet  = (EntitySetSegment)odataUri.Path.FirstSegment;
            KeySegment       keySegment = (KeySegment)odataUri.Path.LastSegment;
            IEnumerable <KeyValuePair <string, object> > keyValuePairs = keySegment.Keys;

            Assert.AreEqual(odataUri.Path.Count, 2);
            Assert.AreEqual(entitySet.EntitySet.Name, "People");
            foreach (var keyValuePair in keyValuePairs)
            {
                Assert.AreEqual(keyValuePair.Key, "ID");
                Assert.AreEqual(keyValuePair.Value, 1);
            }

            //verify $filter
            BinaryOperatorNode            binaryOperator      = (BinaryOperatorNode)odataUri.Filter.Expression;
            SingleValuePropertyAccessNode singleValueProperty = (SingleValuePropertyAccessNode)binaryOperator.Left;
            SingleNavigationNode          singleNavigation    = (SingleNavigationNode)singleValueProperty.Source;
            ConstantNode constantNode = (ConstantNode)binaryOperator.Right;

            Assert.AreEqual(binaryOperator.OperatorKind, BinaryOperatorKind.Equal);
            Assert.AreEqual(singleValueProperty.Property.Name, "Color");
            Assert.AreEqual(singleNavigation.NavigationProperty.Name, "MyDog");
            Assert.AreEqual(constantNode.LiteralText, "'Brown'");

            //verify $select and $expand
            IEnumerable <SelectItem> selectItems = odataUri.SelectAndExpand.SelectedItems;

            foreach (ExpandedNavigationSelectItem selectItem in selectItems)
            {
                NavigationPropertySegment navigationProperty = (NavigationPropertySegment)selectItem.PathToNavigationProperty.FirstSegment;
                Assert.AreEqual(navigationProperty.NavigationProperty.Name, "MyDog");
                break;
            }

            //verify $top
            Assert.AreEqual(odataUri.Top, 1);

            //verify $skip
            Assert.AreEqual(odataUri.Skip, 2);

            //verify $count
            Assert.AreEqual(odataUri.QueryCount, false);

            ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri);
            Uri             actualUri = uriBuilderWithKeyAsSegment.BuildUri();

            Assert.AreEqual(new Uri("http://www.example.com/People/1?$filter=MyDog%2FColor%20eq%20%27Brown%27&$select=ID%2CMyDog&$expand=MyDog&$top=1&$skip=2&$count=false"), actualUri);
        }
コード例 #20
0
        /// <summary>
        /// Build QueryValue from query expresion and server response.
        /// </summary>
        /// <param name="expression">The query expresion of client request.</param>
        /// <param name="response">The http response from the server.</param>
        /// <returns>The baseline QueryValue converted from payload.</returns>
        public QueryValue BuildQueryValue(QueryExpression expression, HttpResponseData response)
        {
            ExceptionUtilities.CheckArgumentNotNull(expression, "expression");
            ExceptionUtilities.CheckArgumentNotNull(response, "response");
            ExceptionUtilities.CheckAllRequiredDependencies(this);

            // get type resolver and payload deserializer.
            var typeResolver = new LinqToAstoriaTypeResolutionVisitor(this.TypeLibrary);

            // if the response has an error
            if (response.StatusCode != HttpStatusCode.OK)
            {
                return(expression.ExpressionType.CreateErrorValue(new QueryError("Response from server has an error!")));
            }

            string contentType;

            ExceptionUtilities.Assert(response.Headers.TryGetValue(HttpHeaders.ContentType, out contentType), "Cannot get content type from response.");
            var deserializer = this.StrategySelector.GetStrategy(contentType, null).GetDeserializer();

            this.currentExpression = expression;

            var      expressionForUri = this.ClientSideProjectionReplacer.ReplaceClientSideProjections(expression);
            ODataUri queryUri         = this.QueryToODataUriConverter.ComputeUri(expressionForUri);

            queryUri.Segments.Insert(0, ODataUriBuilder.Root(this.Workspace.ServiceUri));

            // deserialize byte array payload to OData payload element.
            ODataPayloadElement payload = this.DeserializePayloadData(deserializer, response, queryUri);

            this.PayloadElementMetadataResolver.ResolveMetadata(payload, queryUri);
            var normalizer = this.StrategySelector.GetStrategy(contentType, null).GetPayloadNormalizer();

            payload = normalizer.Normalize(payload);

            if (this.ShouldUsePayloadDrivenVerification(queryUri))
            {
                return(this.BuildQueryValueForActionResponse(payload, expression.ExpressionType));
            }
            else
            {
                // build query data set from payload for evaluation. It's a different data set from the initial one of current workspace.
                IQueryDataSet dataSet = this.BuildQueryDataSet(payload);

                // filter the query and resolve types. Need to remove expressions such as $top, $skip, $orderby, $filter because the returned payload is already the result of performing these expressions.
                // need to keep root expression, key expression, $expand and $select to have correct anonymous type.
                var filteredQuery = this.FilterExpression(expression);
                filteredQuery = typeResolver.ResolveTypes(filteredQuery, this.EvaluationStrategy);

                // replace the evaluator's query-data-set with the one generated in the payload
                using (this.Evaluator.WithTemporaryDataSet(dataSet))
                {
                    return(this.Evaluator.Evaluate(filteredQuery));
                }
            }
        }
コード例 #21
0
        /// <summary>
        /// Generates the conventional edit link for the given named stream: http://serviceRoot/SetName(keyValues)/StreamName
        /// </summary>
        /// <param name="entitySet">The entity set of the entity</param>
        /// <param name="entityType">The type of the entity</param>
        /// <param name="keyValues">They values of the entity's key</param>
        /// <param name="streamName">The stream's name</param>
        /// <returns>The convention-based stream edit link</returns>
        public string GenerateNamedStreamEditLink(EntitySet entitySet, EntityType entityType, IEnumerable <NamedValue> keyValues, string streamName)
        {
            // null checks performed by this helper
            var uri = this.GenerateEntityEditLinkUri(entitySet, entityType, keyValues);

            // null checks performed by ODataUriBuilder
            uri.Segments.Add(ODataUriBuilder.NamedStream(entityType, streamName));

            return(this.UriToStringConverter.ConvertToString(uri));
        }
コード例 #22
0
        /// <summary>
        /// Puts payload in a batch request.
        /// </summary>
        /// <typeparam name="T">T must be a PayloadTestDescriptor.</typeparam>
        /// <param name="originalPayload">Payload to put into batch.</param>
        /// <param name="verb">HttpVerb associated with payload.</param>
        /// <param name="random">Use of random makes this method non deterministic.</param>
        /// <param name="requestManager">Used to construct requests.</param>
        /// <param name="operationsBefore">Number of operations/changesets to go before payload.</param>
        /// <param name="operationsAfter">Number of operations/changesets to go after payload.</param>
        /// <param name="version">Maximum version for extra payloads</param>
        /// <returns>The test descriptor for the new BatchRequestPayload</returns>
        public static T InBatchRequest <T>(
            this T originalPayload,
            HttpVerb verb,
            IRandomNumberGenerator random,
            IODataRequestManager requestManager,
            int operationsBefore = 0,
            int operationsAfter  = 0,
            ODataVersion version = ODataVersion.V4
            ) where T : PayloadTestDescriptor
        {
            ExceptionUtilities.CheckArgumentNotNull(originalPayload, "originalPayload");
            ExceptionUtilities.CheckArgumentNotNull(verb, "verb");
            ExceptionUtilities.CheckArgumentNotNull(random, "random");
            ExceptionUtilities.CheckArgumentNotNull(requestManager, "requestManager");
            var payload = (T)originalPayload.Clone();

            var baseUri = new ODataUri(ODataUriBuilder.Root(new Uri("http://www.odata.org/service.svc")));

            IMimePart[] extraOperations = BatchUtils.ExtraRequestChangesets(random, requestManager, (EdmModel)payload.PayloadEdmModel, baseUri, version);  // add extraChangesets methods
            extraOperations.Concat(BatchUtils.ExtraRequestChangesets(random, requestManager, (EdmModel)payload.PayloadEdmModel, baseUri, version));

            //Work out the operations and changesets to go before the payload
            var parts = Enumerable.Range(0, operationsBefore).Select(i => random.ChooseFrom(extraOperations));

            if (verb != HttpVerb.Get)
            {
                extraOperations.ConcatSingle(payload.InRequestOperation(HttpVerb.Get, baseUri, requestManager));
            }
            else
            {
                extraOperations.ConcatSingle(payload.InRequestChangeset(verb, random, requestManager, random.NextFromRange(0, 2), random.NextFromRange(0, 2), version));
            }

            parts.Concat(Enumerable.Range(0, operationsAfter).Select(i => random.ChooseFrom(extraOperations)));

            var batchRequest = new BatchRequestPayload();

            foreach (var part in parts)
            {
                IHttpRequest operation = part as IHttpRequest;
                if (operation != null)
                {
                    batchRequest.Add(operation.AsBatchFragment());
                }
                BatchRequestChangeset changeset = part as BatchRequestChangeset;
                if (changeset != null)
                {
                    batchRequest.Add(changeset);
                }
            }

            //payload.PayloadEdmModel.Fixup();
            payload.PayloadElement = batchRequest;
            return(payload);
        }
コード例 #23
0
        public static Uri UriBuilder(Uri queryUri, ODataUrlConventions urlConventions, ODataUriParserSettings settings)
        {
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, ServiceRoot, queryUri);

            odataUriParser.UrlConventions = urlConventions;
            ODataUri odataUri = odataUriParser.ParseUri();

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(urlConventions, odataUri);

            return(odataUriBuilder.BuildUri());
        }
コード例 #24
0
ファイル: PathBuilderTests.cs プロジェクト: sivethe/odata.net
        public void TrailingDollarSegmentIsIgnored()
        {
            Uri            queryUri       = new Uri("People/$", UriKind.Relative);
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("https://www.blah.org/OData/"), queryUri);
            ODataUri       odataUri       = odataUriParser.ParseUri();

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(new Uri("https://www.blah.org/OData/People"), actualUri);
        }
コード例 #25
0
ファイル: PathBuilderTests.cs プロジェクト: sivethe/odata.net
        public void UriOverloadSmokeTest()
        {
            Uri            queryUri       = new Uri("Dogs", UriKind.Relative);
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("https://www.tomatosoup.com:1234/OData/V3/"), queryUri);
            ODataUri       odataUri       = odataUriParser.ParseUri();

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(new Uri("https://www.tomatosoup.com:1234/OData/V3/Dogs"), actualUri);
        }
コード例 #26
0
ファイル: PathBuilderTests.cs プロジェクト: sivethe/odata.net
        public void BuildPathWithRelativeFullUri()
        {
            Uri            queryUri       = new Uri("Dogs", UriKind.Relative);
            ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://gobbldygook/service.svc"), queryUri);
            ODataUri       odataUri       = odataUriParser.ParseUri();

            ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri);
            Uri             actualUri       = odataUriBuilder.BuildUri();

            Assert.Equal(new Uri("http://gobbldygook/service.svc/Dogs"), actualUri);
        }
コード例 #27
0
        private ODataUri GenerateEntityEditLinkUri(EntitySet entitySet, EntityType entityType, IEnumerable <NamedValue> keyValues)
        {
            // null checks performed by ODataUriBuilder
            var conventionalEditLink = this.GenerateEntityIdUri(entitySet, entityType, keyValues);

            if (EditLinkShouldContainTypeSegment(entitySet, entityType))
            {
                conventionalEditLink.Segments.Add(ODataUriBuilder.EntityType(entityType));
            }

            return(conventionalEditLink);
        }
コード例 #28
0
        private ODataUri GenerateEntityIdUri(EntitySet entitySet, EntityType entityType, IEnumerable <NamedValue> keyValues)
        {
            ExceptionUtilities.CheckAllRequiredDependencies(this);

            // null checks performed by ODataUriBuilder
            var conventionalId = new ODataUri();

            conventionalId.Segments.Add(new ServiceRootSegment(this.Service.ServiceUri));
            conventionalId.Segments.Add(ODataUriBuilder.EntitySet(entitySet));
            conventionalId.Segments.Add(ODataUriBuilder.Key(entityType, keyValues));
            return(conventionalId);
        }
コード例 #29
0
        /// <summary>
        /// Creates a batch payload with the specified number of changesets and the specified number of operations in each changeset.
        /// </summary>
        /// <param name="requestManager">Used for building the requests/responses.</param>
        /// <param name="changeSetCount">The number of changesets to create in the batch payload.</param>
        /// <param name="changeSetSizes">The size of each changeset.</param>
        /// <param name="forRequest">true if creating a batch request payload; otherwise false.</param>
        /// <param name="batchBoundary">The batch boundary to use; or null to use an auto-generated one.</param>
        /// <returns>A <see cref="PayloadTestDescriptor"/> for the batch payload.</returns>
        public static PayloadTestDescriptor CreateDefaultQueryBatch(
            IODataRequestManager requestManager,
            int queryCount,
            bool forRequest,
            string batchBoundary = null)
        {
            Debug.Assert(queryCount >= 0, "batchSize >= 0");

            var emptyPayload = new PayloadTestDescriptor()
            {
                PayloadEdmModel = CreateEmptyEdmModel()
            };

            var root = ODataUriBuilder.Root(new Uri("http://www.odata.org/service.svc"));

            IMimePart[] parts = new IMimePart[queryCount];

            if (forRequest)
            {
                var queryOperation = emptyPayload.InRequestOperation(HttpVerb.Get, new ODataUri(new ODataUriSegment[] { root }), requestManager);

                for (int i = 0; i < queryCount; ++i)
                {
                    parts[i] = queryOperation;
                }
                ;

                string requestBoundary = batchBoundary ?? "bb_multiple_request_queries_" + queryCount;
                return(new PayloadTestDescriptor()
                {
                    PayloadElement = PayloadBuilder.BatchRequestPayload(parts)
                                     .AddAnnotation(new BatchBoundaryAnnotation(requestBoundary)),
                });
            }

            // Response operation with no payload and a status code of 200
            var emptyPayloadResponse = emptyPayload.InResponseOperation(200, requestManager);

            for (int i = 0; i < queryCount; ++i)
            {
                parts[i] = emptyPayloadResponse;
            }
            ;

            string responseBoundary = batchBoundary ?? "bb_multiple_response_queries_" + queryCount;

            return(new PayloadTestDescriptor()
            {
                PayloadElement = PayloadBuilder.BatchResponsePayload(parts)
                                 .AddAnnotation(new BatchBoundaryAnnotation(responseBoundary)),
            });
        }
コード例 #30
0
        private static ODataUri GetTopLevelUri(QueryStructuralValue entity)
        {
            ExceptionUtilities.CheckArgumentNotNull(entity, "entity");
            QueryEntityType entityType = entity.Type as QueryEntityType;

            ExceptionUtilities.CheckObjectNotNull(entityType, "Given structural value was not an entity type");

            var setSegment = ODataUriBuilder.EntitySet(entityType.EntitySet);
            var keyValues  = entityType.EntityType.AllKeyProperties.Select(k => new NamedValue(k.Name, entity.GetScalarValue(k.Name).Value));
            var keySegment = ODataUriBuilder.Key(entityType.EntityType, keyValues);

            return(new ODataUri(setSegment, keySegment));
        }