Skip to content

Commit 1aeb913

Browse files
authored
Merge pull request #2931 from microsoft/fix/default-mapping-serialization
fix/default mapping serialization
2 parents 1591007 + 2a6ebec commit 1aeb913

2 files changed

Lines changed: 86 additions & 8 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs

Lines changed: 11 additions & 8 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
@@ -108,13 +108,16 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
108108
writer.WriteProperty(OpenApiConstants.PropertyName, PropertyName);
109109

110110
// mapping
111-
writer.WriteOptionalMap(OpenApiConstants.Mapping, Mapping, (w, s) =>
111+
writer.WriteOptionalMap(OpenApiConstants.Mapping, Mapping, WriteMappingReference);
112+
}
113+
114+
private static void WriteMappingReference(IOpenApiWriter writer, OpenApiSchemaReference schemaReference)
115+
{
116+
var reference = schemaReference.Reference.ReferenceV3;
117+
if (!string.IsNullOrEmpty(reference))
112118
{
113-
if (!string.IsNullOrEmpty(s.Reference.ReferenceV3) && s.Reference.ReferenceV3 is not null)
114-
{
115-
w.WriteValue(s.Reference.ReferenceV3);
116-
}
117-
});
119+
writer.WriteValue(reference!);
120+
}
118121
}
119122

120123
/// <summary>
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.Text.Json.Nodes;
6+
using System.Threading.Tasks;
7+
using Xunit;
8+
9+
namespace Microsoft.OpenApi.Tests.Models
10+
{
11+
[Collection("DefaultSettings")]
12+
public class OpenApiDiscriminatorTests
13+
{
14+
[Theory]
15+
[InlineData(OpenApiSpecVersion.OpenApi3_2, "defaultMapping", "Pet", true)]
16+
[InlineData(OpenApiSpecVersion.OpenApi3_2, "defaultMapping", "#/components/schemas/Pet", true)]
17+
[InlineData(OpenApiSpecVersion.OpenApi3_2, "defaultMapping", "Pet", false)]
18+
[InlineData(OpenApiSpecVersion.OpenApi3_1, "x-oas-default-mapping", "Pet", true)]
19+
[InlineData(OpenApiSpecVersion.OpenApi3_1, "x-oas-default-mapping", "#/components/schemas/Pet", true)]
20+
[InlineData(OpenApiSpecVersion.OpenApi3_1, "x-oas-default-mapping", "Pet", false)]
21+
public async Task SerializeDefaultMappingAsReferenceString(OpenApiSpecVersion specVersion, string propertyName, string referenceId, bool useDocument)
22+
{
23+
// Arrange
24+
var document = useDocument ? new OpenApiDocument() : null;
25+
var discriminator = new OpenApiDiscriminator
26+
{
27+
PropertyName = "pet_type",
28+
DefaultMapping = new OpenApiSchemaReference(referenceId, document)
29+
};
30+
31+
// Act
32+
var actual = JsonNode.Parse(await discriminator.SerializeAsJsonAsync(specVersion));
33+
34+
// Assert
35+
Assert.NotNull(actual);
36+
Assert.Equal("#/components/schemas/Pet", actual[propertyName]?.GetValue<string>());
37+
}
38+
39+
[Theory]
40+
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
41+
[InlineData(OpenApiSpecVersion.OpenApi3_1)]
42+
[InlineData(OpenApiSpecVersion.OpenApi3_2)]
43+
public async Task SerializeMappingValuesAsReferenceStrings(OpenApiSpecVersion specVersion)
44+
{
45+
// Arrange
46+
var document = new OpenApiDocument();
47+
var discriminator = new OpenApiDiscriminator
48+
{
49+
PropertyName = "pet_type",
50+
Mapping = new Dictionary<string, OpenApiSchemaReference>
51+
{
52+
["simple"] = new OpenApiSchemaReference("Pet", document),
53+
["explicit"] = new OpenApiSchemaReference("#/components/schemas/Pet", document),
54+
["noDocument"] = new OpenApiSchemaReference("Pet")
55+
}
56+
};
57+
58+
// Act
59+
var actual = JsonNode.Parse(await discriminator.SerializeAsJsonAsync(specVersion));
60+
61+
// Assert
62+
Assert.NotNull(actual);
63+
var mapping = Assert.IsAssignableFrom<JsonObject>(actual["mapping"]);
64+
AssertMappingValue(mapping, "simple");
65+
AssertMappingValue(mapping, "explicit");
66+
AssertMappingValue(mapping, "noDocument");
67+
}
68+
69+
private static void AssertMappingValue(JsonObject mapping, string key)
70+
{
71+
var value = Assert.IsAssignableFrom<JsonValue>(mapping[key]);
72+
Assert.Equal("#/components/schemas/Pet", value.GetValue<string>());
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)