Skip to content

Commit 9781529

Browse files
committed
swagger servers section support, filters bug fix, tests
1 parent 8ffdcf5 commit 9781529

File tree

6 files changed

+153
-51
lines changed

6 files changed

+153
-51
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>0.1.0</Version>
3+
<Version>0.1.1</Version>
44
</PropertyGroup>
55
</Project>

src/QAToolKit.Source.Swagger.Test/QAToolKit.Source.Swagger.Test.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@
1919
</PackageReference>
2020
</ItemGroup>
2121

22+
<ItemGroup>
23+
<ProjectReference Include="..\QAToolKit.Source.Swagger\QAToolKit.Source.Swagger.csproj" />
24+
</ItemGroup>
25+
2226
</Project>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using QAToolKit.Core.Models;
2+
using System;
3+
using System.Threading.Tasks;
4+
using Xunit;
5+
6+
namespace QAToolKit.Source.Swagger.Test
7+
{
8+
public class SwaggerUrlSourceTests
9+
{
10+
[Fact]
11+
public async Task SwaggerUrlSourceWithoutOptionsV3Test_Successfull()
12+
{
13+
var urlSource = new SwaggerUrlSource();
14+
var requests = await urlSource.Load(
15+
new Uri[]
16+
{
17+
new Uri("https://petstore3.swagger.io/api/v3/openapi.json")
18+
});
19+
20+
Assert.NotNull(requests);
21+
}
22+
23+
[Fact]
24+
public async Task SwaggerUrlSourceWithOptionsV3Test_Successfull()
25+
{
26+
var swaggerSource = new SwaggerUrlSource(
27+
options =>
28+
{
29+
options.AddRequestFilters(new RequestFilter()
30+
{
31+
EndpointNameWhitelist = new string[] { "getPetById" }
32+
});
33+
options.AddReplacementValues(new ReplacementValue[] {
34+
new ReplacementValue()
35+
{
36+
Key = "petId",
37+
Value = "1"
38+
}
39+
});
40+
});
41+
42+
var requests = await swaggerSource.Load(new Uri[] {
43+
new Uri("https://petstore3.swagger.io/api/v3/openapi.json")
44+
});
45+
46+
Assert.NotNull(requests);
47+
}
48+
49+
50+
/* [Fact]
51+
public async Task SwaggerUrlSourceWithoutOptionsV2Test_Successfull()
52+
{
53+
var urlSource = new SwaggerUrlSource();
54+
var requests = await urlSource.Load(
55+
new Uri[]
56+
{
57+
new Uri("https://petstore.swagger.io/v2/swagger.json"),
58+
});
59+
60+
Assert.NotNull(requests);
61+
}*/
62+
}
63+
}

src/QAToolKit.Source.Swagger/QAToolKit.Source.Swagger.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<ItemGroup>
3535
<PackageReference Include="Microsoft.OpenApi" Version="1.2.3" />
3636
<PackageReference Include="Microsoft.OpenApi.Readers" Version="1.2.3" />
37-
<PackageReference Include="QAToolKit.Core" Version="0.1.0" />
37+
<PackageReference Include="QAToolKit.Core" Version="0.1.1" />
3838
</ItemGroup>
3939

4040
</Project>

src/QAToolKit.Source.Swagger/SwaggerProcessor.cs

