Skip to content

Commit 53c160c

Browse files
committed
add more unit tests
fix the response deserializer
1 parent a095dbf commit 53c160c

File tree

11 files changed

+299
-24
lines changed

11 files changed

+299
-24
lines changed

src/Microsoft.OpenApi.Readers/V2/OpenApiResponseDeserializer.cs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,17 @@ internal static partial class OpenApiV2Deserializer
4848
{s => s.StartsWith("x-"), (o, p, n) => o.AddExtension(p, LoadExtension(p, n))}
4949
};
5050

51-
private static readonly AnyMapFieldMap<OpenApiMediaType, OpenApiExample> _mediaTypeAnyMapOpenApiExampleFields =
52-
new AnyMapFieldMap<OpenApiMediaType, OpenApiExample>
53-
{
51+
private static readonly AnyFieldMap<OpenApiMediaType> _mediaTypeAnyFields =
52+
new AnyFieldMap<OpenApiMediaType>
5453
{
55-
OpenApiConstants.Examples,
56-
new AnyMapFieldMapParameter<OpenApiMediaType, OpenApiExample>(
57-
m => m.Examples,
58-
e => e.Value,
59-
(e, v) => e.Value = v,
60-
m => m.Schema)
61-
}
62-
};
54+
{
55+
OpenApiConstants.Example,
56+
new AnyFieldMapParameter<OpenApiMediaType>(
57+
m => m.Example,
58+
(m, v) => m.Example = v,
59+
m => m.Schema)
60+
}
61+
};
6362

