From 598f2b6962695fd05a15cf1b49dde622cd309479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Canales=20Mart=C3=ADn?= Date: Thu, 18 Jul 2024 17:32:50 +0200 Subject: [PATCH 1/2] Create test for bug --- .../Services/OpenApiServiceTests.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs index 7314da8ab..e092a1c43 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs @@ -65,6 +65,46 @@ public async Task ReturnFilteredOpenApiDocBasedOnOperationIdsAndInputCsdlDocumen Assert.Equal(expectedPathCount, subsetOpenApiDocument.Paths.Count); } + [Fact] + public void CreateFilteredDocumentOnMinimalOpenApi() + { + // Arrange + + // We create a minimal OpenApiDocument with a single path and operation. + var openApiDoc = new OpenApiDocument + { + Info = new() + { + Title = "Test", + Version = "1.0.0" + }, + Paths = new() + { + ["/test"] = new OpenApiPathItem() + { + Operations = new Dictionary + { + [OperationType.Get] = new OpenApiOperation() + } + } + } + }; + + // Act + var requestUrls = new Dictionary>() + { + { "/test", ["GET"] } + }; + var filterPredicate = OpenApiFilterService.CreatePredicate(null, null, requestUrls, openApiDoc); + var filteredDocument = OpenApiFilterService.CreateFilteredDocument(openApiDoc, filterPredicate); + + // Assert + Assert.NotNull(filteredDocument); + Assert.NotNull(filteredDocument.Paths); + Assert.Single(filteredDocument.Paths); + } + + [Theory] [InlineData("UtilityFiles/appsettingstest.json")] [InlineData(null)] From 691d99d99b9db22fe0e8e96a5c639601cb70a718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Canales=20Mart=C3=ADn?= Date: Thu, 18 Jul 2024 17:36:17 +0200 Subject: [PATCH 2/2] Add null check to OpenApiDocument.Components Without a null check this method will fail if the optional components field is missing. --- src/Microsoft.OpenApi/Services/OpenApiFilterService.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs b/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs index fa1b9911e..92051949b 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiFilterService.cs @@ -61,6 +61,10 @@ public static class OpenApiFilterService public static OpenApiDocument CreateFilteredDocument(OpenApiDocument source, Func predicate) { // Fetch and copy title, graphVersion and server info from OpenApiDoc + var components = source.Components is null + ? null + : new OpenApiComponents() { SecuritySchemes = source.Components.SecuritySchemes }; + var subset = new OpenApiDocument { Info = new() @@ -74,7 +78,7 @@ public static OpenApiDocument CreateFilteredDocument(OpenApiDocument source, Fun Extensions = source.Info.Extensions }, - Components = new() { SecuritySchemes = source.Components.SecuritySchemes }, + Components = components, SecurityRequirements = source.SecurityRequirements, Servers = source.Servers };