Skip to content

Commit

Permalink
Fix issue in finding navigation target for type segment present in OD…
Browse files Browse the repository at this point in the history
…ata path (#2690)
  • Loading branch information
gathogojr committed Jun 21, 2023
1 parent 22b8a0a commit dac1c85
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/Microsoft.OData.Core/EdmExtensionMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,14 @@ public static IEdmNavigationSource FindNavigationTarget(this IEdmNavigationSourc
}
}

return new UnknownEntitySet(navigationSource, navigationProperty);
if (typeof(IEdmUnknownEntitySet).IsAssignableFrom(navigationSource.GetType()))
{
return new UnknownEntitySet(navigationSource, navigationProperty);
}
else
{
return navigationSource.FindNavigationTarget(navigationProperty);
}
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,59 @@ public void MaxExpandCountSettingShouldBeEnforced()
parse.Throws<ODataException>(ODataErrorStrings.UriParser_ExpandCountExceeded(2, 1));
}

[Theory]
[InlineData("NS.Models.Menu", "NS.Models.ExtendedMenu/Panels")]
[InlineData("NS.Models.ExtendedMenu", "Panels")]
public void ExpectedNavigationSourceIsResolvedForExpandedNonContainedNavigationPropertyDeclaredOnDerivedType(string targetEdmType, string expand)
{
// Arrange
var model = new EdmModel();

var menuType = new EdmEntityType("NS.Models", "Menu");
menuType.AddKeys(menuType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));
var panelType = new EdmEntityType("NS.Models", "Panel");
panelType.AddKeys(panelType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));

var extendedMenuType = new EdmEntityType("NS.Models", "ExtendedMenu", menuType);
var extendedPanelType = new EdmEntityType("NS.Models", "ExtendedPanel", panelType);

model.AddElement(menuType);
model.AddElement(panelType);
model.AddElement(extendedMenuType);
model.AddElement(extendedPanelType);

var panelsNavigationProperty = extendedMenuType.AddUnidirectionalNavigation(
new EdmNavigationPropertyInfo
{
Name = "Panels",
Target = panelType,
TargetMultiplicity = EdmMultiplicity.Many
});

var entityContainer = model.AddEntityContainer("Default", "Container");

var menusEntitySet = entityContainer.AddEntitySet("Menus", menuType);
var panelsEntitySet = entityContainer.AddEntitySet("Panels", panelType);

menusEntitySet.AddNavigationTarget(panelsNavigationProperty, panelsEntitySet);

var queryOptionsParser = new ODataQueryOptionParser(
model: model,
targetEdmType: model.FindDeclaredType(targetEdmType),
targetNavigationSource: menusEntitySet,
queryOptions: new Dictionary<string, string> { { "$expand", expand } },
null);

// Act
var selectAndExpand = queryOptionsParser.ParseSelectAndExpand();

// Assert
Assert.NotNull(selectAndExpand);
var selectedItem = Assert.Single(selectAndExpand.SelectedItems);
var expandedNavigationSelectItem = Assert.IsType<ExpandedNavigationSelectItem>(selectedItem);
Assert.Equal(expandedNavigationSelectItem.NavigationSource, panelsEntitySet);
}

#endregion

#region Interesting $expand with other options scenarios
Expand Down

0 comments on commit dac1c85

Please sign in to comment.