From 7d7856db91d037b5c32906197eda8e4ae2645bac Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 20 Oct 2025 10:52:19 -0400 Subject: [PATCH 1/2] tests: adds a unit test to validate empty defaults are serialized Signed-off-by: Vincent Biret --- .../V31Tests/OpenApiSchemaTests.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 72fb153dd..c992f6656 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -315,6 +315,40 @@ public void CloningSchemaWithExamplesAndEnumsShouldSucceed() Assert.Equivalent(6, clone.Default.GetValue()); } + [Fact] + public void DefaultEmptyCollectionShouldRoundTrip() + { + // Given + var serializedSchema = + """ + { + "type": "array", + "items": { + "type": "string", + "default": [] + } + } + """; + using var textWriter = new StringWriter(); + var writer = new OpenApiJsonWriter(textWriter); + + // When + var schema = OpenApiModelFactory.Parse(serializedSchema, OpenApiSpecVersion.OpenApi3_1, new(), out _, "json", SettingsFixture.ReaderSettings); + + var deserializedArray = Assert.IsType(schema.Items.Default); + Assert.Empty(deserializedArray); + + schema.SerializeAsV31(writer); + var roundTrippedSchema = textWriter.ToString(); + + // Then + var parsedResult = JsonNode.Parse(roundTrippedSchema); + var parsedExpected = JsonNode.Parse(serializedSchema); + Assert.True(JsonNode.DeepEquals(parsedExpected, parsedResult)); + var resultingArray = Assert.IsType(parsedResult["items"]?["default"]); + Assert.Empty(resultingArray); + } + [Fact] public async Task SerializeV31SchemaWithMultipleTypesAsV3Works() { From 4c4d257c0cf10d1742fae9f3961e4a6242c0ce1d Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 20 Oct 2025 10:58:41 -0400 Subject: [PATCH 2/2] fix: a bug where empty collections would not be serialized for default values Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs index f2e4aa5a9..f346dddc4 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs @@ -141,9 +141,9 @@ public static void WriteOptionalObject( { if (value != null) { - if (value is IEnumerable values && !values.GetEnumerator().MoveNext()) + if (value is IEnumerable values && value is not JsonArray && !values.GetEnumerator().MoveNext()) { - return; // Don't render optional empty collections + return; // Don't render optional empty collections except for the Default properties which are JsonArray } writer.WriteRequiredObject(name, value, action);