Skip to content

Commit aa90edf

Browse files
authored
Merge pull request #2041 from microsoft/fix/v2-properties-references
fix: v2 references for properties do not work as expected
2 parents b394a47 + ebdbcd8 commit aa90edf

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer)
650650
/// <param name="writer">The open api writer.</param>
651651
/// <param name="parentRequiredProperties">The list of required properties in parent schema.</param>
652652
/// <param name="propertyName">The property name that will be serialized.</param>
653-
internal void SerializeAsV2(
653+
internal virtual void SerializeAsV2(
654654
IOpenApiWriter writer,
655655
ISet<string> parentRequiredProperties,
656656
string propertyName)

src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,22 @@ public override void SerializeAsV3(IOpenApiWriter writer)
227227
writer.GetSettings().LoopDetector.PopLoop<OpenApiSchema>();
228228
}
229229

230+
/// <inheritdoc/>
231+
internal override void SerializeAsV2(
232+
IOpenApiWriter writer,
233+
ISet<string> parentRequiredProperties,
234+
string propertyName)
235+
{
236+
if (!writer.GetSettings().ShouldInlineReference(_reference))
237+
{
238+
_reference.SerializeAsV2(writer);
239+
}
240+
else
241+
{
242+
base.SerializeAsV2(writer, parentRequiredProperties, propertyName);
243+
}
244+
}
245+
230246
/// <inheritdoc/>
231247
public override void SerializeAsV2(IOpenApiWriter writer)
232248
{

test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
using System.Text.Json.Nodes;
1212
using System.Collections.Generic;
1313
using FluentAssertions.Equivalency;
14+
using Microsoft.OpenApi.Models.References;
15+
using Microsoft.OpenApi.Writers;
1416

1517
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
1618
{
@@ -95,5 +97,56 @@ public void ParseSchemaWithEnumShouldSucceed()
9597
.Excluding((IMemberInfo memberInfo) =>
9698
memberInfo.Path.EndsWith("Parent")));
9799
}
100+
[Fact]
101+
public void PropertiesReferenceShouldWork()
102+
{
103+
var workingDocument = new OpenApiDocument()
104+
{
105+
Components = new OpenApiComponents(),
106+
};
107+
const string referenceId = "targetSchema";
108+
var targetSchema = new OpenApiSchema()
109+
{
110+
Type = JsonSchemaType.Object,
111+
Properties = new Dictionary<string, OpenApiSchema>
112+
{
113+
["prop1"] = new OpenApiSchema()
114+
{
115+
Type = JsonSchemaType.String
116+
}
117+
}
118+
};
119+
workingDocument.Components.Schemas.Add(referenceId, targetSchema);
120+
workingDocument.Workspace.RegisterComponents(workingDocument);
121+
var referenceSchema = new OpenApiSchema()
122+
{
123+
Type = JsonSchemaType.Object,
124+
Properties = new Dictionary<string, OpenApiSchema>
125+
{
126+
["propA"] = new OpenApiSchemaReference(referenceId, workingDocument),
127+
}
128+
};
129+
130+
using var textWriter = new StringWriter();
131+
var writer = new OpenApiJsonWriter(textWriter);
132+
referenceSchema.SerializeAsV2(writer);
133+
134+
var json = textWriter.ToString();
135+
var expected = JsonNode.Parse(
136+
"""
137+
{
138+
"type": "object",
139+
"properties":
140+
{
141+
"propA":
142+
{
143+
"$ref": "#/definitions/targetSchema"
144+
}
145+
}
146+
}
147+
"""
148+
);
149+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(json), expected));
150+
}
98151
}
99152
}

0 commit comments

Comments
 (0)