Skip to content

Commit 425003a

Browse files
committed
- Add V2 and V3 reader tests for Security Scheme
- Fix callback tests
1 parent 09b7e20 commit 425003a

20 files changed

+605
-46
lines changed

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

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,32 @@ internal static partial class OpenApiV2Deserializer
1818
{
1919
private static string flowValue;
2020

21-
private static readonly OpenApiOAuthFlow flow = new OpenApiOAuthFlow();
21+
private static OpenApiOAuthFlow flow;
2222

2323
private static readonly FixedFieldMap<OpenApiSecurityScheme> SecuritySchemeFixedFields =
2424
new FixedFieldMap<OpenApiSecurityScheme>
2525
{
2626
{
2727
"type",
28-
(o, n) => o.Type = (SecuritySchemeType)Enum.Parse(typeof(SecuritySchemeType), n.GetScalarValue())
28+
(o, n) =>
29+
{
30+
var type = n.GetScalarValue();
31+
switch (type)
32+
{
33+
case "basic":
34+
o.Type = SecuritySchemeType.Http;
35+
o.Scheme = "basic";
36+
break;
37+
38+
case "apiKey":
39+
o.Type = SecuritySchemeType.ApiKey;
40+
break;
41+
42+
case "oauth2":
43+
o.Type = SecuritySchemeType.OAuth2;
44+
break;
45+
}
46+
}
2947
},
3048
{"description", (o, n) => o.Description = n.GetScalarValue()},
3149
{"name", (o, n) => o.Name = n.GetScalarValue()},
@@ -53,7 +71,7 @@ internal static partial class OpenApiV2Deserializer
5371
{
5472
"scopes", (o, n) =>
5573
{
56-
flow.Scopes = n.CreateMap(LoadString);
74+
flow.Scopes = n.CreateSimpleMap(LoadString);
5775
}
5876
}
5977
};
@@ -66,6 +84,10 @@ internal static partial class OpenApiV2Deserializer
6684

6785
public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node)
6886
{
87+
// Reset the local variables every time this method is called.
88+
flowValue = null;
89+
flow = new OpenApiOAuthFlow();
90+
6991
var mapNode = node.CheckMapNode("securityScheme");
7092

7193
var securityScheme = new OpenApiSecurityScheme();
@@ -74,25 +96,34 @@ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node)
7496
property.ParseField(securityScheme, SecuritySchemeFixedFields, SecuritySchemePatternFields);
7597
}
7698

77-
securityScheme.Flows = new OpenApiOAuthFlows();
78-
;
79-
8099
// Put the Flow object in the right Flows property based on the string in "flow"
81100
if (flowValue == OpenApiConstants.Implicit)
82101
{
83-
securityScheme.Flows.Implicit = flow;
102+
securityScheme.Flows = new OpenApiOAuthFlows
103+
{
104+
Implicit = flow
105+
};
84106
}
85107
else if (flowValue == OpenApiConstants.Password)
86108
{
87-
securityScheme.Flows.Password = flow;
109+
securityScheme.Flows = new OpenApiOAuthFlows
110+
{
111+
Password = flow
112+
};
88113
}
89114
else if (flowValue == OpenApiConstants.Application)
90115
{
91-
securityScheme.Flows.ClientCredentials = flow;
116+
securityScheme.Flows = new OpenApiOAuthFlows
117+
{
118+
ClientCredentials = flow
119+
};
92120
}
93121
else if (flowValue == OpenApiConstants.AccessCode)
94122
{
95-
securityScheme.Flows.AuthorizationCode = flow;
123+
securityScheme.Flows = new OpenApiOAuthFlows
124+
{
125+
AuthorizationCode = flow
126+
};
96127
}
97128

98129
return securityScheme;

src/Microsoft.OpenApi.Readers/V3/OpenApiOAuthFlowDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ internal static partial class OpenApiV3Deserializer
2323
{"authorizationUrl", (o, n) => o.AuthorizationUrl = new Uri(n.GetScalarValue())},
2424
{"tokenUrl", (o, n) => o.TokenUrl = new Uri(n.GetScalarValue())},
2525
{"refreshUrl", (o, n) => o.RefreshUrl = new Uri(n.GetScalarValue())},
26-
{"scopes", (o, n) => o.Scopes = n.CreateMap(LoadString)}
26+
{"scopes", (o, n) => o.Scopes = n.CreateSimpleMap(LoadString)}
2727
};
2828

2929
private static readonly PatternFieldMap<OpenApiOAuthFlow> OAuthFlowPatternFields =

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
<RootNamespace>Microsoft.OpenApi.Readers.Tests</RootNamespace>
1212
<SignAssembly>true</SignAssembly>
1313
</PropertyGroup>
14+
<ItemGroup>
15+
<None Remove="V2Tests\Samples\OpenApiSecurityScheme\httpSecurityScheme.yaml" />
16+
</ItemGroup>
1417

