From 32ed80b181747b1306b628f9402b9c9d9594f583 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 24 Jul 2024 23:22:26 +0200 Subject: [PATCH] Fix securityScheme/securityRequirement serialization The security requirement should not use the full serialization of a securityScheme as those are not the same. The securityRequirement only needs the reference to the securityScheme, not the complete object. --- .../Models/OpenApiReference.cs | 7 ------ .../Models/OpenApiSecurityRequirement.cs | 2 +- ...sync_produceTerseOutput=False.verified.txt | 12 ++++++++++ ...Async_produceTerseOutput=True.verified.txt | 1 + .../Models/OpenApiSecurityRequirementTests.cs | 22 +++++++++++++++++++ ...sync_produceTerseOutput=False.verified.txt | 2 +- ...Async_produceTerseOutput=True.verified.txt | 2 +- .../Models/OpenApiSecuritySchemeTests.cs | 5 ----- 8 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs index e366bf10d..37f050473 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs @@ -148,13 +148,6 @@ public void SerializeAsV3(IOpenApiWriter writer) return; } - if (Type == ReferenceType.SecurityScheme) - { - // Write the string as property name - writer.WritePropertyName(ReferenceV3); - return; - } - writer.WriteStartObject(); // $ref diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs index 76728c957..9fe4498e0 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs @@ -50,7 +50,7 @@ public void SerializeAsV3(IOpenApiWriter writer) continue; } - securityScheme.SerializeAsV3(writer); + writer.WritePropertyName(securityScheme.Reference.ReferenceV3); writer.WriteStartArray(); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..d225bb5da --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,12 @@ +{ + "scheme1": [ + "scope1", + "scope2", + "scope3" + ], + "scheme2": [ + "scope4", + "scope5" + ], + "scheme3": [ ] +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..fc86e7424 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.SerializeSecurityRequirementAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"scheme1":["scope1","scope2","scope3"],"scheme2":["scope4","scope5"],"scheme3":[ ]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs index 4c962aaad..9543f6a1a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs @@ -3,9 +3,14 @@ using System; using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading.Tasks; using FluentAssertions; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Writers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models @@ -95,6 +100,23 @@ public void SerializeBasicSecurityRequirementAsV3JsonWorks() actual.Should().Be(expected); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeSecurityRequirementAsV3JsonWorksAsync(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new() { Terse = produceTerseOutput }); + + // Act + SecurityRequirementWithReferencedSecurityScheme.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + [Fact] public void SerializeSecurityRequirementWithReferencedSecuritySchemeAsV3JsonWorks() { diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt index e2f0188e6..5bf57b219 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -1,3 +1,3 @@ { - "sampleSecurityScheme": null + "$ref": "sampleSecurityScheme" } \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt index d74ff6ddf..04a9d3e76 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.SerializeReferencedSecuritySchemeAsV3JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"sampleSecurityScheme":null} \ No newline at end of file +{"$ref":"sampleSecurityScheme"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs index 5df97e135..aec0489b1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs @@ -314,12 +314,7 @@ public async Task SerializeReferencedSecuritySchemeAsV3JsonWorksAsync(bool produ var writer = new OpenApiJsonWriter(outputStringWriter, new() { Terse = produceTerseOutput }); // Act - // Add dummy start object, value, and end object to allow SerializeAsV3 to output security scheme - // as property name. - writer.WriteStartObject(); ReferencedSecurityScheme.SerializeAsV3(writer); - writer.WriteNull(); - writer.WriteEndObject(); writer.Flush(); // Assert