Skip to content
This repository was archived by the owner on Nov 11, 2025. It is now read-only.

Commit aaf4c36

Browse files
Copilotbaywet
andcommitted
Add tests for SecurityScheme deprecated field and update public API
Co-authored-by: baywet <[email protected]>
1 parent 8637a83 commit aaf4c36

File tree

4 files changed

+171
-0
lines changed

4 files changed

+171
-0
lines changed

test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,62 @@ public void ShouldDeserializeSecuritySchemeReferenceAnnotations()
3838
Assert.Equal("This is a security scheme reference", resultReference.Description);
3939
Assert.NotNull(resultReference.Target);
4040
}
41+
42+
[Fact]
43+
public void ShouldDeserializeSecuritySchemeWithXOaiDeprecatedExtension()
44+
{
45+
var json =
46+
"""
47+
{
48+
"type": "apiKey",
49+
"description": "This is a deprecated security scheme",
50+
"name": "api_key",
51+
"in": "header",
52+
"x-oai-deprecated": true
53+
}
54+
""";
55+
56+
var hostDocument = new OpenApiDocument();
57+
var jsonNode = JsonNode.Parse(json);
58+
var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
59+
60+
var result = OpenApiV31Deserializer.LoadSecurityScheme(parseNode, hostDocument);
61+
62+
Assert.NotNull(result);
63+
var resultScheme = Assert.IsType<OpenApiSecurityScheme>(result);
64+
65+
Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
66+
Assert.Equal("api_key", resultScheme.Name);
67+
Assert.Equal(ParameterLocation.Header, resultScheme.In);
68+
Assert.True(resultScheme.Deprecated);
69+
}
70+
71+
[Fact]
72+
public void ShouldDeserializeSecuritySchemeWithDeprecatedField()
73+
{
74+
var json =
75+
"""
76+
{
77+
"type": "apiKey",
78+
"description": "This is a deprecated security scheme",
79+
"name": "api_key",
80+
"in": "header",
81+
"deprecated": true
82+
}
83+
""";
84+
85+
var hostDocument = new OpenApiDocument();
86+
var jsonNode = JsonNode.Parse(json);
87+
var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
88+
89+
var result = OpenApiV31Deserializer.LoadSecurityScheme(parseNode, hostDocument);
90+
91+
Assert.NotNull(result);
92+
var resultScheme = Assert.IsType<OpenApiSecurityScheme>(result);
93+
94+
Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
95+
Assert.Equal("api_key", resultScheme.Name);
96+
Assert.Equal(ParameterLocation.Header, resultScheme.In);
97+
Assert.True(resultScheme.Deprecated);
98+
}
4199
}

test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,34 @@ public void ShouldDeserializeSecuritySchemeReferenceAnnotations()
3838
Assert.Equal("This is a security scheme reference", resultReference.Description);
3939
Assert.NotNull(resultReference.Target);
4040
}
41+
42+
[Fact]
43+
public void ShouldDeserializeSecuritySchemeWithDeprecatedField()
44+
{
45+
var json =
46+
"""
47+
{
48+
"type": "apiKey",
49+
"description": "This is a deprecated security scheme",
50+
"name": "api_key",
51+
"in": "header",
52+
"deprecated": true
53+
}
54+
""";
55+
56+
var hostDocument = new OpenApiDocument();
57+
var jsonNode = JsonNode.Parse(json);
58+
var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
59+
60+
var result = OpenApiV32Deserializer.LoadSecurityScheme(parseNode, hostDocument);
61+
62+
Assert.NotNull(result);
63+
var resultScheme = Assert.IsType<OpenApiSecurityScheme>(result);
64+
65+
Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
66+
Assert.Equal("api_key", resultScheme.Name);
67+
Assert.Equal(ParameterLocation.Header, resultScheme.In);
68+
Assert.True(resultScheme.Deprecated);
69+
}
4170
}
4271

test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ public class OpenApiSecuritySchemeTests
109109
OpenIdConnectUrl = new("https://example.com/openIdConnect")
110110
};
111111

