public void NestedTopAndSkipAndCountWithValidExpression() { // Arrange SelectToken select = ParseSelectToken("FavoriteColors($skip=4;$count=false;$top=2)"); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: select); // Assert Assert.NotNull(clause); Assert.NotNull(clause.SelectedItems); // FavoriteColors SelectItem selectItem = Assert.Single(clause.SelectedItems); PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.NotNull(subPathSelect.SkipOption); Assert.Equal(4, subPathSelect.SkipOption.Value); Assert.NotNull(subPathSelect.CountOption); Assert.False(subPathSelect.CountOption.Value); Assert.NotNull(subPathSelect.TopOption); Assert.Equal(2, subPathSelect.TopOption.Value); }
public void MultiLevelExpandTermTokenWorks() { // Arrange: $expand=MyDog($expand=MyPeople) ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), null, new ExpandToken(new ExpandTermToken[] { innerExpandTerm })); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { outerExpandTerm }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, null); // Assert Assert.True(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); ExpandedNavigationSelectItem expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); // sub-level Assert.NotNull(expandedItem.SelectAndExpand); Assert.True(expandedItem.SelectAndExpand.AllSelected); selectItem = Assert.Single(expandedItem.SelectAndExpand.SelectedItems); expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()); // sub-sub level Assert.NotNull(expandedItem.SelectAndExpand); }
public void SelectIsBasedOnTheCurrentLevel() { // Arrange: $expand=MyDog($select=Color;$expand=MyPeople;) ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), new SelectToken(new List <PathSegmentToken>() { new NonSystemToken("Color", null, null) }), new ExpandToken(new ExpandTermToken[] { innerExpandTerm })); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { outerExpandTerm }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, null); // $expand=MyDog Assert.True(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); ExpandedNavigationSelectItem expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); // Sub-level ($select=Color;$expand=MyPeople;) SelectExpandClause subSelectExpand = expandedItem.SelectAndExpand; Assert.False(subSelectExpand.AllSelected); Assert.Equal(2, subSelectExpand.SelectedItems.Count()); selectItem = Assert.Single(subSelectExpand.SelectedItems, x => x is ExpandedNavigationSelectItem); expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()); Assert.NotNull(expandedItem.SelectAndExpand); }
public void EntitySetCorrectlyPopulatedAtEachLevel() { // Arrange: $expand=MyDog($expand=MyPeople;) ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), null, new ExpandToken(new ExpandTermToken[] { innerExpandTerm })); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { outerExpandTerm }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, null); // Assert SelectItem selectItem = Assert.Single(clause.SelectedItems); ExpandedNavigationSelectItem myDogExpandItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); Assert.Same(HardCodedTestModel.GetDogsSet(), myDogExpandItem.NavigationSource); // Sub-level ($expand=MyPeople) Assert.NotNull(myDogExpandItem.SelectAndExpand); selectItem = Assert.Single(myDogExpandItem.SelectAndExpand.SelectedItems); ExpandedNavigationSelectItem myPeopleExpandItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()); Assert.Same(HardCodedTestModel.GetPeopleSet(), myPeopleExpandItem.NavigationSource); // Sub-sub-level Assert.NotNull(myPeopleExpandItem.SelectAndExpand); }
public void NestedSelectWithValidExpressionOnCollection() { // Arrange SelectToken select = ParseSelectToken("PreviousAddresses($select=Street)"); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: select); // Assert Assert.NotNull(clause); // only one top level $select SelectItem selectItem = Assert.Single(clause.SelectedItems); // it should be "PathSelectItem PathSelectItem pathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.NotNull(pathSelect.SelectAndExpand); // Street selectItem = Assert.Single(pathSelect.SelectAndExpand.SelectedItems); PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.Equal("Street", subPathSelect.SelectedPath.ToResourcePathString(ODataUrlKeyDelimiter.Parentheses)); Assert.NotNull(subPathSelect.SelectAndExpand); }
public void SelectWildcardStoresSubsumed() { // Arrange: $select=Name,*,Birthdate SelectToken selectToken = new SelectToken( new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Name", null, null)), new SelectTermToken(new NonSystemToken("*", null, null)), new SelectTermToken(new NonSystemToken("Birthdate", null, null)), }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); WildcardSelectItem wildcardSelectItem = Assert.Single(clause.SelectedItems) as WildcardSelectItem; Assert.NotNull(wildcardSelectItem); SelectItem[] subsumedSelectItems = wildcardSelectItem.SubsumedSelectItems.ToArray(); Assert.Equal(2, subsumedSelectItems.Length); subsumedSelectItems[0].ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetPersonNameProp()))); subsumedSelectItems[1].ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetPersonBirthdateProp()))); }
public void AllSelectedIsSetIfSelectIsEmpty() { // Arrange & Act SelectExpandClause clause = BinderForPerson.Bind(new ExpandToken(), selectToken: null); // Assert Assert.NotNull(clause); Assert.True(clause.AllSelected); }
public void BindReturnsNotNullForNullExpandAndSelect() { // Arrange & Act SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: null); // Assert Assert.NotNull(clause); Assert.True(clause.AllSelected); Assert.Empty(clause.SelectedItems); }
public void NonNavigationPropertyThrowsUsefulErrorIfKnobIsNotFlipped() { // Arrange: $expand=Shoe ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("Shoe", null, null)) }); // Act Action test = () => BinderForPerson.Bind(expandToken, null); test.Throws <ODataException>(ODataErrorStrings.ExpandItemBinder_PropertyIsNotANavigationPropertyOrComplexProperty("Shoe", HardCodedTestModel.GetPersonType().FullName())); }
public void NonexistentPropertyThrowsUsefulError() { // Arrange: $expand=Blah ExpandToken expandToken = new ExpandToken(new[] { new ExpandTermToken(new NonSystemToken("Blah", null, null)) }); // Act & Assert Action test = () => BinderForPerson.Bind(expandToken, null); test.Throws <ODataException>(ODataErrorStrings.MetadataBinder_PropertyNotDeclared(HardCodedTestModel.GetPersonType().FullName(), "Blah")); }
public void QueryOptionsNestedInNotAllowedSelectionThrows(string select, string identifier) { // Arrange SelectToken selectToken = ParseSelectToken(select); // Act Action test = () => BinderForPerson.Bind(null, selectToken); // Assert test.Throws <ODataException>(Strings.SelectExpandBinder_InvalidQueryOptionNestedSelection(identifier)); }
public void BindingOnTreeWithWithMultipleNavPropPathsThrows() { // Arrange: $expand=MyDog/MyPeople NonSystemToken innerSegment = new NonSystemToken("MyPeople", null, null); NonSystemToken navProp = new NonSystemToken("MyDog", null, innerSegment); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(navProp) }); // Act & Assert Action test = () => BinderForPerson.Bind(expandToken, null); test.Throws <ODataException>(ODataErrorStrings.ExpandItemBinder_TraversingMultipleNavPropsInTheSamePath); }
public void SystemTokenInSelectionThrows() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Shoe", null, new SystemToken("$value", null))) }); // Act Action test = () => BinderForPerson.Bind(null, selectToken); // Assert test.Throws <ODataException>(Strings.SelectExpandBinder_SystemTokenInSelect("$value")); }
public void InvlidIdentifierInSelectionThrows() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Dotted.Name", null, null)) }); // Act Action test = () => BinderForPerson.Bind(null, selectToken); // Assert test.Throws <ODataException>(Strings.MetadataBinder_InvalidIdentifierInQueryOption("Dotted.Name")); }
public void MultiLevelPathAfterNavigationPropertyThrows() { // Arrange : $select=MyDog/Color SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("MyDog", null, new NonSystemToken("Color", null, null))) }); // Act Action test = () => BinderForPerson.Bind(null, selectToken); // Assert test.Throws <ODataException>(Strings.SelectBinder_MultiLevelPathInSelect); }
public void CustomFunctionsThrow() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("GetCoolPeople", null, null)) }); // Act Action test = () => BinderForPerson.Bind(null, selectToken); // Assert test.Throws <ODataException>(Strings.MetadataBinder_PropertyNotDeclared(HardCodedTestModel.GetPersonType(), "GetCoolPeople")); }
public void FunctionCallsInSelectTreeThrows() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("substring", null, null)) }); // Act Action test = () => BinderForPerson.Bind(null, selectToken); // Arrange test.Throws <ODataException>(Strings.MetadataBinder_PropertyNotDeclared(HardCodedTestModel.GetPersonType(), "substring")); }
public void AllSelectedIsNotSetIfSelectedIsNotEmpty() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Name", null, null)) // normal property }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); }
public void NestedSkipWithValidExpression() { SelectToken select = ParseSelectToken("FavoriteColors($skip=5)"); SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: select); Assert.NotNull(clause); Assert.NotNull(clause.SelectedItems); // FavoriteColors SelectItem selectItem = Assert.Single(clause.SelectedItems); PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.NotNull(subPathSelect.SkipOption); Assert.Equal(5, subPathSelect.SkipOption.Value); }
public void LowerLevelEmptySelectedItemsListDoesNotThrow() { // Arrange ExpandToken lowerLevelExpand = new ExpandToken(new List <ExpandTermToken>()); ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", /*namedValues*/ null, /*nextToken*/ null), null, lowerLevelExpand); ExpandToken topLevelExpand = new ExpandToken(new List <ExpandTermToken>() { topLevelExpandTermToken }); // Act Action bindWithEmptySelectedItemsList = () => BinderForPerson.Bind(topLevelExpand, null); // Assert var ex = Record.Exception(bindWithEmptySelectedItemsList); Assert.Null(ex); }
public void WildcardSelectionItemPreemptsStructuralProperties() { // Arrange : $select=* SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("*", null, null)) }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); selectItem.ShouldBeWildcardSelectionItem(); }
public void NavigationPropertyEndPathResultsInNavPropLinkSelectionItem() { // Arrange: $select=MyDog SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("MyDog", null, null)) }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); selectItem.ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null))); }
public void SingleLevelExpandTermTokenWorks() { // Arrange ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null)); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { expandTermToken }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, null); // Arrange Assert.NotNull(clause); SelectItem selectItem = Assert.Single(clause.SelectedItems); ExpandedNavigationSelectItem expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); Assert.NotNull(expandedItem); Assert.NotNull(expandedItem.SelectAndExpand); }
public void NonSystemTokenTranslatedToSelectionItem() { // Arrange: $select=Shoe SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Shoe", null, null)) }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); selectItem.ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetPersonShoeProp()))); }
public void ExistingWildcardPreemptsAnyNewPropertiesAdded() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("*", null, null)), // * new SelectTermToken(new NonSystemToken("Name", null, null)) // normal property }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); SelectItem selectItem = Assert.Single(clause.SelectedItems); selectItem.ShouldBeWildcardSelectionItem(); }
public void NamespaceWildcardSelectionItemPreemptsStructuralProperties() { // Arrange : $select=* SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Fully.Qualified.Namespace.*", null, null)) }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); NamespaceQualifiedWildcardSelectItem namespaceSelectItem = Assert.IsType <NamespaceQualifiedWildcardSelectItem>(selectItem); Assert.Equal("Fully.Qualified.Namespace", namespaceSelectItem.Namespace); }
public void NestedCountWithValidExpression() { // Assert SelectToken select = ParseSelectToken("FavoriteColors($count=true)"); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: select); // Assert Assert.NotNull(clause); Assert.NotNull(clause.SelectedItems); // FavoriteColors SelectItem selectItem = Assert.Single(clause.SelectedItems); PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.NotNull(subPathSelect.CountOption); Assert.True(subPathSelect.CountOption.Value); }
public void MustFindNonTypeSegmentBeforeTheEndOfTheChain() { // Arrange SelectToken selectToken = new SelectToken(new SelectTermToken[] { new SelectTermToken(new NonSystemToken("Fully.Qualified.Namespace.Employee", null, new NonSystemToken("WorkEmail", null, null))) }); // Act SelectExpandClause clause = BinderForPerson.Bind(null, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); SelectItem selectItem = Assert.Single(clause.SelectedItems); PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.Equal("Fully.Qualified.Namespace.Employee/WorkEmail", subPathSelect.SelectedPath.ToResourcePathString(ODataUrlKeyDelimiter.Parentheses)); }
public void SelectedAndExpandedNavPropProduceExpandedNavPropSelectionItemAndPathSelectionItem() { // Arrange: $select=MyDog&$expand=MyDog ExpandTermToken innerExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null)); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { innerExpandTermToken }); SelectTermToken innerSelectTermToken = new SelectTermToken(new NonSystemToken("MyDog", null, null)); SelectToken selectToken = new SelectToken(new SelectTermToken[] { innerSelectTermToken }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); Assert.Equal(2, clause.SelectedItems.Count()); clause.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); clause.SelectedItems.Last().ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetPeopleSet()))); }
public void NestedFilterWithValidExpression() { // Arrange SelectToken select = ParseSelectToken("PreviousAddresses($filter=Street eq 'abc')"); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: select); // Assert Assert.NotNull(clause); Assert.NotNull(clause.SelectedItems); SelectItem selectItem = Assert.Single(clause.SelectedItems); PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem); Assert.Equal("PreviousAddresses", subPathSelect.SelectedPath.FirstSegment.Identifier); Assert.NotNull(subPathSelect.FilterOption); subPathSelect.FilterOption.Expression.ShouldBeBinaryOperatorNode(BinaryOperatorKind.Equal); }