Skip to content

Commit fe4a25f

Browse files
committed
fix: default mapping is not being serialized with the correct shape
1 parent 1591007 commit fe4a25f

2 files changed

Lines changed: 50 additions & 6 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public void SerializeAsV32(IOpenApiWriter writer)
5858
if (DefaultMapping != null)
5959
{
6060
writer.WritePropertyName("defaultMapping");
61-
DefaultMapping.SerializeAsV32(writer);
61+
WriteMappingReference(writer, DefaultMapping);
6262
}
6363

6464
// extensions
@@ -79,7 +79,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
7979
if (DefaultMapping != null)
8080
{
8181
writer.WritePropertyName("x-oas-default-mapping");
82-
DefaultMapping.SerializeAsV31(writer);
82+
WriteMappingReference(writer, DefaultMapping);
8383
}
8484

8585
// extensions
@@ -110,13 +110,19 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
110110
// mapping
111111
writer.WriteOptionalMap(OpenApiConstants.Mapping, Mapping, (w, s) =>
112112
{
113-
if (!string.IsNullOrEmpty(s.Reference.ReferenceV3) && s.Reference.ReferenceV3 is not null)
114-
{
115-
w.WriteValue(s.Reference.ReferenceV3);
116-
}
113+
WriteMappingReference(w, s);
117114
});
118115
}
119116

117+
private static void WriteMappingReference(IOpenApiWriter writer, OpenApiSchemaReference schemaReference)
118+
{
119+
var reference = schemaReference.Reference.ReferenceV3;
120+
if (!string.IsNullOrEmpty(reference))
121+
{
122+
writer.WriteValue(reference);
123+
}
124+
}
125+
120126
/// <summary>
121127
/// Serialize <see cref="OpenApiDiscriminator"/> to Open Api v2.0
122128
/// </summary>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Text.Json.Nodes;
5+
using System.Threading.Tasks;
6+
using Xunit;
7+
8+
namespace Microsoft.OpenApi.Tests.Models
9+
{
10+
[Collection("DefaultSettings")]
11+
public class OpenApiDiscriminatorTests
12+
{
13+
[Theory]
14+
[InlineData(OpenApiSpecVersion.OpenApi3_2, "defaultMapping", "Pet", true)]
15+
[InlineData(OpenApiSpecVersion.OpenApi3_2, "defaultMapping", "#/components/schemas/Pet", true)]
16+
[InlineData(OpenApiSpecVersion.OpenApi3_2, "defaultMapping", "Pet", false)]
17+
[InlineData(OpenApiSpecVersion.OpenApi3_1, "x-oas-default-mapping", "Pet", true)]
18+
[InlineData(OpenApiSpecVersion.OpenApi3_1, "x-oas-default-mapping", "#/components/schemas/Pet", true)]
19+
[InlineData(OpenApiSpecVersion.OpenApi3_1, "x-oas-default-mapping", "Pet", false)]
20+
public async Task SerializeDefaultMappingAsReferenceString(OpenApiSpecVersion specVersion, string propertyName, string referenceId, bool useDocument)
21+
{
22+
// Arrange
23+
var document = useDocument ? new OpenApiDocument() : null;
24+
var discriminator = new OpenApiDiscriminator
25+
{
26+
PropertyName = "pet_type",
27+
DefaultMapping = new OpenApiSchemaReference(referenceId, document)
28+
};
29+
30+
// Act
31+
var actual = JsonNode.Parse(await discriminator.SerializeAsJsonAsync(specVersion));
32+
33+
// Assert
34+
Assert.NotNull(actual);
35+
Assert.Equal("#/components/schemas/Pet", actual[propertyName]?.GetValue<string>());
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)