From ad565cfeb8349c051ba970ad04ebe58c6ed4c625 Mon Sep 17 00:00:00 2001 From: Andrea Peruffo Date: Wed, 28 Jun 2023 18:39:08 +0100 Subject: [PATCH 1/2] Python|Ruby - Fix query parameter mapper generation --- .../Refiners/CommonLanguageRefiner.cs | 1 - src/Kiota.Builder/Refiners/PythonRefiner.cs | 1 + src/Kiota.Builder/Refiners/RubyRefiner.cs | 1 + .../GenerateSample.cs | 27 ++++++++++ .../GeneratesQueryMappers.yaml | 18 +++++++ .../Kiota.Builder.IntegrationTests.csproj | 3 ++ .../Refiners/PythonLanguageRefinerTests.cs | 26 ++++++++++ .../Refiners/RubyLanguageRefinerTests.cs | 50 +++++++++++++++++++ 8 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 tests/Kiota.Builder.IntegrationTests/GeneratesQueryMappers.yaml diff --git a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs index 2f72ac828d..bc6775f615 100644 --- a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs +++ b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs @@ -192,7 +192,6 @@ protected static void ReplacePropertyNames(CodeElement current, HashSet s.ToSnakeCase()); AddParentClassToErrorClasses( diff --git a/src/Kiota.Builder/Refiners/RubyRefiner.cs b/src/Kiota.Builder/Refiners/RubyRefiner.cs index 82245da615..8b0059894b 100644 --- a/src/Kiota.Builder/Refiners/RubyRefiner.cs +++ b/src/Kiota.Builder/Refiners/RubyRefiner.cs @@ -61,6 +61,7 @@ public override Task Refine(CodeNamespace generatedCode, CancellationToken cance ReplacePropertyNames(generatedCode, new() { CodePropertyKind.Custom, + CodePropertyKind.QueryParameter, }, static s => s.ToSnakeCase()); AddParentClassToErrorClasses( diff --git a/tests/Kiota.Builder.IntegrationTests/GenerateSample.cs b/tests/Kiota.Builder.IntegrationTests/GenerateSample.cs index 6ef8f9aa69..45469579a1 100644 --- a/tests/Kiota.Builder.IntegrationTests/GenerateSample.cs +++ b/tests/Kiota.Builder.IntegrationTests/GenerateSample.cs @@ -136,4 +136,31 @@ public async Task GeneratesIdiomaticChildrenNames(GenerationLanguage language) Assert.Empty(Directory.GetFiles(OutputPath, "*_*", SearchOption.AllDirectories)); } + [InlineData(GenerationLanguage.Python)] + [InlineData(GenerationLanguage.Ruby)] + [Theory] + public async Task GeneratesQueryParametersMapper(GenerationLanguage language) + { + var logger = LoggerFactory.Create(builder => + { + }).CreateLogger(); + + var OutputPath = $".\\Generated\\GeneratesQueryParametersMapper\\{language}"; + var configuration = new GenerationConfiguration + { + Language = language, + OpenAPIFilePath = "GeneratesQueryMappers.yaml", + OutputPath = OutputPath, + CleanOutput = true, + }; + await new KiotaBuilder(logger, configuration, _httpClient).GenerateClientAsync(new()); + + var fullText = ""; + foreach (var file in Directory.GetFiles(OutputPath, "*.*", SearchOption.AllDirectories)) + { + fullText += File.ReadAllText(file); + } + + Assert.Contains("get_query_parameter", fullText); + } } diff --git a/tests/Kiota.Builder.IntegrationTests/GeneratesQueryMappers.yaml b/tests/Kiota.Builder.IntegrationTests/GeneratesQueryMappers.yaml new file mode 100644 index 0000000000..fdafa323cd --- /dev/null +++ b/tests/Kiota.Builder.IntegrationTests/GeneratesQueryMappers.yaml @@ -0,0 +1,18 @@ +openapi: 3.0.0 +info: + title: Test + version: 1.0.0 + description: something +paths: + /api/something/v1: + get: + parameters: + - name: "ifExists" + schema: + type: boolean + in: "query" + responses: + "200": + description: "something" + content: + application/json: {} diff --git a/tests/Kiota.Builder.IntegrationTests/Kiota.Builder.IntegrationTests.csproj b/tests/Kiota.Builder.IntegrationTests/Kiota.Builder.IntegrationTests.csproj index 244a86f0a5..e28d4da543 100644 --- a/tests/Kiota.Builder.IntegrationTests/Kiota.Builder.IntegrationTests.csproj +++ b/tests/Kiota.Builder.IntegrationTests/Kiota.Builder.IntegrationTests.csproj @@ -46,6 +46,9 @@ PreserveNewest + + PreserveNewest + \ No newline at end of file diff --git a/tests/Kiota.Builder.Tests/Refiners/PythonLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/PythonLanguageRefinerTests.cs index c2b749358e..f41bec9f49 100644 --- a/tests/Kiota.Builder.Tests/Refiners/PythonLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/PythonLanguageRefinerTests.cs @@ -63,6 +63,32 @@ public async Task AddsQueryParameterMapperMethod() Assert.Single(model.Methods.Where(x => x.IsOfKind(CodeMethodKind.QueryParametersMapper))); } [Fact] + public async Task AddsQueryParameterMapperMethodAfterMangling() + { + var model = graphNS.AddClass(new CodeClass + { + Name = "somemodel", + Kind = CodeClassKind.QueryParameters, + }).First(); + + model.AddProperty(new CodeProperty + { + Name = "ifExists", + Type = new CodeType + { + Name = "string" + }, + Kind = CodePropertyKind.QueryParameter + }); + + Assert.Empty(model.Methods); + + await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.Python }, graphNS); + Assert.Single(model.Properties.Where(x => x.Name.Equals("if_exists"))); + Assert.Single(model.Properties.Where(x => x.IsNameEscaped)); + Assert.Single(model.Methods.Where(x => x.IsOfKind(CodeMethodKind.QueryParametersMapper))); + } + [Fact] public async Task AddsExceptionInheritanceOnErrorClasses() { var model = root.AddClass(new CodeClass diff --git a/tests/Kiota.Builder.Tests/Refiners/RubyLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/RubyLanguageRefinerTests.cs index 426345a667..5faa51b23f 100644 --- a/tests/Kiota.Builder.Tests/Refiners/RubyLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/RubyLanguageRefinerTests.cs @@ -249,5 +249,55 @@ public async Task ShortensLongNamespaceNames() Assert.NotNull(root.FindNamespaceByName($"{graphNS.Name}.i7f5f9550ce583c5b890fd039add74646312e8d1fcdadf26872765e05988073b0")); Assert.Equal($"{graphNS.Name}.i7f5f9550ce583c5b890fd039add74646312e8d1fcdadf26872765e05988073b0", subNS.Name); } + [Fact] + public async Task AddsQueryParameterMapperMethod() + { + var model = graphNS.AddClass(new CodeClass + { + Name = "somemodel", + Kind = CodeClassKind.QueryParameters, + }).First(); + + model.AddProperty(new CodeProperty + { + Name = "Select", + SerializationName = "%24select", + Type = new CodeType + { + Name = "string" + }, + }); + + Assert.Empty(model.Methods); + + await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.Ruby }, graphNS); + Assert.Single(model.Methods.Where(x => x.IsOfKind(CodeMethodKind.QueryParametersMapper))); + } + [Fact] + public async Task AddsQueryParameterMapperMethodAfterMangling() + { + var model = graphNS.AddClass(new CodeClass + { + Name = "somemodel", + Kind = CodeClassKind.QueryParameters, + }).First(); + + model.AddProperty(new CodeProperty + { + Name = "ifExists", + Type = new CodeType + { + Name = "string" + }, + Kind = CodePropertyKind.QueryParameter + }); + + Assert.Empty(model.Methods); + + await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.Ruby }, graphNS); + Assert.Single(model.Properties.Where(x => x.Name.Equals("if_exists"))); + Assert.Single(model.Properties.Where(x => x.IsNameEscaped)); + Assert.Single(model.Methods.Where(x => x.IsOfKind(CodeMethodKind.QueryParametersMapper))); + } #endregion } From 5db305b17361ce3f7570929b961dccdbae1e3516 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 28 Jun 2023 16:35:03 -0400 Subject: [PATCH 2/2] - adds changelog entry for query parameters normalization fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b0c7265d3..a6d882b246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Fixed an issue with query parameter name normalization in Ruby and Python. [#2825](https://github.com/microsoft/kiota/issues/2825) - Deprecated Visual Studio OpenAPI reference packages. - Fixes a bug where a stackoverflow exception occurs when inlined schemas have self-references [2656](https://github.com/microsoft/kiota/issues/2656) - Fixes nil safety while type casting values in collections in Go