From 2f171a3476ea0f3227ecdcb724f1d1af5406ec0e Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 3 Feb 2025 15:34:07 -0500 Subject: [PATCH] fix: multiple unit test failures Signed-off-by: Vincent Biret --- .../Extensions/OpenApiTypeMapper.cs | 2 +- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 9 ++------ .../Formatters/PowerShellFormatterTests.cs | 5 ++--- ...sync_produceTerseOutput=False.verified.txt | 1 + ...Async_produceTerseOutput=True.verified.txt | 2 +- .../Models/OpenApiSchemaTests.cs | 21 ++++++++----------- 6 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.OpenApi/Extensions/OpenApiTypeMapper.cs b/src/Microsoft.OpenApi/Extensions/OpenApiTypeMapper.cs index 857de1d16..eea41be49 100644 --- a/src/Microsoft.OpenApi/Extensions/OpenApiTypeMapper.cs +++ b/src/Microsoft.OpenApi/Extensions/OpenApiTypeMapper.cs @@ -153,7 +153,7 @@ public static Type MapOpenApiPrimitiveTypeToSimpleType(this OpenApiSchema schema throw new ArgumentNullException(nameof(schema)); } - var type = ((schema.Type.Value ^ JsonSchemaType.Null).ToIdentifier(), schema.Format?.ToLowerInvariant(), schema.Type.Value & JsonSchemaType.Null) switch + var type = ((schema.Type & ~JsonSchemaType.Null).ToIdentifier(), schema.Format?.ToLowerInvariant(), schema.Type & JsonSchemaType.Null) switch { ("integer" or "number", "int32", JsonSchemaType.Null) => typeof(int?), ("integer" or "number", "int64", JsonSchemaType.Null) => typeof(long?), diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index 86fbc89ed..e69340641 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -726,9 +726,7 @@ private void DowncastTypeArrayToV2OrV3(JsonSchemaType schemaType, IOpenApiWriter ? OpenApiConstants.NullableExtension : OpenApiConstants.Nullable; - var nullable = (schemaType & JsonSchemaType.Null) == JsonSchemaType.Null; - - if (!HasMultipleTypes(schemaType ^ JsonSchemaType.Null) && nullable) // checks for two values and one is null + if (!HasMultipleTypes(schemaType & ~JsonSchemaType.Null) && (schemaType & JsonSchemaType.Null) == JsonSchemaType.Null) // checks for two values and one is null { foreach (JsonSchemaType flag in jsonSchemaTypeValues) { @@ -739,10 +737,7 @@ private void DowncastTypeArrayToV2OrV3(JsonSchemaType schemaType, IOpenApiWriter writer.WriteProperty(OpenApiConstants.Type, flag.ToIdentifier()); } } - if (!nullable || version is not OpenApiSpecVersion.OpenApi2_0) - { - writer.WriteProperty(nullableProp, true); - } + writer.WriteProperty(nullableProp, true); } else if (!HasMultipleTypes(schemaType)) { diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Formatters/PowerShellFormatterTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Formatters/PowerShellFormatterTests.cs index cad3b4548..da6d8c61e 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Formatters/PowerShellFormatterTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Formatters/PowerShellFormatterTests.cs @@ -69,7 +69,7 @@ public void RemoveAnyOfAndOneOfFromSchema() Assert.NotNull(openApiDocument.Components.Schemas); Assert.NotNull(testSchema); Assert.Null(averageAudioDegradationProperty.AnyOf); - Assert.Equal(JsonSchemaType.Number, averageAudioDegradationProperty.Type); + Assert.Equal(JsonSchemaType.Number | JsonSchemaType.Null, averageAudioDegradationProperty.Type); Assert.Equal("float", averageAudioDegradationProperty.Format); Assert.Equal(JsonSchemaType.Null, averageAudioDegradationProperty.Type & JsonSchemaType.Null); Assert.Null(defaultPriceProperty.OneOf); @@ -163,11 +163,10 @@ private static OpenApiDocument GetSampleOpenApiDocument() { AnyOf = new List { - new OpenApiSchema() { Type = JsonSchemaType.Number }, + new OpenApiSchema() { Type = JsonSchemaType.Number | JsonSchemaType.Null }, new OpenApiSchema() { Type = JsonSchemaType.String } }, Format = "float", - Type = JsonSchemaType.Number | JsonSchemaType.Null | JsonSchemaType.String } }, { diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt index 4e4e0200b..e30457226 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -1,5 +1,6 @@ { "type": "object", + "x-nullable": true, "title": "title1", "required": [ "property1" diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt index 864b97656..d5d9596f0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"type":"object","title":"title1","required":["property1"],"properties":{"property1":{"required":["property3"],"properties":{"property2":{"type":"integer"},"property3":{"type":"string","maxLength":15}}},"property4":{"properties":{"property5":{"properties":{"property6":{"type":"boolean"}}},"property7":{"type":"string","minLength":2}},"readOnly":true}},"externalDocs":{"url":"http://example.com/externalDocs"}} \ No newline at end of file +{"type":"object","x-nullable":true,"title":"title1","required":["property1"],"properties":{"property1":{"required":["property3"],"properties":{"property2":{"type":"integer"},"property3":{"type":"string","maxLength":15}}},"property4":{"properties":{"property5":{"properties":{"property6":{"type":"boolean"}}},"property7":{"type":"string","minLength":2}},"readOnly":true}},"externalDocs":{"url":"http://example.com/externalDocs"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index 3e6ed2f2e..951c96fe8 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -240,8 +240,8 @@ public async Task SerializeAdvancedSchemaNumberAsV3JsonWorks() "maximum": 42, "minimum": 10, "exclusiveMinimum": true, - "nullable": true, "type": "integer", + "nullable": true, "default": 15, "externalDocs": { "url": "http://example.com/externalDocs" @@ -253,9 +253,7 @@ public async Task SerializeAdvancedSchemaNumberAsV3JsonWorks() var actual = await AdvancedSchemaNumber.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual = actual.MakeLineBreaksEnvironmentNeutral(); - expected = expected.MakeLineBreaksEnvironmentNeutral(); - Assert.Equal(expected, actual); + Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual))); } [Fact] @@ -266,6 +264,7 @@ public async Task SerializeAdvancedSchemaObjectAsV3JsonWorks() """ { "title": "title1", + "type": "object", "nullable": true, "properties": { "property1": { @@ -305,9 +304,7 @@ public async Task SerializeAdvancedSchemaObjectAsV3JsonWorks() var actual = await AdvancedSchemaObject.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual = actual.MakeLineBreaksEnvironmentNeutral(); - expected = expected.MakeLineBreaksEnvironmentNeutral(); - Assert.Equal(expected, actual); + Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual))); } [Fact] @@ -318,6 +315,7 @@ public async Task SerializeAdvancedSchemaWithAllOfAsV3JsonWorks() """ { "title": "title1", + "type": "object", "nullable": true, "allOf": [ { @@ -334,6 +332,7 @@ public async Task SerializeAdvancedSchemaWithAllOfAsV3JsonWorks() }, { "title": "title3", + "type": "object", "nullable": true, "properties": { "property3": { @@ -360,9 +359,7 @@ public async Task SerializeAdvancedSchemaWithAllOfAsV3JsonWorks() var actual = await AdvancedSchemaWithAllOf.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual = actual.MakeLineBreaksEnvironmentNeutral(); - expected = expected.MakeLineBreaksEnvironmentNeutral(); - Assert.Equal(expected, actual); + Assert.True(JsonObject.DeepEquals(JsonObject.Parse(expected), JsonObject.Parse(actual))); } [Theory] @@ -472,9 +469,9 @@ public void OpenApiSchemaCopyConstructorSucceeds() var actualSchema = baseSchema.CreateShallowCopy() as OpenApiSchema; actualSchema.Type |= JsonSchemaType.Null; - Assert.Equal(JsonSchemaType.String, actualSchema.Type); - Assert.Equal("date", actualSchema.Format); + Assert.Equal(JsonSchemaType.String, actualSchema.Type & JsonSchemaType.String); Assert.Equal(JsonSchemaType.Null, actualSchema.Type & JsonSchemaType.Null); + Assert.Equal("date", actualSchema.Format); } [Fact]