Lines changed: 78 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,20 @@ public IList<HttpTestRequest> MapFromOpenApiDocument(Uri baseUri, OpenApiDocumen
2323
{
2424
var requests = new List<HttpTestRequest>();
2525

26+
var server = openApiDocument.Servers.FirstOrDefault();
27+
if (server != null)
28+
{
29+
var tempUri = new Uri(server.Url, UriKind.RelativeOrAbsolute);
30+
if (tempUri.IsAbsoluteUri)
31+
{
32+
baseUri = tempUri;
33+
}
34+
else
35+
{
36+
baseUri = new Uri(baseUri, tempUri);
37+
}
38+
}
39+
2640
foreach (var path in openApiDocument.Paths)
2741
{
2842
requests.AddRange(GetRestRequestsForPath(baseUri, path, replacementValues));
@@ -46,7 +60,7 @@ private IList<HttpTestRequest> GetRestRequestsForPath(Uri baseUri, KeyValuePair<
4660
Description = GetDescription(operation),
4761
OperationId = GetOperationId(operation),
4862
Parameters = ReplaceUrlParameters(GetParameters(operation).ToList(), replacementValues).ToList(),
49-
RequestBody = ReplaceRequestBodyModel(GetRequestBody(operation), replacementValues),
63+
RequestBodies = ReplaceRequestBodyModel(GetRequestBodies(operation), replacementValues),
5064
Responses = GetResponses(operation),
5165
Tags = GetTags(operation),
5266
AuthenticationTypes = GetAuthenticationTypes(operation),
@@ -128,9 +142,12 @@ private string GetPath(string path)
128142

129143
private string ReplacePathParameters(string path, ReplacementValue[] replacementValues)
130144
{
131-
foreach (var replacementValue in replacementValues)
145+
if (replacementValues != null)
132146
{
133-
path = path.Replace("{" + replacementValue.Key + "}", replacementValue.Value);
147+
foreach (var replacementValue in replacementValues)
148+
{
149+
path = path.Replace("{" + replacementValue.Key + "}", replacementValue.Value);
150+
}
134151
}
135152

136153
return path;
@@ -195,93 +212,107 @@ private IList<Parameter> GetParameters(KeyValuePair<OperationType, OpenApiOperat
195212

196213
private IList<Parameter> ReplaceUrlParameters(List<Parameter> urlParameters, ReplacementValue[] replacementValues)
197214
{
198-
foreach (var replacementValue in replacementValues)
215+
if (replacementValues != null)
199216
{
200-
foreach (var parameter in urlParameters)
217+
foreach (var replacementValue in replacementValues)
201218
{
202-
if (parameter.Name == replacementValue.Key)
219+
foreach (var parameter in urlParameters)
203220
{
204-
parameter.Value = replacementValue.Value;
221+
if (parameter.Name == replacementValue.Key)
222+
{
223+
parameter.Value = replacementValue.Value;
224+
}
205225
}
206226
}
207227
}
208228

209229
return urlParameters;
210230
}
211231

212-
private RequestBody GetRequestBody(KeyValuePair<OperationType, OpenApiOperation> openApiOperation)
232+
private List<RequestBody> GetRequestBodies(KeyValuePair<OperationType, OpenApiOperation> openApiOperation)
213233
{
214234
try
215235
{
236+
var requests = new List<RequestBody>();
237+
216238
if (openApiOperation.Value.RequestBody == null)
217239
{
218-
return new RequestBody();
240+
return new List<RequestBody>();
219241
}
220242

221243
if (openApiOperation.Value.RequestBody.Content.Count == 0)
222244
{
223-
return new RequestBody();
224-
}
225-
226-
if (openApiOperation.Value.RequestBody.Content.FirstOrDefault().Value.Schema.Properties.Count == 0)
227-
{
228-
return new RequestBody();
245+
return new List<RequestBody>();
229246
}
230247

231-
var requestBody = new RequestBody
248+
foreach (var contentType in openApiOperation.Value.RequestBody.Content)
232249
{
233-
Name = openApiOperation.Value.RequestBody.Content.FirstOrDefault().Value.Schema.Reference.Id,
234-
Properties = new List<Property>()
235-
};
250+
var requestBody = new RequestBody
251+
{
252+
Name = contentType.Value.Schema.Reference != null ? contentType.Value.Schema.Reference.Id : "N/A",
253+
ContentType = contentType.Key,
254+
Properties = new List<Property>()
255+
};
236256

237-
foreach (var property in openApiOperation.Value.RequestBody.Content.FirstOrDefault().Value.Schema.Properties)
238-
{
239-
requestBody.Properties.Add(new Property()
257+
foreach (var property in contentType.Value.Schema.Properties)
240258
{
241-
Name = property.Key,
242-
Description = property.Value.Description,
243-
Type = property.Value.Type,
244-
});
259+
requestBody.Properties.Add(new Property()
260+
{
261+
Name = property.Key,
262+
Description = property.Value.Description,
263+
Type = property.Value.Type,
264+
});
265+
}
266+
267+
requests.Add(requestBody);
245268
}
246269

247-
return requestBody;
270+
return requests;
248271
}
249272
catch (Exception ex)
250273
{
251274
var msg = ex.Message;
252-
return new RequestBody();
275+
return new List<RequestBody>();
253276
}
254277
}
255278

256-
private RequestBody ReplaceRequestBodyModel(RequestBody requestBody, ReplacementValue[] replacementValues)
279+
private List<RequestBody> ReplaceRequestBodyModel(List<RequestBody> requestBodies, ReplacementValue[] replacementValues)
257280
{
258-
if (requestBody.Properties == null)
259-
{
260-
return requestBody;
261-
}
262281

263-
var requestBodyResult = new RequestBody
282+
foreach (var requestBody in requestBodies)
264283
{
265-
Name = requestBody.Name
266-
};
284+
if (requestBody.Properties == null)
285+
{
286+
continue;
287+
}
267288

268-
foreach (var replacementValue in replacementValues)
269-
{
270-
var prop = requestBody.Properties.FirstOrDefault(p => p.Name == replacementValue.Key);
289+
var requestBodyResult = new RequestBody
290+
{
291+
Name = requestBody.Name,
292+
Properties = new List<Property>()
293+
};
271294

272-
if (prop != null)
295+
if (replacementValues != null)
273296
{
274-
requestBodyResult.Properties.Add(new Property()
297+
foreach (var replacementValue in replacementValues)
275298
{
276-
Description = prop.Description,
277-
Name = prop.Name,
278-
Type = prop.Type,
279-
Value = replacementValue.Value
280-
});
299+
var prop = requestBody.Properties.FirstOrDefault(p => p.Name == replacementValue.Key);
300+
301+
if (prop != null)
302+
{
303+
requestBodyResult.Properties.Add(new Property()
304+
{
305+
Description = prop.Description,
306+
Name = prop.Name,
307+
Type = prop.Type,
308+
Value = replacementValue.Value
309+
});
310+
}
311+
}
281312
}
282313
}
283314

284-
return requestBodyResult;
315+
return requestBodies;
285316
}
286317

287318
private List<Response> GetResponses(KeyValuePair<OperationType, OpenApiOperation> openApiOperation)

src/QAToolKit.Source.Swagger/SwaggerUrlSource.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using Microsoft.OpenApi.Readers;
2+
using Microsoft.OpenApi.Writers;
23
using QAToolKit.Core.Interfaces;
34
using QAToolKit.Core.Models;
45
using System;
56
using System.Collections.Generic;
7+
using System.IO;
68
using System.Linq;
79
using System.Net.Http;
810
using System.Net.Http.Headers;
@@ -55,6 +57,8 @@ public async Task<IList<HttpTestRequest>> Load(Uri[] source)
5557
var stream = await httpClient.GetStreamAsync(uri);
5658

5759
var openApiDocument = new OpenApiStreamReader().Read(stream, out var diagnostic);
60+
var textWritter = new OpenApiJsonWriter(new StringWriter());
61+
openApiDocument.SerializeAsV3(textWritter);
5862

5963
var requests = processor.MapFromOpenApiDocument(new Uri($"{uri.Scheme}://{uri.Host}"), openApiDocument, _swaggerOptions.ReplacementValues);
6064

@@ -81,12 +85,12 @@ private List<HttpTestRequest> FilterRequests(IList<HttpTestRequest> requests, Re
8185
requestsLocal.AddRange(requests.Where(request => requestFilter.AuthenticationTypes.ToList().Any(x => x == request.AuthenticationTypes)));
8286
}
8387

84-
if (requestFilter.EndpointNameWhitelist != null)
88+
if (requestFilter.TestTypes != null)
8589
{
8690
requestsLocal.AddRange(requests.Where(request => requestFilter.TestTypes.ToList().Any(x => x == request.TestTypes)));
8791
}
8892

89-
if (requestFilter.TestTypes != null)
93+
if (requestFilter.EndpointNameWhitelist != null)
9094
{
9195
requestsLocal.AddRange(requests.Where(request => requestFilter.EndpointNameWhitelist.Any(x => x == request.OperationId)));
9296
}

0 commit comments

Comments
 (0)