Skip to content

Commit 01105d1

Browse files
committed
Progress
1 parent 8db16f9 commit 01105d1

7 files changed

Lines changed: 30 additions & 40 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -800,12 +800,15 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer)
800800
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi2_0);
801801
}
802802

803-
internal void FinalizeDeserialization()
803+
internal void FinalizeDeserialization(OpenApiSpecVersion version)
804804
{
805-
if (HasTrueNullableExtension)
805+
if (version is OpenApiSpecVersion.OpenApi2_0)
806806
{
807-
Extensions!.Remove(OpenApiConstants.NullableExtension);
808-
IsNullableFromDeserialization = true;
807+
if (HasTrueNullableExtension)
808+
{
809+
Extensions!.Remove(OpenApiConstants.NullableExtension);
810+
IsNullableFromDeserialization = true;
811+
}
809812
}
810813

811814
if (IsNullableFromDeserialization && Type is not null && Type != 0)

src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum
268268

269269
ParseMap(jsonObject, schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields, hostDocument, context);
270270

271-
schema.FinalizeDeserialization();
271+
schema.FinalizeDeserialization(OpenApiSpecVersion.OpenApi2_0);
272272

273273
return schema;
274274
}

src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum
385385

386386
ParseMap(jsonObject, schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields, hostDocument, context);
387387

388-
schema.FinalizeDeserialization();
388+
schema.FinalizeDeserialization(OpenApiSpecVersion.OpenApi3_0);
389389

390390
return schema;
391391
}

src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -326,17 +326,6 @@ internal static partial class OpenApiV31Deserializer
326326
"default",
327327
(o, n, _, _) => o.Default = n
328328
},
329-
{
330-
"nullable",
331-
(o, n, _, _) =>
332-
{
333-
var value = n.GetScalarValue();
334-
if (value is not null)
335-
{
336-
o.IsNullableFromDeserialization = bool.Parse(value);
337-
}
338-
}
339-
},
340329
{
341330
"discriminator",
342331
(o, n, doc, c) => o.Discriminator = LoadDiscriminator(n, doc, c)
@@ -470,7 +459,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum
470459
schema.UnrecognizedKeywords[name] = value;
471460
});
472461

473-
schema.FinalizeDeserialization();
462+
schema.FinalizeDeserialization(OpenApiSpecVersion.OpenApi3_1);
474463

475464
if (!string.IsNullOrEmpty(identifier) && hostDocument.Workspace is not null)
476465
{

src/Microsoft.OpenApi/Reader/V32/OpenApiSchemaDeserializer.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -326,17 +326,6 @@ internal static partial class OpenApiV32Deserializer
326326
"default",
327327
(o, n, _, _) => o.Default = n
328328
},
329-
{
330-
"nullable",
331-
(o, n, _, _) =>
332-
{
333-
var value = n.GetScalarValue();
334-
if (value is not null)
335-
{
336-
o.IsNullableFromDeserialization = bool.Parse(value);
337-
}
338-
}
339-
},
340329
{
341330
"discriminator",
342331
(o, n, doc, c) => o.Discriminator = LoadDiscriminator(n, doc, c)
@@ -470,7 +459,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum
470459
schema.UnrecognizedKeywords[name] = value;
471460
});
472461

473-
schema.FinalizeDeserialization();
462+
schema.FinalizeDeserialization(OpenApiSpecVersion.OpenApi3_2);
474463

