From bd19a685d2493f1cd928442ed0c8f5bf7a969c37 Mon Sep 17 00:00:00 2001 From: mosborn Date: Tue, 18 Feb 2020 12:14:04 -0800 Subject: [PATCH] Fixes #458 --- src/Microsoft.OpenApi/Models/OpenApiResponse.cs | 13 ++++++++++++- .../Models/OpenApiResponseTests.cs | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index 569eee5ca..bc2e4e525 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -124,6 +124,8 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) // description writer.WriteRequiredProperty(OpenApiConstants.Description, Description); + var extensionsClone = new Dictionary(Extensions); + if (Content != null) { var mediatype = Content.FirstOrDefault(); @@ -152,6 +154,15 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } + + writer.WriteExtensions(mediatype.Value.Extensions, OpenApiSpecVersion.OpenApi2_0); + + foreach (var key in mediatype.Value.Extensions.Keys) + { + // The extension will already have been serialized as part of the call above, + // so remove it from the cloned collection so we don't write it again. + extensionsClone.Remove(key); + } } } @@ -159,7 +170,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteOptionalMap(OpenApiConstants.Headers, Headers, (w, h) => h.SerializeAsV2(w)); // extension - writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi2_0); + writer.WriteExtensions(extensionsClone, OpenApiSpecVersion.OpenApi2_0); writer.WriteEndObject(); } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs index 93ed45b60..9b86a6d51 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs @@ -1,11 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Collections.Generic; using System.Globalization; using System.IO; using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Writers; using Xunit; @@ -33,7 +35,11 @@ public class OpenApiResponseTests Reference = new OpenApiReference {Type = ReferenceType.Schema, Id = "customType"} } }, - Example = new OpenApiString("Blabla") + Example = new OpenApiString("Blabla"), + Extensions = new Dictionary + { + ["myextension"] = new OpenApiString("myextensionvalue"), + }, } }, Headers = @@ -158,7 +164,8 @@ public void SerializeAdvancedResponseAsV3JsonWorks() ""$ref"": ""#/components/schemas/customType"" } }, - ""example"": ""Blabla"" + ""example"": ""Blabla"", + ""myextension"": ""myextensionvalue"" } } }"; @@ -193,7 +200,8 @@ public void SerializeAdvancedResponseAsV3YamlWorks() type: array items: $ref: '#/components/schemas/customType' - example: Blabla"; + example: Blabla + myextension: myextensionvalue"; // Act var actual = AdvancedResponse.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); @@ -219,6 +227,7 @@ public void SerializeAdvancedResponseAsV2JsonWorks() ""examples"": { ""text/plain"": ""Blabla"" }, + ""myextension"": ""myextensionvalue"", ""headers"": { ""X-Rate-Limit-Limit"": { ""description"": ""The number of allowed requests in the current period"", @@ -252,6 +261,7 @@ public void SerializeAdvancedResponseAsV2YamlWorks() $ref: '#/definitions/customType' examples: text/plain: Blabla +myextension: myextensionvalue headers: X-Rate-Limit-Limit: description: The number of allowed requests in the current period