6463
private static void ProcessProduces(OpenApiResponse response, ParsingContext context)
6564
{
@@ -73,11 +72,17 @@ private static void ProcessProduces(OpenApiResponse response, ParsingContext con
7372

7473
foreach (var produce in produces)
7574
{
76-
if (!response.Content.ContainsKey(produce))
75+
var schema = context.GetFromTempStorage<OpenApiSchema>(TempStorageKeys.ResponseSchema);
76+
77+
if (response.Content.ContainsKey(produce) && response.Content[produce] != null)
78+
{
79+
response.Content[produce].Schema = schema;
80+
}
81+
else
7782
{
7883
var mediaType = new OpenApiMediaType
7984
{
80-
Schema = context.GetFromTempStorage<OpenApiSchema>(TempStorageKeys.ResponseSchema)
85+
Schema = schema
8186
};
8287

8388
response.Content.Add(produce, mediaType);
@@ -96,12 +101,13 @@ private static void LoadExamples(OpenApiResponse response, ParseNode node)
96101

97102
private static void LoadExample(OpenApiResponse response, string mediaType, ParseNode node)
98103
{
99-
var exampleNode = OpenApiAnyConverter.GetSpecificOpenApiAny(node.CreateAny());
104+
var exampleNode = node.CreateAny();
100105

101106
if (response.Content == null)
102107
{
103108
response.Content = new Dictionary<string, OpenApiMediaType>();
104109
}
110+
105111
OpenApiMediaType mediaTypeObject;
106112
if (response.Content.ContainsKey(mediaType))
107113
{
@@ -112,6 +118,7 @@ private static void LoadExample(OpenApiResponse response, string mediaType, Pars
112118
mediaTypeObject = new OpenApiMediaType();
113119
response.Content.Add(mediaType, mediaTypeObject);
114120
}
121+
115122
mediaTypeObject.Example = exampleNode;
116123
}
117124

@@ -135,9 +142,9 @@ public static OpenApiResponse LoadResponse(ParseNode node)
135142

136143
ProcessProduces(response, node.Context);
137144

138-
foreach( var mediaType in response.Content.Values)
145+
foreach (var mediaType in response.Content.Values)
139146
{
140-
ProcessAnyMapFields(mapNode, mediaType, _mediaTypeAnyMapOpenApiExampleFields);
147+
ProcessAnyFields(mapNode, mediaType, _mediaTypeAnyFields);
141148
}
142149

143150
return response;

test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,6 @@
1212
<SignAssembly>true</SignAssembly>
1313
<AssemblyOriginatorKeyFile>..\..\src\Microsoft.OpenApi.snk</AssemblyOriginatorKeyFile>
1414
</PropertyGroup>
15-
<ItemGroup>
16-
<None Remove="V2Tests\Samples\OpenApiParameter\parameterWithDefault.yaml" />
17-
<None Remove="V2Tests\Samples\OpenApiParameter\parameterWithEnum.yaml" />
18-
<None Remove="V3Tests\Samples\OpenApiMediaType\mediaTypeWithExample.yaml" />
19-
<None Remove="V3Tests\Samples\OpenApiMediaType\mediaTypeWithExamples.yaml" />
20-
<None Remove="V3Tests\Samples\OpenApiParameter\parameterWithExample.yaml" />
21-
<None Remove="V3Tests\Samples\OpenApiParameter\parameterWithExamples.yaml" />
22-
</ItemGroup>
2315
<ItemGroup>
2416
<EmbeddedResource Include="OpenApiReaderTests\Samples\unsupported.v1.yaml">
2517
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
@@ -84,6 +76,12 @@
8476
<EmbeddedResource Include="V2Tests\Samples\OpenApiPathItem\basicPathItemWithFormData.yaml">
8577
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
8678
</EmbeddedResource>
79+
<EmbeddedResource Include="V2Tests\Samples\OpenApiResponse\responseWithExamples.yaml" />
80+
<EmbeddedResource Include="V2Tests\Samples\OpenApiHeader\headerWithDefault.yaml" />
81+
<EmbeddedResource Include="V2Tests\Samples\OpenApiHeader\headerWithEnum.yaml" />
82+
<EmbeddedResource Include="V2Tests\Samples\OpenApiSchema\schemaWithDefault.yaml" />
83+
<EmbeddedResource Include="V2Tests\Samples\OpenApiSchema\schemaWithEnum.yaml" />
84+
<EmbeddedResource Include="V2Tests\Samples\OpenApiSchema\schemaWithExample.yaml" />
8785
<EmbeddedResource Include="V2Tests\Samples\OpenApiSecurityScheme\apiKeySecurityScheme.yaml">
8886
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
8987
</EmbeddedResource>
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using FluentAssertions;
7+
using Microsoft.OpenApi.Any;
8+
using Microsoft.OpenApi.Models;
9+
using Microsoft.OpenApi.Readers.ParseNodes;
10+
using Microsoft.OpenApi.Readers.V2;
11+
using Xunit;
12+
13+
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
14+
{
15+
[Collection("DefaultSettings")]
16+
public class OpenApiHeaderTests
17+
{
18+
private const string SampleFolderPath = "V2Tests/Samples/OpenApiHeader/";
19+
20+
[Fact]
21+
public void ParseHeaderWithDefaultShouldSucceed()
22+
{
23+
// Arrange
24+
MapNode node;
25+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "headerWithDefault.yaml")))
26+
{
27+
node = TestHelper.CreateYamlMapNode(stream);
28+
}
29+
30+
// Act
31+
var header = OpenApiV2Deserializer.LoadHeader(node);
32+
33+
// Assert
34+
header.ShouldBeEquivalentTo(
35+
new OpenApiHeader
36+
{
37+
Schema = new OpenApiSchema()
38+
{
39+
Type = "number",
40+
Format = "float",
41+
Default = new OpenApiFloat(5)
42+
}
43+
});
44+
}
45+
46+
[Fact]
47+
public void ParseHeaderWithEnumShouldSucceed()
48+
{
49+
// Arrange
50+
MapNode node;
51+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "headerWithEnum.yaml")))
52+
{
53+
node = TestHelper.CreateYamlMapNode(stream);
54+
}
55+
56+
// Act
57+
var header = OpenApiV2Deserializer.LoadHeader(node);
58+
59+
// Assert
60+
header.ShouldBeEquivalentTo(
61+
new OpenApiHeader
62+
{
63+
Schema = new OpenApiSchema()
64+
{
65+
Type = "number",
66+
Format = "float",
67+
Enum =
68+
{
69+
new OpenApiFloat(7),
70+
new OpenApiFloat(8),
71+
new OpenApiFloat(9)
72+
}
73+
}
74+
});
75+
}
76+
}
77+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using FluentAssertions;
7+
using Microsoft.OpenApi.Any;
8+
using Microsoft.OpenApi.Models;
9+
using Microsoft.OpenApi.Readers.ParseNodes;
10+
using Microsoft.OpenApi.Readers.V2;
11+
using Xunit;
12+
13+
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
14+
{
15+
[Collection("DefaultSettings")]
16+
public class OpenApiResponseTests
17+
{
18+
private const string SampleFolderPath = "V2Tests/Samples/OpenApiResponse/";
19+
20+
[Fact]
21+
public void ParseResponseWithExamplesShouldSucceed()
22+
{
23+
// Arrange
24+
MapNode node;
25+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "responseWithExamples.yaml")))
26+
{
27+
node = TestHelper.CreateYamlMapNode(stream);
28+
}
29+
30+
node.Context.SetTempStorage(TempStorageKeys.OperationProduces, new List<string>()
31+
{
32+
"application/json"
33+
});
34+
35+
// Act
36+
var response = OpenApiV2Deserializer.LoadResponse(node);
37+
38+
// Assert
39+
response.ShouldBeEquivalentTo(
40+
new OpenApiResponse()
41+
{
42+
Description = "An array of float response",
43+
Content =
44+
{
45+
["application/json"] = new OpenApiMediaType()
46+
{
47+
Schema = new OpenApiSchema()
48+
{
49+
Type = "array",
50+
Items = new OpenApiSchema()
51+
{
52+
Type = "number",
53+
Format = "float"
54+
}
55+
},
56+
Example = new OpenApiArray()
57+
{
58+
new OpenApiFloat(5),
59+
new OpenApiFloat(6),
60+
new OpenApiFloat(7),
61+
}
62+
}
63+
}
64+
});
65+
}
66+
}
67+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using FluentAssertions;
7+
using Microsoft.OpenApi.Any;
8+
using Microsoft.OpenApi.Models;
9+
using Microsoft.OpenApi.Readers.ParseNodes;
10+
using Microsoft.OpenApi.Readers.V2;
11+
using Xunit;
12+
13+
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
14+
{
15+
[Collection("DefaultSettings")]
16+
public class OpenApiSchemaTests
17+
{
18+
private const string SampleFolderPath = "V2Tests/Samples/OpenApiSchema/";
19+
20+
[Fact]
21+
public void ParseSchemaWithDefaultShouldSucceed()
22+
{
23+
// Arrange
24+
MapNode node;
25+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "schemaWithDefault.yaml")))
26+
{
27+
node = TestHelper.CreateYamlMapNode(stream);
28+
}
29+
30+
// Act
31+
var schema = OpenApiV2Deserializer.LoadSchema(node);
32+
33+
// Assert
34+
schema.ShouldBeEquivalentTo(
35+
new OpenApiSchema
36+
{
37+
Type = "number",
38+
Format = "float",
39+
Default = new OpenApiFloat(5)
40+
});
41+
}
42+
43+
[Fact]
44+
public void ParseSchemaWithExampleShouldSucceed()
45+
{
46+
// Arrange
47+
MapNode node;
48+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "schemaWithExample.yaml")))
49+
{
50+
node = TestHelper.CreateYamlMapNode(stream);
51+
}
52+
53+
// Act
54+
var schema = OpenApiV2Deserializer.LoadSchema(node);
55+
56+
// Assert
57+
schema.ShouldBeEquivalentTo(
58+
new OpenApiSchema
59+
{
60+
Type = "number",
61+
Format = "float",
62+
Example = new OpenApiFloat(5)
63+
});
64+
}
65+
66+
[Fact]
67+
public void ParseSchemaWithEnumShouldSucceed()
68+
{
69+
// Arrange
70+
MapNode node;
71+
using (var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "schemaWithEnum.yaml")))
72+
{
73+
node = TestHelper.CreateYamlMapNode(stream);
74+
}
75+
76+
// Act
77+
var schema = OpenApiV2Deserializer.LoadSchema(node);
78+
79+
// Assert
80+
schema.ShouldBeEquivalentTo(
81+
new OpenApiSchema
82+
{
83+
Type = "number",
84+
Format = "float",
85+
Enum =
86+
{
87+
new OpenApiFloat(7),
88+
new OpenApiFloat(8),
89+
new OpenApiFloat(9)
90+
}
91+
});
92+
}
93+
}
94+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type: number
2+
format: float
3+
default: 5
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type: number
2+
format: float
3+
enum:
4+
- 7
5+
- 8
6+
- 9
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
description: An array of float response
2+
schema:
3+
type: array
4+
items:
5+
type: number
6+
format: float
7+
examples:
8+
application/json:
9+
- 5
10+
- 6
11+
- 7
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type: number
2+
format: float
3+
default: 5
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type: number
2+
format: float
3+
enum:
4+
- 7
5+
- 8
6+
- 9

0 commit comments

Comments
 (0)