From face5eb54bb4cde99fc8f7bf99043f3f55e25a5a Mon Sep 17 00:00:00 2001 From: Irvine Date: Wed, 7 Sep 2022 14:31:30 +0300 Subject: [PATCH 1/5] Retrieve format from schema composition properties when serializing as V2 --- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index 8734c19a2..a80e34cdb 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Collections.Generic; @@ -566,6 +566,10 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer) writer.WriteProperty(OpenApiConstants.Type, Type); // format + Format ??= AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? + AnyOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? + OneOf?.FirstOrDefault(static x => x.Format != null)?.Format; + writer.WriteProperty(OpenApiConstants.Format, Format); // items From 55cafef162fa5c4e3ede2836e50f89eccb19093d Mon Sep 17 00:00:00 2001 From: Irvine Date: Wed, 7 Sep 2022 14:31:41 +0300 Subject: [PATCH 2/5] Update tests --- .../Models/OpenApiParameterTests.cs | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs index 6db019be7..cfcc56d15 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs @@ -50,7 +50,12 @@ public class OpenApiParameterTests Schema = new OpenApiSchema { Title = "title2", - Description = "description2" + Description = "description2", + OneOf = new List + { + new OpenApiSchema { Type = "number", Format = "double" }, + new OpenApiSchema { Type = "string" } + } }, Examples = new Dictionary { @@ -234,6 +239,15 @@ public void SerializeAdvancedParameterAsV3JsonWorks() ""explode"": true, ""schema"": { ""title"": ""title2"", + ""oneOf"": [ + { + ""type"": ""number"", + ""format"": ""double"" + }, + { + ""type"": ""string"" + } + ], ""description"": ""description2"" }, ""examples"": { @@ -253,6 +267,27 @@ public void SerializeAdvancedParameterAsV3JsonWorks() actual.Should().Be(expected); } + [Fact] + public void SerializeAdvancedParameterAsV2JsonWorks() + { + // Arrange + var expected = @"{ + ""in"": ""path"", + ""name"": ""name1"", + ""description"": ""description1"", + ""required"": true, + ""format"": ""double"" +}"; + + // Act + var actual = AdvancedPathParameterWithSchema.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + + // Assert + actual = actual.MakeLineBreaksEnvironmentNeutral(); + expected = expected.MakeLineBreaksEnvironmentNeutral(); + actual.Should().Be(expected); + } + [Theory] [InlineData(true)] [InlineData(false)] From b7cdba84096b505d807467f0ee9a21ef3b7d0d78 Mon Sep 17 00:00:00 2001 From: Irvine Date: Wed, 7 Sep 2022 18:06:20 +0300 Subject: [PATCH 3/5] Check for format nullability or empty --- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index a80e34cdb..dad502f7d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -566,10 +566,13 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer) writer.WriteProperty(OpenApiConstants.Type, Type); // format - Format ??= AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? + if (string.IsNullOrEmpty(Format)) + { + Format = AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? AnyOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? OneOf?.FirstOrDefault(static x => x.Format != null)?.Format; - + } + writer.WriteProperty(OpenApiConstants.Format, Format); // items @@ -634,9 +637,12 @@ internal void WriteAsSchemaProperties( } // format - Format ??= AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? + if (string.IsNullOrEmpty(Format)) + { + Format = AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? AnyOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? OneOf?.FirstOrDefault(static x => x.Format != null)?.Format; + } writer.WriteProperty(OpenApiConstants.Format, Format); From b40a638c3b74880c9c82d0ac53f93ec79b62cb3f Mon Sep 17 00:00:00 2001 From: Irvine Date: Wed, 7 Sep 2022 18:09:02 +0300 Subject: [PATCH 4/5] Bump up lib. version --- src/Microsoft.OpenApi/Microsoft.OpenApi.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj index f07012b5d..fa8bee8bf 100644 --- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj +++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj @@ -11,7 +11,7 @@ Microsoft Microsoft.OpenApi Microsoft.OpenApi - 1.4.0 + 1.4.1 .NET models with JSON and YAML writers for OpenAPI specification © Microsoft Corporation. All rights reserved. OpenAPI .NET From 57f86ab2a5bcdc0684b897c699306fd730476497 Mon Sep 17 00:00:00 2001 From: Irvine Date: Wed, 7 Sep 2022 18:32:40 +0300 Subject: [PATCH 5/5] PR review comments: validate nullability and empty --- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index dad502f7d..6019d7362 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -568,9 +568,9 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer) // format if (string.IsNullOrEmpty(Format)) { - Format = AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? - AnyOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? - OneOf?.FirstOrDefault(static x => x.Format != null)?.Format; + Format = AllOf?.FirstOrDefault(static x => !string.IsNullOrEmpty(x.Format))?.Format ?? + AnyOf?.FirstOrDefault(static x => !string.IsNullOrEmpty(x.Format))?.Format ?? + OneOf?.FirstOrDefault(static x => !string.IsNullOrEmpty(x.Format))?.Format; } writer.WriteProperty(OpenApiConstants.Format, Format); @@ -639,9 +639,9 @@ internal void WriteAsSchemaProperties( // format if (string.IsNullOrEmpty(Format)) { - Format = AllOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? - AnyOf?.FirstOrDefault(static x => x.Format != null)?.Format ?? - OneOf?.FirstOrDefault(static x => x.Format != null)?.Format; + Format = AllOf?.FirstOrDefault(static x => !string.IsNullOrEmpty(x.Format))?.Format ?? + AnyOf?.FirstOrDefault(static x => !string.IsNullOrEmpty(x.Format))?.Format ?? + OneOf?.FirstOrDefault(static x => !string.IsNullOrEmpty(x.Format))?.Format; } writer.WriteProperty(OpenApiConstants.Format, Format);