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}