@@ -187,6 +187,155 @@ public async Task SerializeApiKeySecuritySchemeAsV3YamlWorks()
187187 Assert . Equal ( expected , actual ) ;
188188 }
189189
190+ [ Theory ]
191+ [ InlineData ( OpenApiSpecVersion . OpenApi2_0 ) ]
192+ [ InlineData ( OpenApiSpecVersion . OpenApi3_0 ) ]
193+ [ InlineData ( OpenApiSpecVersion . OpenApi3_1 ) ]
194+ [ InlineData ( OpenApiSpecVersion . OpenApi3_2 ) ]
195+ public Task SerializeSecuritySchemeWithoutTypeThrows ( OpenApiSpecVersion version )
196+ {
197+ // Arrange
198+ var securityScheme = new OpenApiSecurityScheme ( ) ;
199+
200+ // Act & Assert
201+ return AssertRequiredPropertyThrowsAsync (
202+ securityScheme ,
203+ version ,
204+ "The 'type' property is required for security schemes." ) ;
205+ }
206+
207+ [ Theory ]
208+ [ InlineData ( OpenApiSpecVersion . OpenApi2_0 ) ]
209+ [ InlineData ( OpenApiSpecVersion . OpenApi3_0 ) ]
210+ [ InlineData ( OpenApiSpecVersion . OpenApi3_1 ) ]
211+ [ InlineData ( OpenApiSpecVersion . OpenApi3_2 ) ]
212+ public Task SerializeApiKeySecuritySchemeWithoutNameThrows ( OpenApiSpecVersion version )
213+ {
214+ // Arrange
215+ var securityScheme = new OpenApiSecurityScheme
216+ {
217+ Type = SecuritySchemeType . ApiKey ,
218+ In = ParameterLocation . Query
219+ } ;
220+
221+ // Act & Assert
222+ return AssertRequiredPropertyThrowsAsync (
223+ securityScheme ,
224+ version ,
225+ "The 'name' property is required for apiKey security schemes." ) ;
226+ }
227+
228+ [ Theory ]
229+ [ InlineData ( OpenApiSpecVersion . OpenApi2_0 ) ]
230+ [ InlineData ( OpenApiSpecVersion . OpenApi3_0 ) ]
231+ [ InlineData ( OpenApiSpecVersion . OpenApi3_1 ) ]
232+ [ InlineData ( OpenApiSpecVersion . OpenApi3_2 ) ]
233+ public Task SerializeApiKeySecuritySchemeWithoutInThrows ( OpenApiSpecVersion version )
234+ {
235+ // Arrange
236+ var securityScheme = new OpenApiSecurityScheme
237+ {
238+ Name = "parameterName" ,
239+ Type = SecuritySchemeType . ApiKey
240+ } ;
241+
242+ // Act & Assert
243+ return AssertRequiredPropertyThrowsAsync (
244+ securityScheme ,
245+ version ,
246+ "The 'in' property is required for apiKey security schemes." ) ;
247+ }
248+
249+ [ Theory ]
250+ [ InlineData ( OpenApiSpecVersion . OpenApi3_0 ) ]
251+ [ InlineData ( OpenApiSpecVersion . OpenApi3_1 ) ]
252+ [ InlineData ( OpenApiSpecVersion . OpenApi3_2 ) ]
253+ public Task SerializeHttpSecuritySchemeWithoutSchemeThrows ( OpenApiSpecVersion version )
254+ {
255+ // Arrange
256+ var securityScheme = new OpenApiSecurityScheme
257+ {
258+ Type = SecuritySchemeType . Http
259+ } ;
260+
261+ // Act & Assert
262+ return AssertRequiredPropertyThrowsAsync (
263+ securityScheme ,
264+ version ,
265+ "The 'scheme' property is required for http security schemes." ) ;
266+ }
267+
268+ [ Fact ]
269+ public async Task SerializeHttpSecuritySchemeWithoutSchemeAsV2DoesNotThrow ( )
270+ {
271+ // Arrange
272+ var securityScheme = new OpenApiSecurityScheme
273+ {
274+ Type = SecuritySchemeType . Http
275+ } ;
276+
277+ // Act
278+ var actual = await securityScheme . SerializeAsJsonAsync ( OpenApiSpecVersion . OpenApi2_0 ) ;
279+
280+ // Assert
281+ Assert . True ( JsonNode . DeepEquals ( JsonNode . Parse ( "{}" ) , JsonNode . Parse ( actual ) ) ) ;
282+ }
283+
284+ [ Theory ]
285+ [ InlineData ( OpenApiSpecVersion . OpenApi2_0 ) ]
286+ [ InlineData ( OpenApiSpecVersion . OpenApi3_0 ) ]
287+ [ InlineData ( OpenApiSpecVersion . OpenApi3_1 ) ]
288+ [ InlineData ( OpenApiSpecVersion . OpenApi3_2 ) ]
289+ public Task SerializeOAuth2SecuritySchemeWithoutFlowsThrows ( OpenApiSpecVersion version )
290+ {
291+ // Arrange
292+ var securityScheme = new OpenApiSecurityScheme
293+ {
294+ Type = SecuritySchemeType . OAuth2
295+ } ;
296+
297+ // Act & Assert
298+ return AssertRequiredPropertyThrowsAsync (
299+ securityScheme ,
300+ version ,
301+ "The 'flows' property is required for oauth2 security schemes." ) ;
302+ }
303+
304+ [ Theory ]
305+ [ InlineData ( OpenApiSpecVersion . OpenApi3_0 ) ]
306+ [ InlineData ( OpenApiSpecVersion . OpenApi3_1 ) ]
307+ [ InlineData ( OpenApiSpecVersion . OpenApi3_2 ) ]
308+ public Task SerializeOpenIdConnectSecuritySchemeWithoutOpenIdConnectUrlThrows ( OpenApiSpecVersion version )
309+ {
310+ // Arrange
311+ var securityScheme = new OpenApiSecurityScheme
312+ {
313+ Type = SecuritySchemeType . OpenIdConnect
314+ } ;
315+
316+ // Act & Assert
317+ return AssertRequiredPropertyThrowsAsync (
318+ securityScheme ,
319+ version ,
320+ "The 'openIdConnectUrl' property is required for openIdConnect security schemes." ) ;
321+ }
322+
323+ [ Fact ]
324+ public async Task SerializeOpenIdConnectSecuritySchemeWithoutOpenIdConnectUrlAsV2DoesNotThrow ( )
325+ {
326+ // Arrange
327+ var securityScheme = new OpenApiSecurityScheme
328+ {
329+ Type = SecuritySchemeType . OpenIdConnect
330+ } ;
331+
332+ // Act
333+ var actual = await securityScheme . SerializeAsJsonAsync ( OpenApiSpecVersion . OpenApi2_0 ) ;
334+
335+ // Assert
336+ Assert . True ( JsonNode . DeepEquals ( JsonNode . Parse ( "{}" ) , JsonNode . Parse ( actual ) ) ) ;
337+ }
338+
190339 [ Fact ]
191340 public async Task SerializeHttpBasicSecuritySchemeAsV3JsonWorks ( )
192341 {
@@ -498,5 +647,11 @@ public async Task SerializeDeprecatedSecuritySchemeAsV3JsonWorks()
498647 // Assert
499648 Assert . True ( JsonNode . DeepEquals ( JsonNode . Parse ( expected ) , JsonNode . Parse ( actual ) ) ) ;
500649 }
650+
651+ private static async Task AssertRequiredPropertyThrowsAsync ( OpenApiSecurityScheme securityScheme , OpenApiSpecVersion version , string message )
652+ {
653+ var exception = await Assert . ThrowsAsync < OpenApiException > ( ( ) => securityScheme . SerializeAsJsonAsync ( version ) ) ;
654+ Assert . Contains ( message , exception . Message ) ;
655+ }
501656 }
502657}
0 commit comments