Skip to content

Commit 020b7d8

Browse files
committedDec 1, 2020
2 parents dede7bc + f6b5abc commit 020b7d8

File tree

9 files changed

+318
-35
lines changed

9 files changed

+318
-35
lines changed
 

‎.github/workflows/dotnet-core.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
runs-on: ${{ matrix.os }}
1313
strategy:
1414
matrix:
15-
os: [ ubuntu-latest, windows-latest, macos-latest ]
15+
os: [ ubuntu-latest, windows-latest ]
1616

1717
steps:
1818
- uses: actions/checkout@v2

‎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.3.6</Version>
3+
<Version>0.3.7</Version>
44
</PropertyGroup>
55
</Project>

‎README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ Major features:
1616
- access swagger.json from URL, which is protected by `basic authentication`,
1717
- control which swagger endpoints are returned by specifying `request filters` (check below)
1818

19+
## Video material
20+
21+
1. Introduction to Swagger Library
22+
23+
[![Swagger Library part 1](https://i9.ytimg.com/vi/EhQQMNZbwVY/mq2.jpg?sqp=CIirif4F&rs=AOn4CLCVs7LUGLQ63wZWNnLb8XAr3CShtA)](https://youtu.be/EhQQMNZbwVY "Swagger Library part 1")
24+
25+
2. Swagger RequestFilter explained
26+
27+
28+
3. Generate a CSV report
29+
1930
## Sample
2031

2132
This is a sample of instantiating a new Swagger Source object from URL.
@@ -28,8 +39,8 @@ SwaggerUrlSource swaggerSource = new SwaggerUrlSource(
2839
options.AddBasicAuthentication("myuser", "mypassword");
2940
options.AddRequestFilters(new RequestFilter()
3041
{
31-
AuthenticationTypes = new List<AuthenticationType>() { AuthenticationType.Customer },
32-
TestTypes = new List<TestType>() { TestType.LoadTest },
42+
AuthenticationTypes = new List<AuthenticationType.Enumeration>() { AuthenticationType.Enumeration.Customer },
43+
TestTypes = new List<TestType.Enumeration>() { TestType.Enumeration.LoadTest },
3344
EndpointNameWhitelist = new string[] { "GetCategories" }
3445
});
3546
options.AddBaseUrl(new Uri("https://dev.myapi.com"));
@@ -105,7 +116,7 @@ Similarly as in the `AuthenticationTypes` you can filter out certain endpoints t
105116

106117
- TestType.LoadTest which specifies a string `"@loadtest"`,
107118
- TestType.IntegrationTest which specifies a string `"@integrationtest"`,
108-
- TestType.SecurityTest which specifies a string `"@securitytest"`,
119+
- TestType.SecurityTest which specifies a string `"@securitytest"`
109120

110121
The same swagger.json excerpt which support test type tags might look like this:
111122

‎src/QAToolKit.Source.Swagger.Test/SwaggerOptionsTest.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,13 @@ public void SwaggerAuthenticationTypeRequestFiltersTest_Successful()
7272
var options = new SwaggerOptions();
7373
options.AddRequestFilters(new RequestFilter()
7474
{
75-
AuthenticationTypes = new List<AuthenticationType>() { AuthenticationType.Administrator, AuthenticationType.Basic }
75+
AuthenticationTypes = new List<AuthenticationType.Enumeration>() { AuthenticationType.Enumeration.Administrator, AuthenticationType.Enumeration.Basic }
7676
});
7777

78-
Assert.NotNull(options.RequestFilter.AuthenticationTypes.FirstOrDefault(i => i == AuthenticationType.Administrator));
79-
Assert.Null(options.RequestFilter.AuthenticationTypes.FirstOrDefault(i => i == AuthenticationType.Customer));
80-
Assert.Null(options.RequestFilter.AuthenticationTypes.FirstOrDefault(i => i == AuthenticationType.ApiKey));
81-
Assert.NotNull(options.RequestFilter.AuthenticationTypes.FirstOrDefault(i => i == AuthenticationType.Basic));
78+
Assert.Contains(AuthenticationType.Enumeration.Administrator, options.RequestFilter.AuthenticationTypes);
79+
Assert.DoesNotContain(AuthenticationType.Enumeration.Customer, options.RequestFilter.AuthenticationTypes);
80+
Assert.DoesNotContain(AuthenticationType.Enumeration.ApiKey, options.RequestFilter.AuthenticationTypes);
81+
Assert.Contains(AuthenticationType.Enumeration.Basic, options.RequestFilter.AuthenticationTypes);
8282
Assert.True(options.UseRequestFilter);
8383
}
8484

@@ -101,13 +101,13 @@ public void SwaggerTestTypeRequestFiltersTest_Successful()
101101
var options = new SwaggerOptions();
102102
options.AddRequestFilters(new RequestFilter()
103103
{
104-
TestTypes = new List<TestType>() { TestType.LoadTest }
104+
TestTypes = new List<TestType.Enumeration>() { TestType.Enumeration.LoadTest }
105105
});
106106

107-
Assert.NotNull(options.RequestFilter.TestTypes.FirstOrDefault(i => i == TestType.LoadTest));
108-
Assert.Null(options.RequestFilter.TestTypes.FirstOrDefault(i => i == TestType.IntegrationTest));
109-
Assert.Null(options.RequestFilter.TestTypes.FirstOrDefault(i => i == TestType.SecurityTest));
110-
Assert.Null(options.RequestFilter.TestTypes.FirstOrDefault(i => i == TestType.SqlTest));
107+
Assert.Contains(TestType.Enumeration.LoadTest, options.RequestFilter.TestTypes);
108+
Assert.DoesNotContain(TestType.Enumeration.IntegrationTest, options.RequestFilter.TestTypes);
109+
Assert.DoesNotContain(TestType.Enumeration.SecurityTest, options.RequestFilter.TestTypes);
110+
Assert.DoesNotContain(TestType.Enumeration.SqlTest, options.RequestFilter.TestTypes);
111111
Assert.True(options.UseRequestFilter);
112112
}
113113

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
using Microsoft.Extensions.Logging;
2+
using Newtonsoft.Json;
3+
using QAToolKit.Core.Models;
4+
using QAToolKit.Source.Swagger.Exceptions;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.IO;
8+
using System.Linq;
9+
using System.Net.Http;
10+
using System.Threading.Tasks;
11+
using Xunit;
12+
using Xunit.Abstractions;
13+
14+
namespace QAToolKit.Source.Swagger.Test
15+
{
16+
public class SwaggerRequestFilterTests
17+
{
18+
[Fact]
19+
public async Task SwaggerRequestFilterOnlyOperationIdTest_Success()
20+
{
21+
var urlSource = new SwaggerUrlSource(options =>
22+
{
23+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
24+
options.AddRequestFilters(new RequestFilter()
25+
{
26+
EndpointNameWhitelist = new string[] { "GetAllBikes", "UpdateBike" }
27+
});
28+
options.UseSwaggerExampleValues = true;
29+
});
30+
31+
var requests = await urlSource.Load(new Uri[] {
32+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v1/swagger.json")
33+
});
34+
35+
Assert.Equal(2, requests.Count());
36+
}
37+
38+
[Fact]
39+
public async Task SwaggerRequestFilterOnlyAuthTypeTest_Success()
40+
{
41+
var urlSource = new SwaggerUrlSource(options =>
42+
{
43+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
44+
options.AddRequestFilters(new RequestFilter()
45+
{
46+
AuthenticationTypes = new List<AuthenticationType.Enumeration> { AuthenticationType.Enumeration.ApiKey }
47+
});
48+
options.UseSwaggerExampleValues = true;
49+
});
50+
51+
var requests = await urlSource.Load(new Uri[] {
52+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
53+
});
54+
55+
Assert.Equal(3, requests.Count());
56+
}
57+
58+
[Fact]
59+
public async Task SwaggerRequestFilterOnlyTestTypeTest_Success()
60+
{
61+
var urlSource = new SwaggerUrlSource(options =>
62+
{
63+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
64+
options.AddRequestFilters(new RequestFilter()
65+
{
66+
TestTypes = new List<TestType.Enumeration> { TestType.Enumeration.LoadTest }
67+
});
68+
options.UseSwaggerExampleValues = true;
69+
});
70+
71+
var requests = await urlSource.Load(new Uri[] {
72+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
73+
});
74+
75+
Assert.Equal(5, requests.Count());
76+
}
77+
78+
[Fact]
79+
public async Task SwaggerRequestFilterTestAndAuthTypeTest_Success()
80+
{
81+
var urlSource = new SwaggerUrlSource(options =>
82+
{
83+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
84+
options.AddRequestFilters(new RequestFilter()
85+
{
86+
TestTypes = new List<TestType.Enumeration> { TestType.Enumeration.LoadTest },
87+
AuthenticationTypes = new List<AuthenticationType.Enumeration> { AuthenticationType.Enumeration.ApiKey }
88+
});
89+
options.UseSwaggerExampleValues = true;
90+
});
91+
92+
var requests = await urlSource.Load(new Uri[] {
93+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
94+
});
95+
96+
Assert.Equal(3, requests.Count());
97+
}
98+
99+
[Fact]
100+
public async Task SwaggerRequestFilterOperationIdAndAuthTypeTest_Success()
101+
{
102+
var urlSource = new SwaggerUrlSource(options =>
103+
{
104+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
105+
options.AddRequestFilters(new RequestFilter()
106+
{
107+
TestTypes = new List<TestType.Enumeration> { TestType.Enumeration.LoadTest },
108+
EndpointNameWhitelist = new string[] { "UpdateBike" }
109+
});
110+
options.UseSwaggerExampleValues = true;
111+
});
112+
113+
var requests = await urlSource.Load(new Uri[] {
114+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
115+
});
116+
117+
Assert.Single(requests);
118+
}
119+
120+
[Fact]
121+
public async Task SwaggerRequestFilterOperationIdAndTestTypeTest_Success()
122+
{
123+
var urlSource = new SwaggerUrlSource(options =>
124+
{
125+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
126+
options.AddRequestFilters(new RequestFilter()
127+
{
128+
TestTypes = new List<TestType.Enumeration> { TestType.Enumeration.LoadTest },
129+
EndpointNameWhitelist = new string[] { "GetAllBikes", "UpdateBike" }
130+
});
131+
options.UseSwaggerExampleValues = true;
132+
});
133+
134+
var requests = await urlSource.Load(new Uri[] {
135+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
136+
});
137+
138+
Assert.Equal(2, requests.Count());
139+
}
140+
141+
[Fact]
142+
public async Task SwaggerRequestFilterOperationIdAndAuthTypeAndTestTypeTest_Success()
143+
{
144+
var urlSource = new SwaggerUrlSource(options =>
145+
{
146+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
147+
options.AddRequestFilters(new RequestFilter()
148+
{
149+
TestTypes = new List<TestType.Enumeration> { TestType.Enumeration.LoadTest },
150+
EndpointNameWhitelist = new string[] { "GetAllBikes", "UpdateBike" },
151+
AuthenticationTypes = new List<AuthenticationType.Enumeration> { AuthenticationType.Enumeration.ApiKey }
152+
});
153+
options.UseSwaggerExampleValues = true;
154+
});
155+
156+
var requests = await urlSource.Load(new Uri[] {
157+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
158+
});
159+
160+
Assert.Single(requests);
161+
}
162+
163+
[Fact]
164+
public async Task SwaggerRequestFilterOperationIdAndAuthTypeAndTestTypeAlternativeTest_Success()
165+
{
166+
var urlSource = new SwaggerUrlSource(options =>
167+
{
168+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
169+
options.AddRequestFilters(new RequestFilter()
170+
{
171+
TestTypes = new List<TestType.Enumeration> { TestType.Enumeration.LoadTest },
172+
EndpointNameWhitelist = new string[] { "DeleteBike", "UpdateBike" },
173+
AuthenticationTypes = new List<AuthenticationType.Enumeration> { AuthenticationType.Enumeration.ApiKey }
174+
});
175+
options.UseSwaggerExampleValues = true;
176+
});
177+
178+
var requests = await urlSource.Load(new Uri[] {
179+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
180+
});
181+
182+
Assert.Equal(2, requests.Count());
183+
}
184+
}
185+
}

‎src/QAToolKit.Source.Swagger.Test/SwaggerTests/BicycleApi/Get/SwaggerProcessorGetBicycleByIdTests.cs

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using QAToolKit.Source.Swagger.Test.Fixtures.BicycleApi.Get;
66
using QAToolKit.Source.Swagger.Test.Fixtures.BicycleApi.Get.Helpers;
77
using System;
8+
using System.Collections.Generic;
89
using System.Linq;
910
using System.Net.Http;
1011
using System.Threading.Tasks;
@@ -25,7 +26,7 @@ public SwaggerProcessorGetBicycleByIdTests(ITestOutputHelper testOutputHelper)
2526
}
2627