112+
private static OpenApiSecurityScheme DeprecatedApiKeySecurityScheme => new()
113+
{
114+
Description = "description1",
115+
Name = "parameterName",
116+
Type = SecuritySchemeType.ApiKey,
117+
In = ParameterLocation.Query,
118+
Deprecated = true
119+
};
120+
112121
[Fact]
113122
public async Task SerializeApiKeySecuritySchemeAsV3JsonWorks()
114123
{
@@ -329,5 +338,77 @@ public async Task SerializeReferencedSecuritySchemeAsV3JsonWithoutReferenceWorks
329338
// Assert
330339
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
331340
}
341+
342+
[Fact]
343+
public async Task SerializeDeprecatedSecuritySchemeAsV32JsonWorks()
344+
{
345+
// Arrange
346+
var expected =
347+
"""
348+
{
349+
"type": "apiKey",
350+
"description": "description1",
351+
"name": "parameterName",
352+
"in": "query",
353+
"deprecated": true
354+
}
355+
""";
356+
357+
// Act
358+
var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_2);
359+
360+
// Assert
361+
actual = actual.MakeLineBreaksEnvironmentNeutral();
362+
expected = expected.MakeLineBreaksEnvironmentNeutral();
363+
Assert.Equal(expected, actual);
364+
}
365+
366+
[Fact]
367+
public async Task SerializeDeprecatedSecuritySchemeAsV31JsonWorks()
368+
{
369+
// Arrange
370+
var expected =
371+
"""
372+
{
373+
"type": "apiKey",
374+
"description": "description1",
375+
"name": "parameterName",
376+
"in": "query",
377+
"x-oai-deprecated": true
378+
}
379+
""";
380+
381+
// Act
382+
var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1);
383+
384+
// Assert
385+
actual = actual.MakeLineBreaksEnvironmentNeutral();
386+
expected = expected.MakeLineBreaksEnvironmentNeutral();
387+
Assert.Equal(expected, actual);
388+
}
389+
390+
[Fact]
391+
public async Task SerializeDeprecatedSecuritySchemeAsV3JsonWorks()
392+
{
393+
// Arrange
394+
var expected =
395+
"""
396+
{
397+
"type": "apiKey",
398+
"description": "description1",
399+
"name": "parameterName",
400+
"in": "query",
401+
"x-oai-deprecated": true
402+
}
403+
""";
404+
405+
// Act
406+
var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
407+
408+
// Assert
409+
actual = actual.MakeLineBreaksEnvironmentNeutral();
410+
expected = expected.MakeLineBreaksEnvironmentNeutral();
411+
Assert.Equal(expected, actual);
412+
}
332413
}
333414
}

test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ namespace Microsoft.OpenApi
268268
public interface IOpenApiSecurityScheme : Microsoft.OpenApi.IOpenApiDescribedElement, Microsoft.OpenApi.IOpenApiElement, Microsoft.OpenApi.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.IOpenApiReferenceable, Microsoft.OpenApi.IOpenApiSerializable, Microsoft.OpenApi.IShallowCopyable<Microsoft.OpenApi.IOpenApiSecurityScheme>
269269
{
270270
string? BearerFormat { get; }
271+
bool Deprecated { get; }
271272
Microsoft.OpenApi.OpenApiOAuthFlows? Flows { get; }
272273
Microsoft.OpenApi.ParameterLocation? In { get; }
273274
string? Name { get; }
@@ -1299,6 +1300,7 @@ namespace Microsoft.OpenApi
12991300
{
13001301
public OpenApiSecurityScheme() { }
13011302
public string? BearerFormat { get; set; }
1303+
public bool Deprecated { get; set; }
13021304
public string? Description { get; set; }
13031305
public System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.IOpenApiExtension>? Extensions { get; set; }
13041306
public Microsoft.OpenApi.OpenApiOAuthFlows? Flows { get; set; }
@@ -1317,6 +1319,7 @@ namespace Microsoft.OpenApi
13171319
{
13181320
public OpenApiSecuritySchemeReference(string referenceId, Microsoft.OpenApi.OpenApiDocument? hostDocument = null, string? externalResource = null) { }
13191321
public string? BearerFormat { get; }
1322+
public bool Deprecated { get; }
13201323
public string? Description { get; set; }
13211324
public System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.IOpenApiExtension>? Extensions { get; }
13221325
public Microsoft.OpenApi.OpenApiOAuthFlows? Flows { get; }

0 commit comments

Comments
 (0)