From fd9be6b1c39f15fbe01894180e0435ad9bb65527 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 14 Sep 2021 13:22:06 +0300 Subject: [PATCH 1/2] Do not create actions/functions for non-containment nav. props --- .../Edm/ODataPathProvider.cs | 10 ++++++ .../Edm/ODataPathProviderTests.cs | 36 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) 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..aa491192 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,35 @@ public void GetPathsWithBoundActionOperationWorks() Assert.Contains("/Customers({ID})/NS.renew", paths.Select(p => p.GetPathItemName())); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GetPathsWithBoundActionOperationForContainmentNavigationPropertyWorks(bool containsTarget) + { + // Arrange + string navProp = $@""; + IEdmModel model = GetNavPropModel(string.Empty, navProp); + ODataPathProvider provider = new ODataPathProvider(); + var settings = new OpenApiConvertSettings(); + + // Act + var paths = provider.GetPaths(model, settings); + + // Assert + Assert.NotNull(paths); + + if (containsTarget) + { + Assert.Equal(5, paths.Count()); + Assert.Contains("/Root/Referral/NS.Ack", paths.Select(p => p.GetPathItemName())); + } + else + { + Assert.Equal(6, paths.Count()); + Assert.DoesNotContain("/Root/Referral/NS.Ack", paths.Select(p => p.GetPathItemName())); + } + } + [Fact] public void GetPathsWithUnboundOperationImportWorks() { @@ -544,7 +573,7 @@ private static IEdmModel GetInheritanceModel(string annotation) return GetEdmModel(template); } - private static IEdmModel GetNavPropModel(string annotation) + private static IEdmModel GetNavPropModel(string annotation, string propertySchema = null) { string template = $@" @@ -556,6 +585,7 @@ private static IEdmModel GetNavPropModel(string annotation) {annotation} + {propertySchema} From 5673aa4ccef0bac27933df9078672a49482d7e50 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 14 Sep 2021 15:27:09 +0300 Subject: [PATCH 2/2] Add test for Function Operations --- .../Edm/ODataPathProviderTests.cs | 63 ++++++++++++++++--- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs index aa491192..fa4f3b62 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathProviderTests.cs @@ -279,11 +279,20 @@ public void GetPathsWithBoundActionOperationWorks() [Theory] [InlineData(true)] [InlineData(false)] - public void GetPathsWithBoundActionOperationForContainmentNavigationPropertyWorks(bool containsTarget) + public void GetPathsWithBoundActionOperationForContainmentNavigationPropertyPathsWorks(bool containsTarget) { // Arrange string navProp = $@""; - IEdmModel model = GetNavPropModel(string.Empty, navProp); + string boundAction = +@" + + + + + +"; + + IEdmModel model = GetEdmModel(boundAction, "", navProp); ODataPathProvider provider = new ODataPathProvider(); var settings = new OpenApiConvertSettings(); @@ -292,16 +301,52 @@ public void GetPathsWithBoundActionOperationForContainmentNavigationPropertyWork // Assert Assert.NotNull(paths); + Assert.Equal(4, paths.Count()); if (containsTarget) { - Assert.Equal(5, paths.Count()); - Assert.Contains("/Root/Referral/NS.Ack", paths.Select(p => p.GetPathItemName())); + Assert.Contains("/Customers({ID})/Referral/NS.Ack", paths.Select(p => p.GetPathItemName())); } else { - Assert.Equal(6, paths.Count()); - Assert.DoesNotContain("/Root/Referral/NS.Ack", paths.Select(p => p.GetPathItemName())); + 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())); } } @@ -529,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 = $@" @@ -538,6 +583,7 @@ private static IEdmModel GetEdmModel(string schemaElement, string containerEleme + {propertySchema} {schemaElement} @@ -573,7 +619,7 @@ private static IEdmModel GetInheritanceModel(string annotation) return GetEdmModel(template); } - private static IEdmModel GetNavPropModel(string annotation, string propertySchema = null) + private static IEdmModel GetNavPropModel(string annotation) { string template = $@" @@ -585,7 +631,6 @@ private static IEdmModel GetNavPropModel(string annotation, string propertySchem {annotation} - {propertySchema}