2728
[Fact]
28-
public async Task PetsSwaggerGetPetByIdWithExampleValuesTest_Successfull()
29+
public async Task PetsSwaggerGetPetByIdWithExampleValuesTestV1_Successfull()
2930
{
3031
var urlSource = new SwaggerUrlSource(options =>
3132
{
@@ -70,7 +71,7 @@ public async Task PetsSwaggerGetPetByIdWithExampleValuesTest_Successfull()
7071
}
7172

7273
[Fact]
73-
public async Task PetsSwaggerGetPetByIdWithExampleValuesAndDifferentBaseAddressTest_Successfull()
74+
public async Task PetsSwaggerGetPetByIdWithExampleValuesAndDifferentBaseAddressTestV1_Successfull()
7475
{
7576
var urlSource = new SwaggerUrlSource(options =>
7677
{
@@ -113,5 +114,91 @@ public async Task PetsSwaggerGetPetByIdWithExampleValuesAndDifferentBaseAddressT
113114
});
114115
Assert.Empty(requests.FirstOrDefault().TestTypes);
115116
}
117+
118+
[Fact]
119+
public async Task PetsSwaggerGetPetByIdWithExampleValuesTestV2_Successfull()
120+
{
121+
var urlSource = new SwaggerUrlSource(options =>
122+
{
123+
options.AddBaseUrl(new Uri("https://qatoolkitapi.azurewebsites.net/"));
124+
options.AddRequestFilters(new RequestFilter()
125+
{
126+
EndpointNameWhitelist = new string[] { "NewBike", "UpdateBike" },
127+
AuthenticationTypes = new List<AuthenticationType.Enumeration>() { AuthenticationType.Enumeration.ApiKey }
128+
});
129+
options.UseSwaggerExampleValues = true;
130+
});
131+
132+
var requests = await urlSource.Load(new Uri[] {
133+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
134+
});
135+
136+
_logger.LogInformation(JsonConvert.SerializeObject(requests, Formatting.Indented));
137+
138+
Assert.NotNull(requests);
139+
Assert.Equal(2, requests.Count());
140+
Assert.Equal("https://qatoolkitapi.azurewebsites.net/", requests.FirstOrDefault().BasePath);
141+
Assert.Equal("Add new bike. TEST TAGS -> [@integrationtest,@loadtest,@apikey,@customer]", requests.FirstOrDefault().Description);
142+
Assert.Equal(HttpMethod.Post, requests.FirstOrDefault().Method);
143+
Assert.Equal("NewBike", requests.FirstOrDefault().OperationId);
144+
Assert.Equal(3, requests.FirstOrDefault().Parameters.Count);
145+
Assert.Equal("/api/bicycles", requests.FirstOrDefault().Path);
146+
Assert.NotEmpty(requests.FirstOrDefault().RequestBodies);
147+
Assert.Equal(3, requests.FirstOrDefault().Responses.Count);
148+
149+
Assert.Equal("Create new bicycle", requests.FirstOrDefault().Summary);
150+
Assert.Collection(requests.FirstOrDefault().Tags, item =>
151+
{
152+
item = "Public";
153+
});
154+
Assert.Equal(2, requests.FirstOrDefault().TestTypes.Count);
155+
Assert.Equal(2, requests.FirstOrDefault().AuthenticationTypes.Count);
156+
Assert.Contains(TestType.Enumeration.IntegrationTest, requests.FirstOrDefault().TestTypes);
157+
Assert.Contains(TestType.Enumeration.LoadTest, requests.FirstOrDefault().TestTypes);
158+
Assert.Contains(AuthenticationType.Enumeration.ApiKey, requests.FirstOrDefault().AuthenticationTypes);
159+
}
160+
161+
[Fact]
162+
public async Task PetsSwaggerGetPetByIdWithExampleValuesAndDifferentBaseAddressTestV2_Successfull()
163+
{
164+
var urlSource = new SwaggerUrlSource(options =>
165+
{
166+
options.AddBaseUrl(new Uri("http://localhost/"));
167+
options.AddRequestFilters(new RequestFilter()
168+
{
169+
EndpointNameWhitelist = new string[] { "NewBike", "UpdateBike" },
170+
AuthenticationTypes = new List<AuthenticationType.Enumeration>() { AuthenticationType.Enumeration.ApiKey }
171+
});
172+
options.UseSwaggerExampleValues = true;
173+
});
174+
175+
var requests = await urlSource.Load(new Uri[] {
176+
new Uri("https://qatoolkitapi.azurewebsites.net/swagger/v2/swagger.json")
177+
});
178+
179+
_logger.LogInformation(JsonConvert.SerializeObject(requests, Formatting.Indented));
180+
181+
Assert.NotNull(requests);
182+
Assert.Equal(2, requests.Count());
183+
Assert.Equal("http://localhost/", requests.FirstOrDefault().BasePath);
184+
Assert.Equal("Add new bike. TEST TAGS -> [@integrationtest,@loadtest,@apikey,@customer]", requests.FirstOrDefault().Description);
185+
Assert.Equal(HttpMethod.Post, requests.FirstOrDefault().Method);
186+
Assert.Equal("NewBike", requests.FirstOrDefault().OperationId);
187+
Assert.Equal(3, requests.FirstOrDefault().Parameters.Count);
188+
Assert.Equal("/api/bicycles", requests.FirstOrDefault().Path);
189+
Assert.NotEmpty(requests.FirstOrDefault().RequestBodies);
190+
Assert.Equal(3, requests.FirstOrDefault().Responses.Count);
191+
192+
Assert.Equal("Create new bicycle", requests.FirstOrDefault().Summary);
193+
Assert.Collection(requests.FirstOrDefault().Tags, item =>
194+
{
195+
item = "Public";
196+
});
197+
Assert.Equal(2, requests.FirstOrDefault().TestTypes.Count);
198+
Assert.Equal(2, requests.FirstOrDefault().AuthenticationTypes.Count);
199+
Assert.Contains(TestType.Enumeration.IntegrationTest, requests.FirstOrDefault().TestTypes);
200+
Assert.Contains(TestType.Enumeration.LoadTest, requests.FirstOrDefault().TestTypes);
201+
Assert.Contains(AuthenticationType.Enumeration.ApiKey, requests.FirstOrDefault().AuthenticationTypes);
202+
}
116203
}
117204
}

0 commit comments

Comments
 (0)