diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 250254212..540664ae5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; @@ -110,7 +111,7 @@ public void SerializeAsV31(IOpenApiWriter writer) // however if they have cycles, then we will need a component rendered if (writer.GetSettings().InlineLocalReferences) { - RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer)); + RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer), OpenApiSpecVersion.OpenApi3_1); return; } @@ -148,7 +149,7 @@ public void SerializeAsV3(IOpenApiWriter writer) // however if they have cycles, then we will need a component rendered if (writer.GetSettings().InlineLocalReferences) { - RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer)); + RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer), OpenApiSpecVersion.OpenApi3_0); return; } @@ -315,7 +316,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version writer.WriteEndObject(); } - private void RenderComponents(IOpenApiWriter writer, Action callback) + private void RenderComponents(IOpenApiWriter writer, Action callback, OpenApiSpecVersion version) { var loops = writer.GetSettings().LoopDetector.Loops; writer.WriteStartObject(); @@ -323,6 +324,19 @@ private void RenderComponents(IOpenApiWriter writer, Action + { + if (version is OpenApiSpecVersion.OpenApi3_1) + component.SerializeAsV31(writer); + component.SerializeAsV3(writer); + }); + } writer.WriteEndObject(); } diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index da64a0482..e1d0e3752 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -1,4 +1,4 @@ - + net8.0 false @@ -51,6 +51,10 @@ PreserveNewest + + PreserveNewest + + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index 75ad6d086..6c3498007 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -2179,5 +2179,48 @@ public void SerializeAsThrowsIfVersionIsNotSupported() Assert.Equal("version", actual.ParamName); Assert.Equal(version, actual.ActualValue); } + + [Fact] + public async Task SerializeDocWithSecuritySchemeWithInlineRefererencesWorks() + { + var expected = @"openapi: 3.0.4 +info: + title: Repair Service + version: 1.0.0 +servers: + - url: https://pluginrentu.azurewebsites.net/api +paths: + /repairs: + get: + summary: List all repairs with oauth + description: Returns a list of repairs with their details and images + operationId: listRepairs + responses: + '200': + description: A list of repairs + content: + application/json: + schema: + type: object + security: + - oAuth2AuthCode: [ ] +components: + securitySchemes: + oAuth2AuthCode: + type: oauth2 + description: OAuth configuration for the repair service + flows: + authorizationCode: + authorizationUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/authorize + tokenUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/token + scopes: + api://a2a7226d-e8d1-4ded-8c53-dd4c136ff456/repairs_read: Read repair records"; + + var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithSecurityScheme.yaml", SettingsFixture.ReaderSettings)).Document; + var stringWriter = new StringWriter(); + doc.SerializeAsV3(new OpenApiYamlWriter(stringWriter, new OpenApiWriterSettings { InlineLocalReferences = true })); + var actual = stringWriter.ToString(); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml new file mode 100644 index 000000000..ee888cb2c --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithSecurityScheme.yaml @@ -0,0 +1,32 @@ +openapi: 3.0.0 +info: + title: Repair Service + version: 1.0.0 +servers: + - url: https://pluginrentu.azurewebsites.net/api +components: + securitySchemes: + oAuth2AuthCode: + type: oauth2 + description: OAuth configuration for the repair service + flows: + authorizationCode: + authorizationUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/authorize + tokenUrl: https://login.microsoftonline.com/2f13b28c-bd4d-43e2-8ae6-48594aaba125/oauth2/v2.0/token + scopes: + api://a2a7226d-e8d1-4ded-8c53-dd4c136ff456/repairs_read: Read repair records +paths: + /repairs: + get: + operationId: listRepairs + summary: List all repairs with oauth + description: Returns a list of repairs with their details and images + security: + - oAuth2AuthCode: [] + responses: + '200': + description: A list of repairs + content: + application/json: + schema: + type: object \ No newline at end of file