Skip to content

Commit 4823ccc

Browse files
committed
Add unit tests for GetSwaggerAsync
1 parent 326091c commit 4823ccc

5 files changed

Lines changed: 368 additions & 0 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.OpenApi.Any;
3+
using Microsoft.OpenApi.Models;
4+
using Swashbuckle.AspNetCore.TestSupport;
5+
6+
namespace Swashbuckle.AspNetCore.SwaggerGen.Test
7+
{
8+
public class TestDocumentAsyncFilter : IDocumentAsyncFilter
9+
{
10+
public Task Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
11+
{
12+
swaggerDoc.Extensions.Add("X-foo", new OpenApiString("bar"));
13+
swaggerDoc.Extensions.Add("X-docName", new OpenApiString(context.DocumentName));
14+
context.SchemaGenerator.GenerateSchema(typeof(ComplexType), context.SchemaRepository);
15+
16+
return Task.CompletedTask;
17+
}
18+
}
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.OpenApi.Any;
3+
using Microsoft.OpenApi.Models;
4+
5+
namespace Swashbuckle.AspNetCore.SwaggerGen.Test
6+
{
7+
public class TestOperationAsyncFilter : IOperationAsyncFilter
8+
{
9+
public Task Apply(OpenApiOperation operation, OperationFilterContext context)
10+
{
11+
operation.Extensions.Add("X-foo", new OpenApiString("bar"));
12+
operation.Extensions.Add("X-docName", new OpenApiString(context.DocumentName));
13+
14+
return Task.CompletedTask;
15+
}
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.OpenApi.Any;
3+
using Microsoft.OpenApi.Models;
4+
5+
namespace Swashbuckle.AspNetCore.SwaggerGen.Test
6+
{
7+
public class TestParameterAsyncFilter : IParameterAsyncFilter
8+
{
9+
public Task Apply(OpenApiParameter parameter, ParameterFilterContext context)
10+
{
11+
parameter.Extensions.Add("X-foo", new OpenApiString("bar"));
12+
parameter.Extensions.Add("X-docName", new OpenApiString(context.DocumentName));
13+
14+
return Task.CompletedTask;
15+
}
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.OpenApi.Any;
3+
using Microsoft.OpenApi.Models;
4+
5+
namespace Swashbuckle.AspNetCore.SwaggerGen.Test
6+
{
7+
public class TestRequestBodyAsyncFilter : IRequestBodyAsyncFilter
8+
{
9+
public Task Apply(OpenApiRequestBody requestBody, RequestBodyFilterContext context)
10+
{
11+
requestBody.Extensions.Add("X-foo", new OpenApiString("bar"));
12+
requestBody.Extensions.Add("X-docName", new OpenApiString(context.DocumentName));
13+
14+
return Task.CompletedTask;
15+
}
16+
}
17+
}
Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Text.Json;
4+
using System.Threading.Tasks;
5+
using Microsoft.AspNetCore.Authentication;
6+
using Microsoft.AspNetCore.Mvc.ApiExplorer;
7+
using Microsoft.AspNetCore.Mvc.ModelBinding;
8+
using Microsoft.OpenApi.Any;
9+
using Microsoft.OpenApi.Models;
10+
using Swashbuckle.AspNetCore.TestSupport;
11+
using Xunit;
12+
13+
namespace Swashbuckle.AspNetCore.SwaggerGen.Test
14+
{
15+
public class SwaggerGeneratorAsyncTests
16+
{
17+
[Fact]
18+
public async Task GetSwaggerAsync_SupportsOption_OperationFilters()
19+
{
20+
var subject = Subject(
21+
apiDescriptions: new[]
22+
{
23+
ApiDescriptionFactory.Create<FakeController>(
24+
c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource")
25+
},
26+
options: new SwaggerGeneratorOptions
27+
{
28+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
29+
{
30+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
31+
},
32+
OperationFilters = new List<IOperationFilter>
33+
{
34+
new TestOperationFilter()
35+
}
36+
}
37+
);
38+
39+
var document = await subject.GetSwaggerAsync("v1");
40+
41+
var operation = document.Paths["/resource"].Operations[OperationType.Post];
42+
Assert.Equal(2, operation.Extensions.Count);
43+
Assert.Equal("bar", ((OpenApiString)operation.Extensions["X-foo"]).Value);
44+
Assert.Equal("v1", ((OpenApiString)operation.Extensions["X-docName"]).Value);
45+
}
46+
47+
[Fact]
48+
public async Task GetSwaggerAsync_SupportsOption_OperationAsyncFilters()
49+
{
50+
var subject = Subject(
51+
apiDescriptions: new[]
52+
{
53+
ApiDescriptionFactory.Create<FakeController>(
54+
c => nameof(c.ActionWithNoParameters), groupName: "v1", httpMethod: "POST", relativePath: "resource")
55+
},
56+
options: new SwaggerGeneratorOptions
57+
{
58+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
59+
{
60+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
61+
},
62+
OperationAsyncFilters = new List<IOperationAsyncFilter>
63+
{
64+
new TestOperationAsyncFilter()
65+
}
66+
}
67+
);
68+
69+
var document = await subject.GetSwaggerAsync("v1");
70+
71+
var operation = document.Paths["/resource"].Operations[OperationType.Post];
72+
Assert.Equal(2, operation.Extensions.Count);
73+
Assert.Equal("bar", ((OpenApiString)operation.Extensions["X-foo"]).Value);
74+
Assert.Equal("v1", ((OpenApiString)operation.Extensions["X-docName"]).Value);
75+
}
76+
77+
[Fact]
78+
public async Task GetSwaggerAsync_SupportsOption_DocumentAsyncFilters()
79+
{
80+
var subject = Subject(
81+
apiDescriptions: new ApiDescription[] { },
82+
options: new SwaggerGeneratorOptions
83+
{
84+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
85+
{
86+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
87+
},
88+
DocumentAsyncFilters = new List<IDocumentAsyncFilter>
89+
{
90+
new TestDocumentAsyncFilter()
91+
}
92+
}
93+
);
94+
95+
var document = await subject.GetSwaggerAsync("v1");
96+
97+
Assert.Equal(2, document.Extensions.Count);
98+
Assert.Equal("bar", ((OpenApiString)document.Extensions["X-foo"]).Value);
99+
Assert.Equal("v1", ((OpenApiString)document.Extensions["X-docName"]).Value);
100+
Assert.Contains("ComplexType", document.Components.Schemas.Keys);
101+
}
102+
103+
[Fact]
104+
public async Task GetSwaggerAsync_SupportsOption_DocumentFilters()
105+
{
106+
var subject = Subject(
107+
apiDescriptions: new ApiDescription[] { },
108+
options: new SwaggerGeneratorOptions
109+
{
110+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
111+
{
112+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
113+
},
114+
DocumentFilters = new List<IDocumentFilter>
115+
{
116+
new TestDocumentFilter()
117+
}
118+
}
119+
);
120+
121+
var document = await subject.GetSwaggerAsync("v1");
122+
123+
Assert.Equal(2, document.Extensions.Count);
124+
Assert.Equal("bar", ((OpenApiString)document.Extensions["X-foo"]).Value);
125+
Assert.Equal("v1", ((OpenApiString)document.Extensions["X-docName"]).Value);
126+
Assert.Contains("ComplexType", document.Components.Schemas.Keys);
127+
}
128+
129+
[Fact]
130+
public async Task GetSwaggerAsync_SupportsOption_RequestBodyAsyncFilters()
131+
{
132+
var subject = Subject(
133+
apiDescriptions: new[]
134+
{
135+
ApiDescriptionFactory.Create<FakeController>(
136+
c => nameof(c.ActionWithParameter),
137+
groupName: "v1",
138+
httpMethod: "POST",
139+
relativePath: "resource",
140+
parameterDescriptions: new []
141+
{
142+
new ApiParameterDescription { Name = "param", Source = BindingSource.Body }
143+
})
144+
},
145+
options: new SwaggerGeneratorOptions
146+
{
147+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
148+
{
149+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
150+
},
151+
RequestBodyAsyncFilters = new List<IRequestBodyAsyncFilter>
152+
{
153+
new TestRequestBodyAsyncFilter()
154+
}
155+
}
156+
);
157+
158+
var document = await subject.GetSwaggerAsync("v1");
159+
160+
var operation = document.Paths["/resource"].Operations[OperationType.Post];
161+
Assert.Equal(2, operation.RequestBody.Extensions.Count);
162+
Assert.Equal("bar", ((OpenApiString)operation.RequestBody.Extensions["X-foo"]).Value);
163+
Assert.Equal("v1", ((OpenApiString)operation.RequestBody.Extensions["X-docName"]).Value);
164+
}
165+
166+
[Fact]
167+
public async Task GetSwaggerAsync_SupportsOption_RequestBodyFilters()
168+
{
169+
var subject = Subject(
170+
apiDescriptions: new[]
171+
{
172+
ApiDescriptionFactory.Create<FakeController>(
173+
c => nameof(c.ActionWithParameter),
174+
groupName: "v1",
175+
httpMethod: "POST",
176+
relativePath: "resource",
177+
parameterDescriptions: new []
178+
{
179+
new ApiParameterDescription { Name = "param", Source = BindingSource.Body }
180+
})
181+
},
182+
options: new SwaggerGeneratorOptions
183+
{
184+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
185+
{
186+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
187+
},
188+
RequestBodyFilters = new List<IRequestBodyFilter>
189+
{
190+
new TestRequestBodyFilter()
191+
}
192+
}
193+
);
194+
195+
var document = await subject.GetSwaggerAsync("v1");
196+
197+
var operation = document.Paths["/resource"].Operations[OperationType.Post];
198+
Assert.Equal(2, operation.RequestBody.Extensions.Count);
199+
Assert.Equal("bar", ((OpenApiString)operation.RequestBody.Extensions["X-foo"]).Value);
200+
Assert.Equal("v1", ((OpenApiString)operation.RequestBody.Extensions["X-docName"]).Value);
201+
}
202+
203+
[Fact]
204+
public async Task GetSwaggerAsync_SupportsOption_ParameterFilters()
205+
{
206+
var subject = Subject(
207+
apiDescriptions: new[]
208+
{
209+
ApiDescriptionFactory.Create<FakeController>(
210+
c => nameof(c.ActionWithParameter),
211+
groupName: "v1",
212+
httpMethod: "POST",
213+
relativePath: "resource",
214+
parameterDescriptions: new []
215+
{
216+
new ApiParameterDescription { Name = "param", Source = BindingSource.Query }
217+
})
218+
},
219+
options: new SwaggerGeneratorOptions
220+
{
221+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
222+
{
223+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
224+
},
225+
ParameterFilters = new List<IParameterFilter>
226+
{
227+
new TestParameterFilter()
228+
}
229+
}
230+
);
231+
232+
var document = await subject.GetSwaggerAsync("v1");
233+
234+
var operation = document.Paths["/resource"].Operations[OperationType.Post];
235+
Assert.Equal(2, operation.Parameters[0].Extensions.Count);
236+
Assert.Equal("bar", ((OpenApiString)operation.Parameters[0].Extensions["X-foo"]).Value);
237+
Assert.Equal("v1", ((OpenApiString)operation.Parameters[0].Extensions["X-docName"]).Value);
238+
}
239+
240+
[Fact]
241+
public async Task GetSwaggerAsync_SupportsOption_ParameterAsyncFilters()
242+
{
243+
var subject = Subject(
244+
apiDescriptions: new[]
245+
{
246+
ApiDescriptionFactory.Create<FakeController>(
247+
c => nameof(c.ActionWithParameter),
248+
groupName: "v1",
249+
httpMethod: "POST",
250+
relativePath: "resource",
251+
parameterDescriptions: new []
252+
{
253+
new ApiParameterDescription { Name = "param", Source = BindingSource.Query }
254+
})
255+
},
256+
options: new SwaggerGeneratorOptions
257+
{
258+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
259+
{
260+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
261+
},
262+
ParameterAsyncFilters = new List<IParameterAsyncFilter>
263+
{
264+
new TestParameterAsyncFilter()
265+
}
266+
}
267+
);
268+
269+
var document = await subject.GetSwaggerAsync("v1");
270+
271+
var operation = document.Paths["/resource"].Operations[OperationType.Post];
272+
Assert.Equal(2, operation.Parameters[0].Extensions.Count);
273+
Assert.Equal("bar", ((OpenApiString)operation.Parameters[0].Extensions["X-foo"]).Value);
274+
Assert.Equal("v1", ((OpenApiString)operation.Parameters[0].Extensions["X-docName"]).Value);
275+
}
276+
277+
private static SwaggerGenerator Subject(
278+
IEnumerable<ApiDescription> apiDescriptions,
279+
SwaggerGeneratorOptions options = null,
280+
IEnumerable<AuthenticationScheme> authenticationSchemes = null)
281+
{
282+
return new SwaggerGenerator(
283+
options ?? DefaultOptions,
284+
new FakeApiDescriptionGroupCollectionProvider(apiDescriptions),
285+
new SchemaGenerator(new SchemaGeneratorOptions(), new JsonSerializerDataContractResolver(new JsonSerializerOptions())),
286+
new FakeAuthenticationSchemeProvider(authenticationSchemes ?? Enumerable.Empty<AuthenticationScheme>())
287+
);
288+
}
289+
290+
private static readonly SwaggerGeneratorOptions DefaultOptions = new SwaggerGeneratorOptions
291+
{
292+
SwaggerDocs = new Dictionary<string, OpenApiInfo>
293+
{
294+
["v1"] = new OpenApiInfo { Version = "V1", Title = "Test API" }
295+
}
296+
};
297+
}
298+
}

0 commit comments

Comments
 (0)