public void BuildPath_AliasInFunctionImport() { Uri fullUri = new Uri("http://gobbledygook/GetPet4(id=@p1)?@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)); aliasNodes["@p1"].ShouldBeConstantQueryNode(1.01M); 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); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
public void ParseOrderby() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/People?$orderby=Name asc")); ODataUri parsedUri = parser.ParseUri(); parsedUri.OrderBy.Expression.ShouldBeSingleValuePropertyAccessQueryNode(HardCodedTestModel.GetPersonNameProp()); parsedUri.OrderBy.Direction.Should().Be(OrderByDirection.Ascending); }
public void ParseFilter() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/People?$filter=Name eq 'Bob'")); ODataUri parsedUri = parser.ParseUri(); var equalOperator = parsedUri.Filter.Expression.ShouldBeBinaryOperatorNode(BinaryOperatorKind.Equal).And; equalOperator.Left.ShouldBeSingleValuePropertyAccessQueryNode(HardCodedTestModel.GetPersonNameProp()); equalOperator.Right.ShouldBeConstantQueryNode("Bob"); }
private string GetContextUrlPathString(Uri queryUri) { ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, queryUri); odataUriParser.UrlConventions = ODataUrlConventions.Default; ODataUri odataUri = odataUriParser.ParseUri(); ODataPath odataPath = odataUri.Path; return odataPath.ToContextUrlPathString(); }
public void ODataUriBuilderWithEntitySet() { Uri fullUri = new Uri("http://www.example.com/People?$filter=MyDog%2FColor%20eq%20%27Brown%27&$select=ID&$expand=MyDog&$orderby=ID&$top=1&$skip=2&$count=true&$search=FA"); ODataUriParser odataUriParser = new ODataUriParser(this.GetModel(), serviceRoot, fullUri); odataUriParser.UrlConventions = ODataUrlConventions.Default; SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings); ODataUri odataUri = odataUriParser.ParseUri(); //verify path EntitySetSegment entitySet = (EntitySetSegment)odataUri.Path.FirstSegment; Assert.AreEqual(entitySet.EntitySet.Name, "People"); Assert.AreEqual(odataUri.Path.Count, 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 $orderby SingleValuePropertyAccessNode orderby = (SingleValuePropertyAccessNode)odataUri.OrderBy.Expression; Assert.AreEqual(orderby.Property.Name, "ID"); //verify $top Assert.AreEqual(odataUri.Top, 1); //verify $skip Assert.AreEqual(odataUri.Skip, 2); //verify $count Assert.AreEqual(odataUri.QueryCount, true); //verify $search SearchTermNode searchTermNode = (SearchTermNode)odataUri.Search.Expression; Assert.AreEqual(searchTermNode.Text, "FA"); ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri); Uri actualUri = odataUriBuilder.BuildUri(); Assert.AreEqual(new Uri("http://www.example.com/People?$filter=MyDog%2FColor%20eq%20%27Brown%27&$select=ID%2CMyDog&$expand=MyDog&$orderby=ID&$top=1&$skip=2&$count=true&$search=FA"), actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreEqual(new Uri("http://www.example.com/People?$filter=MyDog%2FColor%20eq%20%27Brown%27&$select=ID%2CMyDog&$expand=MyDog&$orderby=ID&$top=1&$skip=2&$count=true&$search=FA"), actualUri); }
public void ParsePathWithValue() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/People(1)/$value")); ODataUri parsedUri = parser.ParseUri(); List<ODataPathSegment> path = parsedUri.Path.ToList(); path[0].ShouldBeEntitySetSegment(HardCodedTestModel.GetPeopleSet()); path[1].ShouldBeKeySegment(new KeyValuePair<string, object>("ID", 1)); path[2].ShouldBeValueSegment(); }
public void ParsePathWithLinks() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/People(1)/MyDog/$ref")); ODataUri parsedUri = parser.ParseUri(); List<ODataPathSegment> path = parsedUri.Path.ToList(); path[0].ShouldBeEntitySetSegment(HardCodedTestModel.GetPeopleSet()); path[1].ShouldBeKeySegment(new KeyValuePair<string, object>("ID", 1)); path[2].ShouldBeNavigationPropertyLinkSegment(HardCodedTestModel.GetPersonMyDogNavProp()); }
public static Uri UriBuilder(Uri queryUri, ODataUrlConventions urlConventions, ODataUriParserSettings settings) { ODataUriParser odataUriParser = new ODataUriParser(HardCodedTestModel.TestModel, ServiceRoot, queryUri); SetODataUriParserSettingsTo(settings, odataUriParser.Settings); odataUriParser.UrlConventions = urlConventions; ODataUri odataUri = odataUriParser.ParseUri(); ODataUriBuilder odataUriBuilder = new ODataUriBuilder(urlConventions, odataUri); return odataUriBuilder.BuildUri(); }
public void ParseSelectExpand() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/Dogs?$select=Color, MyPeople&$expand=MyPeople")); ODataUri parsedUri = parser.ParseUri(); parsedUri.SelectAndExpand.SelectedItems.First().ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetDogColorProp()))); var myPeopleExpand = parsedUri.SelectAndExpand.SelectedItems.Last().ShouldBeSelectedItemOfType<ExpandedNavigationSelectItem>().And; myPeopleExpand.PathToNavigationProperty.Single().ShouldBeNavigationPropertySegment(HardCodedTestModel.GetDogMyPeopleNavProp()); var myPeopleSelectExpand = myPeopleExpand.SelectAndExpand; myPeopleSelectExpand.AllSelected.Should().BeTrue(); myPeopleSelectExpand.SelectedItems.Should().BeEmpty(); }
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.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
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.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
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.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
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); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
public void ParseCount() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/People?$count=false")); ODataUri parsedUri = parser.ParseUri(); parsedUri.QueryCount.Should().BeFalse(); }
public void BuildFilter_AliasInBinaryOp_ValueAsExpression() { Uri fullUri = new Uri("http://gobbledygook/People?$filter=ID%20eq%20%40p1&@p1=1 add 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.Filter.Expression.ShouldBeBinaryOperatorNode(BinaryOperatorKind.Equal).And.Right.ShouldBeParameterAliasNode("@p1", EdmCoreModel.Instance.GetInt32(false)); aliasNodes["@p1"].ShouldBeBinaryOperatorNode(BinaryOperatorKind.Add).And.Right.ShouldBeConstantQueryNode(2); 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); }
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.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreNotEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
public void BuildFilter_AliasInFunction() { Uri fullUri = new Uri("http://gobbledygook/People?$filter=Fully.Qualified.Namespace.AllHaveDog(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; odataUri.Filter.Expression.ShouldBeSingleValueFunctionCallQueryNode(HardCodedTestModel.GetFunctionForAllHaveDogWithTwoParameters()).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.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreEqual(fullUri, actualUri); }
public void SelectOrExpandCanOnlyBeCalledOnEntity() { ODataUriParser parser = new ODataUriParser(HardCodedTestModel.TestModel, new Uri("http://www.odata.com/OData"), new Uri("http://www.odata.com/OData/People(1)/Name?$select=Name")); Action parseWithNonEntity = () => parser.ParseUri(); parseWithNonEntity.ShouldThrow<ODataException>().WithMessage(ODataErrorStrings.UriParser_TypeInvalidForSelectExpand("Edm.String")); }
/// <summary> /// Runs the given query against the OdataLib's uri translator and compares the results against an inmemorycontext /// </summary> /// <param name="expression">The query expression to run against the Uri parser</param> public void Verify(QueryExpression expression) { // 1. test : take the expression and construct the OData URI // /Customers?$top=1 string queryFragment = null; queryFragment = this.UriQueryVisitor.ComputeUri(expression); Uri serviceBaseUri = new Uri("http://localhost:9000/"); // http://localhost:9000/Customers?$top=1 Uri queryUri = new Uri(serviceBaseUri, queryFragment); this.Logger.WriteLine(LogLevel.Info, "Running Uri :{0}", queryUri.OriginalString); EntityModelSchema schema = Workspace.ConceptualModel; // Generate an EDM model based on the EntityModelSchema to use in the UriParser IEdmModel model = this.DataServiceProviderFactory.CreateMetadataProvider(schema); // Generate an IDSQP based on the EntityModelSchema to use in the Expression Translator var queryResolver = this.DataServiceProviderFactory.CreateQueryProvider(schema); // 2. product : take the URI , run it through the parser and get the Linq expression ODataUriParser parser = new ODataUriParser(model, serviceBaseUri, queryUri); var query = parser.ParseUri(); var result = query.Path; // Get the expected Results QueryValue expectedResults = null; expectedResults = this.Evaluator.Evaluate(expression); }
public void ODataUriBuilderWithKeyAsSegment() { Uri fullUri = new Uri("http://www.example.com/People/1?$filter=MyDog%2FColor%20eq%20%27Brown%27&$select=ID&$expand=MyDog%2CMyCat/$ref&$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; IEnumerable<ExpandedNavigationSelectItem> expandedNavigationSelectItem = selectItems.Where(I => I.GetType() == typeof(ExpandedNavigationSelectItem)).OfType<ExpandedNavigationSelectItem>(); IEnumerable<ExpandedReferenceSelectItem> expandedReferenceSelectItem = selectItems.Where(I => I.GetType() == typeof(ExpandedReferenceSelectItem)).OfType<ExpandedReferenceSelectItem>(); IEnumerable<PathSelectItem> pathSelectItem = selectItems.Where(I => I.GetType() == typeof(PathSelectItem)).OfType<PathSelectItem>(); Assert.AreEqual(expandedNavigationSelectItem.Count(), 1); Assert.AreEqual(expandedReferenceSelectItem.Count(), 1); Assert.AreEqual(pathSelectItem.Count(), 3); NavigationPropertySegment navigationProperty = (NavigationPropertySegment)expandedNavigationSelectItem.First().PathToNavigationProperty.FirstSegment; Assert.AreEqual(navigationProperty.NavigationProperty.Name, "MyDog"); navigationProperty = (NavigationPropertySegment)expandedReferenceSelectItem.First().PathToNavigationProperty.FirstSegment; Assert.AreEqual(navigationProperty.NavigationProperty.Name, "MyCat"); //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%2CMyCat&$expand=MyDog%2CMyCat%2F%24ref&$top=1&$skip=2&$count=false"), actualUri); }
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.AreEqual(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.AreEqual(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.AreEqual(new Uri("http://gobbledygook/People?$orderby=ID%20mul%20%40p1&@p1=3 div 2"), actualUri); }
public void AbsoluteUriBuildWithEmptyQueryOptions() { Uri queryUri = new Uri("http://www.example.com/People"); ODataUriParser odataUriParser = new ODataUriParser(this.GetModel(), serviceRoot, queryUri); SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings); odataUriParser.UrlConventions = ODataUrlConventions.Default; ODataUri odataUri = odataUriParser.ParseUri(); ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri); Uri actualUri = odataUriBuilder.BuildUri(); Assert.AreEqual(queryUri, actualUri); }
public void RelativeUriBuildWithEmptyQueryOptions() { Uri queryUri = new Uri("People", UriKind.Relative); ODataUriParser odataUriParser = new ODataUriParser(this.GetModel(), queryUri); SetODataUriParserSettingsTo(this.settings, odataUriParser.Settings); odataUriParser.UrlConventions = ODataUrlConventions.Default; ODataUri odataUri = odataUriParser.ParseUri(); ODataUriBuilder odataUriBuilder = new ODataUriBuilder(ODataUrlConventions.Default, odataUri); Uri actualUri = odataUriBuilder.BuildUri(); Assert.AreEqual(queryUri, actualUri); }
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.AreEqual("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.AreEqual("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.AreEqual("http://gobbledygook/People?$expand=" + Uri.EscapeDataString("MyPet2Set($orderby=concat(Color,@p1))") + "&@p1=" + Uri.EscapeDataString("'abc'"), actualUri.OriginalString); }
public static ODataUri ParseUri(string input, IEdmModel model, int? maxDepth = null) { var serviceBaseUri = new Uri("http://server/service/"); var queryUri = new Uri(serviceBaseUri, input); ODataUriParser parser = new ODataUriParser(model, serviceBaseUri, queryUri); if (maxDepth.HasValue) { parser.Settings.FilterLimit = maxDepth.Value; return parser.ParseUri(); } else { return parser.ParseUri(); } }
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.AreEqual(new Uri("https://www.blah.org/OData/People"), actualUri); }
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); }
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.AreEqual(new Uri("http://gobbldygook/service.svc/Dogs"), actualUri); }
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.AreEqual(new Uri("https://www.tomatosoup.com:1234/OData/V3/Dogs"), actualUri); }
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.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithKeyAsSegment = new ODataUriBuilder(ODataUrlConventions.KeyAsSegment, odataUri); actualUri = uriBuilderWithKeyAsSegment.BuildUri(); Assert.AreEqual(fullUri, actualUri); ODataUriBuilder uriBuilderWithODataSimplified = new ODataUriBuilder(ODataUrlConventions.ODataSimplified, odataUri); actualUri = uriBuilderWithODataSimplified.BuildUri(); Assert.AreEqual(fullUri, actualUri); }