Skip to content

Commit 4ecd027

Browse files
committed
Add child schema format to parent schema when serializing as V2
1 parent 9c296e1 commit 4ecd027

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,12 @@ internal void WriteAsSchemaProperties(
707707
// oneOf (Not Supported in V2) - Write the first schema only as an allOf.
708708
writer.WriteOptionalCollection(OpenApiConstants.AllOf, OneOf?.Take(1), (w, s) => s.SerializeAsV2(w));
709709
}
710+
if (OneOf?.Count > 0)
711+
{
712+
// Take the format and set it at the root
713+
var oneOfFormat = OneOf.Select<OpenApiSchema, string>(x => x.Format.ToString()).FirstOrDefault();
714+
this.Format = oneOfFormat;
715+
}
710716
}
711717

712718
// properties

test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,5 +422,68 @@ public async Task SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync(bool prod
422422
// Assert
423423
await Verifier.Verify(actual).UseParameters(produceTerseOutput);
424424
}
425+
426+
[Fact]
427+
public void SerializeSchemaPrimitiveTypeShouldRemoveFormatInRootIfPresentInChildrenSchema()
428+
{
429+
// Arrange
430+
var schema = new OpenApiSchema()
431+
{
432+
OneOf = new List<OpenApiSchema>
433+
{
434+
new OpenApiSchema
435+
{
436+
Type = "number",
437+
Format = "decimal"
438+
},
439+
new OpenApiSchema { Type = "string" },
440+
}
441+
};
442+
443+
var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture);
444+
var openApiJsonWriter = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = false });
445+
446+
// Act
447+
// Serialize as V2
448+
schema.SerializeAsV2(openApiJsonWriter);
449+
openApiJsonWriter.Flush();
450+
451+
var v2Schema = outputStringWriter.GetStringBuilder().ToString();//.Replace(Environment.NewLine, "").Replace(" ", "").Replace("\n","");
452+
453+
// Serialize as V3
454+
//schema.SerializeAsV3(openApiJsonWriter);
455+
//openApiJsonWriter.Flush();
456+
457+
//var v3Schema = outputStringWriter.GetStringBuilder().ToString();//.Replace(Environment.NewLine, "").Replace(" ", "").Replace("\n", "");
458+
459+
var expectedV2Schema = @"{
460+
""allOf"": [
461+
{
462+
""format"": ""decimal"",
463+
""type"": ""number""
464+
}],
465+
""format"": ""decimal""
466+
}".Replace(Environment.NewLine, "").Replace(" ", "").Replace("\n","");
467+
468+
469+
var expectedV3Schema = @"{
470+
""allOf"": [
471+
{
472+
""format"": ""decimal"",
473+
""type"": ""number""
474+
}]}
475+
{""oneOf"": [
476+
{
477+
""type"": ""number"",
478+
""format"": ""decimal""
479+
},
480+
{""type"" : ""string""}
481+
482+
]}}";//.Replace(Environment.NewLine, "").Replace(" ", "").Replace("\n", "");
483+
484+
// Assert
485+
Assert.Equal(expectedV2Schema, v2Schema); // Assert that v2 schema has the root schema Format defined
486+
//Assert.Equal(expectedV3Schema, v3Schema);
487+
}
425488
}
426489
}

0 commit comments

Comments
 (0)