From 039a84c5fffa2205dc515fe95c29f3404eeb2dd3 Mon Sep 17 00:00:00 2001 From: Andrew Omondi Date: Mon, 8 Apr 2024 13:46:11 +0300 Subject: [PATCH] Fixes --- CHANGELOG.md | 6 ++ src/Kiota.Builder/KiotaBuilder.cs | 2 +- .../OpenApiUrlTreeNodeExtensionsTests.cs | 81 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 252974848e..184394a048 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +### Changed + +- Changed URI template generation to reuse templates when required templates are absent across operations. + ## [1.13.0] - 2024-04-04 ### Added diff --git a/src/Kiota.Builder/KiotaBuilder.cs b/src/Kiota.Builder/KiotaBuilder.cs index ce8a3426ae..1f8499d3d6 100644 --- a/src/Kiota.Builder/KiotaBuilder.cs +++ b/src/Kiota.Builder/KiotaBuilder.cs @@ -1290,7 +1290,7 @@ private void CreateOperationMethods(OpenApiUrlTreeNode currentNode, OperationTyp }; var operationUrlTemplate = currentNode.GetUrlTemplate(operationType); if (!operationUrlTemplate.Equals(parentClass.Properties.FirstOrDefault(static x => x.Kind is CodePropertyKind.UrlTemplate)?.DefaultValue?.Trim('"'), StringComparison.Ordinal) - && currentNode.HasRequiredQueryParametersAcrossOperations()) + && currentNode.HasRequiredQueryParametersAcrossOperations())// no need to generate extra strings/templates as optional parameters will have no effect on resolved url. generatorMethod.UrlTemplateOverride = operationUrlTemplate; var mediaTypes = schema switch diff --git a/tests/Kiota.Builder.Tests/Extensions/OpenApiUrlTreeNodeExtensionsTests.cs b/tests/Kiota.Builder.Tests/Extensions/OpenApiUrlTreeNodeExtensionsTests.cs index 0a7030661a..7a0c41f151 100644 --- a/tests/Kiota.Builder.Tests/Extensions/OpenApiUrlTreeNodeExtensionsTests.cs +++ b/tests/Kiota.Builder.Tests/Extensions/OpenApiUrlTreeNodeExtensionsTests.cs @@ -232,12 +232,93 @@ public void DifferentUrlTemplatesPerOperation() } }); var node = OpenApiUrlTreeNode.Create(doc, Label); + Assert.False(node.HasRequiredQueryParametersAcrossOperations()); Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment{?%24select}", node.Children.First().Value.GetUrlTemplate()); Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment{?%24select}", node.Children.First().Value.GetUrlTemplate(OperationType.Get)); Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment", node.Children.First().Value.GetUrlTemplate(OperationType.Put)); // the query parameters will be decoded by a middleware at runtime before the request is executed } [Fact] + public void DifferentUrlTemplatesPerOperationWithRequiredParameter() + { + var doc = new OpenApiDocument + { + Paths = [], + }; + doc.Paths.Add("{param-with-dashes}\\existing-segment", new() + { + Parameters = [ + new() + { + Name = "param-with-dashes", + In = ParameterLocation.Path, + Required = true, + Schema = new() + { + Type = "string" + }, + Style = ParameterStyle.Simple, + }, + ], + Operations = new Dictionary { + { OperationType.Get, new() { + Parameters = [ + + new (){ + Name = "$select", + In = ParameterLocation.Query, + Schema = new () { + Type = "string" + }, + Style = ParameterStyle.Simple, + } + ] + } + }, + { OperationType.Post, new() { + Parameters = [ + + new (){ + Name = "$expand", + In = ParameterLocation.Query, + Schema = new () { + Type = "string" + }, + Style = ParameterStyle.Simple, + } + ] + } + }, + { + OperationType.Put, new() {} + }, + { OperationType.Delete, new() { + Parameters = [ + + new (){ + Name = "id", + In = ParameterLocation.Query, + Schema = new () { + Type = "string" + }, + Style = ParameterStyle.Simple, + Required = true + } + ] + } + }, + } + }); + var node = OpenApiUrlTreeNode.Create(doc, Label); + Assert.True(node.HasRequiredQueryParametersAcrossOperations()); + Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment?id={id}{&%24expand,%24select}", node.Children.First().Value.GetUrlTemplate());//the default contains a combination of everything. + Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment{?%24select}", node.Children.First().Value.GetUrlTemplate(OperationType.Get)); + Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment{?%24expand}", node.Children.First().Value.GetUrlTemplate(OperationType.Post)); + Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment", node.Children.First().Value.GetUrlTemplate(OperationType.Put)); + Assert.Equal("{+baseurl}/{param%2Dwith%2Ddashes}/existing-segment?id={id}", node.Children.First().Value.GetUrlTemplate(OperationType.Delete)); + // the query parameters will be decoded by a middleware at runtime before the request is executed + } + [Fact] public void GeneratesRequiredQueryParametersAndOptionalMixInPathItem() { var doc = new OpenApiDocument