diff --git a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs
index 87b1c773..580d27a6 100644
--- a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs
+++ b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs
@@ -478,6 +478,11 @@ private bool AppendBoundOperationOnNavigationPropertyPath(IEdmOperation edmOpera
ODataNavigationPropertySegment npSegment = path.Segments.Last(s => s is ODataNavigationPropertySegment) as ODataNavigationPropertySegment;
+ if (!npSegment.NavigationProperty.ContainsTarget)
+ {
+ continue;
+ }
+
bool isLastKeySegment = path.LastSegment is ODataKeySegment;
if (isCollection)
@@ -605,6 +610,11 @@ private bool AppendBoundOperationOnDerivedNavigationPropertyPath(
continue;
}
+ if (!npSegment.NavigationProperty.ContainsTarget)
+ {
+ continue;
+ }
+
bool isLastKeySegment = path.LastSegment is ODataKeySegment;
if (isCollection)
diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs
index 2494b793..fa4f3b62 100644
--- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs
+++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs
@@ -48,7 +48,7 @@ public void GetPathsForGraphBetaModelReturnsAllPaths()
// Assert
Assert.NotNull(paths);
- Assert.Equal(17401, paths.Count());
+ Assert.Equal(13727, paths.Count());
}
[Fact]
@@ -67,7 +67,7 @@ public void GetPathsForGraphBetaModelWithDerivedTypesConstraintReturnsAllPaths()
// Assert
Assert.NotNull(paths);
- Assert.Equal(13730, paths.Count());
+ Assert.Equal(13712, paths.Count());
}
[Fact]
@@ -276,6 +276,80 @@ public void GetPathsWithBoundActionOperationWorks()
Assert.Contains("/Customers({ID})/NS.renew", paths.Select(p => p.GetPathItemName()));
}
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void GetPathsWithBoundActionOperationForContainmentNavigationPropertyPathsWorks(bool containsTarget)
+ {
+ // Arrange
+ string navProp = $@"";
+ string boundAction =
+@"
+
+
+
+
+
+";
+
+ IEdmModel model = GetEdmModel(boundAction, "", navProp);
+ ODataPathProvider provider = new ODataPathProvider();
+ var settings = new OpenApiConvertSettings();
+
+ // Act
+ var paths = provider.GetPaths(model, settings);
+
+ // Assert
+ Assert.NotNull(paths);
+ Assert.Equal(4, paths.Count());
+
+ if (containsTarget)
+ {
+ Assert.Contains("/Customers({ID})/Referral/NS.Ack", paths.Select(p => p.GetPathItemName()));
+ }
+ else
+ {
+ Assert.DoesNotContain("/Customers({ID})/Referral/NS.Ack", paths.Select(p => p.GetPathItemName()));
+ }
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void GetPathsWithBoundFunctionOperationForContainmentNavigationPropertyPathsWorks(bool containsTarget)
+ {
+ // Arrange
+ string navProp = $@"";
+ string boundAction =
+@"
+
+
+
+
+
+";
+
+ IEdmModel model = GetEdmModel(boundAction, "", navProp);
+ ODataPathProvider provider = new ODataPathProvider();
+ var settings = new OpenApiConvertSettings();
+
+ // Act
+ var paths = provider.GetPaths(model, settings);
+
+ // Assert
+ Assert.NotNull(paths);
+ Assert.Equal(4, paths.Count());
+
+ if (containsTarget)
+ {
+ Assert.Contains("/Customers({ID})/Referral/NS.Search()", paths.Select(p => p.GetPathItemName()));
+ }
+ else
+ {
+ Assert.DoesNotContain("/Customers({ID})/Referral/NS.Search()", paths.Select(p => p.GetPathItemName()));
+ }
+ }
+
[Fact]
public void GetPathsWithUnboundOperationImportWorks()
{
@@ -500,7 +574,7 @@ public void GetPathsWithStreamPropertyAndWithEntityHasStreamWorks(bool hasStream
}
}
- private static IEdmModel GetEdmModel(string schemaElement, string containerElement)
+ private static IEdmModel GetEdmModel(string schemaElement, string containerElement, string propertySchema = null)
{
string template = $@"
@@ -509,6 +583,7 @@ private static IEdmModel GetEdmModel(string schemaElement, string containerEleme
+ {propertySchema}
{schemaElement}