diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj
index 120210fb0..377f67995 100644
--- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj
+++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj
@@ -9,7 +9,7 @@
enable
hidi
./../../artifacts
- 1.4.9
+ 1.4.10
OpenAPI.NET CLI tool for slicing OpenAPI documents
true
diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
index 703291eb4..eb0ee6b12 100644
--- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
+++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
@@ -3,7 +3,7 @@
netstandard2.0
Latest
true
- 1.6.21
+ 1.6.22
.NET models with JSON and YAML writers for OpenAPI specification
true
diff --git a/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs b/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs
index fcc2af0b2..bd351ce0e 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs
@@ -112,7 +112,10 @@ public static OpenApiDocument CreateFilteredDocument(OpenApiDocument source, Fun
{
foreach (var parameter in result.Parameters)
{
- pathItem.Parameters.Add(parameter);
+ if (!pathItem.Parameters.Contains(parameter))
+ {
+ pathItem.Parameters.Add(parameter);
+ }
}
}
}
diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
index f91d0db93..ebb863461 100644
--- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
+++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
+// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using Microsoft.Extensions.Logging;
@@ -105,6 +105,57 @@ public void TestPredicateFiltersUsingRelativeRequestUrls()
Assert.False(predicate("/foo", OperationType.Patch, null));
}
+ [Fact]
+ public void CreateFilteredDocumentUsingPredicateFromRequestUrl()
+ {
+ // Arrange
+ var openApiDocument = new OpenApiDocument
+ {
+ Info = new() { Title = "Test", Version = "1.0" },
+ Servers = new List { new() { Url = "https://localhost/" } },
+ Paths = new()
+ {
+ ["/test/{id}"] = new()
+ {
+ Operations = new Dictionary
+ {
+ { OperationType.Get, new() },
+ { OperationType.Patch, new() }
+ },
+ Parameters = new List
+ {
+ new()
+ {
+ Name = "id",
+ In = ParameterLocation.Path,
+ Required = true,
+ Schema = new()
+ {
+ Type = "string"
+ }
+ }
+ }
+ }
+
+
+ }
+ };
+
+ var requestUrls = new Dictionary>
+ {
+ {"/test/{id}", new List {"GET","PATCH"}}
+ };
+
+ // Act
+ var predicate = OpenApiFilterService.CreatePredicate(requestUrls: requestUrls, source: openApiDocument);
+ var subsetDoc = OpenApiFilterService.CreateFilteredDocument(openApiDocument, predicate);
+
+ // Assert that there's only 1 parameter in the subset document
+ Assert.NotNull(subsetDoc);
+ Assert.NotEmpty(subsetDoc.Paths);
+ Assert.Single(subsetDoc.Paths.First().Value.Parameters);
+ }
+
[Fact]
public void ShouldParseNestedPostmanCollection()
{