1518
<ItemGroup>
1619
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
@@ -52,6 +55,18 @@
5255
<None Update="V2Tests\Samples\minimal.v3.yaml">
5356
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
5457
</None>
58+
<None Update="V2Tests\Samples\OpenApiSecurityScheme\apiKeySecurityScheme.yaml">
59+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
60+
</None>
61+
<None Update="V2Tests\Samples\OpenApiSecurityScheme\oauth2AccessCodeSecurityScheme.yaml">
62+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
63+
</None>
64+
<None Update="V2Tests\Samples\OpenApiSecurityScheme\oauth2ApplicationSecurityScheme.yaml">
65+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
66+
</None>
67+
<None Update="V2Tests\Samples\OpenApiSecurityScheme\oauth2PasswordSecurityScheme.yaml">
68+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
69+
</None>
5570
<None Update="V2Tests\Samples\parameterRef.v2.yaml">
5671
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
5772
</None>
@@ -63,6 +78,15 @@
6378
</None>
6479
<None Update="V2Tests\Samples\simplest.v3.yaml">
6580
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
81+
</None>
82+
<None Include="V2Tests\Samples\OpenApiSecurityScheme\basicSecurityScheme.yaml">
83+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
84+
</None>
85+
<None Include="V2Tests\Samples\OpenApiSecurityScheme\oauth2ImplicitSecurityScheme.yaml">
86+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
87+
</None>
88+
<None Include="V3Tests\Samples\OpenApiCallback\advancedCallbackWithReference.yaml">
89+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
6690
</None>
6791
<None Include="V3Tests\Samples\OpenApiInfo\advancedInfo.yaml">
6892
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -85,9 +109,6 @@
85109
<None Update="V3Tests\Samples\OpenApiCallback\basicCallback.yaml">
86110
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
87111
</None>
88-
<None Update="V3Tests\Samples\OpenApiCallback\basicCallbackWithReference.yaml">
89-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
90-
</None>
91112
<None Update="V3Tests\Samples\CompleteHeader.yaml">
92113
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
93114
</None>
@@ -118,13 +139,27 @@
118139
<None Update="V3Tests\Samples\OpenApiDocument\minimalDocument.yaml">
119140
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
120141
</None>
142+
<None Update="V3Tests\Samples\OpenApiSecurityScheme\openIdConnectSecurityScheme.yaml">
143+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
144+
</None>
145+
<None Update="V3Tests\Samples\OpenApiSecurityScheme\oauth2SecurityScheme.yaml">
146+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
147+
</None>
148+
<None Update="V3Tests\Samples\OpenApiSecurityScheme\bearerSecurityScheme.yaml">
149+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
150+
</None>
151+
<None Update="V3Tests\Samples\OpenApiSecurityScheme\apiKeySecurityScheme.yaml">
152+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
153+
</None>
154+
<None Update="V3Tests\Samples\OpenApiSecurityScheme\httpSecurityScheme.yaml">
155+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
156+
</None>
121157
<None Update="V3Tests\Samples\OpenApiXml\basicXml.yaml">
122158
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
123159
</None>
124160
</ItemGroup>
125161

126162
<ItemGroup>
127-
<Folder Include="V3Tests\Samples\OpenApiSecurityScheme\" />
128163
<Folder Include="V3Tests\Samples\OpenApiSchema\" />
129164
</ItemGroup>
130165

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// ------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
4+
// ------------------------------------------------------------
5+
6+
using System.IO;
7+
using FluentAssertions;
8+
using Microsoft.OpenApi.Models;
9+
using Xunit;
10+
11+
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
12+
{
13+
[Collection("DefaultSettings")]
14+
public class ComparisonTests
15+
{
16+
private const string SampleFolderPath = "V2Tests/Samples/";
17+
18+
[Theory]
19+
[InlineData("minimal")]
20+
[InlineData("basic")]
21+
public void EquivalentV2AndV3DocumentsShouldProductEquivalentObjects(string fileName)
22+
{
23+
using (var streamV2 = File.OpenRead(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")))
24+
using (var streamV3 = File.OpenRead(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml")))
25+
{
26+
var openApiDocV2 = new OpenApiStreamReader().Read(streamV2, out var contextV2);
27+
var openApiDocV3 = new OpenApiStreamReader().Read(streamV3, out var contextV3);
28+
29+
// Everything in the DOM read from V2 and V3 documents should be equal
30+
// except the SpecVersion property (2.0 and 3.0.0)
31+
openApiDocV3.ShouldBeEquivalentTo(
32+
openApiDocV2,
33+
options => options.Excluding(
34+
s => s.SelectedMemberPath == nameof(OpenApiDocument.SpecVersion)));
35+
36+
contextV2.ShouldBeEquivalentTo(contextV3);
37+
}
38+
39+
}
40+
}
41+
}

0 commit comments

Comments
 (0)