diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs index 9e181fdcd..2f3a4dcec 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.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; @@ -170,6 +170,11 @@ internal static partial class OpenApiV2Deserializer if (type != null) { o.Type = type.ToJsonSchemaType(); + // OpenAPI 2.0 response schema allows type: file, which maps to format: binary in OpenAPI 3.x + if ("file".Equals(type, StringComparison.OrdinalIgnoreCase)) + { + o.Format = "binary"; + } } } }, diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs index cbbde4b70..0f02c3743 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.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; @@ -186,5 +186,40 @@ public async Task SerializeSchemaWithOnlyNullableShouldSucceed() Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral()); } + + [Fact] + public void ParseSchemaWithTypeFileShouldSetTypeStringAndFormatBinary() + { + // Arrange + var node = JsonNode.Parse("{\"type\": \"file\"}"); + + // Act + var schema = OpenApiV2Deserializer.LoadSchema(node, new(), new ParsingContext(new())); + + // Assert + Assert.NotNull(schema); + Assert.Equal(JsonSchemaType.String, schema.Type); + Assert.Equal("binary", schema.Format); + } + + [Fact] + public void ParseResponseSchemaWithTypeFileShouldSetTypeStringAndFormatBinary() + { + // Arrange + var node = JsonNode.Parse("{\"produces\": [\"application/octet-stream\"], \"responses\": {\"200\": {\"description\": \"File response\", \"schema\": {\"type\": \"file\"}}}}"); + + // Act + var operation = OpenApiV2Deserializer.LoadOperation(node, new(), new ParsingContext(new())); + + // Assert + Assert.NotNull(operation); + Assert.NotNull(operation.Responses); + var response = Assert.IsType(operation.Responses["200"]); + Assert.NotNull(response.Content); + var mediaType = Assert.Single(response.Content.Values); + Assert.NotNull(mediaType.Schema); + Assert.Equal(JsonSchemaType.String, mediaType.Schema.Type); + Assert.Equal("binary", mediaType.Schema.Format); + } } }