Skip to content

Commit 3d07756

Browse files
authored
Merge pull request #2744 from microsoft/copilot/fix-openapi-schema-issue
fix(library): serialize additionalProperties schema in OpenAPI V2 documents
2 parents 404d106 + f3165fa commit 3d07756

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -790,9 +790,15 @@ private void SerializeAsV2(
790790
});
791791

792792
// additionalProperties
793-
// a schema cannot be serialized in v2
794793
// true is the default, no need to write it out
795-
if (!AdditionalPropertiesAllowed)
794+
if (AdditionalProperties is not null)
795+
{
796+
writer.WriteOptionalObject(
797+
OpenApiConstants.AdditionalProperties,
798+
AdditionalProperties,
799+
(w, s) => s.SerializeAsV2(w));
800+
}
801+
else if (!AdditionalPropertiesAllowed)
796802
{
797803
writer.WriteProperty(OpenApiConstants.AdditionalProperties, AdditionalPropertiesAllowed);
798804
}

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -718,9 +718,9 @@ public async Task SerializeConstAsEnumV20()
718718
}
719719

720720
[Fact]
721-
public async Task SerializeAdditionalPropertiesAsV2DoesNotEmit()
721+
public async Task SerializeAdditionalPropertiesAsV2WithEmptySchemaEmits()
722722
{
723-
var expected = @"{ }";
723+
var expected = @"{ ""additionalProperties"": { } }";
724724
// Given
725725
var schema = new OpenApiSchema
726726
{
@@ -734,6 +734,24 @@ public async Task SerializeAdditionalPropertiesAsV2DoesNotEmit()
734734
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
735735
}
736736

737+
[Fact]
738+
public async Task SerializeAdditionalPropertiesAsV2WithRefSchemaEmits()
739+
{
740+
var expected = @"{ ""type"": ""object"", ""additionalProperties"": { ""$ref"": ""#/definitions/MyModel"" } }";
741+
// Given - schema with additionalProperties pointing to a ref (dictionary case)
742+
var schema = new OpenApiSchema
743+
{
744+
Type = JsonSchemaType.Object,
745+
AdditionalProperties = new OpenApiSchemaReference("MyModel", null)
746+
};
747+
748+
// When
749+
var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0);
750+
751+
// Then
752+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
753+
}
754+
737755
[Fact]
738756
public async Task SerializeAdditionalPropertiesAllowedAsV2DefaultDoesNotEmit()
739757
{

0 commit comments

Comments
 (0)