475464
if (!string.IsNullOrEmpty(identifier) && hostDocument.Workspace is not null)
476465
{

test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,15 @@ public void ParseSchemaWithTypeArrayWorks()
141141
[Theory]
142142
[InlineData(@"{ ""nullable"": true, ""type"": ""string"" }")]
143143
[InlineData(@"{ ""type"": ""string"", ""nullable"": true }")]
144-
public void ParseSchemaWithNullableBeforeOrAfterTypePreservesNullFlag(string schemaJson)
144+
public void ParseSchemaWithNullableBeforeOrAfterTypeDoesNotPreserveNullFlag(string schemaJson)
145145
{
146+
// "nullable" is only for 3.0.
147+
146148
// Act
147149
var schema = OpenApiModelFactory.Parse<OpenApiSchema>(schemaJson, OpenApiSpecVersion.OpenApi3_1, new(), out _, "json", SettingsFixture.ReaderSettings);
148150

149151
// Assert
150-
Assert.Equal(JsonSchemaType.String | JsonSchemaType.Null, schema.Type);
152+
Assert.Equal(JsonSchemaType.String, schema.Type);
151153
}
152154

153155
[Fact]
@@ -517,7 +519,7 @@ public void SerializeSchemaWithTypeArrayAndNullableDoesntEmitType()
517519
- ""int""
518520
nullable: true";
519521

520-
var expected = @"x-nullable: true";
522+
var expected = @"{ }";
521523

522524
var schema = OpenApiModelFactory.Parse<OpenApiSchema>(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml", SettingsFixture.ReaderSettings);
523525

@@ -531,16 +533,18 @@ public void SerializeSchemaWithTypeArrayAndNullableDoesntEmitType()
531533
[Theory]
532534
[InlineData("schemaWithNullable.yaml")]
533535
[InlineData("schemaWithNullableExtension.yaml")]
534-
public async Task LoadSchemaWithNullableExtensionAsV31Works(string filePath)
536+
public async Task LoadSchemaWithNullableExtensionAsV31ShouldNotWork(string filePath)
535537
{
538+
// "nullable" is only for 3.0.
539+
// and "x-nullable" is only for 2.0.
536540
// Arrange
537541
var path = Path.Combine(SampleFolderPath, filePath);
538542

539543
// Act
540544
var schema = await OpenApiModelFactory.LoadAsync<OpenApiSchema>(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings);
541545

542546
// Assert
543-
Assert.Equal(JsonSchemaType.String | JsonSchemaType.Null, schema.Type);
547+
Assert.Equal(JsonSchemaType.String, schema.Type);
544548
}
545549

546550
[Fact]

test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSchemaTests.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,15 @@ public void ParseSchemaWithTypeArrayWorks()
140140
[Theory]
141141
[InlineData(@"{ ""nullable"": true, ""type"": ""string"" }")]
142142
[InlineData(@"{ ""type"": ""string"", ""nullable"": true }")]
143-
public void ParseSchemaWithNullableBeforeOrAfterTypePreservesNullFlag(string schemaJson)
143+
public void ParseSchemaWithNullableBeforeOrAfterTypeDoesNotPreserveNullFlag(string schemaJson)
144144
{
145+
// "nullable" is only for 3.0.
146+
145147
// Act
146148
var schema = OpenApiModelFactory.Parse<OpenApiSchema>(schemaJson, OpenApiSpecVersion.OpenApi3_2, new(), out _, "json", SettingsFixture.ReaderSettings);
147149

148150
// Assert
149-
Assert.Equal(JsonSchemaType.String | JsonSchemaType.Null, schema.Type);
151+
Assert.Equal(JsonSchemaType.String, schema.Type);
150152
}
151153

152154
[Fact]
@@ -419,7 +421,7 @@ public void SerializeSchemaWithTypeArrayAndNullableDoesntEmitType()
419421
- ""int""
420422
nullable: true";
421423

422-
var expected = @"x-nullable: true";
424+
var expected = @"{ }";
423425

424426
var schema = OpenApiModelFactory.Parse<OpenApiSchema>(input, OpenApiSpecVersion.OpenApi3_2, new(), out _, "yaml", SettingsFixture.ReaderSettings);
425427

@@ -433,16 +435,19 @@ public void SerializeSchemaWithTypeArrayAndNullableDoesntEmitType()
433435
[Theory]
434436
[InlineData("schemaWithNullable.yaml")]
435437
[InlineData("schemaWithNullableExtension.yaml")]
436-
public async Task LoadSchemaWithNullableExtensionAsV32Works(string filePath)
438+
public async Task LoadSchemaWithNullableExtensionAsV32ShouldNotWork(string filePath)
437439
{
440+
// "nullable" is only for 3.0.
441+
// and "x-nullable" is only for 2.0.
442+
438443
// Arrange
439444
var path = Path.Combine(SampleFolderPath, filePath);
440445

441446
// Act
442447
var schema = await OpenApiModelFactory.LoadAsync<OpenApiSchema>(path, OpenApiSpecVersion.OpenApi3_2, new(), SettingsFixture.ReaderSettings);
443448

444449
// Assert
445-
Assert.Equal(JsonSchemaType.String | JsonSchemaType.Null, schema.Type);
450+
Assert.Equal(JsonSchemaType.String, schema.Type);
446451
}
447452

448453
[Fact]

0 commit comments

Comments
 (0)