diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs new file mode 100644 index 000000000..620ad185c --- /dev/null +++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.Interfaces; + +/// +/// Defines the base properties for the security scheme object. +/// This interface is provided for type assertions but should not be implemented by package consumers beyond automatic mocking. +/// +public interface IOpenApiSecurityScheme : IOpenApiDescribedElement, IOpenApiSerializable, IOpenApiReadOnlyExtensible +{ + /// + /// REQUIRED. The type of the security scheme. Valid values are "apiKey", "http", "oauth2", "openIdConnect". + /// + public SecuritySchemeType? Type { get; } + + /// + /// REQUIRED. The name of the header, query or cookie parameter to be used. + /// + public string Name { get; } + + /// + /// REQUIRED. The location of the API key. Valid values are "query", "header" or "cookie". + /// + public ParameterLocation? In { get; } + + /// + /// REQUIRED. The name of the HTTP Authorization scheme to be used + /// in the Authorization header as defined in RFC7235. + /// + public string Scheme { get; } + + /// + /// A hint to the client to identify how the bearer token is formatted. + /// Bearer tokens are usually generated by an authorization server, + /// so this information is primarily for documentation purposes. + /// + public string BearerFormat { get; } + + /// + /// REQUIRED. An object containing configuration information for the flow types supported. + /// + public OpenApiOAuthFlows Flows { get; } + + /// + /// REQUIRED. OpenId Connect URL to discover OAuth2 configuration values. + /// + public Uri OpenIdConnectUrl { get; } +} diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index 6b735087e..250254212 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -50,10 +50,10 @@ public class OpenApiComponents : IOpenApiSerializable, IOpenApiExtensible public IDictionary? Headers { get; set; } = new Dictionary(); /// - /// An object to hold reusable Objects. + /// An object to hold reusable Objects. /// - public IDictionary? SecuritySchemes { get; set; } = - new Dictionary(); + public IDictionary? SecuritySchemes { get; set; } = + new Dictionary(); /// /// An object to hold reusable Objects. @@ -91,7 +91,7 @@ public OpenApiComponents(OpenApiComponents? components) Examples = components?.Examples != null ? new Dictionary(components.Examples) : null; RequestBodies = components?.RequestBodies != null ? new Dictionary(components.RequestBodies) : null; Headers = components?.Headers != null ? new Dictionary(components.Headers) : null; - SecuritySchemes = components?.SecuritySchemes != null ? new Dictionary(components.SecuritySchemes) : null; + SecuritySchemes = components?.SecuritySchemes != null ? new Dictionary(components.SecuritySchemes) : null; Links = components?.Links != null ? new Dictionary(components.Links) : null; Callbacks = components?.Callbacks != null ? new Dictionary(components.Callbacks) : null; PathItems = components?.PathItems != null ? new Dictionary(components.PathItems) : null; diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index eaf436793..72fb875ef 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -624,7 +624,7 @@ public bool AddComponent(string id, T componentToRegister) Components.Headers.Add(id, openApiHeader); break; case OpenApiSecurityScheme openApiSecurityScheme: - Components.SecuritySchemes ??= new Dictionary(); + Components.SecuritySchemes ??= new Dictionary(); Components.SecuritySchemes.Add(id, openApiSecurityScheme); break; default: diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs index 428d0649e..193d648df 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs @@ -3,7 +3,10 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -16,7 +19,7 @@ namespace Microsoft.OpenApi.Models /// then the value is a list of scope names required for the execution. /// For other security scheme types, the array MUST be empty. /// - public class OpenApiSecurityRequirement : Dictionary>, + public class OpenApiSecurityRequirement : Dictionary>, IOpenApiSerializable { /// @@ -34,7 +37,7 @@ public OpenApiSecurityRequirement() /// public void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); + SerializeInternal(writer, (w, s) => w.WritePropertyName(s.Reference.ReferenceV3)); } /// @@ -42,32 +45,28 @@ public void SerializeAsV31(IOpenApiWriter writer) /// public void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer)); + SerializeInternal(writer, (w, s) => w.WritePropertyName(s.Reference.ReferenceV3)); } /// /// Serialize /// - private void SerializeInternal(IOpenApiWriter writer, Action callback) + private void SerializeInternal(IOpenApiWriter writer, Action callback) { - Utils.CheckArgumentNull(writer);; + Utils.CheckArgumentNull(writer); writer.WriteStartObject(); - foreach (var securitySchemeAndScopesValuePair in this) + // Reaching this point means the reference to a specific OpenApiSecurityScheme fails. + // We are not able to serialize this SecurityScheme/Scopes key value pair since we do not know what + // string to output. + + foreach (var securitySchemeAndScopesValuePair in this.Where(static p => p.Key?.Target is not null)) { var securityScheme = securitySchemeAndScopesValuePair.Key; var scopes = securitySchemeAndScopesValuePair.Value; - if (securityScheme.Reference == null) - { - // Reaching this point means the reference to a specific OpenApiSecurityScheme fails. - // We are not able to serialize this SecurityScheme/Scopes key value pair since we do not know what - // string to output. - continue; - } - - writer.WritePropertyName(securityScheme.Reference.ReferenceV3); + callback(writer, securityScheme); writer.WriteStartArray(); @@ -87,48 +86,19 @@ private void SerializeInternal(IOpenApiWriter writer, Action public void SerializeAsV2(IOpenApiWriter writer) { - Utils.CheckArgumentNull(writer);; - - writer.WriteStartObject(); - - foreach (var securitySchemeAndScopesValuePair in this) - { - var securityScheme = securitySchemeAndScopesValuePair.Key; - var scopes = securitySchemeAndScopesValuePair.Value; - - if (securityScheme.Reference == null) - { - // Reaching this point means the reference to a specific OpenApiSecurityScheme fails. - // We are not able to serialize this SecurityScheme/Scopes key value pair since we do not know what - // string to output. - continue; - } - - securityScheme.SerializeAsV2(writer); - - writer.WriteStartArray(); - - foreach (var scope in scopes) - { - writer.WriteValue(scope); - } - - writer.WriteEndArray(); - } - - writer.WriteEndObject(); + SerializeInternal(writer, (w, s) => s.SerializeAsV2(w)); } /// /// Comparer for OpenApiSecurityScheme that only considers the Id in the Reference /// (i.e. the string that will actually be displayed in the written document) /// - private class OpenApiSecuritySchemeReferenceEqualityComparer : IEqualityComparer + private sealed class OpenApiSecuritySchemeReferenceEqualityComparer : IEqualityComparer { /// /// Determines whether the specified objects are equal. /// - public bool Equals(OpenApiSecurityScheme x, OpenApiSecurityScheme y) + public bool Equals(OpenApiSecuritySchemeReference x, OpenApiSecuritySchemeReference y) { if (x == null && y == null) { @@ -140,20 +110,19 @@ public bool Equals(OpenApiSecurityScheme x, OpenApiSecurityScheme y) return false; } - if (x.Reference == null || y.Reference == null) - { - return false; - } - - return x.Reference.Id == y.Reference.Id; + return GetHashCode(x) == GetHashCode(y); } /// /// Returns a hash code for the specified object. /// - public int GetHashCode(OpenApiSecurityScheme obj) + public int GetHashCode(OpenApiSecuritySchemeReference obj) { - return obj?.Reference?.Id == null ? 0 : obj.Reference.Id.GetHashCode(); + if (obj is null) + { + return 0; + } + return string.IsNullOrEmpty(obj?.Reference?.Id) ? 0 : obj.Reference.Id.GetHashCode(); } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index d9227be25..3d9e0e636 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models @@ -12,65 +13,34 @@ namespace Microsoft.OpenApi.Models /// /// Security Scheme Object. /// - public class OpenApiSecurityScheme : IOpenApiReferenceable, IOpenApiExtensible + public class OpenApiSecurityScheme : IOpenApiExtensible, IOpenApiReferenceable, IOpenApiSecurityScheme { - /// - /// REQUIRED. The type of the security scheme. Valid values are "apiKey", "http", "oauth2", "openIdConnect". - /// - public virtual SecuritySchemeType? Type { get; set; } - - /// - /// A short description for security scheme. CommonMark syntax MAY be used for rich text representation. - /// - public virtual string Description { get; set; } - - /// - /// REQUIRED. The name of the header, query or cookie parameter to be used. - /// - public virtual string Name { get; set; } + /// + public SecuritySchemeType? Type { get; set; } - /// - /// REQUIRED. The location of the API key. Valid values are "query", "header" or "cookie". - /// - public virtual ParameterLocation? In { get; set; } + /// + public string Description { get; set; } - /// - /// REQUIRED. The name of the HTTP Authorization scheme to be used - /// in the Authorization header as defined in RFC7235. - /// - public virtual string Scheme { get; set; } + /// + public string Name { get; set; } - /// - /// A hint to the client to identify how the bearer token is formatted. - /// Bearer tokens are usually generated by an authorization server, - /// so this information is primarily for documentation purposes. - /// - public virtual string BearerFormat { get; set; } + /// + public ParameterLocation? In { get; set; } - /// - /// REQUIRED. An object containing configuration information for the flow types supported. - /// - public virtual OpenApiOAuthFlows Flows { get; set; } + /// + public string Scheme { get; set; } - /// - /// REQUIRED. OpenId Connect URL to discover OAuth2 configuration values. - /// - public virtual Uri OpenIdConnectUrl { get; set; } + /// + public string BearerFormat { get; set; } - /// - /// Specification Extensions. - /// - public virtual IDictionary Extensions { get; set; } = new Dictionary(); + /// + public OpenApiOAuthFlows Flows { get; set; } - /// - /// Indicates if object is populated with data or is just a reference to the data - /// - public bool UnresolvedReference { get; set; } + /// + public Uri OpenIdConnectUrl { get; set; } - /// - /// Reference object. - /// - public OpenApiReference Reference { get; set; } + /// + public IDictionary Extensions { get; set; } = new Dictionary(); /// /// Parameterless constructor @@ -78,10 +48,11 @@ public class OpenApiSecurityScheme : IOpenApiReferenceable, IOpenApiExtensible public OpenApiSecurityScheme() { } /// - /// Initializes a copy of object + /// Initializes a copy of object /// - public OpenApiSecurityScheme(OpenApiSecurityScheme securityScheme) + public OpenApiSecurityScheme(IOpenApiSecurityScheme securityScheme) { + Utils.CheckArgumentNull(securityScheme); Type = securityScheme?.Type; Description = securityScheme?.Description ?? Description; Name = securityScheme?.Name ?? Name; @@ -91,14 +62,12 @@ public OpenApiSecurityScheme(OpenApiSecurityScheme securityScheme) Flows = securityScheme?.Flows != null ? new(securityScheme?.Flows) : null; OpenIdConnectUrl = securityScheme?.OpenIdConnectUrl != null ? new Uri(securityScheme.OpenIdConnectUrl.OriginalString, UriKind.RelativeOrAbsolute) : null; Extensions = securityScheme?.Extensions != null ? new Dictionary(securityScheme.Extensions) : null; - UnresolvedReference = securityScheme?.UnresolvedReference ?? UnresolvedReference; - Reference = securityScheme?.Reference != null ? new(securityScheme?.Reference) : null; } /// /// Serialize to Open Api v3.1 /// - public virtual void SerializeAsV31(IOpenApiWriter writer) + public void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); } @@ -106,12 +75,12 @@ public virtual void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public virtual void SerializeAsV3(IOpenApiWriter writer) + public void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - internal virtual void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, + private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { Utils.CheckArgumentNull(writer); @@ -161,7 +130,7 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersio /// /// Serialize to Open Api v2.0 /// - public virtual void SerializeAsV2(IOpenApiWriter writer) + public void SerializeAsV2(IOpenApiWriter writer) { Utils.CheckArgumentNull(writer); diff --git a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs index 9b8c1be28..56d694d0a 100644 --- a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs +++ b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs @@ -16,7 +16,7 @@ public T Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument?.ResolveReferenceTo(Reference); return _target; } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index c1dafa80f..a05070472 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -4,147 +4,69 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; -using Microsoft.OpenApi.Writers; +using Microsoft.OpenApi.Models.Interfaces; namespace Microsoft.OpenApi.Models.References { /// /// Security Scheme Object Reference. /// - public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme, IOpenApiReferenceHolder + public class OpenApiSecuritySchemeReference : BaseOpenApiReferenceHolder, IOpenApiSecurityScheme { - internal OpenApiSecurityScheme _target; - private readonly OpenApiReference _reference; - private string _description; - - /// - /// Gets the target security scheme. - /// - /// - /// If the reference is not resolved, this will return null. - /// - public OpenApiSecurityScheme Target - { - get - { - _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiSecurityScheme resolved = new OpenApiSecurityScheme(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - return resolved; - } - } - /// /// Constructor initializing the reference object. /// /// The reference Id. /// The host OpenAPI document. /// The externally referenced file. - public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) + public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.SecurityScheme, externalResource) { - Utils.CheckArgumentNullOrEmpty(referenceId); - - _reference = new OpenApiReference() - { - Id = referenceId, - HostDocument = hostDocument, - Type = ReferenceType.SecurityScheme, - ExternalResource = externalResource - }; - - Reference = _reference; } - - internal OpenApiSecuritySchemeReference(string referenceId, OpenApiSecurityScheme target) + internal OpenApiSecuritySchemeReference(OpenApiSecurityScheme target, string referenceId):base(target, referenceId, ReferenceType.SecurityScheme) { - _target = target; - - _reference = new OpenApiReference() - { - Id = referenceId, - Type = ReferenceType.SecurityScheme, - }; } /// - public override string Description + public string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; - set => _description = value; + get => string.IsNullOrEmpty(Reference?.Description) ? Target?.Description : Reference.Description; + set + { + if (Reference is not null) + { + Reference.Description = value; + } + } } /// - public override string Name { get => Target.Name; set => Target.Name = value; } - - /// - public override ParameterLocation? In { get => Target.In; set => Target.In = value; } + public string Name { get => Target?.Name; } /// - public override string Scheme { get => Target.Scheme; set => Target.Scheme = value; } + public ParameterLocation? In { get => Target?.In; } /// - public override string BearerFormat { get => Target.BearerFormat; set => Target.BearerFormat = value; } + public string Scheme { get => Target?.Scheme; } /// - public override OpenApiOAuthFlows Flows { get => Target.Flows; set => Target.Flows = value; } + public string BearerFormat { get => Target?.BearerFormat; } /// - public override Uri OpenIdConnectUrl { get => Target.OpenIdConnectUrl; set => Target.OpenIdConnectUrl = value; } + public OpenApiOAuthFlows Flows { get => Target?.Flows; } /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public Uri OpenIdConnectUrl { get => Target?.OpenIdConnectUrl; } /// - public override SecuritySchemeType? Type { get => Target.Type; set => Target.Type = value; } - - /// - public override void SerializeAsV3(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(_reference)) - { - _reference.SerializeAsV3(writer); - return; - } - else - { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer)); - } - } - - /// - public override void SerializeAsV31(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(_reference)) - { - _reference.SerializeAsV31(writer); - return; - } - else - { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); - } - } + public IDictionary Extensions { get => Target?.Extensions; } /// - public override void SerializeAsV2(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(_reference)) - { - _reference.SerializeAsV2(writer); - return; - } - else - { - SerializeInternal(writer, (writer, element) => element.SerializeAsV2(writer)); - } - } + public SecuritySchemeType? Type { get => Target?.Type; } /// - private void SerializeInternal(IOpenApiWriter writer, - Action action) + public override IOpenApiSecurityScheme CopyReferenceAsTargetElementWithOverrides(IOpenApiSecurityScheme source) { - Utils.CheckArgumentNull(writer);; - action(writer, Target); + return source is OpenApiSecurityScheme ? new OpenApiSecurityScheme(this) : source; } } } diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs index 4dfdbba16..7b47ff6c5 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs @@ -2,6 +2,8 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; +using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; namespace Microsoft.OpenApi.Reader.V2 @@ -21,7 +23,7 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, foreach (var property in mapNode) { var scheme = LoadSecuritySchemeByReference( - mapNode.Context, + hostDocument, property.Name); var scopes = property.Value.CreateSimpleList((n2, p) => n2.GetScalarValue(), hostDocument); @@ -41,21 +43,11 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, return securityRequirement; } - private static OpenApiSecurityScheme LoadSecuritySchemeByReference( - ParsingContext context, + private static OpenApiSecuritySchemeReference LoadSecuritySchemeByReference( + OpenApiDocument openApiDocument, string schemeName) { - var securitySchemeObject = new OpenApiSecurityScheme - { - UnresolvedReference = true, - Reference = new() - { - Id = schemeName, - Type = ReferenceType.SecurityScheme - } - }; - - return securitySchemeObject; + return new OpenApiSecuritySchemeReference(schemeName, openApiDocument); } } } diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs index 43151c15a..0b49b5e9d 100644 --- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs @@ -4,6 +4,7 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Reader.ParseNodes; namespace Microsoft.OpenApi.Reader.V2 @@ -77,10 +78,10 @@ internal static partial class OpenApiV2Deserializer private static readonly PatternFieldMap _securitySchemePatternFields = new() { - {s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))} + {s => s.StartsWith("x-", StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))} }; - public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument) + public static IOpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument) { // Reset the local variables every time this method is called. // TODO: Change _flow to a tempStorage variable to make the deserializer thread-safe. diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs index 73610713c..030f2ef34 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -21,7 +22,7 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, foreach (var property in mapNode) { - var scheme = LoadSecuritySchemeByReference(mapNode.Context, property.Name); + var scheme = LoadSecuritySchemeByReference(hostDocument, property.Name); var scopes = property.Value.CreateSimpleList((value, p) => value.GetScalarValue(), hostDocument); @@ -39,12 +40,11 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, return securityRequirement; } - private static OpenApiSecurityScheme LoadSecuritySchemeByReference( - ParsingContext context, + private static OpenApiSecuritySchemeReference LoadSecuritySchemeByReference( + OpenApiDocument openApiDocument, string schemeName) { - var securitySchemeObject = new OpenApiSecuritySchemeReference(schemeName, hostDocument: null); - return securitySchemeObject; + return new OpenApiSecuritySchemeReference(schemeName, openApiDocument); } } } diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs index 18c4eae28..cd696ddfb 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs @@ -4,6 +4,7 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -69,10 +70,10 @@ internal static partial class OpenApiV3Deserializer private static readonly PatternFieldMap _securitySchemePatternFields = new() { - {s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} + {s => s.StartsWith("x-", StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} }; - public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument) + public static IOpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument) { var mapNode = node.CheckMapNode("securityScheme"); var pointer = mapNode.GetReferencePointer(); diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs index b204c83d4..cddb97699 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -39,10 +40,9 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, return securityRequirement; } - private static OpenApiSecurityScheme LoadSecuritySchemeByReference(string schemeName, OpenApiDocument hostDocument) + private static OpenApiSecuritySchemeReference LoadSecuritySchemeByReference(string schemeName, OpenApiDocument hostDocument) { - var securitySchemeObject = new OpenApiSecuritySchemeReference(schemeName, hostDocument); - return securitySchemeObject; + return new OpenApiSecuritySchemeReference(schemeName, hostDocument); } } } diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs index b56352c22..5a2667cda 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs @@ -4,6 +4,7 @@ using System; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader.ParseNodes; @@ -79,10 +80,10 @@ internal static partial class OpenApiV31Deserializer private static readonly PatternFieldMap _securitySchemePatternFields = new() { - {s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} + {s => s.StartsWith("x-", StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} }; - public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument) + public static IOpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument) { var mapNode = node.CheckMapNode("securityScheme"); diff --git a/src/Microsoft.OpenApi/Services/CopyReferences.cs b/src/Microsoft.OpenApi/Services/CopyReferences.cs index 490c7cff8..980aafb56 100644 --- a/src/Microsoft.OpenApi/Services/CopyReferences.cs +++ b/src/Microsoft.OpenApi/Services/CopyReferences.cs @@ -172,9 +172,9 @@ private void AddSecuritySchemeToComponents(OpenApiSecurityScheme securityScheme, { EnsureComponentsExist(); EnsureSecuritySchemesExist(); - if (!Components.SecuritySchemes.ContainsKey(referenceId ?? securityScheme.Reference.Id)) + if (!Components.SecuritySchemes.ContainsKey(referenceId)) { - Components.SecuritySchemes.Add(referenceId ?? securityScheme.Reference.Id, securityScheme); + Components.SecuritySchemes.Add(referenceId, securityScheme); } } @@ -236,7 +236,7 @@ private void EnsureLinksExist() private void EnsureSecuritySchemesExist() { - _target.Components.SecuritySchemes ??= new Dictionary(); + _target.Components.SecuritySchemes ??= new Dictionary(); } private void EnsurePathItemsExist() { diff --git a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs index 2b79864d8..254528b41 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs @@ -293,9 +293,9 @@ public virtual void Visit(OpenApiSecurityRequirement securityRequirement) } /// - /// Visits + /// Visits /// - public virtual void Visit(OpenApiSecurityScheme securityScheme) + public virtual void Visit(IOpenApiSecurityScheme securityScheme) { } diff --git a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs index 8d634834a..ae4430067 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs @@ -1146,9 +1146,9 @@ internal void Walk(OpenApiSecurityRequirement securityRequirement) } /// - /// Visits and child objects + /// Visits and child objects /// - internal void Walk(OpenApiSecurityScheme securityScheme, bool isComponent = false) + internal void Walk(IOpenApiSecurityScheme securityScheme, bool isComponent = false) { if (securityScheme == null) { diff --git a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs index a8669fce0..784f06172 100644 --- a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs +++ b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs @@ -135,7 +135,7 @@ public void AddWarning(OpenApiValidatorWarning warning) public override void Visit(OpenApiServerVariable serverVariable) => Validate(serverVariable); /// - public override void Visit(OpenApiSecurityScheme securityScheme) => Validate(securityScheme); + public override void Visit(IOpenApiSecurityScheme securityScheme) => Validate(securityScheme); /// public override void Visit(OpenApiSecurityRequirement securityRequirement) => Validate(securityRequirement); diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs index 98cc4ed78..9d1400de6 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs @@ -56,13 +56,13 @@ public async Task LoadSecuritySchemeReference() var reference = new OpenApiSecuritySchemeReference("api_key_sample", result.Document); // Assert - reference.Should().BeEquivalentTo( + Assert.Equivalent( new OpenApiSecurityScheme { Type = SecuritySchemeType.ApiKey, Name = "api_key", In = ParameterLocation.Header - }, options => options.Excluding(x => x.Reference) + }, reference ); } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.ParseDocumentWith31PropertiesWorks.verified.txt b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.ParseDocumentWith31PropertiesWorks.verified.txt index 3392a4bb8..fa7dd54e4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.ParseDocumentWith31PropertiesWorks.verified.txt +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.ParseDocumentWith31PropertiesWorks.verified.txt @@ -5,7 +5,6 @@ info: description: A sample API demonstrating OpenAPI 3.1 features license: name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0.html identifier: Apache-2.0 version: 2.0.0 summary: Sample OpenAPI 3.1 API with the latest features @@ -93,6 +92,11 @@ components: - 'null' - object description: Dynamic attributes for the pet + securitySchemes: + api_key: + type: apiKey + name: api_key + in: header security: - api_key: [ ] webhooks: diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDocument/documentWith31Properties.yaml b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDocument/documentWith31Properties.yaml index 35e5ccf80..e3d1b6cf5 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDocument/documentWith31Properties.yaml +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDocument/documentWith31Properties.yaml @@ -7,7 +7,6 @@ info: license: name: Apache 2.0 identifier: Apache-2.0 # SPDX license identifier, a new 3.1 feature to define an API's SPDX license expression - url: https://www.apache.org/licenses/LICENSE-2.0.html # JSON Schema 2020-12 feature jsonSchemaDialect: "https://json-schema.org/draft/2020-12/schema" @@ -89,6 +88,11 @@ paths: - name $dynamicAnchor: "addressDef" components: + securitySchemes: + api_key: + type: apiKey + name: api_key + in: header schemas: Pet: $id: 'https://example.com/schemas/pet.json' diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 32c27b3b1..c59aec6fb 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -664,7 +664,7 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() } }, }, - SecuritySchemes = new Dictionary + SecuritySchemes = new Dictionary { ["securitySchemeName1"] = new OpenApiSecurityScheme { @@ -700,21 +700,11 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() var tagReference2 = new OpenApiTagReference("tagName2", null); - var securityScheme1 = await CloneSecuritySchemeAsync(components.SecuritySchemes["securitySchemeName1"]); + var securityScheme1Cast = Assert.IsType(components.SecuritySchemes["securitySchemeName1"]); + var securityScheme1 = await CloneSecuritySchemeAsync(securityScheme1Cast); - securityScheme1.Reference = new OpenApiReference - { - Id = "securitySchemeName1", - Type = ReferenceType.SecurityScheme - }; - - var securityScheme2 = await CloneSecuritySchemeAsync(components.SecuritySchemes["securitySchemeName2"]); - - securityScheme2.Reference = new OpenApiReference - { - Id = "securitySchemeName2", - Type = ReferenceType.SecurityScheme - }; + var securityScheme2Cast = Assert.IsType(components.SecuritySchemes["securitySchemeName2"]); + var securityScheme2 = await CloneSecuritySchemeAsync(securityScheme2Cast); var expected = new OpenApiDocument { @@ -899,8 +889,8 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { new OpenApiSecurityRequirement { - [securityScheme1] = new List(), - [securityScheme2] = new List + [new OpenApiSecuritySchemeReference(securityScheme1, "securitySchemeName1")] = new List(), + [new OpenApiSecuritySchemeReference(securityScheme2, "securitySchemeName2")] = new List { "scope1", "scope2" @@ -1045,8 +1035,8 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { new OpenApiSecurityRequirement { - [securityScheme1] = new List(), - [securityScheme2] = new List + [new OpenApiSecuritySchemeReference(securityScheme1, "securitySchemeName1")] = new List(), + [new OpenApiSecuritySchemeReference(securityScheme2, "securitySchemeName2")] = new List { "scope1", "scope2", @@ -1098,8 +1088,7 @@ public async Task GlobalSecurityRequirementShouldReferenceSecurityScheme() var securityRequirement = result.Document.SecurityRequirements[0]; - securityRequirement.Keys.First().Should().BeEquivalentTo(result.Document.Components.SecuritySchemes.First().Value, - options => options.Excluding(x => x.Reference)); + Assert.Equivalent(result.Document.Components.SecuritySchemes.First().Value, securityRequirement.Keys.First()); } [Fact] @@ -1176,7 +1165,6 @@ public async Task ParseDocumentWithReferencedSecuritySchemeWorks() var securityScheme = result.Document.Components.SecuritySchemes["OAuth2"]; // Assert - Assert.False(securityScheme.UnresolvedReference); Assert.NotNull(securityScheme.Flows); } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index 3d629a23b..1dd24a128 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -27,8 +27,7 @@ public async Task OperationWithSecurityRequirementShouldReferenceSecurityScheme( var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "securedOperation.yaml")); var securityScheme = result.Document.Paths["/"].Operations[OperationType.Get].Security[0].Keys.First(); - securityScheme.Should().BeEquivalentTo(result.Document.Components.SecuritySchemes.First().Value, - options => options.Excluding(x => x.Reference)); + Assert.Equivalent(result.Document.Components.SecuritySchemes.First().Value, securityScheme); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs index 45c3dc1fc..379dc0c4f 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs @@ -34,9 +34,9 @@ public class OpenApiComponentsTests } } }, - SecuritySchemes = new Dictionary + SecuritySchemes = new Dictionary { - ["securityScheme1"] = new() + ["securityScheme1"] = new OpenApiSecurityScheme() { Description = "description1", Type = SecuritySchemeType.OAuth2, @@ -53,7 +53,7 @@ public class OpenApiComponentsTests } } }, - ["securityScheme2"] = new() + ["securityScheme2"] = new OpenApiSecurityScheme() { Description = "description1", Type = SecuritySchemeType.OpenIdConnect, @@ -89,9 +89,9 @@ public class OpenApiComponentsTests } }, }, - SecuritySchemes = new Dictionary + SecuritySchemes = new Dictionary { - ["securityScheme1"] = new() + ["securityScheme1"] = new OpenApiSecurityScheme() { Description = "description1", Type = SecuritySchemeType.OAuth2, @@ -107,23 +107,13 @@ public class OpenApiComponentsTests AuthorizationUrl = new("https://example.com/api/oauth") } }, - Reference = new() - { - Type = ReferenceType.SecurityScheme, - Id = "securityScheme1" - } }, - ["securityScheme2"] = new() + ["securityScheme2"] = new OpenApiSecurityScheme() { Description = "description1", Type = SecuritySchemeType.OpenIdConnect, Scheme = OpenApiConstants.Bearer, OpenIdConnectUrl = new("https://example.com/openIdConnect"), - Reference = new() - { - Type = ReferenceType.SecurityScheme, - Id = "securityScheme2" - } } } }; diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs index 499477616..138888d71 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs @@ -181,8 +181,8 @@ public class OpenApiOperationTests { new() { - [new OpenApiSecuritySchemeReference("securitySchemeId1", hostDocument: null)] = new List(), - [new OpenApiSecuritySchemeReference("securitySchemeId2", hostDocument: null)] = new List + [new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "securitySchemeId1")] = new List(), + [new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "securitySchemeId2")] = new List { "scopeName1", "scopeName2" diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs index af0343f57..19900f215 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs @@ -25,7 +25,7 @@ public class OpenApiSecurityRequirementTests new() { [ - new OpenApiSecuritySchemeReference("scheme1", hostDocument: null) + new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "scheme1") ] = new List { "scope1", @@ -33,14 +33,14 @@ public class OpenApiSecurityRequirementTests "scope3", }, [ - new OpenApiSecuritySchemeReference("scheme2", hostDocument: null) + new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "scheme2") ] = new List { "scope4", "scope5", }, [ - new OpenApiSecuritySchemeReference("scheme3", hostDocument: null) + new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "scheme3") ] = new List() }; @@ -48,7 +48,7 @@ public class OpenApiSecurityRequirementTests new() { [ - new OpenApiSecuritySchemeReference("scheme1", hostDocument: null) + new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "scheme1") ] = new List { "scope1", @@ -56,18 +56,14 @@ public class OpenApiSecurityRequirementTests "scope3", }, [ - new() - { - // This security scheme is unreferenced, so this key value pair cannot be serialized. - Name = "brokenUnreferencedScheme" - } + new OpenApiSecuritySchemeReference("brokenUnreferencedScheme", hostDocument: null) ] = new List { "scope4", "scope5", }, [ - new OpenApiSecuritySchemeReference("scheme3", hostDocument: null) + new OpenApiSecuritySchemeReference(new OpenApiSecurityScheme(), "scheme3") ] = new List() }; @@ -223,22 +219,12 @@ public void SchemesShouldConsiderOnlyReferenceIdForEquality() Type = SecuritySchemeType.ApiKey, Name = "apiKeyName1", In = ParameterLocation.Header, - Reference = new() - { - Id = "securityScheme1", - Type = ReferenceType.SecurityScheme - } }; var securityScheme2 = new OpenApiSecurityScheme { Type = SecuritySchemeType.OpenIdConnect, OpenIdConnectUrl = new("http://example.com"), - Reference = new() - { - Id = "securityScheme2", - Type = ReferenceType.SecurityScheme - } }; var securityScheme1Duplicate = new OpenApiSecurityScheme @@ -246,11 +232,6 @@ public void SchemesShouldConsiderOnlyReferenceIdForEquality() Type = SecuritySchemeType.ApiKey, Name = "apiKeyName1", In = ParameterLocation.Header, - Reference = new() - { - Id = "securityScheme1", - Type = ReferenceType.SecurityScheme - } }; var securityScheme1WithDifferentProperties = new OpenApiSecurityScheme @@ -258,21 +239,16 @@ public void SchemesShouldConsiderOnlyReferenceIdForEquality() Type = SecuritySchemeType.ApiKey, Name = "apiKeyName2", In = ParameterLocation.Query, - Reference = new() - { - Id = "securityScheme1", - Type = ReferenceType.SecurityScheme - } }; // Act - securityRequirement.Add(securityScheme1, new List()); - securityRequirement.Add(securityScheme2, new List { "scope1", "scope2" }); + securityRequirement.Add(new OpenApiSecuritySchemeReference(securityScheme1, "securityScheme1"), new List()); + securityRequirement.Add(new OpenApiSecuritySchemeReference(securityScheme2, "securityScheme2"), new List { "scope1", "scope2" }); var addSecurityScheme1Duplicate = () => - securityRequirement.Add(securityScheme1Duplicate, new List()); + securityRequirement.Add(new OpenApiSecuritySchemeReference(securityScheme1Duplicate, "securityScheme1"), new List()); var addSecurityScheme1WithDifferentProperties = () => - securityRequirement.Add(securityScheme1WithDifferentProperties, new List()); + securityRequirement.Add(new OpenApiSecuritySchemeReference(securityScheme1WithDifferentProperties, "securityScheme1"), new List()); // Assert // Only the first two should be added successfully since the latter two are duplicates of securityScheme1. @@ -287,8 +263,8 @@ public void SchemesShouldConsiderOnlyReferenceIdForEquality() { // This should work with any security scheme object // as long as Reference.Id os securityScheme1 - [securityScheme1WithDifferentProperties] = new List(), - [securityScheme2] = new List { "scope1", "scope2" }, + [new OpenApiSecuritySchemeReference(securityScheme1WithDifferentProperties, "securityScheme1")] = new List(), + [new OpenApiSecuritySchemeReference(securityScheme2, "securityScheme2")] = new List { "scope1", "scope2" }, }); } } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs index 9c59ca4bd..780b2116a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs @@ -104,7 +104,7 @@ public class OpenApiSecuritySchemeTests OpenIdConnectUrl = new("https://example.com/openIdConnect") }; - public static OpenApiSecuritySchemeReference OpenApiSecuritySchemeReference = new(target: ReferencedSecurityScheme, referenceId: "sampleSecurityScheme"); + public static OpenApiSecuritySchemeReference OpenApiSecuritySchemeReference = new(ReferencedSecurityScheme, "sampleSecurityScheme"); public static OpenApiSecurityScheme ReferencedSecurityScheme = new() { Description = "description1", diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False_inlineLocalReferences=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False_inlineLocalReferences=False.verified.txt new file mode 100644 index 000000000..a73e7078d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False_inlineLocalReferences=False.verified.txt @@ -0,0 +1,3 @@ +{ + "$ref": "mySecurityScheme" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False_inlineLocalReferences=True.verified.txt similarity index 100% rename from test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt rename to test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False_inlineLocalReferences=True.verified.txt diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True_inlineLocalReferences=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True_inlineLocalReferences=False.verified.txt new file mode 100644 index 000000000..5c70082e7 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True_inlineLocalReferences=False.verified.txt @@ -0,0 +1 @@ +{"$ref":"mySecurityScheme"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True_inlineLocalReferences=True.verified.txt similarity index 100% rename from test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt rename to test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True_inlineLocalReferences=True.verified.txt diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False_inlineLocalReferences=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False_inlineLocalReferences=False.verified.txt new file mode 100644 index 000000000..a73e7078d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False_inlineLocalReferences=False.verified.txt @@ -0,0 +1,3 @@ +{ + "$ref": "mySecurityScheme" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False_inlineLocalReferences=True.verified.txt similarity index 100% rename from test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt rename to test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False_inlineLocalReferences=True.verified.txt diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True_inlineLocalReferences=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True_inlineLocalReferences=False.verified.txt new file mode 100644 index 000000000..5c70082e7 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True_inlineLocalReferences=False.verified.txt @@ -0,0 +1 @@ +{"$ref":"mySecurityScheme"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True_inlineLocalReferences=True.verified.txt similarity index 100% rename from test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt rename to test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True_inlineLocalReferences=True.verified.txt diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index d13d63c9a..56b7e6d07 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -57,37 +57,41 @@ public void SecuritySchemeResolutionWorks() } [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTerseOutput) + [InlineData(true, false)] + [InlineData(false, false)] + [InlineData(true, true)] + [InlineData(false, true)] + public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTerseOutput, bool inlineLocalReferences) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); - var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput, InlineLocalReferences = true }); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput, InlineLocalReferences = inlineLocalReferences }); // Act _openApiSecuritySchemeReference.SerializeAsV3(writer); await writer.FlushAsync(); // Assert - await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput, inlineLocalReferences); } [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task SerializeSecuritySchemeReferenceAsV31JsonWorks(bool produceTerseOutput) + [InlineData(true, false)] + [InlineData(false, false)] + [InlineData(true, true)] + [InlineData(false, true)] + public async Task SerializeSecuritySchemeReferenceAsV31JsonWorks(bool produceTerseOutput, bool inlineLocalReferences) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); - var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput, InlineLocalReferences = true }); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput, InlineLocalReferences = inlineLocalReferences }); // Act _openApiSecuritySchemeReference.SerializeAsV31(writer); await writer.FlushAsync(); // Assert - await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput, inlineLocalReferences); } } } diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 11020cee0..98029f874 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -459,6 +459,16 @@ namespace Microsoft.OpenApi.Models.Interfaces bool WriteOnly { get; } Microsoft.OpenApi.Models.OpenApiXml Xml { get; } } + public interface IOpenApiSecurityScheme : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement + { + string BearerFormat { get; } + Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; } + Microsoft.OpenApi.Models.ParameterLocation? In { get; } + string Name { get; } + System.Uri OpenIdConnectUrl { get; } + string Scheme { get; } + Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; } + } public interface IOpenApiSummarizedElement : Microsoft.OpenApi.Interfaces.IOpenApiElement { string Summary { get; set; } @@ -502,7 +512,7 @@ namespace Microsoft.OpenApi.Models public System.Collections.Generic.IDictionary? RequestBodies { get; set; } public System.Collections.Generic.IDictionary? Responses { get; set; } public System.Collections.Generic.IDictionary? Schemas { get; set; } - public System.Collections.Generic.IDictionary? SecuritySchemes { get; set; } + public System.Collections.Generic.IDictionary? SecuritySchemes { get; set; } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } @@ -1051,31 +1061,29 @@ namespace Microsoft.OpenApi.Models public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSecurityRequirement : System.Collections.Generic.Dictionary>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiSecurityRequirement : System.Collections.Generic.Dictionary>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiSecurityRequirement() { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSecurityScheme : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiSecurityScheme : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme { public OpenApiSecurityScheme() { } - public OpenApiSecurityScheme(Microsoft.OpenApi.Models.OpenApiSecurityScheme securityScheme) { } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public bool UnresolvedReference { get; set; } - public virtual string BearerFormat { get; set; } - public virtual string Description { get; set; } - public virtual System.Collections.Generic.IDictionary Extensions { get; set; } - public virtual Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; set; } - public virtual Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } - public virtual string Name { get; set; } - public virtual System.Uri OpenIdConnectUrl { get; set; } - public virtual string Scheme { get; set; } - public virtual Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; set; } - public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public OpenApiSecurityScheme(Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme securityScheme) { } + public string BearerFormat { get; set; } + public string Description { get; set; } + public System.Collections.Generic.IDictionary Extensions { get; set; } + public Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; set; } + public Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } + public string Name { get; set; } + public System.Uri OpenIdConnectUrl { get; set; } + public string Scheme { get; set; } + public Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; set; } + public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiServer : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1404,22 +1412,19 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme { public OpenApiSecuritySchemeReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } - public Microsoft.OpenApi.Models.OpenApiSecurityScheme Target { get; } - public override string BearerFormat { get; set; } - public override string Description { get; set; } - public override System.Collections.Generic.IDictionary Extensions { get; set; } - public override Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; set; } - public override Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } - public override string Name { get; set; } - public override System.Uri OpenIdConnectUrl { get; set; } - public override string Scheme { get; set; } - public override Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; set; } - public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public string BearerFormat { get; } + public string Description { get; set; } + public System.Collections.Generic.IDictionary Extensions { get; } + public Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; } + public Microsoft.OpenApi.Models.ParameterLocation? In { get; } + public string Name { get; } + public System.Uri OpenIdConnectUrl { get; } + public string Scheme { get; } + public Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; } + public override Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme source) { } } public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1622,6 +1627,7 @@ namespace Microsoft.OpenApi.Services public virtual void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiRequestBody requestBody) { } public virtual void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiResponse response) { } public virtual void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiSchema schema) { } + public virtual void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme securityScheme) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { } @@ -1635,7 +1641,6 @@ namespace Microsoft.OpenApi.Services public virtual void Visit(Microsoft.OpenApi.Models.OpenApiPaths paths) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiResponses response) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiSecurityRequirement securityRequirement) { } - public virtual void Visit(Microsoft.OpenApi.Models.OpenApiSecurityScheme securityScheme) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiServer server) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable serverVariable) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { } @@ -1721,6 +1726,7 @@ namespace Microsoft.OpenApi.Validations public override void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiRequestBody requestBody) { } public override void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiResponse response) { } public override void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiSchema schema) { } + public override void Visit(Microsoft.OpenApi.Models.Interfaces.IOpenApiSecurityScheme securityScheme) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { } @@ -1734,7 +1740,6 @@ namespace Microsoft.OpenApi.Validations public override void Visit(Microsoft.OpenApi.Models.OpenApiPaths paths) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiResponses response) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityRequirement securityRequirement) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityScheme securityScheme) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiServer server) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable serverVariable) { } public override void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { } diff --git a/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs b/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs index a11d64599..581f2998a 100644 --- a/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Visitors/InheritanceTests.cs @@ -51,7 +51,7 @@ public void ExpectedVirtualsInvolved() visitor.Visit(default(IOpenApiHeader)); visitor.Visit(default(OpenApiOAuthFlow)); visitor.Visit(default(OpenApiSecurityRequirement)); - visitor.Visit(default(OpenApiSecurityScheme)); + visitor.Visit(default(IOpenApiSecurityScheme)); visitor.Visit(default(IOpenApiExample)); visitor.Visit(default(IList)); visitor.Visit(default(IList)); @@ -280,7 +280,7 @@ public override void Visit(OpenApiSecurityRequirement securityRequirement) base.Visit(securityRequirement); } - public override void Visit(OpenApiSecurityScheme securityScheme) + public override void Visit(IOpenApiSecurityScheme securityScheme) { EncodeCall(); base.Visit(securityScheme); diff --git a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs index fa5b901dc..663328b78 100644 --- a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs @@ -216,7 +216,7 @@ public void LocateReferences() { ["test-header"] = testHeader }, - SecuritySchemes = new Dictionary + SecuritySchemes = new Dictionary { ["test-secScheme"] = new OpenApiSecuritySchemeReference("reference-to-scheme", null, null) }