From f55b01877b0e7e57816939211f587ea605006eb1 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 7 Jun 2023 10:53:20 +0300 Subject: [PATCH 01/24] Add reference classes --- .../Models/OpenApiCallback.cs | 9 +- .../Models/OpenApiComponents.cs | 25 +++--- .../Models/OpenApiContact.cs | 1 - .../Models/OpenApiDocument.cs | 1 - .../Models/OpenApiEncoding.cs | 1 - .../Models/OpenApiExample.cs | 15 ++-- .../Models/OpenApiExtensibleDictionary.cs | 1 - .../Models/OpenApiExternalDocs.cs | 1 - src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 1 - src/Microsoft.OpenApi/Models/OpenApiInfo.cs | 1 - .../Models/OpenApiLicense.cs | 3 +- src/Microsoft.OpenApi/Models/OpenApiLink.cs | 20 ++--- .../Models/OpenApiMediaType.cs | 1 - .../Models/OpenApiOAuthFlow.cs | 1 - .../Models/OpenApiOAuthFlows.cs | 2 - .../Models/OpenApiOperation.cs | 1 - .../Models/OpenApiParameter.cs | 35 ++++---- .../Models/OpenApiPathItem.cs | 17 ++-- .../Models/OpenApiRequestBody.cs | 13 ++- .../Models/OpenApiResponse.cs | 15 ++-- .../Models/OpenApiSecurityRequirement.cs | 1 - .../Models/OpenApiSecurityScheme.cs | 27 +++--- src/Microsoft.OpenApi/Models/OpenApiServer.cs | 1 - .../Models/OpenApiServerVariable.cs | 1 - src/Microsoft.OpenApi/Models/OpenApiTag.cs | 14 ++-- src/Microsoft.OpenApi/Models/OpenApiXml.cs | 1 - .../References/OpenApiCallbackReference.cs | 47 +++++++++++ .../References/OpenApiExampleReference.cs | 56 +++++++++++++ .../Models/References/OpenApiLinkReference.cs | 62 ++++++++++++++ .../References/OpenApiParameterReference.cs | 83 +++++++++++++++++++ .../References/OpenApiPathItemReference.cs | 58 +++++++++++++ .../References/OpenApiRequestBodyReference.cs | 57 +++++++++++++ .../References/OpenApiResponseReference.cs | 55 ++++++++++++ .../OpenApiSecuritySchemeReference.cs | 68 +++++++++++++++ .../Models/References/OpenApiTagReference.cs | 52 ++++++++++++ 35 files changed, 627 insertions(+), 120 deletions(-) create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index 09f1b6256..2871f3643 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -6,7 +6,6 @@ using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -18,23 +17,23 @@ public class OpenApiCallback : IOpenApiSerializable, IOpenApiReferenceable, IOpe /// /// A Path Item Object used to define a callback request and expected responses. /// - public Dictionary PathItems { get; set; } + public virtual Dictionary PathItems { get; set; } = new Dictionary(); /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference pointer. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Parameter-less constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index c7c9a0a32..7b56745cd 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -1,11 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; -using System.Linq; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -17,60 +16,60 @@ public class OpenApiComponents : IOpenApiSerializable, IOpenApiExtensible /// /// An object to hold reusable Objects. /// - public IDictionary Schemas { get; set; } = new Dictionary(); + public virtual IDictionary Schemas { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary Responses { get; set; } = new Dictionary(); + public virtual IDictionary Responses { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary Parameters { get; set; } = + public virtual IDictionary Parameters { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary Examples { get; set; } = new Dictionary(); + public virtual IDictionary Examples { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary RequestBodies { get; set; } = + public virtual IDictionary RequestBodies { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary Headers { get; set; } = new Dictionary(); + public virtual IDictionary Headers { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary SecuritySchemes { get; set; } = + public virtual IDictionary SecuritySchemes { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary Links { get; set; } = new Dictionary(); + public virtual IDictionary Links { get; set; } = new Dictionary(); /// /// An object to hold reusable Objects. /// - public IDictionary Callbacks { get; set; } = new Dictionary(); + public virtual IDictionary Callbacks { get; set; } = new Dictionary(); /// /// An object to hold reusable Object. /// - public IDictionary PathItems { get; set; } = new Dictionary(); + public virtual IDictionary PathItems { get; set; } = new Dictionary(); /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Parameter-less constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiContact.cs b/src/Microsoft.OpenApi/Models/OpenApiContact.cs index bc4e30356..8d5ae9543 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiContact.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiContact.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index bddede097..ba67231d3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -11,7 +11,6 @@ using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs index ffa8a372a..81a688e61 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiEncoding.cs @@ -6,7 +6,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 15e04fe5b..5e4754b70 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -6,7 +6,6 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -18,20 +17,20 @@ public class OpenApiExample : IOpenApiSerializable, IOpenApiReferenceable, IOpen /// /// Short description for the example. /// - public string Summary { get; set; } + public virtual string Summary { get; set; } /// /// Long description for the example. /// CommonMark syntax MAY be used for rich text representation. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Embedded literal example. The value field and externalValue field are mutually /// exclusive. To represent examples of media types that cannot naturally represented /// in JSON or YAML, use a string value to contain the example, escaping where necessary. /// - public IOpenApiAny Value { get; set; } + public virtual IOpenApiAny Value { get; set; } /// /// A URL that points to the literal example. @@ -39,22 +38,22 @@ public class OpenApiExample : IOpenApiSerializable, IOpenApiReferenceable, IOpen /// included in JSON or YAML documents. /// The value field and externalValue field are mutually exclusive. /// - public string ExternalValue { get; set; } + public virtual string ExternalValue { get; set; } /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Reference object. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// Indicates object is a placeholder reference to an actual object and does not contain valid data. /// - public bool UnresolvedReference { get; set; } = false; + public virtual bool UnresolvedReference { get; set; } = false; /// /// Parameter-less constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs b/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs index aaeeee49c..b9939b685 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs index 103261576..2ca01e880 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index 7f289b1c2..2eace4892 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -7,7 +7,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs index fa6c7690a..9a377ce87 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs index 211831c82..40cce04bb 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLicense.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLicense.cs @@ -1,9 +1,8 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index 2e714c8fe..4a82e8785 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -19,49 +17,49 @@ public class OpenApiLink : IOpenApiSerializable, IOpenApiReferenceable, IOpenApi /// A relative or absolute reference to an OAS operation. /// This field is mutually exclusive of the operationId field, and MUST point to an Operation Object. /// - public string OperationRef { get; set; } + public virtual string OperationRef { get; set; } /// /// The name of an existing, resolvable OAS operation, as defined with a unique operationId. /// This field is mutually exclusive of the operationRef field. /// - public string OperationId { get; set; } + public virtual string OperationId { get; set; } /// /// A map representing parameters to pass to an operation as specified with operationId or identified via operationRef. /// - public Dictionary Parameters { get; set; } = + public virtual Dictionary Parameters { get; set; } = new Dictionary(); /// /// A literal value or {expression} to use as a request body when calling the target operation. /// - public RuntimeExpressionAnyWrapper RequestBody { get; set; } + public virtual RuntimeExpressionAnyWrapper RequestBody { get; set; } /// /// A description of the link. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// A server object to be used by the target operation. /// - public OpenApiServer Server { get; set; } + public virtual OpenApiServer Server { get; set; } /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference pointer. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// Parameterless constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs index 86de2d554..900a56859 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiMediaType.cs @@ -6,7 +6,6 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs index 1f75883b2..8b142aae1 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs index d37088248..812785656 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs index a86868aa3..efb856582 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs @@ -6,7 +6,6 @@ using System.Linq; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index 9f87aad2b..2473a177e 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -7,7 +7,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -22,12 +21,12 @@ public class OpenApiParameter : IOpenApiSerializable, IOpenApiReferenceable, IEf /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference object. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// REQUIRED. The name of the parameter. Parameter names are case sensitive. @@ -35,31 +34,31 @@ public class OpenApiParameter : IOpenApiSerializable, IOpenApiReferenceable, IEf /// If in is "header" and the name field is "Accept", "Content-Type" or "Authorization", the parameter definition SHALL be ignored. /// For all other cases, the name corresponds to the parameter name used by the in property. /// - public string Name { get; set; } + public virtual string Name { get; set; } /// /// REQUIRED. The location of the parameter. /// Possible values are "query", "header", "path" or "cookie". /// - public ParameterLocation? In { get; set; } + public virtual ParameterLocation? In { get; set; } /// /// A brief description of the parameter. This could contain examples of use. /// CommonMark syntax MAY be used for rich text representation. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Determines whether this parameter is mandatory. /// If the parameter location is "path", this property is REQUIRED and its value MUST be true. /// Otherwise, the property MAY be included and its default value is false. /// - public bool Required { get; set; } + public virtual bool Required { get; set; } /// /// Specifies that a parameter is deprecated and SHOULD be transitioned out of usage. /// - public bool Deprecated { get; set; } = false; + public virtual bool Deprecated { get; set; } = false; /// /// Sets the ability to pass empty-valued parameters. @@ -68,14 +67,14 @@ public class OpenApiParameter : IOpenApiSerializable, IOpenApiReferenceable, IEf /// If style is used, and if behavior is n/a (cannot be serialized), /// the value of allowEmptyValue SHALL be ignored. /// - public bool AllowEmptyValue { get; set; } = false; + public virtual bool AllowEmptyValue { get; set; } = false; /// /// Describes how the parameter value will be serialized depending on the type of the parameter value. /// Default values (based on value of in): for query - form; for path - simple; for header - simple; /// for cookie - form. /// - public ParameterStyle? Style + public virtual ParameterStyle? Style { get => _style ?? GetDefaultStyleValue(); set => _style = value; @@ -88,7 +87,7 @@ public ParameterStyle? Style /// When style is form, the default value is true. /// For all other styles, the default value is false. /// - public bool Explode + public virtual bool Explode { get => _explode ?? Style == ParameterStyle.Form; set => _explode = value; @@ -100,12 +99,12 @@ public bool Explode /// This property only applies to parameters with an in value of query. /// The default value is false. /// - public bool AllowReserved { get; set; } + public virtual bool AllowReserved { get; set; } /// /// The schema defining the type used for the parameter. /// - public OpenApiSchema Schema { get; set; } + public virtual OpenApiSchema Schema { get; set; } /// /// Examples of the media type. Each example SHOULD contain a value @@ -114,7 +113,7 @@ public bool Explode /// Furthermore, if referencing a schema which contains an example, /// the examples value SHALL override the example provided by the schema. /// - public IDictionary Examples { get; set; } = new Dictionary(); + public virtual IDictionary Examples { get; set; } = new Dictionary(); /// /// Example of the media type. The example SHOULD match the specified schema and encoding properties @@ -124,7 +123,7 @@ public bool Explode /// To represent examples of media types that cannot naturally be represented in JSON or YAML, /// a string value can contain the example with escaping where necessary. /// - public IOpenApiAny Example { get; set; } + public virtual IOpenApiAny Example { get; set; } /// /// A map containing the representations for the parameter. @@ -135,12 +134,12 @@ public bool Explode /// When example or examples are provided in conjunction with the schema object, /// the example MUST follow the prescribed serialization strategy for the parameter. /// - public IDictionary Content { get; set; } = new Dictionary(); + public virtual IDictionary Content { get; set; } = new Dictionary(); /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// A parameterless constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index 02e9c2d50..1fd734c71 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs @@ -6,7 +6,6 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -18,44 +17,44 @@ public class OpenApiPathItem : IOpenApiSerializable, IOpenApiExtensible, IOpenAp /// /// An optional, string summary, intended to apply to all operations in this path. /// - public string Summary { get; set; } + public virtual string Summary { get; set; } /// /// An optional, string description, intended to apply to all operations in this path. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Gets the definition of operations on this path. /// - public IDictionary Operations { get; set; } + public virtual IDictionary Operations { get; set; } = new Dictionary(); /// /// An alternative server array to service all operations in this path. /// - public IList Servers { get; set; } = new List(); + public virtual IList Servers { get; set; } = new List(); /// /// A list of parameters that are applicable for all the operations described under this path. /// These parameters can be overridden at the operation level, but cannot be removed there. /// - public IList Parameters { get; set; } = new List(); + public virtual IList Parameters { get; set; } = new List(); /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference object. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// Add one operation into this path item. diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index 3d5cfdfd5..a8eb42c58 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -7,7 +7,6 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -19,34 +18,34 @@ public class OpenApiRequestBody : IOpenApiSerializable, IOpenApiReferenceable, I /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference object. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// A brief description of the request body. This could contain examples of use. /// CommonMark syntax MAY be used for rich text representation. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Determines if the request body is required in the request. Defaults to false. /// - public bool Required { get; set; } + public virtual bool Required { get; set; } /// /// REQUIRED. The content of the request body. The key is a media type or media type range and the value describes it. /// For requests that match multiple keys, only the most specific key is applicable. e.g. text/plain overrides text/* /// - public IDictionary Content { get; set; } = new Dictionary(); + public virtual IDictionary Content { get; set; } = new Dictionary(); /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Parameter-less constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index 10ac3de85..cb8b7430d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -6,7 +6,6 @@ using System.Linq; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -18,40 +17,40 @@ public class OpenApiResponse : IOpenApiSerializable, IOpenApiReferenceable, IOpe /// /// REQUIRED. A short description of the response. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Maps a header name to its definition. /// - public IDictionary Headers { get; set; } = new Dictionary(); + public virtual IDictionary Headers { get; set; } = new Dictionary(); /// /// A map containing descriptions of potential response payloads. /// The key is a media type or media type range and the value describes it. /// - public IDictionary Content { get; set; } = new Dictionary(); + public virtual IDictionary Content { get; set; } = new Dictionary(); /// /// A map of operations links that can be followed from the response. /// The key of the map is a short name for the link, /// following the naming constraints of the names for Component Objects. /// - public IDictionary Links { get; set; } = new Dictionary(); + public virtual IDictionary Links { get; set; } = new Dictionary(); /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference pointer. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// Parameterless constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs index 3ccf9b468..a763f0954 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityRequirement.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index 8d5ab80da..f83759478 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -1,14 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; -using System.Linq; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -20,60 +17,60 @@ public class OpenApiSecurityScheme : IOpenApiSerializable, IOpenApiReferenceable /// /// REQUIRED. The type of the security scheme. Valid values are "apiKey", "http", "oauth2", "openIdConnect". /// - public SecuritySchemeType Type { get; set; } + public virtual SecuritySchemeType Type { get; set; } /// /// A short description for security scheme. CommonMark syntax MAY be used for rich text representation. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// REQUIRED. The name of the header, query or cookie parameter to be used. /// - public string Name { get; set; } + public virtual string Name { get; set; } /// /// REQUIRED. The location of the API key. Valid values are "query", "header" or "cookie". /// - public ParameterLocation In { get; set; } + public virtual ParameterLocation In { get; set; } /// /// REQUIRED. The name of the HTTP Authorization scheme to be used /// in the Authorization header as defined in RFC7235. /// - public string Scheme { get; set; } + public virtual string Scheme { 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 string BearerFormat { get; set; } + public virtual string BearerFormat { get; set; } /// /// REQUIRED. An object containing configuration information for the flow types supported. /// - public OpenApiOAuthFlows Flows { get; set; } + public virtual OpenApiOAuthFlows Flows { get; set; } /// /// REQUIRED. OpenId Connect URL to discover OAuth2 configuration values. /// - public Uri OpenIdConnectUrl { get; set; } + public virtual Uri OpenIdConnectUrl { get; set; } /// /// Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference object. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// Parameterless constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiServer.cs b/src/Microsoft.OpenApi/Models/OpenApiServer.cs index 015c29780..800398cf6 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServer.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServer.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { diff --git a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs index 9bd923214..5c88fcbc7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index 64e62b062..c8669fb2b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -18,32 +16,32 @@ public class OpenApiTag : IOpenApiSerializable, IOpenApiReferenceable, IOpenApiE /// /// The name of the tag. /// - public string Name { get; set; } + public virtual string Name { get; set; } /// /// A short description for the tag. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Additional external documentation for this tag. /// - public OpenApiExternalDocs ExternalDocs { get; set; } + public virtual OpenApiExternalDocs ExternalDocs { get; set; } /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// Parameterless constructor diff --git a/src/Microsoft.OpenApi/Models/OpenApiXml.cs b/src/Microsoft.OpenApi/Models/OpenApiXml.cs index 358b42cb3..f9c80e926 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiXml.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiXml.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs new file mode 100644 index 000000000..39bd36428 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Expressions; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Callback Object Reference: A reference to a map of possible out-of band callbacks related to the parent operation. + /// + public class OpenApiCallbackReference : OpenApiCallback + { + private OpenApiCallback _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiCallback Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override Dictionary PathItems { get => Target.PathItems; set => Target.PathItems = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs new file mode 100644 index 000000000..c0964a9e8 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Example Object Reference. + /// + internal class OpenApiExampleReference : OpenApiExample + { + private OpenApiExample _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiExample Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override string Summary { get => Target.Summary; set => Target.Summary = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override string ExternalValue { get => Target.ExternalValue; set => Target.ExternalValue = value; } + + /// + public override IOpenApiAny Value { get => Target.Value; set => Target.Value = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs new file mode 100644 index 000000000..db758f6e3 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Link Object Reference. + /// + internal class OpenApiLinkReference : OpenApiLink + { + private OpenApiLink _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiLink Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string OperationRef { get => Target.OperationRef; set => Target.OperationRef = value; } + + /// + public override string OperationId { get => Target.OperationId; set => Target.OperationId = value; } + + /// + public override OpenApiServer Server { get => Target.Server; set => Target.Server = value; } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override Dictionary Parameters { get => Target.Parameters; set => Target.Parameters = value; } + + /// + public override RuntimeExpressionAnyWrapper RequestBody { get => Target.RequestBody; set => Target.RequestBody = value; } + + /// + public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs new file mode 100644 index 000000000..3becd81a6 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Parameter Object Reference. + /// + internal class OpenApiParameterReference : OpenApiParameter + { + private OpenApiParameter _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiParameter Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Name { get => Target.Name; set => Target.Name = value; } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override bool Required { get => Target.Required; set => Target.Required = value; } + + /// + public override bool Deprecated { get => Target.Deprecated; set => Target.Deprecated = value; } + + /// + public override bool AllowEmptyValue { get => Target.AllowEmptyValue; set => Target.AllowEmptyValue = value; } + + /// + public override bool AllowReserved { get => Target.AllowReserved; set => Target.AllowReserved = value; } + + /// + public override OpenApiSchema Schema { get => Target.Schema; set => Target.Schema = value; } + + /// + public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } + + /// + public override IOpenApiAny Example { get => Target.Example; set => Target.Example = value; } + + /// + public override ParameterLocation? In { get => Target.In; set => Target.In = value; } + + /// + public override ParameterStyle? Style { get => Target.Style; set => Target.Style = value; } + + /// + public override bool Explode { get => base.Explode; set => base.Explode = value; } + + /// + public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs new file mode 100644 index 000000000..c2afdab4a --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Path Item Object Reference: to describe the operations available on a single path. + /// + internal class OpenApiPathItemReference : OpenApiPathItem + { + private OpenApiPathItem _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiPathItem Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Summary { get => Target.Summary; set => Target.Summary = value; } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override IDictionary Operations { get => Target.Operations; set => Target.Operations = value; } + + /// + public override IList Servers { get => Target.Servers; set => Target.Servers = value; } + + /// + public override IList Parameters { get => Target.Parameters; set => Target.Parameters = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs new file mode 100644 index 000000000..995e39f09 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Request Body Object Reference. + /// + internal class OpenApiRequestBodyReference : OpenApiRequestBody + { + private OpenApiRequestBody _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiRequestBody Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + public OpenApiRequestBodyReference(OpenApiDocument hostDocument) + { + _hostDocument = hostDocument; + } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + + /// + public override bool Required { get => Target.Required; set => Target.Required = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => Target.Reference; + set + { + Target.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs new file mode 100644 index 000000000..cd0a89166 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Response Object Reference. + /// + internal class OpenApiResponseReference : OpenApiResponse + { + private OpenApiResponse _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiResponse Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + + /// + public override IDictionary Headers { get => Target.Headers; set => Target.Headers = value; } + + /// + public override IDictionary Links { get => Target.Links; set => Target.Links = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs new file mode 100644 index 000000000..25ce3da99 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Security Scheme Object Reference. + /// + internal class OpenApiSecuritySchemeReference : OpenApiSecurityScheme + { + private OpenApiSecurityScheme _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiSecurityScheme Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Description { get => Target.Description; set => Target.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 override string Scheme { get => Target.Scheme; set => Target.Scheme = value; } + + /// + public override string BearerFormat { get => Target.BearerFormat; set => Target.BearerFormat = value; } + + /// + public override OpenApiOAuthFlows Flows { get => Target.Flows; set => Target.Flows = value; } + + /// + public override Uri OpenIdConnectUrl { get => Target.OpenIdConnectUrl; set => Target.OpenIdConnectUrl = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override SecuritySchemeType Type { get => Target.Type; set => Target.Type = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs new file mode 100644 index 000000000..99685af3c --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using Microsoft.OpenApi.Interfaces; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Tag Object Reference + /// + internal class OpenApiTagReference : OpenApiTag + { + private OpenApiTag _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiTag Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override OpenApiExternalDocs ExternalDocs { get => Target.ExternalDocs; set => Target.ExternalDocs = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override string Name { get => Target.Name; set => Target.Name = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + } +} From a458d704de7cb4bcac5e1fa0d3537dffd98f1107 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 9 Jun 2023 20:14:21 +0300 Subject: [PATCH 02/24] Add serialization methods to reference classes --- .../References/OpenApiCallbackReference.cs | 46 ++++++++++++++++++ .../References/OpenApiExampleReference.cs | 44 +++++++++++++++++ .../Models/References/OpenApiLinkReference.cs | 43 +++++++++++++++++ .../References/OpenApiParameterReference.cs | 46 ++++++++++++++++++ .../References/OpenApiPathItemReference.cs | 44 +++++++++++++++++ .../References/OpenApiRequestBodyReference.cs | 46 ++++++++++++++++++ .../References/OpenApiResponseReference.cs | 48 ++++++++++++++++++- .../OpenApiSecuritySchemeReference.cs | 42 ++++++++++++++++ .../Models/References/OpenApiTagReference.cs | 42 ++++++++++++++++ 9 files changed, 400 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 39bd36428..21096feb2 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -1,9 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -43,5 +45,49 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index c0964a9e8..19dbce397 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -1,9 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -52,5 +54,47 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index db758f6e3..7dcfe3af5 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -58,5 +60,46 @@ public override OpenApiReference Reference } } + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 3becd81a6..984d8ba45 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -1,9 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -79,5 +81,49 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index c2afdab4a..d34009724 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -54,5 +56,47 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 995e39f09..6f18df592 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -53,5 +55,49 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index cd0a89166..2847586fc 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -50,6 +52,50 @@ public override OpenApiReference Reference base.Reference = value; _target = null; } - } + } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index 25ce3da99..1f1987966 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -64,5 +65,46 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), SerializeAsV3WithoutReference); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), SerializeAsV31WithoutReference); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (Reference != null) + { + callback(writer, Reference); + return; + } + + action(writer); + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 99685af3c..a1314285e 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -1,8 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -48,5 +50,45 @@ public override OpenApiReference Reference _target = null; } } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, Action callback) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (Reference != null) + { + callback(writer, Reference); + return; + } + + writer.WriteValue(Name); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } } } From 9b6e0aca2e96690b72e5a3f4026caa40c870f680 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 9 Jun 2023 20:14:51 +0300 Subject: [PATCH 03/24] Modify access modifiers --- src/Microsoft.OpenApi/Models/OpenApiCallback.cs | 17 +++++++++-------- src/Microsoft.OpenApi/Models/OpenApiExample.cs | 14 +++++++------- src/Microsoft.OpenApi/Models/OpenApiLink.cs | 14 +++++++------- .../Models/OpenApiParameter.cs | 12 ++++++------ src/Microsoft.OpenApi/Models/OpenApiPathItem.cs | 12 ++++++------ .../Models/OpenApiRequestBody.cs | 16 ++++++++-------- src/Microsoft.OpenApi/Models/OpenApiResponse.cs | 16 ++++++++-------- .../Models/OpenApiSecurityScheme.cs | 12 ++++++------ src/Microsoft.OpenApi/Models/OpenApiTag.cs | 12 ++++++------ 9 files changed, 63 insertions(+), 62 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index 2871f3643..e20f43225 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -81,7 +81,7 @@ public void AddPathItem(RuntimeExpression expression, OpenApiPathItem pathItem) /// /// /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); @@ -90,7 +90,7 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); @@ -102,14 +102,14 @@ public void SerializeAsV3(IOpenApiWriter writer) /// /// /// - private void SerializeInternal(IOpenApiWriter writer, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); var target = this; - + if (Reference != null) { if (!writer.GetSettings().ShouldInlineReference(Reference)) @@ -122,6 +122,7 @@ private void SerializeInternal(IOpenApiWriter writer, target = GetEffective(Reference.HostDocument); } } + action(writer, target); } @@ -145,7 +146,7 @@ public OpenApiCallback GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V31 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -154,13 +155,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + + internal void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 5e4754b70..b68d58583 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -78,7 +78,7 @@ public OpenApiExample(OpenApiExample example) /// Serialize to Open Api v3.1 /// /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -88,13 +88,13 @@ public void SerializeAsV31(IOpenApiWriter writer) /// Serialize to Open Api v3.0 /// /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -123,7 +123,7 @@ private void SerializeInternal(IOpenApiWriter writer, ActionOpenApiExample public OpenApiExample GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { return doc.ResolveReferenceTo(this.Reference); } @@ -136,7 +136,7 @@ public OpenApiExample GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V31 example without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1); } @@ -144,12 +144,12 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 example without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version) + internal void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index 4a82e8785..136c6fcc4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -85,7 +85,7 @@ public OpenApiLink(OpenApiLink link) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -94,13 +94,13 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - - private void SerializeInternal(IOpenApiWriter writer, Action callback, + + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -142,7 +142,7 @@ public OpenApiLink GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V31 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, (writer, element) => element.SerializeAsV31(writer)); } @@ -150,12 +150,12 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, Action callback) + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index 2473a177e..bef4dba8f 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -172,7 +172,7 @@ public OpenApiParameter(OpenApiParameter parameter) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -181,13 +181,13 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -229,7 +229,7 @@ public OpenApiParameter GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -238,13 +238,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index 1fd734c71..9da320df4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs @@ -89,7 +89,7 @@ public OpenApiPathItem(OpenApiPathItem pathItem) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -98,7 +98,7 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); @@ -107,7 +107,7 @@ public void SerializeAsV3(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -212,7 +212,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) /// Serialize inline PathItem in OpenAPI V31 /// /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); } @@ -221,13 +221,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// Serialize inline PathItem in OpenAPI V3 /// /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index a8eb42c58..8fe48c895 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -68,7 +68,7 @@ public OpenApiRequestBody(OpenApiRequestBody requestBody) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -77,13 +77,13 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -112,9 +112,9 @@ private void SerializeInternal(IOpenApiWriter writer, ActionOpenApiRequestBody public OpenApiRequestBody GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { @@ -125,7 +125,7 @@ public OpenApiRequestBody GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V31 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -134,13 +134,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index cb8b7430d..e4f0d8bd7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -74,7 +74,7 @@ public OpenApiResponse(OpenApiResponse response) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -83,13 +83,13 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0. /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -118,9 +118,9 @@ private void SerializeInternal(IOpenApiWriter writer, ActionOpenApiResponse public OpenApiResponse GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { @@ -131,7 +131,7 @@ public OpenApiResponse GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -140,13 +140,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index f83759478..a84079f5d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -98,7 +98,7 @@ public OpenApiSecurityScheme(OpenApiSecurityScheme securityScheme) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), SerializeAsV31WithoutReference); } @@ -106,7 +106,7 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), SerializeAsV3WithoutReference); } @@ -114,7 +114,7 @@ public void SerializeAsV3(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -131,7 +131,7 @@ private void SerializeInternal(IOpenApiWriter writer, Action /// Serialize to OpenAPI V31 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -140,13 +140,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index c8669fb2b..f5b177d3a 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -64,7 +64,7 @@ public OpenApiTag(OpenApiTag tag) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); } @@ -72,7 +72,7 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer)); } @@ -80,7 +80,7 @@ public void SerializeAsV3(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - private void SerializeInternal(IOpenApiWriter writer, Action callback) + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -96,7 +96,7 @@ private void SerializeInternal(IOpenApiWriter writer, Action /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -105,13 +105,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); From ddc640cfe2238df9b5f8625f228986abd45ecb60 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Sat, 10 Jun 2023 02:28:32 +0300 Subject: [PATCH 04/24] Add header reference class --- src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 44 +++---- .../References/OpenApiHeaderReference.cs | 120 ++++++++++++++++++ .../References/OpenApiResponseReference.cs | 2 +- 3 files changed, 143 insertions(+), 23 deletions(-) create mode 100644 src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index 2eace4892..e17d589e3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -19,73 +19,73 @@ public class OpenApiHeader : IOpenApiSerializable, IOpenApiReferenceable, IOpenA /// /// Indicates if object is populated with data or is just a reference to the data /// - public bool UnresolvedReference { get; set; } + public virtual bool UnresolvedReference { get; set; } /// /// Reference pointer. /// - public OpenApiReference Reference { get; set; } + public virtual OpenApiReference Reference { get; set; } /// /// A brief description of the header. /// - public string Description { get; set; } + public virtual string Description { get; set; } /// /// Determines whether this header is mandatory. /// - public bool Required { get; set; } + public virtual bool Required { get; set; } /// /// Specifies that a header is deprecated and SHOULD be transitioned out of usage. /// - public bool Deprecated { get; set; } + public virtual bool Deprecated { get; set; } /// /// Sets the ability to pass empty-valued headers. /// - public bool AllowEmptyValue { get; set; } + public virtual bool AllowEmptyValue { get; set; } /// /// Describes how the header value will be serialized depending on the type of the header value. /// - public ParameterStyle? Style { get; set; } + public virtual ParameterStyle? Style { get; set; } /// /// When this is true, header values of type array or object generate separate parameters /// for each value of the array or key-value pair of the map. /// - public bool Explode { get; set; } + public virtual bool Explode { get; set; } /// /// Determines whether the header value SHOULD allow reserved characters, as defined by RFC3986. /// - public bool AllowReserved { get; set; } + public virtual bool AllowReserved { get; set; } /// /// The schema defining the type used for the header. /// - public OpenApiSchema Schema { get; set; } + public virtual OpenApiSchema Schema { get; set; } /// /// Example of the media type. /// - public IOpenApiAny Example { get; set; } + public virtual IOpenApiAny Example { get; set; } /// /// Examples of the media type. /// - public IDictionary Examples { get; set; } = new Dictionary(); + public virtual IDictionary Examples { get; set; } = new Dictionary(); /// /// A map containing the representations for the header. /// - public IDictionary Content { get; set; } = new Dictionary(); + public virtual IDictionary Content { get; set; } = new Dictionary(); /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public virtual IDictionary Extensions { get; set; } = new Dictionary(); /// /// Parameter-less constructor @@ -116,7 +116,7 @@ public OpenApiHeader(OpenApiHeader header) /// /// Serialize to Open Api v3.1 /// - public void SerializeAsV31(IOpenApiWriter writer) + public virtual void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), (writer, element) => element.SerializeAsV31WithoutReference(writer)); @@ -125,13 +125,13 @@ public void SerializeAsV31(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - public void SerializeAsV3(IOpenApiWriter writer) + public virtual void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - private void SerializeInternal(IOpenApiWriter writer, Action callback, + internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -161,9 +161,9 @@ private void SerializeInternal(IOpenApiWriter writer, ActionOpenApiHeader public OpenApiHeader GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { @@ -174,7 +174,7 @@ public OpenApiHeader GetEffective(OpenApiDocument doc) /// /// Serialize to OpenAPI V31 document without using reference. /// - public void SerializeAsV31WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); @@ -183,13 +183,13 @@ public void SerializeAsV31WithoutReference(IOpenApiWriter writer) /// /// Serialize to OpenAPI V3 document without using reference. /// - public void SerializeAsV3WithoutReference(IOpenApiWriter writer) + public virtual void SerializeAsV3WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer)); } - private void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, + internal virtual void SerializeInternalWithoutReference(IOpenApiWriter writer, OpenApiSpecVersion version, Action callback) { writer.WriteStartObject(); diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs new file mode 100644 index 000000000..9eae6437f --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.Collections.Generic; +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + internal class OpenApiHeaderReference : OpenApiHeader + { + private OpenApiHeader _target; + private readonly OpenApiDocument _hostDocument; + + private OpenApiHeader Target + { + get + { + _target ??= _hostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + + /// + public override string Description { get => Target.Description; set => Target.Description = value; } + + /// + public override bool Required { get => Target.Required; set => Target.Required = value; } + + /// + public override bool Deprecated { get => Target.Deprecated; set => Target.Deprecated = value; } + + /// + public override bool AllowEmptyValue { get => Target.AllowEmptyValue; set => Target.AllowEmptyValue = value; } + + /// + public override OpenApiSchema Schema { get => Target.Schema; set => Target.Schema = value; } + + /// + public override ParameterStyle? Style { get => Target.Style; set => Target.Style = value; } + + /// + public override bool Explode { get => Target.Explode; set => Target.Explode = value; } + + /// + public override bool AllowReserved { get => Target.AllowReserved; set => Target.AllowReserved = value; } + + /// + public override IOpenApiAny Example { get => Target.Example; set => Target.Example = value; } + + /// + public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } + + /// + public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + + /// + public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } + + /// + public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } + + /// + public override OpenApiReference Reference + { + get => base.Reference; + set + { + base.Reference = value; + _target = null; + } + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), + (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), + (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + internal override void SerializeInternal(IOpenApiWriter writer, + Action callback, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + callback(writer, Reference); + return; + } + + action(writer, this); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index 2847586fc..f2ff903e3 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -32,7 +32,7 @@ private OpenApiResponse Target public override IDictionary Content { get => Target.Content; set => Target.Content = value; } /// - public override IDictionary Headers { get => Target.Headers; set => Target.Headers = value; } + public override IDictionary Headers { get => Target.Headers; set => Target.Headers = value; } /// public override IDictionary Links { get => Target.Links; set => Target.Links = value; } From ef6f2708c66e07d7d3d10d3602d57a7aa9f5296d Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 13 Jun 2023 15:32:24 +0300 Subject: [PATCH 05/24] Use Target property instead of this --- .../Models/OpenApiCallback.cs | 4 +-- .../References/OpenApiCallbackReference.cs | 4 +-- .../References/OpenApiExampleReference.cs | 2 +- .../References/OpenApiHeaderReference.cs | 2 +- .../Models/References/OpenApiLinkReference.cs | 2 +- .../References/OpenApiParameterReference.cs | 2 +- .../References/OpenApiPathItemReference.cs | 2 +- .../References/OpenApiRequestBodyReference.cs | 2 +- .../References/OpenApiResponseReference.cs | 2 +- .../Models/References/OpenApiTagReference.cs | 28 +++++++++---------- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index e20f43225..be1e8cdc7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -133,9 +133,9 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, /// OpenApiCallback public OpenApiCallback GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 21096feb2..4c890d9b2 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -87,7 +87,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 19dbce397..38770de57 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -94,7 +94,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 9eae6437f..76bcf2a05 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -114,7 +114,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 7dcfe3af5..c0d37aeaf 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -99,7 +99,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 984d8ba45..dc545b6a0 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -123,7 +123,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index d34009724..0c497814b 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -96,7 +96,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 6f18df592..544de89df 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -97,7 +97,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, return; } - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index f2ff903e3..2847586fc 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -32,7 +32,7 @@ private OpenApiResponse Target public override IDictionary Content { get => Target.Content; set => Target.Content = value; } /// - public override IDictionary Headers { get => Target.Headers; set => Target.Headers = value; } + public override IDictionary Headers { get => Target.Headers; set => Target.Headers = value; } /// public override IDictionary Links { get => Target.Links; set => Target.Links = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index a1314285e..a06705612 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -61,6 +61,20 @@ public override void SerializeAsV3(IOpenApiWriter writer) public override void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); + } + + /// + public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, + (writer, element) => element.SerializeAsV3(writer)); + } + + /// + public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) + { + SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, + (writer, element) => element.SerializeAsV31(writer)); } /// @@ -76,19 +90,5 @@ internal override void SerializeInternal(IOpenApiWriter writer, Action - public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) - { - SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_0, - (writer, element) => element.SerializeAsV3(writer)); - } - - /// - public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) - { - SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, - (writer, element) => element.SerializeAsV31(writer)); - } } } From 124bd44c138ccd6b2e8537cba8b49415bcdfc513 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Thu, 15 Jun 2023 15:21:42 +0300 Subject: [PATCH 06/24] Make Reference property readonly; add constructors to get reference value --- .../References/OpenApiCallbackReference.cs | 49 ++++++++++++------- .../References/OpenApiExampleReference.cs | 39 +++++++++------ .../References/OpenApiHeaderReference.cs | 39 +++++++++------ .../Models/References/OpenApiLinkReference.cs | 34 ++++++++----- .../References/OpenApiParameterReference.cs | 41 ++++++++++------ .../References/OpenApiPathItemReference.cs | 39 +++++++++------ .../References/OpenApiRequestBodyReference.cs | 36 ++++++++------ .../References/OpenApiResponseReference.cs | 39 +++++++++------ .../OpenApiSecuritySchemeReference.cs | 39 +++++++++------ .../Models/References/OpenApiTagReference.cs | 39 +++++++++------ .../Properties/SRResource.Designer.cs | 22 +++++++++ 11 files changed, 265 insertions(+), 151 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 4c890d9b2..c23ba4053 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -1,10 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections.Generic; using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -15,17 +16,40 @@ namespace Microsoft.OpenApi.Models.References public class OpenApiCallbackReference : OpenApiCallback { private OpenApiCallback _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiCallback Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } - + + /// + /// + /// + /// + public OpenApiCallbackReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Callback; + _reference = reference; + } + /// public override Dictionary PathItems { get => Target.PathItems; set => Target.PathItems = value; } @@ -33,18 +57,7 @@ private OpenApiCallback Target public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - - /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) @@ -80,7 +93,7 @@ internal override void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - + if (!writer.GetSettings().ShouldInlineReference(Reference)) { callback(writer, Reference); @@ -88,6 +101,6 @@ internal override void SerializeInternal(IOpenApiWriter writer, } action(writer, Target); - } + } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 38770de57..c248e7a1c 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -15,17 +16,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiExampleReference : OpenApiExample { private OpenApiExample _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiExample Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiExampleReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Example; + _reference = reference; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } @@ -40,20 +60,9 @@ private OpenApiExample Target /// public override IOpenApiAny Value { get => Target.Value; set => Target.Value = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 76bcf2a05..497b9fc8f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -12,17 +13,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiHeaderReference : OpenApiHeader { private OpenApiHeader _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiHeader Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiHeaderReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Header; + _reference = reference; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } @@ -58,20 +78,9 @@ private OpenApiHeader Target /// public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV31(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index c0d37aeaf..e21130bc1 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -14,17 +15,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiLinkReference : OpenApiLink { private OpenApiLink _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiLink Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiLinkReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Link; + _reference = reference; + } + /// public override string OperationRef { get => Target.OperationRef; set => Target.OperationRef = value; } @@ -50,15 +70,7 @@ private OpenApiLink Target public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index dc545b6a0..ba1b3bd3f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -15,17 +16,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiParameterReference : OpenApiParameter { private OpenApiParameter _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiParameter Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiParameterReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Parameter; + _reference = reference; + } + /// public override string Name { get => Target.Name; set => Target.Name = value; } @@ -60,27 +80,16 @@ private OpenApiParameter Target public override ParameterStyle? Style { get => Target.Style; set => Target.Style = value; } /// - public override bool Explode { get => base.Explode; set => base.Explode = value; } + public override bool Explode { get => Target.Explode; set => Target.Explode = value; } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index 0c497814b..58cdebf47 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -14,17 +15,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiPathItemReference : OpenApiPathItem { private OpenApiPathItem _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiPathItem Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiPathItemReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.PathItem; + _reference = reference; + } + /// public override string Summary { get => Target.Summary; set => Target.Summary = value; } @@ -42,20 +62,9 @@ private OpenApiPathItem Target /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 544de89df..303b7f325 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -14,20 +15,34 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiRequestBodyReference : OpenApiRequestBody { private OpenApiRequestBody _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiRequestBody Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } - public OpenApiRequestBodyReference(OpenApiDocument hostDocument) + public OpenApiRequestBodyReference(OpenApiReference reference) { - _hostDocument = hostDocument; + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.RequestBody; + _reference = reference; } /// @@ -43,18 +58,7 @@ public OpenApiRequestBodyReference(OpenApiDocument hostDocument) public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - - /// - public override OpenApiReference Reference - { - get => Target.Reference; - set - { - Target.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index 2847586fc..a29f534ab 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -14,17 +15,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiResponseReference : OpenApiResponse { private OpenApiResponse _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiResponse Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiResponseReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Response; + _reference = reference; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } @@ -39,20 +59,9 @@ private OpenApiResponse Target /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index 1f1987966..ed750a458 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -14,17 +15,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiSecuritySchemeReference : OpenApiSecurityScheme { private OpenApiSecurityScheme _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiSecurityScheme Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiSecuritySchemeReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.SecurityScheme; + _reference = reference; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } @@ -51,20 +71,9 @@ private OpenApiSecurityScheme Target /// public override SecuritySchemeType Type { get => Target.Type; set => Target.Type = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index a06705612..b2ec19614 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References @@ -14,17 +15,36 @@ namespace Microsoft.OpenApi.Models.References internal class OpenApiTagReference : OpenApiTag { private OpenApiTag _target; - private readonly OpenApiDocument _hostDocument; + private readonly OpenApiReference _reference; private OpenApiTag Target { get { - _target ??= _hostDocument.ResolveReferenceTo(Reference); + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); return _target; } } + public OpenApiTagReference(OpenApiReference reference) + { + if (reference == null) + { + throw Error.ArgumentNull(nameof(reference)); + } + if (reference.HostDocument == null) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + } + if (string.IsNullOrEmpty(reference.Id)) + { + throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + } + + reference.Type = ReferenceType.Tag; + _reference = reference; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } @@ -36,20 +56,9 @@ private OpenApiTag Target /// public override string Name { get => Target.Name; set => Target.Name = value; } - - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - + /// - public override OpenApiReference Reference - { - get => base.Reference; - set - { - base.Reference = value; - _target = null; - } - } + public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs index 96c0ce501..c70aff362 100644 --- a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs +++ b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs @@ -366,5 +366,27 @@ internal static string WorkspaceRequredForExternalReferenceResolution { return ResourceManager.GetString("WorkspaceRequredForExternalReferenceResolution", resourceCulture); } } + + /// + /// Looks up a localized string similar to The HostDocument in the referenced element is null.. + /// + internal static string ReferencedElementHostDocumentIsNull + { + get + { + return ResourceManager.GetString("ReferencedElementHostDocumentIsNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The identifier in the referenced element is null or empty .. + /// + internal static string ReferencedElementIdentifierIsNullOrEmpty + { + get + { + return ResourceManager.GetString("ReferencedElementIdentifierIsNullOrEmpty", resourceCulture); + } + } } } From d57f07c376eba69d2978545fba7954f5838163c8 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Thu, 22 Jun 2023 12:24:07 +0300 Subject: [PATCH 07/24] Add new constructor --- .../References/OpenApiCallbackReference.cs | 15 +++++++++++++++ .../Models/References/OpenApiExampleReference.cs | 16 ++++++++++++++++ .../Models/References/OpenApiHeaderReference.cs | 16 ++++++++++++++++ .../Models/References/OpenApiLinkReference.cs | 10 ++++++++++ .../References/OpenApiParameterReference.cs | 10 ++++++++++ .../References/OpenApiPathItemReference.cs | 10 ++++++++++ .../References/OpenApiRequestBodyReference.cs | 10 ++++++++++ .../References/OpenApiResponseReference.cs | 10 ++++++++++ .../References/OpenApiSecuritySchemeReference.cs | 11 +++++++++++ .../Models/References/OpenApiTagReference.cs | 10 ++++++++++ 10 files changed, 118 insertions(+) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index c23ba4053..ae87e3fbf 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -50,6 +50,21 @@ public OpenApiCallbackReference(OpenApiReference reference) _reference = reference; } + /// + /// + /// + /// + /// + public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Callback + }; + } + /// public override Dictionary PathItems { get => Target.PathItems; set => Target.PathItems = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index c248e7a1c..e838e8c3d 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -17,6 +17,7 @@ internal class OpenApiExampleReference : OpenApiExample { private OpenApiExample _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiExample Target { @@ -46,6 +47,21 @@ public OpenApiExampleReference(OpenApiReference reference) _reference = reference; } + /// + /// + /// + /// + /// + public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Example + }; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 497b9fc8f..a41e64a91 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -43,6 +43,22 @@ public OpenApiHeaderReference(OpenApiReference reference) _reference = reference; } + + /// + /// + /// + /// + /// + public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Header + }; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index e21130bc1..6c61d99fc 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -45,6 +45,16 @@ public OpenApiLinkReference(OpenApiReference reference) _reference = reference; } + public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Link + }; + } + /// public override string OperationRef { get => Target.OperationRef; set => Target.OperationRef = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index ba1b3bd3f..fa164ed15 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -46,6 +46,16 @@ public OpenApiParameterReference(OpenApiReference reference) _reference = reference; } + public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Parameter + }; + } + /// public override string Name { get => Target.Name; set => Target.Name = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index 58cdebf47..1e372d6eb 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -45,6 +45,16 @@ public OpenApiPathItemReference(OpenApiReference reference) _reference = reference; } + public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.PathItem + }; + } + /// public override string Summary { get => Target.Summary; set => Target.Summary = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 303b7f325..fa05ab4cd 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -45,6 +45,16 @@ public OpenApiRequestBodyReference(OpenApiReference reference) _reference = reference; } + public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.RequestBody + }; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index a29f534ab..e0c36b6c0 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -45,6 +45,16 @@ public OpenApiResponseReference(OpenApiReference reference) _reference = reference; } + public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Response + }; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index ed750a458..303f5738a 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -45,6 +45,17 @@ public OpenApiSecuritySchemeReference(OpenApiReference reference) _reference = reference; } + + public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.SecurityScheme + }; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index b2ec19614..92e9d1f7c 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -45,6 +45,16 @@ public OpenApiTagReference(OpenApiReference reference) _reference = reference; } + public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) + { + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Tag + }; + } + /// public override string Description { get => Target.Description; set => Target.Description = value; } From eae34a78c1c36cd16d711f969989d7a49bed5244 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Thu, 22 Jun 2023 12:24:34 +0300 Subject: [PATCH 08/24] Add reference tests --- .../Microsoft.OpenApi.Tests.csproj | 8 ++ ...orks_produceTerseOutput=False.verified.txt | 1 + .../OpenApiCallbackReferenceTests.cs | 107 ++++++++++++++++++ .../OpenApiExampleReferenceTests.cs | 72 ++++++++++++ .../References/OpenApiHeaderReferenceTests.cs | 57 ++++++++++ .../References/OpenApiLinkReferenceTests.cs | 79 +++++++++++++ .../OpenApiParameterReferenceTests.cs | 66 +++++++++++ .../OpenApiPathItemReferenceTests.cs | 66 +++++++++++ .../OpenApiRequestBodyReferenceTests.cs | 70 ++++++++++++ .../OpenApiResponseReferenceTest.cs | 58 ++++++++++ .../OpenApiSecuritySchemeReferenceTests.cs | 53 +++++++++ 11 files changed, 637 insertions(+) create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 49bd7631f..eeb82fcf4 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -54,6 +54,14 @@ + + OpenApiCallbackReferenceTests.cs + + + + OpenApiCallbackReferenceTests.cs + + diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs new file mode 100644 index 000000000..185176182 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -0,0 +1,107 @@ +using System.Globalization; +using System.IO; +using System.Threading.Tasks; +using Microsoft.OpenApi.Expressions; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; +using VerifyXunit; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + public class OpenApiCallbackReferenceTests + { + const string openapi = @" +openapi: 3.0.0 +info: + title: Callback with ref Example + version: 1.0.0 +paths: + /register: + post: + summary: Subscribe to a webhook + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + callbackUrl: # Callback URL + type: string + format: uri + example: https://myserver.com/send/callback/here + required: + - callbackUrl + responses: + '200': + description: subscription successfully created + content: + application/json: + schema: + type: object + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: unique identifier + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + myEvent: + $ref: '#/components/callbacks/callbackEvent' +components: + callbacks: + callbackEvent: + '{$request.body#/callbackUrl}': + post: + requestBody: # Contents of the callback message + required: true + content: + application/json: + schema: + type: object + properties: + message: + type: string + example: Some event happened + required: + - message + responses: + '200': + description: ok"; + + readonly OpenApiCallbackReference _callbackReference; + + public OpenApiCallbackReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(openapi, out _); + _callbackReference = new("callbackEvent", openApiDoc); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeReferencedCallbackAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + + // Act + _callbackReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + Assert.NotEmpty(_callbackReference.PathItems); + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs new file mode 100644 index 000000000..dc9769051 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiExampleReferenceTests + { + private const string OpenApi = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + get: + summary: Get users + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + examples: + - $ref: '#/components/examples/UserExample' +components: + schemas: + User: + type: object + properties: + id: + type: integer + name: + type: string + examples: + UserExample: + summary: Example of a user + value: + - id: 1 + name: John Doe +"; + + readonly OpenApiExampleReference _openApiExampleReference; + + public OpenApiExampleReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiExampleReference = new OpenApiExampleReference("UserExample", openApiDoc) + { + Summary = "Example of an admin user" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("Example of an admin user", _openApiExampleReference.Summary); + Assert.NotNull(_openApiExampleReference.Value); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs new file mode 100644 index 000000000..4226731ff --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiHeaderReferenceTests + { + private const string OpenApi= @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + post: + summary: Create a post + responses: + '201': + description: Post created successfully + headers: + Location: + $ref: '#/components/headers/LocationHeader' +components: + headers: + LocationHeader: + description: The URL of the newly created post + schema: + type: string +"; + + readonly OpenApiHeaderReference _openApiHeaderReference; + + public OpenApiHeaderReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiHeaderReference = new OpenApiHeaderReference("LocationHeader", openApiDoc) + { + Description = "Location of the created post" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("Location of the created post", _openApiHeaderReference.Description); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs new file mode 100644 index 000000000..24db918ae --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiLinkReferenceTests + { + private const string OpenApi = @" +openapi: 3.0.0 +info: + version: 0.0.0 + title: Links example +paths: + /users: + post: + summary: Creates a user and returns the user ID + operationId: createUser + requestBody: + required: true + description: A JSON object that contains the user name and age. + content: + application/json: + schema: + $ref: '#/components/schemas/User' + responses: + '201': + description: Created + content: + application/json: + schema: + type: object + properties: + id: + type: integer + format: int64 + description: ID of the created user. + links: + GetUserByUserId: + $ref: '#/components/links/GetUserByUserId' # <---- referencing the link here +components: + links: + GetUserByUserId: + operationId: getUser + parameters: + userId: '$response.body#/id' + description: > + The `id` value returned in the response can be used as + the `userId` parameter in `GET /users/{userId}`. +"; + + OpenApiLinkReference _openApiLinkReference; + + public OpenApiLinkReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiLinkReference = new("GetUserByUserId", openApiDoc) + { + Description = "Use the id returned as the userId in `GET /users/{userId}`" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("Use the id returned as the userId in `GET /users/{userId}`", _openApiLinkReference.Description); + Assert.Equal("getUser", _openApiLinkReference.OperationId); + Assert.Equal("userId", _openApiLinkReference.Parameters.First().Key); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs new file mode 100644 index 000000000..aec36ce4e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; +using VerifyXunit; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiParameterReferenceTests + { + private const string OpenApi = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + get: + summary: Get users + parameters: + - $ref: '#/components/parameters/limitParam' + responses: + 200: + description: Successful operation +components: + parameters: + limitParam: + name: limit + in: query + description: Number of results to return + schema: + type: integer + minimum: 1 + maximum: 100 +"; + readonly OpenApiParameterReference _parameterReference; + + public OpenApiParameterReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _parameterReference = new("limitParam", openApiDoc) + { + Description = "Results to return" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("limit", _parameterReference.Name); + Assert.Equal("Results to return", _parameterReference.Description); + _parameterReference.Description = "Number of limit results"; + + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs new file mode 100644 index 000000000..2fd963d82 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Mono.Cecil; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiPathItemReferenceTests + { + private const string OpenApi = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + $ref: '#/components/pathItems/userPathItem' + +components: + pathItems: + userPathItem: + get: + summary: Get users + responses: + 200: + description: Successful operation + post: + summary: Create a user + responses: + 201: + description: User created successfully + delete: + summary: Delete a user + responses: + 204: + description: User deleted successfully +"; + + readonly OpenApiPathItemReference _openApiPathItemReference; + + public OpenApiPathItemReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiPathItemReference = new OpenApiPathItemReference("userPathItem", openApiDoc) + { + Description = "User path item description" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal(3, _openApiPathItemReference.Operations.Count); + Assert.Equal("User path item description", _openApiPathItemReference.Description); + Assert.Equal(new OperationType[] { OperationType.Get, OperationType.Post, OperationType.Delete }, _openApiPathItemReference.Operations.Select(o => o.Key)); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs new file mode 100644 index 000000000..912db3458 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiRequestBodyReferenceTests + { + private const string OpenApi = @" +openapi: 3.0.3 +info: + title: Sample API + version: 1.0.0 + +paths: + /users: + post: + summary: Create a user + requestBody: + $ref: '#/components/requestBodies/UserRequest' # <---- referencing the requestBody here + responses: + '201': + description: User created + +components: + requestBodies: + UserRequest: + description: User creation request body + content: + application/json: + schema: + $ref: '#/components/schemas/UserSchema' + + schemas: + UserSchema: + type: object + properties: + name: + type: string + email: + type: string +"; + + OpenApiRequestBodyReference _openApiRequestBodyReference; + + public OpenApiRequestBodyReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiRequestBodyReference = new("", openApiDoc) + { + Description = "User request body" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("User request body", _openApiRequestBodyReference.Description); + Assert.Equal("application/json", _openApiRequestBodyReference.Content.First().Key); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs new file mode 100644 index 000000000..ae11e7a4b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiResponseReferenceTest + { + private const string OpenApi = @" +openapi: 3.0.3 +info: + title: Sample API + version: 1.0.0 + +paths: + /ping: + get: + responses: + '200': + $ref: '#/components/responses/OkResponse' + +components: + responses: + OkResponse: + description: OK + content: + text/plain: + schema: + $ref: '#/components/schemas/Pong' +"; + + OpenApiResponseReference _openApiResponseReference; + + public OpenApiResponseReferenceTest() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiResponseReference = new("OkResponse", openApiDoc) + { + Description = "OK response" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("OK response", _openApiResponseReference.Description); + Assert.Equal("text/plain", _openApiResponseReference.Content.First().Key); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs new file mode 100644 index 000000000..f22ad0e52 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiSecuritySchemeReferenceTests + { + private const string OpenApi = @" +openapi: 3.0.3 +info: + title: Sample API + version: 1.0.0 + +paths: + /users: + get: + summary: Retrieve users + security: + - mySecurityScheme: [] + +components: + securitySchemes: + mySecurityScheme: + type: apiKey + name: X-API-Key + in: header +"; + + OpenApiSecuritySchemeReference _openApiSecuritySchemeReference; + + public OpenApiSecuritySchemeReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiSecuritySchemeReference = new("mySecurityScheme", openApiDoc); + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("X-API-Key", _openApiSecuritySchemeReference.Name); + Assert.Equal(SecuritySchemeType.ApiKey, _openApiSecuritySchemeReference.Type); + } + } +} From 82ec1fdc616d0916c5be1cb83ed7d57bcc8ef09f Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 23 Jun 2023 01:23:23 +0300 Subject: [PATCH 09/24] Add Tag reference tests --- .../OpenApiSecuritySchemeReferenceTests.cs | 2 +- .../References/OpenApiTagReferenceTest.cs | 76 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index f22ad0e52..2221533d1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -33,7 +33,7 @@ public class OpenApiSecuritySchemeReferenceTests in: header "; - OpenApiSecuritySchemeReference _openApiSecuritySchemeReference; + readonly OpenApiSecuritySchemeReference _openApiSecuritySchemeReference; public OpenApiSecuritySchemeReferenceTests() { diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs new file mode 100644 index 000000000..9d199c893 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Readers; +using Xunit; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + public class OpenApiTagReferenceTest + { + private const string OpenApi = @"openapi: 3.0.3 +info: + title: Sample API + version: 1.0.0 + +paths: + /users/{userId}: + get: + summary: Returns a user by ID. + parameters: + - name: userId + in: path + required: true + description: The ID of the user to return. + schema: + type: integer + responses: + '200': + description: A user object. + content: + application/json: + schema: + $ref: '#/components/schemas/User' + '404': + description: The user was not found. + tags: + - $ref: '#/tags/user' +components: + schemas: + User: + type: object + properties: + id: + type: integer + name: + type: string +tags: + - name: user + description: Operations about users. +"; + + readonly OpenApiTagReference _openApiTagReference; + + public OpenApiTagReferenceTest() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiTagReference = new("user", openApiDoc) + { + Description = "Users operations" + }; + } + + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.Equal("user", _openApiTagReference.Name); + Assert.Equal("Users operations", _openApiTagReference.Description); + } + } +} From d66fbf724ec1a666efb3dccb9d78f077f5783f0c Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 27 Jun 2023 16:06:11 +0300 Subject: [PATCH 10/24] Update tests, method signatures and properties --- .../Models/OpenApiCallback.cs | 4 +- .../Models/OpenApiParameter.cs | 8 +-- .../References/OpenApiCallbackReference.cs | 53 ++++------------ .../References/OpenApiExampleReference.cs | 30 +++------ .../References/OpenApiHeaderReference.cs | 21 +++++-- .../Models/References/OpenApiLinkReference.cs | 25 +++----- .../References/OpenApiParameterReference.cs | 46 +++++--------- .../References/OpenApiPathItemReference.cs | 25 +++----- .../References/OpenApiRequestBodyReference.cs | 25 +++----- .../References/OpenApiResponseReference.cs | 25 +++----- .../OpenApiSecuritySchemeReference.cs | 26 +++----- .../Models/References/OpenApiTagReference.cs | 25 +++----- .../Properties/SRResource.Designer.cs | 10 +-- .../Microsoft.OpenApi.Tests.csproj | 4 -- ...orks_produceTerseOutput=False.verified.txt | 30 +++++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 30 +++++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 30 +++++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 31 ++++++++- ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiCallbackReferenceTests.cs | 39 ++++++++++-- .../OpenApiExampleReferenceTests.cs | 11 ++-- .../References/OpenApiHeaderReferenceTests.cs | 11 ++-- .../References/OpenApiLinkReferenceTests.cs | 10 +-- ...sync_produceTerseOutput=False.verified.txt | 8 +++ ...Async_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 10 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 10 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...sync_produceTerseOutput=False.verified.txt | 8 +++ ...Async_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 10 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiParameterReferenceTests.cs | 63 +++++++++++++++++-- .../OpenApiPathItemReferenceTests.cs | 11 ++-- .../OpenApiRequestBodyReferenceTests.cs | 10 +-- .../OpenApiResponseReferenceTest.cs | 10 +-- .../OpenApiSecuritySchemeReferenceTests.cs | 11 ++-- .../References/OpenApiTagReferenceTest.cs | 11 ++-- 42 files changed, 436 insertions(+), 254 deletions(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=True.verified.txt diff --git a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index be1e8cdc7..250ceaefc 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -28,7 +28,7 @@ public class OpenApiCallback : IOpenApiSerializable, IOpenApiReferenceable, IOpe /// /// Reference pointer. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// This object MAY be extended with Specification Extensions. @@ -102,7 +102,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) /// /// /// - internal virtual void SerializeInternal(IOpenApiWriter writer, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index bef4dba8f..8df0fd319 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -26,7 +26,7 @@ public class OpenApiParameter : IOpenApiSerializable, IOpenApiReferenceable, IEf /// /// Reference object. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// REQUIRED. The name of the parameter. Parameter names are case sensitive. @@ -187,7 +187,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -216,9 +216,9 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, ActionOpenApiParameter public OpenApiParameter GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index ae87e3fbf..1ae67c15d 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -22,41 +22,27 @@ private OpenApiCallback Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } - } + } /// - /// + /// Constructor initializing the reference object. /// - /// - public OpenApiCallbackReference(OpenApiReference reference) + /// The reference Id. + /// The host OpenAPI document. + public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.Callback; - _reference = reference; - } - - /// - /// - /// - /// - /// - public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, @@ -71,21 +57,16 @@ public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer,(writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer,(writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); } /// @@ -103,18 +84,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index e838e8c3d..660a2ece9 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -28,32 +28,22 @@ private OpenApiExample Target } } - public OpenApiExampleReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.ArgumentNull(nameof(reference)); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (reference.HostDocument == null) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); - } - if (string.IsNullOrEmpty(reference.Id)) - { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.Example; - _reference = reference; - } - - /// - /// - /// - /// - /// - public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index a41e64a91..ca60f2fa7 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -32,11 +32,11 @@ public OpenApiHeaderReference(OpenApiReference reference) } if (reference.HostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(reference), SRResource.HostDocumentIsNull); } if (string.IsNullOrEmpty(reference.Id)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(reference), SRResource.ReferenceIdIsNullOrEmpty); } reference.Type = ReferenceType.Header; @@ -45,12 +45,21 @@ public OpenApiHeaderReference(OpenApiReference reference) /// - /// + /// Constructor initializing the reference object. /// - /// - /// + /// The reference Id. + /// The host OpenAPI document. public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument) - { + { + if (string.IsNullOrEmpty(referenceId)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 6c61d99fc..667321027 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -26,27 +26,22 @@ private OpenApiLink Target } } - public OpenApiLinkReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.Link; - _reference = reference; - } - - public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index fa164ed15..8558ef654 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -22,32 +22,27 @@ private OpenApiParameter Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } - public OpenApiParameterReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.Parameter; - _reference = reference; - } - - public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, @@ -98,21 +93,16 @@ public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocumen /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, element) => element.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, element) => element.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); } /// @@ -130,18 +120,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index 1e372d6eb..484fabe72 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -26,27 +26,22 @@ private OpenApiPathItem Target } } - public OpenApiPathItemReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.PathItem; - _reference = reference; - } - - public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index fa05ab4cd..6b738d19b 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -26,27 +26,22 @@ private OpenApiRequestBody Target } } - public OpenApiRequestBodyReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.RequestBody; - _reference = reference; - } - - public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index e0c36b6c0..34dc02523 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -26,27 +26,22 @@ private OpenApiResponse Target } } - public OpenApiResponseReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.Response; - _reference = reference; - } - - public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index 303f5738a..9aa6c6f70 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -26,28 +26,22 @@ private OpenApiSecurityScheme Target } } - public OpenApiSecuritySchemeReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.SecurityScheme; - _reference = reference; - } - - - public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 92e9d1f7c..0c23a554a 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -26,27 +26,22 @@ private OpenApiTag Target } } - public OpenApiTagReference(OpenApiReference reference) + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) + if (string.IsNullOrEmpty(referenceId)) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementHostDocumentIsNull); + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); } - if (string.IsNullOrEmpty(reference.Id)) + if (hostDocument == null) { - throw Error.Argument(nameof(reference), SRResource.ReferencedElementIdentifierIsNullOrEmpty); + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); } - reference.Type = ReferenceType.Tag; - _reference = reference; - } - - public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) - { _reference = new OpenApiReference() { Id = referenceId, diff --git a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs index c70aff362..dd70e121d 100644 --- a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs +++ b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs @@ -368,24 +368,24 @@ internal static string WorkspaceRequredForExternalReferenceResolution { } /// - /// Looks up a localized string similar to The HostDocument in the referenced element is null.. + /// Looks up a localized string similar to The HostDocument is null.. /// - internal static string ReferencedElementHostDocumentIsNull + internal static string HostDocumentIsNull { get { - return ResourceManager.GetString("ReferencedElementHostDocumentIsNull", resourceCulture); + return ResourceManager.GetString("HostDocumentIsNull", resourceCulture); } } /// /// Looks up a localized string similar to The identifier in the referenced element is null or empty .. /// - internal static string ReferencedElementIdentifierIsNullOrEmpty + internal static string ReferenceIdIsNullOrEmpty { get { - return ResourceManager.GetString("ReferencedElementIdentifierIsNullOrEmpty", resourceCulture); + return ResourceManager.GetString("ReferenceIdIsNullOrEmpty", resourceCulture); } } } diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index eeb82fcf4..2bedad902 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -58,10 +58,6 @@ OpenApiCallbackReferenceTests.cs - - OpenApiCallbackReferenceTests.cs - - diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..3bb0efa15 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,30 @@ +{ + "{$request.body#/callbackUrl}": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Some event happened" + } + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "ok" + } + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..63215a889 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"{$request.body#/callbackUrl}":{"post":{"requestBody":{"content":{"application/json":{"schema":{"required":["message"],"type":"object","properties":{"message":{"type":"string","example":"Some event happened"}}}}},"required":true},"responses":{"200":{"description":"ok"}}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..3bb0efa15 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,30 @@ +{ + "{$request.body#/callbackUrl}": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Some event happened" + } + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "ok" + } + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..63215a889 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"{$request.body#/callbackUrl}":{"post":{"requestBody":{"content":{"application/json":{"schema":{"required":["message"],"type":"object","properties":{"message":{"type":"string","example":"Some event happened"}}}}},"required":true},"responses":{"200":{"description":"ok"}}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..3bb0efa15 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,30 @@ +{ + "{$request.body#/callbackUrl}": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Some event happened" + } + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "ok" + } + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..63215a889 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"{$request.body#/callbackUrl}":{"post":{"requestBody":{"content":{"application/json":{"schema":{"required":["message"],"type":"object","properties":{"message":{"type":"string","example":"Some event happened"}}}}},"required":true},"responses":{"200":{"description":"ok"}}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt index 5f282702b..3bb0efa15 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1 +1,30 @@ - \ No newline at end of file +{ + "{$request.body#/callbackUrl}": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "Some event happened" + } + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "ok" + } + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..63215a889 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"{$request.body#/callbackUrl}":{"post":{"requestBody":{"content":{"application/json":{"schema":{"required":["message"],"type":"object","properties":{"message":{"type":"string","example":"Some event happened"}}}}},"required":true},"responses":{"200":{"description":"ok"}}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs index 185176182..3773773b2 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -1,7 +1,10 @@ -using System.Globalization; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Globalization; using System.IO; +using System.Linq; using System.Threading.Tasks; -using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; @@ -85,23 +88,47 @@ public OpenApiCallbackReferenceTests() _callbackReference = new("callbackEvent", openApiDoc); } + [Fact] + public void ReferenceResolutionWorks() + { + // Assert + Assert.NotEmpty(_callbackReference.PathItems); + Assert.Equal("{$request.body#/callbackUrl}", _callbackReference.PathItems.First().Key.Expression); + } + [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeReferencedCallbackAsV3JsonWorks(bool produceTerseOutput) + public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); - var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); - + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act _callbackReference.SerializeAsV3(writer); writer.Flush(); + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _callbackReference.SerializeAsV31(writer); + writer.Flush(); + // Assert - Assert.NotEmpty(_callbackReference.PathItems); await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } + } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index dc9769051..406c7d7d0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -1,15 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiExampleReferenceTests { private const string OpenApi = @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index 4226731ff..82c0804a1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -1,15 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiHeaderReferenceTests { private const string OpenApi= @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index 24db918ae..063661238 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -1,15 +1,17 @@ -using System; -using System.Collections.Generic; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiLinkReferenceTests { private const string OpenApi = @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..2a64ba6d9 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,8 @@ +{ + "in": "query", + "name": "limit", + "description": "Results to return", + "type": "integer", + "maximum": 100, + "minimum": 1 +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..8d3cb1803 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"in":"query","name":"limit","description":"Results to return","type":"integer","maximum":100,"minimum":1} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..cd30a5fc2 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "name": "limit", + "in": "query", + "description": "Results to return", + "schema": { + "maximum": 100, + "minimum": 1, + "type": "integer" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..da4f04c14 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"name":"limit","in":"query","description":"Results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..cd30a5fc2 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "name": "limit", + "in": "query", + "description": "Results to return", + "schema": { + "maximum": 100, + "minimum": 1, + "type": "integer" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..da4f04c14 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"name":"limit","in":"query","description":"Results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..2a64ba6d9 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,8 @@ +{ + "in": "query", + "name": "limit", + "description": "Results to return", + "type": "integer", + "maximum": 100, + "minimum": 1 +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..8d3cb1803 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"in":"query","name":"limit","description":"Results to return","type":"integer","maximum":100,"minimum":1} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..cd30a5fc2 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "name": "limit", + "in": "query", + "description": "Results to return", + "schema": { + "maximum": 100, + "minimum": 1, + "type": "integer" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..da4f04c14 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeReferencedParameterAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"name":"limit","in":"query","description":"Results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs index aec36ce4e..11d1933c2 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -1,9 +1,8 @@ -using System; -using System.Collections.Generic; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using System.Globalization; using System.IO; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -14,6 +13,8 @@ namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiParameterReferenceTests { private const string OpenApi = @" @@ -59,8 +60,58 @@ public void ReferenceResolutionWorks() // Assert Assert.Equal("limit", _parameterReference.Name); Assert.Equal("Results to return", _parameterReference.Description); - _parameterReference.Description = "Number of limit results"; - + _parameterReference.Description = "Number of limit results"; + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeParameterReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _parameterReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeParameterReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _parameterReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _parameterReference.SerializeAsV2(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index 2fd963d82..5382dbed2 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -1,16 +1,17 @@ -using System; -using System.Collections.Generic; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; -using Mono.Cecil; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiPathItemReferenceTests { private const string OpenApi = @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index 912db3458..bbba992aa 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -1,15 +1,17 @@ -using System; -using System.Collections.Generic; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiRequestBodyReferenceTests { private const string OpenApi = @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index ae11e7a4b..1ae25eb24 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -1,15 +1,17 @@ -using System; -using System.Collections.Generic; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiResponseReferenceTest { private const string OpenApi = @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index 2221533d1..62ca134ad 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -1,15 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiSecuritySchemeReferenceTests { private const string OpenApi = @" diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index 9d199c893..d15bf3643 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -1,15 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using VerifyXunit; using Xunit; namespace Microsoft.OpenApi.Tests.Models.References { + [Collection("DefaultSettings")] + [UsesVerify] public class OpenApiTagReferenceTest { private const string OpenApi = @"openapi: 3.0.3 From 0fea87f7d516ac3b17456d1535e94309a0e4a37a Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 30 Jun 2023 11:13:42 +0300 Subject: [PATCH 11/24] Revert access modifiers --- src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 4 ++-- src/Microsoft.OpenApi/Models/OpenApiLink.cs | 8 ++++---- src/Microsoft.OpenApi/Models/OpenApiPathItem.cs | 12 ++++++------ src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs | 6 +++--- src/Microsoft.OpenApi/Models/OpenApiResponse.cs | 6 +++--- .../Models/OpenApiSecurityScheme.cs | 6 +++--- src/Microsoft.OpenApi/Models/OpenApiTag.cs | 6 +++--- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index e17d589e3..68145a44f 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -24,7 +24,7 @@ public class OpenApiHeader : IOpenApiSerializable, IOpenApiReferenceable, IOpenA /// /// Reference pointer. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// A brief description of the header. @@ -131,7 +131,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index 136c6fcc4..e9435e3ee 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -59,7 +59,7 @@ public class OpenApiLink : IOpenApiSerializable, IOpenApiReferenceable, IOpenApi /// /// Reference pointer. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// Parameterless constructor @@ -100,7 +100,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -129,9 +129,9 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, ActionOpenApiLink public OpenApiLink GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { diff --git a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index 9da320df4..045e36619 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs @@ -49,12 +49,12 @@ public class OpenApiPathItem : IOpenApiSerializable, IOpenApiExtensible, IOpenAp /// /// Indicates if object is populated with data or is just a reference to the data /// - public virtual bool UnresolvedReference { get; set; } + public bool UnresolvedReference { get; set; } /// /// Reference object. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// Add one operation into this path item. @@ -107,7 +107,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); @@ -135,9 +135,9 @@ internal virtual void SerializeInternal(IOpenApiWriter writer, ActionOpenApiPathItem public OpenApiPathItem GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { - return doc.ResolveReferenceTo(this.Reference); + return doc.ResolveReferenceTo(Reference); } else { @@ -163,7 +163,7 @@ public void SerializeAsV2(IOpenApiWriter writer) } else { - target = this.GetEffective(Reference.HostDocument); + target = GetEffective(Reference.HostDocument); } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index 8fe48c895..f1b7c910b 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -18,12 +18,12 @@ public class OpenApiRequestBody : IOpenApiSerializable, IOpenApiReferenceable, I /// /// Indicates if object is populated with data or is just a reference to the data /// - public virtual bool UnresolvedReference { get; set; } + public bool UnresolvedReference { get; set; } /// /// Reference object. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// A brief description of the request body. This could contain examples of use. @@ -83,7 +83,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs index e4f0d8bd7..5b6ae2aa6 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -45,12 +45,12 @@ public class OpenApiResponse : IOpenApiSerializable, IOpenApiReferenceable, IOpe /// /// Indicates if object is populated with data or is just a reference to the data /// - public virtual bool UnresolvedReference { get; set; } + public bool UnresolvedReference { get; set; } /// /// Reference pointer. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// Parameterless constructor @@ -89,7 +89,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) (writer, element) => element.SerializeAsV3WithoutReference(writer)); } - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs index a84079f5d..40860d08c 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -65,12 +65,12 @@ public class OpenApiSecurityScheme : IOpenApiSerializable, IOpenApiReferenceable /// /// Indicates if object is populated with data or is just a reference to the data /// - public virtual bool UnresolvedReference { get; set; } + public bool UnresolvedReference { get; set; } /// /// Reference object. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// Parameterless constructor @@ -114,7 +114,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action callback, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs index f5b177d3a..70c4eacb5 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs @@ -36,12 +36,12 @@ public class OpenApiTag : IOpenApiSerializable, IOpenApiReferenceable, IOpenApiE /// /// Indicates if object is populated with data or is just a reference to the data /// - public virtual bool UnresolvedReference { get; set; } + public bool UnresolvedReference { get; set; } /// /// Reference. /// - public virtual OpenApiReference Reference { get; set; } + public OpenApiReference Reference { get; set; } /// /// Parameterless constructor @@ -80,7 +80,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer) /// /// Serialize to Open Api v3.0 /// - internal virtual void SerializeInternal(IOpenApiWriter writer, Action callback) + private void SerializeInternal(IOpenApiWriter writer, Action callback) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); From 3608bf6c15c1abef68d5ac6538ee30477a762ced Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 30 Jun 2023 11:17:14 +0300 Subject: [PATCH 12/24] Update methods --- .../References/OpenApiCallbackReference.cs | 4 +- .../References/OpenApiExampleReference.cs | 21 ++-------- .../References/OpenApiHeaderReference.cs | 41 ++----------------- .../Models/References/OpenApiLinkReference.cs | 24 ++--------- .../References/OpenApiPathItemReference.cs | 21 ++-------- .../References/OpenApiRequestBodyReference.cs | 22 +++------- .../References/OpenApiResponseReference.cs | 21 ++-------- .../OpenApiSecuritySchemeReference.cs | 18 ++------ .../Models/References/OpenApiTagReference.cs | 16 ++------ 9 files changed, 34 insertions(+), 154 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 1ae67c15d..fd41ef63f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -60,13 +60,13 @@ public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer,(writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer,(writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); } /// diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 660a2ece9..46cf31a43 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -17,13 +17,12 @@ internal class OpenApiExampleReference : OpenApiExample { private OpenApiExample _target; private readonly OpenApiReference _reference; - private string _description; private OpenApiExample Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -67,21 +66,17 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) /// public override IOpenApiAny Value { get => Target.Value; set => Target.Value = value; } - /// - public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV31WithoutReference(writer)); } /// @@ -97,18 +92,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index ca60f2fa7..1795da959 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -19,31 +19,11 @@ private OpenApiHeader Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } - public OpenApiHeaderReference(OpenApiReference reference) - { - if (reference == null) - { - throw Error.ArgumentNull(nameof(reference)); - } - if (reference.HostDocument == null) - { - throw Error.Argument(nameof(reference), SRResource.HostDocumentIsNull); - } - if (string.IsNullOrEmpty(reference.Id)) - { - throw Error.Argument(nameof(reference), SRResource.ReferenceIdIsNullOrEmpty); - } - - reference.Type = ReferenceType.Header; - _reference = reference; - } - - /// /// Constructor initializing the reference object. /// @@ -104,21 +84,16 @@ public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument) /// public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, element) => element.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); } /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, element) => element.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); } /// @@ -136,18 +111,10 @@ public override void SerializeAsV3WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 667321027..64484300f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -21,7 +21,7 @@ private OpenApiLink Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -71,24 +71,16 @@ public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) /// public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } - /// - public override bool UnresolvedReference { get => base.UnresolvedReference; set => base.UnresolvedReference = value; } - - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, element) => element.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, element) => element.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); } /// @@ -104,18 +96,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index 484fabe72..2569862e8 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -21,7 +21,7 @@ private OpenApiPathItem Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -68,21 +68,16 @@ public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, element) => element.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, element) => element.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); } /// @@ -98,18 +93,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 6b738d19b..834b33c69 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -21,7 +21,7 @@ private OpenApiRequestBody Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -62,21 +62,17 @@ public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocum /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - /// - public override OpenApiReference Reference => _reference; /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, element) => element.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, element) => element.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); } /// @@ -91,21 +87,13 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) { SerializeInternalWithoutReference(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer)); - } + } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, Target); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index 34dc02523..b87b9dd7f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -21,7 +21,7 @@ private OpenApiResponse Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -65,21 +65,16 @@ public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), - (writer, element) => element.SerializeAsV3WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), - (writer, element) => element.SerializeAsV31WithoutReference(writer)); + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); } /// @@ -97,18 +92,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, - Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - callback(writer, Reference); - return; - } - action(writer, this); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index 9aa6c6f70..47cf17a05 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -21,7 +21,7 @@ private OpenApiSecurityScheme Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -77,19 +77,16 @@ public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDo /// public override SecuritySchemeType Type { get => Target.Type; set => Target.Type = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer), SerializeAsV3WithoutReference); + SerializeInternal(writer, SerializeAsV3WithoutReference); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer), SerializeAsV31WithoutReference); + SerializeInternal(writer, SerializeAsV31WithoutReference); } /// @@ -107,17 +104,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, Action callback, + private void SerializeInternal(IOpenApiWriter writer, Action action) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (Reference != null) - { - callback(writer, Reference); - return; - } - action(writer); } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 0c23a554a..202d76810 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -21,7 +21,7 @@ private OpenApiTag Target { get { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } } @@ -62,9 +62,6 @@ public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) /// public override string Name { get => Target.Name; set => Target.Name = value; } - /// - public override OpenApiReference Reference => _reference; - /// public override void SerializeAsV3(IOpenApiWriter writer) { @@ -92,17 +89,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - internal override void SerializeInternal(IOpenApiWriter writer, Action callback) + private void SerializeInternal(IOpenApiWriter writer, Action callback) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - - if (Reference != null) - { - callback(writer, Reference); - return; - } - - writer.WriteValue(Name); + callback(writer, Reference); } } } From 0bfe56ad1cb53640ec26f64b631c2b4ab40095ea Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 30 Jun 2023 11:17:32 +0300 Subject: [PATCH 13/24] Update tests --- ...orks_produceTerseOutput=False.verified.txt | 9 +++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 9 +++++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiExampleReferenceTests.cs | 38 +++++++++++++++++++ .../OpenApiRequestBodyReferenceTests.cs | 2 +- 6 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..e6554f0a7 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,9 @@ +{ + "summary": "Example of an admin user", + "value": [ + { + "id": "1", + "name": "John Doe" + } + ] +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..889158dcf --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"summary":"Example of an admin user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..e6554f0a7 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,9 @@ +{ + "summary": "Example of an admin user", + "value": [ + { + "id": "1", + "name": "John Doe" + } + ] +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..889158dcf --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"summary":"Example of an admin user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index 406c7d7d0..a8085c8ef 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -1,9 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -69,5 +73,39 @@ public void ReferenceResolutionWorks() Assert.Equal("Example of an admin user", _openApiExampleReference.Summary); Assert.NotNull(_openApiExampleReference.Value); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiExampleReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiExampleReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index bbba992aa..412a74c26 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -55,7 +55,7 @@ public OpenApiRequestBodyReferenceTests() { var reader = new OpenApiStringReader(); OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiRequestBodyReference = new("", openApiDoc) + _openApiRequestBodyReference = new("UserRequest", openApiDoc) { Description = "User request body" }; From acfc24abfe422f4e7d5f469538178ad661de67b6 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 3 Jul 2023 12:33:37 +0300 Subject: [PATCH 14/24] Update tests --- .../Models/References/OpenApiTagReference.cs | 2 +- ...orks_produceTerseOutput=False.verified.txt | 6 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 6 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...sync_produceTerseOutput=False.verified.txt | 4 ++ ...Async_produceTerseOutput=True.verified.txt | 1 + .../References/OpenApiHeaderReferenceTests.cs | 56 +++++++++++++++++++ ...orks_produceTerseOutput=False.verified.txt | 7 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 7 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../References/OpenApiLinkReferenceTests.cs | 38 +++++++++++++ ...orks_produceTerseOutput=False.verified.txt | 27 +++++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 27 +++++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...sync_produceTerseOutput=False.verified.txt | 27 +++++++++ ...Async_produceTerseOutput=True.verified.txt | 1 + .../OpenApiPathItemReferenceTests.cs | 56 +++++++++++++++++++ ...orks_produceTerseOutput=False.verified.txt | 10 ++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 10 ++++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiRequestBodyReferenceTests.cs | 38 +++++++++++++ ...orks_produceTerseOutput=False.verified.txt | 6 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 6 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiResponseReferenceTest.cs | 38 +++++++++++++ ...orks_produceTerseOutput=False.verified.txt | 5 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 5 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiSecuritySchemeReferenceTests.cs | 39 +++++++++++++ ...orks_produceTerseOutput=False.verified.txt | 1 + ...Works_produceTerseOutput=True.verified.txt | 1 + .../References/OpenApiTagReferenceTest.cs | 38 +++++++++++++ 38 files changed, 473 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 202d76810..0e44ccd22 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -92,7 +92,7 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) private void SerializeInternal(IOpenApiWriter writer, Action callback) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - callback(writer, Reference); + callback(writer, Target); } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..0da7cc21f --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,6 @@ +{ + "description": "Location of the created post", + "schema": { + "type": "string" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..902a0a19e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"Location of the created post","schema":{"type":"string"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..0da7cc21f --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,6 @@ +{ + "description": "Location of the created post", + "schema": { + "type": "string" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..902a0a19e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"Location of the created post","schema":{"type":"string"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..4fd919114 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,4 @@ +{ + "description": "Location of the created post", + "type": "string" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..41cc62b41 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"Location of the created post","type":"string"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index 82c0804a1..2d0893d15 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -1,9 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; +using Mono.Cecil; using VerifyXunit; using Xunit; @@ -54,5 +59,56 @@ public void ReferenceResolutionWorks() // Assert Assert.Equal("Location of the created post", _openApiHeaderReference.Description); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiHeaderReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiHeaderReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiHeaderReference.SerializeAsV2(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..89319843f --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,7 @@ +{ + "operationId": "getUser", + "parameters": { + "userId": "$response.body#/id" + }, + "description": "Use the id returned as the userId in `GET /users/{userId}`" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..93208a391 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"Use the id returned as the userId in `GET /users/{userId}`"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..89319843f --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,7 @@ +{ + "operationId": "getUser", + "parameters": { + "userId": "$response.body#/id" + }, + "description": "Use the id returned as the userId in `GET /users/{userId}`" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..93208a391 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"Use the id returned as the userId in `GET /users/{userId}`"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index 063661238..5c25323c9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -1,10 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -77,5 +81,39 @@ public void ReferenceResolutionWorks() Assert.Equal("getUser", _openApiLinkReference.OperationId); Assert.Equal("userId", _openApiLinkReference.Parameters.First().Key); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiLinkReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiLinkReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..180e27200 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,27 @@ +{ + "description": "User path item description", + "get": { + "summary": "Get users", + "responses": { + "200": { + "description": "Successful operation" + } + } + }, + "post": { + "summary": "Create a user", + "responses": { + "201": { + "description": "User created successfully" + } + } + }, + "delete": { + "summary": "Delete a user", + "responses": { + "204": { + "description": "User deleted successfully" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..bc957796c --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..180e27200 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,27 @@ +{ + "description": "User path item description", + "get": { + "summary": "Get users", + "responses": { + "200": { + "description": "Successful operation" + } + } + }, + "post": { + "summary": "Create a user", + "responses": { + "201": { + "description": "User created successfully" + } + } + }, + "delete": { + "summary": "Delete a user", + "responses": { + "204": { + "description": "User deleted successfully" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..bc957796c --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..534e3764d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,27 @@ +{ + "get": { + "summary": "Get users", + "responses": { + "200": { + "description": "Successful operation" + } + } + }, + "post": { + "summary": "Create a user", + "responses": { + "201": { + "description": "User created successfully" + } + } + }, + "delete": { + "summary": "Delete a user", + "responses": { + "204": { + "description": "User deleted successfully" + } + } + }, + "x-description": "User path item description" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..96dd2d21b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}},"x-description":"User path item description"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index 5382dbed2..8e8e70a11 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -1,10 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; +using Mono.Cecil; using VerifyXunit; using Xunit; @@ -63,5 +68,56 @@ public void ReferenceResolutionWorks() Assert.Equal("User path item description", _openApiPathItemReference.Description); Assert.Equal(new OperationType[] { OperationType.Get, OperationType.Post, OperationType.Delete }, _openApiPathItemReference.Operations.Select(o => o.Key)); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiPathItemReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiPathItemReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiPathItemReference.SerializeAsV2(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..9b60ac178 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "description": "User request body", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSchema" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..5b1d7bead --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"User request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSchema"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..9b60ac178 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "description": "User request body", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserSchema" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..5b1d7bead --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"User request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSchema"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index 412a74c26..212f599bb 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -1,10 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -68,5 +72,39 @@ public void ReferenceResolutionWorks() Assert.Equal("User request body", _openApiRequestBodyReference.Description); Assert.Equal("application/json", _openApiRequestBodyReference.Content.First().Key); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeRequestBodyReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiRequestBodyReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeRequestBodyReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiRequestBodyReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..b7716dcb6 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,6 @@ +{ + "description": "OK response", + "content": { + "text/plain": { } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..037f74d31 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"OK response","content":{"text/plain":{}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..b7716dcb6 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,6 @@ +{ + "description": "OK response", + "content": { + "text/plain": { } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..037f74d31 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.SerializeResponseReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"OK response","content":{"text/plain":{}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index 1ae25eb24..fa9bf549e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -1,10 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -56,5 +60,39 @@ public void ReferenceResolutionWorks() Assert.Equal("OK response", _openApiResponseReference.Description); Assert.Equal("text/plain", _openApiResponseReference.Content.First().Key); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeResponseReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiResponseReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeResponseReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiResponseReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } 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.verified.txt new file mode 100644 index 000000000..073ce3d7b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,5 @@ +{ + "type": "apiKey", + "name": "X-API-Key", + "in": "header" +} \ 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.verified.txt new file mode 100644 index 000000000..6d0080a96 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"type":"apiKey","name":"X-API-Key","in":"header"} \ 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.verified.txt new file mode 100644 index 000000000..073ce3d7b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,5 @@ +{ + "type": "apiKey", + "name": "X-API-Key", + "in": "header" +} \ 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.verified.txt new file mode 100644 index 000000000..6d0080a96 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"type":"apiKey","name":"X-API-Key","in":"header"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index 62ca134ad..b67f8dc16 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -1,9 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -50,5 +54,40 @@ public void ReferenceResolutionWorks() Assert.Equal("X-API-Key", _openApiSecuritySchemeReference.Name); Assert.Equal(SecuritySchemeType.ApiKey, _openApiSecuritySchemeReference.Type); } + + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiSecuritySchemeReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeSecuritySchemeReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiSecuritySchemeReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index d15bf3643..2a49d9164 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -1,9 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System.Globalization; +using System.IO; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; +using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -73,5 +77,39 @@ public void ReferenceResolutionWorks() Assert.Equal("user", _openApiTagReference.Name); Assert.Equal("Users operations", _openApiTagReference.Description); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiTagReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeSecuritySchemeReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _openApiTagReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } } } From f36d28475318def3339bbf9f146572d5dc091124 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 7 Jul 2023 14:05:01 +0300 Subject: [PATCH 15/24] Add externalResource parameter to constructors This is to help capture externally referenced resources --- .../References/OpenApiCallbackReference.cs | 14 ++++++++++---- .../References/OpenApiExampleReference.cs | 17 ++++++++++++----- .../Models/References/OpenApiHeaderReference.cs | 13 ++++++++++--- .../Models/References/OpenApiLinkReference.cs | 13 ++++++++++--- .../References/OpenApiParameterReference.cs | 13 ++++++++++--- .../References/OpenApiPathItemReference.cs | 16 ++++++++++++---- .../References/OpenApiRequestBodyReference.cs | 13 ++++++++++--- .../References/OpenApiResponseReference.cs | 13 ++++++++++--- 8 files changed, 84 insertions(+), 28 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index fd41ef63f..3d4cee9ce 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -25,14 +25,19 @@ private OpenApiCallback Target _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); return _target; } - } + } /// /// Constructor initializing the reference object. /// /// The reference Id. /// The host OpenAPI document. - public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -47,8 +52,9 @@ public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.Callback - }; + Type = ReferenceType.Callback, + ExternalResource = externalResource + }; } /// diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 46cf31a43..18f69c219 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -17,6 +17,8 @@ internal class OpenApiExampleReference : OpenApiExample { private OpenApiExample _target; private readonly OpenApiReference _reference; + private string _summary; + private string _description; private OpenApiExample Target { @@ -32,7 +34,12 @@ private OpenApiExample Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -47,15 +54,16 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.Example + Type = ReferenceType.Example, + ExternalResource = externalResource }; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// - public override string Summary { get => Target.Summary; set => Target.Summary = value; } + public override string Summary { get => _summary ?? Target.Summary; set => _summary = value; } /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } @@ -65,7 +73,6 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument) /// public override IOpenApiAny Value { get => Target.Value; set => Target.Value = value; } - /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 1795da959..9e3a6e4d8 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -14,6 +14,7 @@ internal class OpenApiHeaderReference : OpenApiHeader { private OpenApiHeader _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiHeader Target { @@ -29,7 +30,12 @@ private OpenApiHeader Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -44,12 +50,13 @@ public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument) { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.Header + Type = ReferenceType.Header, + ExternalResource = externalResource }; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override bool Required { get => Target.Required; set => Target.Required = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 64484300f..47a767b59 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -16,6 +16,7 @@ internal class OpenApiLinkReference : OpenApiLink { private OpenApiLink _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiLink Target { @@ -31,7 +32,12 @@ private OpenApiLink Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -46,7 +52,8 @@ public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.Link + Type = ReferenceType.Link, + ExternalResource = externalResource }; } @@ -60,7 +67,7 @@ public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument) public override OpenApiServer Server { get => Target.Server; set => Target.Server = value; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override Dictionary Parameters { get => Target.Parameters; set => Target.Parameters = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 8558ef654..bfba44d32 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -17,6 +17,7 @@ internal class OpenApiParameterReference : OpenApiParameter { private OpenApiParameter _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiParameter Target { @@ -32,7 +33,12 @@ private OpenApiParameter Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -47,7 +53,8 @@ public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocumen { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.Parameter + Type = ReferenceType.Parameter, + ExternalResource = externalResource }; } @@ -55,7 +62,7 @@ public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocumen public override string Name { get => Target.Name; set => Target.Name = value; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override bool Required { get => Target.Required; set => Target.Required = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index 2569862e8..574f461ea 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -16,6 +16,8 @@ internal class OpenApiPathItemReference : OpenApiPathItem { private OpenApiPathItem _target; private readonly OpenApiReference _reference; + private string _description; + private string _summary; private OpenApiPathItem Target { @@ -31,7 +33,12 @@ private OpenApiPathItem Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -46,15 +53,16 @@ public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.PathItem + Type = ReferenceType.PathItem, + ExternalResource = externalResource }; } /// - public override string Summary { get => Target.Summary; set => Target.Summary = value; } + public override string Summary { get => _summary ?? Target.Summary; set => _summary = value; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override IDictionary Operations { get => Target.Operations; set => Target.Operations = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 834b33c69..314a3f499 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -16,6 +16,7 @@ internal class OpenApiRequestBodyReference : OpenApiRequestBody { private OpenApiRequestBody _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiRequestBody Target { @@ -31,7 +32,12 @@ private OpenApiRequestBody Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -46,12 +52,13 @@ public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocum { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.RequestBody + Type = ReferenceType.RequestBody, + ExternalResource = externalResource }; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index b87b9dd7f..d1f7041a3 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -16,6 +16,7 @@ internal class OpenApiResponseReference : OpenApiResponse { private OpenApiResponse _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiResponse Target { @@ -31,7 +32,12 @@ private OpenApiResponse Target /// /// The reference Id. /// The host OpenAPI document. - public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument) + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) { if (string.IsNullOrEmpty(referenceId)) { @@ -46,12 +52,13 @@ public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument { Id = referenceId, HostDocument = hostDocument, - Type = ReferenceType.Response + Type = ReferenceType.Response, + ExternalResource = externalResource }; } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } From ef22699218667c9487762e6d4262611865198989 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 7 Jul 2023 14:48:10 +0300 Subject: [PATCH 16/24] Add tests for external reference resolution --- .../OpenApiCallbackReferenceTests.cs | 74 +++++++++++++++---- ...orks_produceTerseOutput=False.verified.txt | 3 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 3 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 10 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 10 +++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiExampleReferenceTests.cs | 70 +++++++++++++++--- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...sync_produceTerseOutput=False.verified.txt | 4 + ...Async_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 6 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 6 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...sync_produceTerseOutput=False.verified.txt | 2 +- ...Async_produceTerseOutput=True.verified.txt | 2 +- .../References/OpenApiHeaderReferenceTests.cs | 58 +++++++++++---- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 7 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 7 ++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../References/OpenApiLinkReferenceTests.cs | 74 +++++++++++++++---- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- .../OpenApiParameterReferenceTests.cs | 51 ++++++++++--- ...orks_produceTerseOutput=False.verified.txt | 1 + ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 1 + ...Works_produceTerseOutput=True.verified.txt | 2 +- ...sync_produceTerseOutput=False.verified.txt | 3 +- ...Async_produceTerseOutput=True.verified.txt | 2 +- ...sync_produceTerseOutput=False.verified.txt | 28 +++++++ ...Async_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 28 +++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 28 +++++++ ...Works_produceTerseOutput=True.verified.txt | 1 + .../OpenApiPathItemReferenceTests.cs | 64 ++++++++++++---- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 2 +- ...Works_produceTerseOutput=True.verified.txt | 2 +- .../OpenApiRequestBodyReferenceTests.cs | 47 ++++++++++-- .../OpenApiResponseReferenceTest.cs | 44 +++++++++-- .../OpenApiSecuritySchemeReferenceTests.cs | 3 +- ...orks_produceTerseOutput=False.verified.txt | 1 + ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 2 +- ...orks_produceTerseOutput=False.verified.txt | 1 + ...Works_produceTerseOutput=True.verified.txt | 1 + ...orks_produceTerseOutput=False.verified.txt | 1 + ...Works_produceTerseOutput=True.verified.txt | 1 + .../References/OpenApiTagReferenceTest.cs | 6 +- 65 files changed, 576 insertions(+), 124 deletions(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt create mode 100644 test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs index 3773773b2..c2fd2b9db 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -17,8 +17,8 @@ namespace Microsoft.OpenApi.Tests.Models.References [Collection("DefaultSettings")] [UsesVerify] public class OpenApiCallbackReferenceTests - { - const string openapi = @" + { + private const string OpenApi = @" openapi: 3.0.0 info: title: Callback with ref Example @@ -78,22 +78,71 @@ public class OpenApiCallbackReferenceTests responses: '200': description: ok"; - - readonly OpenApiCallbackReference _callbackReference; - + + private const string OpenApi_2 = @" +openapi: 3.0.0 +info: + title: Callback with ref Example + version: 1.0.0 +paths: + /register: + post: + summary: Subscribe to a webhook + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + callbackUrl: # Callback URL + type: string + format: uri + example: https://myserver.com/send/callback/here + required: + - callbackUrl + responses: + '200': + description: subscription successfully created + content: + application/json: + schema: + type: object + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: unique identifier + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + myEvent: + $ref: '#/components/callbacks/callbackEvent' +"; + + private readonly OpenApiCallbackReference _localCallbackReference; + private readonly OpenApiCallbackReference _externalCallbackReference; + public OpenApiCallbackReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(openapi, out _); - _callbackReference = new("callbackEvent", openApiDoc); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + OpenApiDocument openApiDoc_2 = reader.Read(OpenApi_2, out _); + openApiDoc_2.Workspace = new(); + openApiDoc_2.Workspace.AddDocument("http://localhost/callbackreference", openApiDoc); + _localCallbackReference = new("callbackEvent", openApiDoc); + _externalCallbackReference = new("callbackEvent", openApiDoc_2, "http://localhost/callbackreference"); } [Fact] - public void ReferenceResolutionWorks() + public void CallbackReferenceResolutionWorks() { // Assert - Assert.NotEmpty(_callbackReference.PathItems); - Assert.Equal("{$request.body#/callbackUrl}", _callbackReference.PathItems.First().Key.Expression); + Assert.NotEmpty(_localCallbackReference.PathItems); + Assert.NotEmpty(_externalCallbackReference.PathItems); + Assert.Equal("{$request.body#/callbackUrl}", _localCallbackReference.PathItems.First().Key.Expression); + Assert.Equal("{$request.body#/callbackUrl}", _externalCallbackReference.PathItems.First().Key.Expression); } [Theory] @@ -106,7 +155,7 @@ public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutpu var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _callbackReference.SerializeAsV3(writer); + _localCallbackReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -123,12 +172,11 @@ public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutp var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _callbackReference.SerializeAsV31(writer); + _localCallbackReference.SerializeAsV31(writer); writer.Flush(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } - } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index e6554f0a7..f71202885 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -1,5 +1,6 @@ { - "summary": "Example of an admin user", + "summary": "Example of a user", + "description": "This is is an example of a user", "value": [ { "id": "1", diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index 889158dcf..cddf257f8 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"summary":"Example of an admin user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file +{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index e6554f0a7..f71202885 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1,5 +1,6 @@ { - "summary": "Example of an admin user", + "summary": "Example of a user", + "description": "This is is an example of a user", "value": [ { "id": "1", diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index 889158dcf..cddf257f8 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"summary":"Example of an admin user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file +{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..f71202885 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "summary": "Example of a user", + "description": "This is is an example of a user", + "value": [ + { + "id": "1", + "name": "John Doe" + } + ] +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..cddf257f8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..f71202885 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "summary": "Example of a user", + "description": "This is is an example of a user", + "value": [ + { + "id": "1", + "name": "John Doe" + } + ] +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..cddf257f8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index a8085c8ef..5ef061cbb 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.IO; +using System.Linq; using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -49,42 +50,89 @@ public class OpenApiExampleReferenceTests examples: UserExample: summary: Example of a user + description: This is is an example of a user value: - id: 1 name: John Doe "; - readonly OpenApiExampleReference _openApiExampleReference; + private const string OpenApi_2 = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + get: + summary: Get users + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + examples: + - $ref: '#/components/examples/UserExample' +"; + + private readonly OpenApiExampleReference _localExampleReference; + private readonly OpenApiExampleReference _externalExampleReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiExampleReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiExampleReference = new OpenApiExampleReference("UserExample", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/examplereference", _openApiDoc); + + _localExampleReference = new OpenApiExampleReference("UserExample", _openApiDoc) + { + Summary = "Example of a local user", + Description = "This is an example of a local user" + }; + + _externalExampleReference = new OpenApiExampleReference("UserExample", _openApiDoc_2, "http://localhost/examplereference") { - Summary = "Example of an admin user" + Summary = "Example of an external user", + Description = "This is an example of an external user" }; } [Fact] - public void ReferenceResolutionWorks() + public void ExampleReferenceResolutionWorks() { // Assert - Assert.Equal("Example of an admin user", _openApiExampleReference.Summary); - Assert.NotNull(_openApiExampleReference.Value); + Assert.Equal("Example of a local user", _localExampleReference.Summary); + Assert.Equal("This is an example of a local user", _localExampleReference.Description); + Assert.NotNull(_localExampleReference.Value); + + Assert.Equal("Example of an external user", _externalExampleReference.Summary); + Assert.Equal("This is an example of an external user", _externalExampleReference.Description); + Assert.NotNull(_externalExampleReference.Value); + + // The main description and summary values shouldn't change + Assert.Equal("Example of a user", _openApiDoc.Components.Examples.First().Value.Summary); + Assert.Equal("This is is an example of a user", + _openApiDoc.Components.Examples.First().Value.Description); } [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + public async Task SerializeExampleReferenceAsV3JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiExampleReference.SerializeAsV3(writer); + _localExampleReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -94,14 +142,14 @@ public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutpu [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + public async Task SerializeExampleReferenceAsV31JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiExampleReference.SerializeAsV31(writer); + _localExampleReference.SerializeAsV31(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index 0da7cc21f..f43e25a40 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -1,5 +1,5 @@ { - "description": "Location of the created post", + "description": "The URL of the newly created post", "schema": { "type": "string" } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index 902a0a19e..1b29be17d 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"Location of the created post","schema":{"type":"string"}} \ No newline at end of file +{"description":"The URL of the newly created post","schema":{"type":"string"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index 0da7cc21f..f43e25a40 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1,5 +1,5 @@ { - "description": "Location of the created post", + "description": "The URL of the newly created post", "schema": { "type": "string" } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index 902a0a19e..1b29be17d 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"Location of the created post","schema":{"type":"string"}} \ No newline at end of file +{"description":"The URL of the newly created post","schema":{"type":"string"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..8b29b212e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,4 @@ +{ + "description": "Location of the locally created post", + "type": "string" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..243908873 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"Location of the locally created post","type":"string"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..f43e25a40 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,6 @@ +{ + "description": "The URL of the newly created post", + "schema": { + "type": "string" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..1b29be17d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"The URL of the newly created post","schema":{"type":"string"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..f43e25a40 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,6 @@ +{ + "description": "The URL of the newly created post", + "schema": { + "type": "string" + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..1b29be17d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeHeaderReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"description":"The URL of the newly created post","schema":{"type":"string"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt index 4fd919114..8b29b212e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -1,4 +1,4 @@ { - "description": "Location of the created post", + "description": "Location of the locally created post", "type": "string" } \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt index 41cc62b41..243908873 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"Location of the created post","type":"string"} \ No newline at end of file +{"description":"Location of the locally created post","type":"string"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index 2d0893d15..3ab1895d1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -3,12 +3,12 @@ using System.Globalization; using System.IO; +using System.Linq; using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Mono.Cecil; using VerifyXunit; using Xunit; @@ -41,36 +41,68 @@ public class OpenApiHeaderReferenceTests type: string "; - readonly OpenApiHeaderReference _openApiHeaderReference; + private const string OpenApi_2 = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + post: + summary: Create a post + responses: + '201': + description: Post created successfully + headers: + Location: + $ref: '#/components/headers/LocationHeader' +"; + + private readonly OpenApiHeaderReference _localHeaderReference; + private readonly OpenApiHeaderReference _externalHeaderReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiHeaderReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiHeaderReference = new OpenApiHeaderReference("LocationHeader", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/headerreference", _openApiDoc); + + _localHeaderReference = new OpenApiHeaderReference("LocationHeader", _openApiDoc) + { + Description = "Location of the locally created post" + }; + + _externalHeaderReference = new OpenApiHeaderReference("LocationHeader", _openApiDoc_2, "http://localhost/headerreference") { - Description = "Location of the created post" + Description = "Location of the external created post" }; } [Fact] - public void ReferenceResolutionWorks() + public void HeaderReferenceResolutionWorks() { // Assert - Assert.Equal("Location of the created post", _openApiHeaderReference.Description); + Assert.Equal("Location of the locally created post", _localHeaderReference.Description); + Assert.Equal("Location of the external created post", _externalHeaderReference.Description); + Assert.Equal("The URL of the newly created post", + _openApiDoc.Components.Headers.First().Value.Description); // The main description value shouldn't change } [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + public async Task SerializeHeaderReferenceAsV3JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiHeaderReference.SerializeAsV3(writer); + _localHeaderReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -80,14 +112,14 @@ public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutpu [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + public async Task SerializeHeaderReferenceAsV31JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiHeaderReference.SerializeAsV31(writer); + _localHeaderReference.SerializeAsV31(writer); writer.Flush(); // Assert @@ -97,14 +129,14 @@ public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutp [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + public async Task SerializeHeaderReferenceAsV2JsonWorksAsync(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiHeaderReference.SerializeAsV2(writer); + _localHeaderReference.SerializeAsV2(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index 89319843f..6fe727ea0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -3,5 +3,5 @@ "parameters": { "userId": "$response.body#/id" }, - "description": "Use the id returned as the userId in `GET /users/{userId}`" + "description": "The id value returned in the response can be used as the userId parameter in GET /users/{userId}" } \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index 93208a391..e3df412e9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"Use the id returned as the userId in `GET /users/{userId}`"} \ No newline at end of file +{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"The id value returned in the response can be used as the userId parameter in GET /users/{userId}"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index 89319843f..6fe727ea0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -3,5 +3,5 @@ "parameters": { "userId": "$response.body#/id" }, - "description": "Use the id returned as the userId in `GET /users/{userId}`" + "description": "The id value returned in the response can be used as the userId parameter in GET /users/{userId}" } \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index 93208a391..e3df412e9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"Use the id returned as the userId in `GET /users/{userId}`"} \ No newline at end of file +{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"The id value returned in the response can be used as the userId parameter in GET /users/{userId}"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..6fe727ea0 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,7 @@ +{ + "operationId": "getUser", + "parameters": { + "userId": "$response.body#/id" + }, + "description": "The id value returned in the response can be used as the userId parameter in GET /users/{userId}" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..e3df412e9 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"The id value returned in the response can be used as the userId parameter in GET /users/{userId}"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..6fe727ea0 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,7 @@ +{ + "operationId": "getUser", + "parameters": { + "userId": "$response.body#/id" + }, + "description": "The id value returned in the response can be used as the userId parameter in GET /users/{userId}" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..e3df412e9 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.SerializeLinkReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"operationId":"getUser","parameters":{"userId":"$response.body#/id"},"description":"The id value returned in the response can be used as the userId parameter in GET /users/{userId}"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index 5c25323c9..ccd4d3de6 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -56,43 +56,89 @@ public class OpenApiLinkReferenceTests operationId: getUser parameters: userId: '$response.body#/id' - description: > - The `id` value returned in the response can be used as - the `userId` parameter in `GET /users/{userId}`. + description: The id value returned in the response can be used as the userId parameter in GET /users/{userId}"; + + private const string OpenApi_2 = @" +openapi: 3.0.0 +info: + version: 0.0.0 + title: Links example +paths: + /users: + post: + summary: Creates a user and returns the user ID + operationId: createUser + requestBody: + required: true + description: A JSON object that contains the user name and age. + content: + application/json: + schema: + $ref: '#/components/schemas/User' + responses: + '201': + description: Created + content: + application/json: + schema: + type: object + properties: + id: + type: integer + format: int64 + description: ID of the created user. + links: + GetUserByUserId: + $ref: '#/components/links/GetUserByUserId' # <---- referencing the link here "; - OpenApiLinkReference _openApiLinkReference; + private readonly OpenApiLinkReference _localLinkReference; + private readonly OpenApiLinkReference _externalLinkReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiLinkReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiLinkReference = new("GetUserByUserId", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/linkreferencesample", _openApiDoc); + + _localLinkReference = new("GetUserByUserId", _openApiDoc) { Description = "Use the id returned as the userId in `GET /users/{userId}`" }; + + _externalLinkReference = new("GetUserByUserId", _openApiDoc_2, "http://localhost/linkreferencesample") + { + Description = "Externally referenced: Use the id returned as the userId in `GET /users/{userId}`" + }; } [Fact] - public void ReferenceResolutionWorks() + public void LinkReferenceResolutionWorks() { // Assert - Assert.Equal("Use the id returned as the userId in `GET /users/{userId}`", _openApiLinkReference.Description); - Assert.Equal("getUser", _openApiLinkReference.OperationId); - Assert.Equal("userId", _openApiLinkReference.Parameters.First().Key); + Assert.Equal("Use the id returned as the userId in `GET /users/{userId}`", _localLinkReference.Description); + Assert.Equal("getUser", _localLinkReference.OperationId); + Assert.Equal("userId", _localLinkReference.Parameters.First().Key); + Assert.Equal("Externally referenced: Use the id returned as the userId in `GET /users/{userId}`", _externalLinkReference.Description); + Assert.Equal("The id value returned in the response can be used as the userId parameter in GET /users/{userId}", + _openApiDoc.Components.Links.First().Value.Description); // The main description value shouldn't change } [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + public async Task SerializeLinkReferenceAsV3JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiLinkReference.SerializeAsV3(writer); + _localLinkReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -102,14 +148,14 @@ public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutpu [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + public async Task SerializeLinkReferenceAsV31JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiLinkReference.SerializeAsV31(writer); + _localLinkReference.SerializeAsV31(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index cd30a5fc2..f0066344e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -1,7 +1,7 @@ { "name": "limit", "in": "query", - "description": "Results to return", + "description": "Number of results to return", "schema": { "maximum": 100, "minimum": 1, diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index da4f04c14..2b7ff1cfb 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"name":"limit","in":"query","description":"Results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file +{"name":"limit","in":"query","description":"Number of results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index cd30a5fc2..f0066344e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1,7 +1,7 @@ { "name": "limit", "in": "query", - "description": "Results to return", + "description": "Number of results to return", "schema": { "maximum": 100, "minimum": 1, diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index da4f04c14..2b7ff1cfb 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"name":"limit","in":"query","description":"Results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file +{"name":"limit","in":"query","description":"Number of results to return","schema":{"maximum":100,"minimum":1,"type":"integer"}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs index 11d1933c2..593c76761 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.IO; +using System.Linq; using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -42,25 +43,55 @@ public class OpenApiParameterReferenceTests minimum: 1 maximum: 100 "; - readonly OpenApiParameterReference _parameterReference; + + private const string OpenApi_2 = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + get: + summary: Get users + parameters: + - $ref: '#/components/parameters/limitParam' + responses: + 200: + description: Successful operation +"; + private readonly OpenApiParameterReference _localParameterReference; + private readonly OpenApiParameterReference _externalParameterReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiParameterReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _parameterReference = new("limitParam", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/parameterreference", _openApiDoc); + + _localParameterReference = new("limitParam", _openApiDoc) { Description = "Results to return" }; + + _externalParameterReference = new OpenApiParameterReference("limitParam", _openApiDoc_2, "http://localhost/parameterreference") + { + Description = "Externally referenced: Results to return" + }; } [Fact] - public void ReferenceResolutionWorks() + public void ParameterReferenceResolutionWorks() { // Assert - Assert.Equal("limit", _parameterReference.Name); - Assert.Equal("Results to return", _parameterReference.Description); - _parameterReference.Description = "Number of limit results"; + Assert.Equal("limit", _localParameterReference.Name); + Assert.Equal("Results to return", _localParameterReference.Description); + Assert.Equal("Externally referenced: Results to return", _externalParameterReference.Description); + Assert.Equal("Number of results to return", + _openApiDoc.Components.Parameters.First().Value.Description); // The main description value shouldn't change } [Theory] @@ -73,7 +104,7 @@ public async Task SerializeParameterReferenceAsV3JsonWorks(bool produceTerseOutp var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _parameterReference.SerializeAsV3(writer); + _localParameterReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -90,7 +121,7 @@ public async Task SerializeParameterReferenceAsV31JsonWorks(bool produceTerseOut var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _parameterReference.SerializeAsV31(writer); + _localParameterReference.SerializeAsV31(writer); writer.Flush(); // Assert @@ -107,7 +138,7 @@ public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTers var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _parameterReference.SerializeAsV2(writer); + _localParameterReference.SerializeAsV2(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index 180e27200..844f5ee81 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -1,4 +1,5 @@ { + "summary": "User path item summary", "description": "User path item description", "get": { "summary": "Get users", diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index bc957796c..f43044ef8 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file +{"summary":"User path item summary","description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index 180e27200..844f5ee81 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1,4 +1,5 @@ { + "summary": "User path item summary", "description": "User path item description", "get": { "summary": "Get users", diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index bc957796c..f43044ef8 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file +{"summary":"User path item summary","description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt index 534e3764d..86685c051 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -23,5 +23,6 @@ } } }, - "x-description": "User path item description" + "x-summary": "Local reference: User path item summary", + "x-description": "Local reference: User path item description" } \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt index 96dd2d21b..efa477cae 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}},"x-description":"User path item description"} \ No newline at end of file +{"get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}},"x-summary":"Local reference: User path item summary","x-description":"Local reference: User path item description"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..86685c051 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt @@ -0,0 +1,28 @@ +{ + "get": { + "summary": "Get users", + "responses": { + "200": { + "description": "Successful operation" + } + } + }, + "post": { + "summary": "Create a user", + "responses": { + "201": { + "description": "User created successfully" + } + } + }, + "delete": { + "summary": "Delete a user", + "responses": { + "204": { + "description": "User deleted successfully" + } + } + }, + "x-summary": "Local reference: User path item summary", + "x-description": "Local reference: User path item description" +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..efa477cae --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}},"x-summary":"Local reference: User path item summary","x-description":"Local reference: User path item description"} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..844f5ee81 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,28 @@ +{ + "summary": "User path item summary", + "description": "User path item description", + "get": { + "summary": "Get users", + "responses": { + "200": { + "description": "Successful operation" + } + } + }, + "post": { + "summary": "Create a user", + "responses": { + "201": { + "description": "User created successfully" + } + } + }, + "delete": { + "summary": "Delete a user", + "responses": { + "204": { + "description": "User deleted successfully" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..f43044ef8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"summary":"User path item summary","description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..844f5ee81 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,28 @@ +{ + "summary": "User path item summary", + "description": "User path item description", + "get": { + "summary": "Get users", + "responses": { + "200": { + "description": "Successful operation" + } + } + }, + "post": { + "summary": "Create a user", + "responses": { + "201": { + "description": "User created successfully" + } + } + }, + "delete": { + "summary": "Delete a user", + "responses": { + "204": { + "description": "User deleted successfully" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..f43044ef8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializePathItemReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"summary":"User path item summary","description":"User path item description","get":{"summary":"Get users","responses":{"200":{"description":"Successful operation"}}},"post":{"summary":"Create a user","responses":{"201":{"description":"User created successfully"}}},"delete":{"summary":"Delete a user","responses":{"204":{"description":"User deleted successfully"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index 8e8e70a11..86a82aacc 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -9,7 +9,6 @@ using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Mono.Cecil; using VerifyXunit; using Xunit; @@ -31,6 +30,8 @@ public class OpenApiPathItemReferenceTests components: pathItems: userPathItem: + description: User path item description + summary: User path item summary get: summary: Get users responses: @@ -48,38 +49,71 @@ public class OpenApiPathItemReferenceTests description: User deleted successfully "; - readonly OpenApiPathItemReference _openApiPathItemReference; + private const string OpenApi_2 = @" +openapi: 3.0.0 +info: + title: Sample API + version: 1.0.0 +paths: + /users: + $ref: '#/components/pathItems/userPathItem' +"; + + private readonly OpenApiPathItemReference _localPathItemReference; + private readonly OpenApiPathItemReference _externalPathItemReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiPathItemReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiPathItemReference = new OpenApiPathItemReference("userPathItem", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/pathitemreference", _openApiDoc); + + _localPathItemReference = new OpenApiPathItemReference("userPathItem", _openApiDoc) { - Description = "User path item description" + Description = "Local reference: User path item description", + Summary = "Local reference: User path item summary" + }; + + _externalPathItemReference = new OpenApiPathItemReference("userPathItem", _openApiDoc_2, "http://localhost/pathitemreference") + { + Description = "External reference: User path item description", + Summary = "External reference: User path item summary" }; } [Fact] - public void ReferenceResolutionWorks() + public void PathItemReferenceResolutionWorks() { // Assert - Assert.Equal(3, _openApiPathItemReference.Operations.Count); - Assert.Equal("User path item description", _openApiPathItemReference.Description); - Assert.Equal(new OperationType[] { OperationType.Get, OperationType.Post, OperationType.Delete }, _openApiPathItemReference.Operations.Select(o => o.Key)); + Assert.Equal(3, _localPathItemReference.Operations.Count); + Assert.Equal("Local reference: User path item description", _localPathItemReference.Description); + Assert.Equal("Local reference: User path item summary", _localPathItemReference.Summary); + Assert.Equal(new OperationType[] { OperationType.Get, OperationType.Post, OperationType.Delete }, + _localPathItemReference.Operations.Select(o => o.Key)); + + Assert.Equal("External reference: User path item description", _externalPathItemReference.Description); + Assert.Equal("External reference: User path item summary", _externalPathItemReference.Summary); + + // The main description and summary values shouldn't change + Assert.Equal("User path item description", _openApiDoc.Components.PathItems.First().Value.Description); + Assert.Equal("User path item summary", _openApiDoc.Components.PathItems.First().Value.Summary); } [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutput) + public async Task SerializePathItemReferenceAsV3JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiPathItemReference.SerializeAsV3(writer); + _localPathItemReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -89,14 +123,14 @@ public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutpu [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutput) + public async Task SerializePathItemReferenceAsV31JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiPathItemReference.SerializeAsV31(writer); + _localPathItemReference.SerializeAsV31(writer); writer.Flush(); // Assert @@ -106,14 +140,14 @@ public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutp [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + public async Task SerializePathItemReferenceAsV2JsonWorksAsync(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiPathItemReference.SerializeAsV2(writer); + _localPathItemReference.SerializeAsV2(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index 9b60ac178..cdbbe00d1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -1,5 +1,5 @@ { - "description": "User request body", + "description": "User creation request body", "content": { "application/json": { "schema": { diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index 5b1d7bead..e82312f67 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"User request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSchema"}}}} \ No newline at end of file +{"description":"User creation request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSchema"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index 9b60ac178..cdbbe00d1 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1,5 +1,5 @@ { - "description": "User request body", + "description": "User creation request body", "content": { "application/json": { "schema": { diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index 5b1d7bead..e82312f67 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"description":"User request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSchema"}}}} \ No newline at end of file +{"description":"User creation request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSchema"}}}} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index 212f599bb..f96345842 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -53,24 +53,55 @@ public class OpenApiRequestBodyReferenceTests type: string "; - OpenApiRequestBodyReference _openApiRequestBodyReference; + private const string OpenApi_2 = @" +openapi: 3.0.3 +info: + title: Sample API + version: 1.0.0 + +paths: + /users: + post: + summary: Create a user + requestBody: + $ref: '#/components/requestBodies/UserRequest' # <---- referencing the requestBody here + responses: + '201': + description: User created +"; + + private readonly OpenApiRequestBodyReference _localRequestBodyReference; + private readonly OpenApiRequestBodyReference _externalRequestBodyReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiRequestBodyReferenceTests() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiRequestBodyReference = new("UserRequest", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/requestbodyreference", _openApiDoc); + + _localRequestBodyReference = new("UserRequest", _openApiDoc) { Description = "User request body" }; + + _externalRequestBodyReference = new("UserRequest", _openApiDoc_2, "http://localhost/requestbodyreference") + { + Description = "External Reference: User request body" + }; } [Fact] - public void ReferenceResolutionWorks() + public void RequestBodyReferenceResolutionWorks() { // Assert - Assert.Equal("User request body", _openApiRequestBodyReference.Description); - Assert.Equal("application/json", _openApiRequestBodyReference.Content.First().Key); + Assert.Equal("User request body", _localRequestBodyReference.Description); + Assert.Equal("application/json", _localRequestBodyReference.Content.First().Key); + Assert.Equal("External Reference: User request body", _externalRequestBodyReference.Description); + Assert.Equal("User creation request body", _openApiDoc.Components.RequestBodies.First().Value.Description); } [Theory] @@ -83,7 +114,7 @@ public async Task SerializeRequestBodyReferenceAsV3JsonWorks(bool produceTerseOu var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiRequestBodyReference.SerializeAsV3(writer); + _localRequestBodyReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -100,7 +131,7 @@ public async Task SerializeRequestBodyReferenceAsV31JsonWorks(bool produceTerseO var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiRequestBodyReference.SerializeAsV31(writer); + _localRequestBodyReference.SerializeAsV31(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index fa9bf549e..f3a654a50 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -41,24 +41,52 @@ public class OpenApiResponseReferenceTest $ref: '#/components/schemas/Pong' "; - OpenApiResponseReference _openApiResponseReference; + private const string OpenApi_2 = @" +openapi: 3.0.3 +info: + title: Sample API + version: 1.0.0 + +paths: + /ping: + get: + responses: + '200': + $ref: '#/components/responses/OkResponse' +"; + + private readonly OpenApiResponseReference _localResponseReference; + private readonly OpenApiResponseReference _externalResponseReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; public OpenApiResponseReferenceTest() { var reader = new OpenApiStringReader(); - OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); - _openApiResponseReference = new("OkResponse", openApiDoc) + _openApiDoc = reader.Read(OpenApi, out _); + _openApiDoc_2 = reader.Read(OpenApi_2, out _); + _openApiDoc_2.Workspace = new(); + _openApiDoc_2.Workspace.AddDocument("http://localhost/responsereference", _openApiDoc); + + _localResponseReference = new("OkResponse", _openApiDoc) { Description = "OK response" }; + + _externalResponseReference = new("OkResponse", _openApiDoc_2, "http://localhost/responsereference") + { + Description = "External reference: OK response" + }; } [Fact] - public void ReferenceResolutionWorks() + public void ResponseReferenceResolutionWorks() { // Assert - Assert.Equal("OK response", _openApiResponseReference.Description); - Assert.Equal("text/plain", _openApiResponseReference.Content.First().Key); + Assert.Equal("OK response", _localResponseReference.Description); + Assert.Equal("text/plain", _localResponseReference.Content.First().Key); + Assert.Equal("External reference: OK response", _externalResponseReference.Description); + Assert.Equal("OK", _openApiDoc.Components.Responses.First().Value.Description); } [Theory] @@ -71,7 +99,7 @@ public async Task SerializeResponseReferenceAsV3JsonWorks(bool produceTerseOutpu var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiResponseReference.SerializeAsV3(writer); + _localResponseReference.SerializeAsV3(writer); writer.Flush(); // Assert @@ -88,7 +116,7 @@ public async Task SerializeResponseReferenceAsV31JsonWorks(bool produceTerseOutp var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); // Act - _openApiResponseReference.SerializeAsV31(writer); + _localResponseReference.SerializeAsV31(writer); writer.Flush(); // Assert diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index b67f8dc16..a0bf9ea38 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -48,14 +48,13 @@ public OpenApiSecuritySchemeReferenceTests() } [Fact] - public void ReferenceResolutionWorks() + public void SecuritySchemeResolutionWorks() { // Assert Assert.Equal("X-API-Key", _openApiSecuritySchemeReference.Name); Assert.Equal(SecuritySchemeType.ApiKey, _openApiSecuritySchemeReference.Type); } - [Theory] [InlineData(true)] [InlineData(false)] diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index 5f282702b..dd019c493 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1 +1 @@ - \ No newline at end of file +"user" \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index 2a49d9164..bff7b6b8c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -71,7 +71,7 @@ public OpenApiTagReferenceTest() } [Fact] - public void ReferenceResolutionWorks() + public void TagReferenceResolutionWorks() { // Assert Assert.Equal("user", _openApiTagReference.Name); @@ -81,7 +81,7 @@ public void ReferenceResolutionWorks() [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTerseOutput) + public async Task SerializeTagReferenceAsV3JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -98,7 +98,7 @@ public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTers [Theory] [InlineData(true)] [InlineData(false)] - public async Task SerializeSecuritySchemeReferenceAsV31JsonWorks(bool produceTerseOutput) + public async Task SerializeTagReferenceAsV31JsonWorks(bool produceTerseOutput) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); From 9397f17ecf7640486cfe1ed7dec3aa903cdc5ba7 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 10 Jul 2023 10:49:02 +0300 Subject: [PATCH 17/24] Add description field --- src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 0e44ccd22..6911b75b2 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -16,6 +16,7 @@ internal class OpenApiTagReference : OpenApiTag { private OpenApiTag _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiTag Target { @@ -51,7 +52,7 @@ public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description { get => _description ?? Target.Description; set => _description = value; } /// public override OpenApiExternalDocs ExternalDocs { get => Target.ExternalDocs; set => Target.ExternalDocs = value; } From e5abd8527c388fc4a89f25909238da9cf5fcab19 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 10 Jul 2023 14:20:15 +0300 Subject: [PATCH 18/24] Update teg reference serializer and tests --- .../Models/References/OpenApiTagReference.cs | 8 ++++---- ...ceAsV31JsonWorks_produceTerseOutput=False.verified.txt | 2 +- ...nceAsV31JsonWorks_produceTerseOutput=True.verified.txt | 2 +- ...nceAsV3JsonWorks_produceTerseOutput=False.verified.txt | 2 +- ...enceAsV3JsonWorks_produceTerseOutput=True.verified.txt | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 6911b75b2..0fd2ba11b 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -66,13 +66,13 @@ public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) /// public override void SerializeAsV3(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer)); + SerializeInternal(writer); } /// public override void SerializeAsV31(IOpenApiWriter writer) { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); + SerializeInternal(writer); } /// @@ -90,10 +90,10 @@ public override void SerializeAsV31WithoutReference(IOpenApiWriter writer) } /// - private void SerializeInternal(IOpenApiWriter writer, Action callback) + private void SerializeInternal(IOpenApiWriter writer) { writer = writer ?? throw Error.ArgumentNull(nameof(writer)); - callback(writer, Target); + writer.WriteValue(Name); } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index 5f282702b..dd019c493 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -1 +1 @@ - \ No newline at end of file +"user" \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index 5f282702b..dd019c493 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ - \ No newline at end of file +"user" \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index 5f282702b..dd019c493 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -1 +1 @@ - \ No newline at end of file +"user" \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index 5f282702b..dd019c493 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ - \ No newline at end of file +"user" \ No newline at end of file From 571e5eb7674d3571c24abad369501af7496cd370 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 10 Jul 2023 14:20:50 +0300 Subject: [PATCH 19/24] Update PublicApi --- .../PublicApi/PublicApi.approved.txt | 263 +++++++++--------- 1 file changed, 138 insertions(+), 125 deletions(-) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index e30beff14..24126b19a 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -350,34 +350,34 @@ namespace Microsoft.OpenApi.Models { public OpenApiCallback() { } public OpenApiCallback(Microsoft.OpenApi.Models.OpenApiCallback callback) { } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public System.Collections.Generic.Dictionary PathItems { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public bool UnresolvedReference { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual System.Collections.Generic.Dictionary PathItems { get; set; } + public virtual bool UnresolvedReference { get; set; } public void AddPathItem(Microsoft.OpenApi.Expressions.RuntimeExpression expression, Microsoft.OpenApi.Models.OpenApiPathItem pathItem) { } public Microsoft.OpenApi.Models.OpenApiCallback GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiComponents : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiComponents() { } public OpenApiComponents(Microsoft.OpenApi.Models.OpenApiComponents components) { } - public System.Collections.Generic.IDictionary Callbacks { get; set; } - public System.Collections.Generic.IDictionary Examples { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public System.Collections.Generic.IDictionary Headers { get; set; } - public System.Collections.Generic.IDictionary Links { get; set; } - public System.Collections.Generic.IDictionary Parameters { get; set; } - public System.Collections.Generic.IDictionary PathItems { get; set; } - 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 virtual System.Collections.Generic.IDictionary Callbacks { get; set; } + public virtual System.Collections.Generic.IDictionary Examples { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual System.Collections.Generic.IDictionary Headers { get; set; } + public virtual System.Collections.Generic.IDictionary Links { get; set; } + public virtual System.Collections.Generic.IDictionary Parameters { get; set; } + public virtual System.Collections.Generic.IDictionary PathItems { get; set; } + public virtual System.Collections.Generic.IDictionary RequestBodies { get; set; } + public virtual System.Collections.Generic.IDictionary Responses { get; set; } + public virtual System.Collections.Generic.IDictionary Schemas { get; set; } + public virtual 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) { } @@ -586,20 +586,20 @@ namespace Microsoft.OpenApi.Models { public OpenApiExample() { } public OpenApiExample(Microsoft.OpenApi.Models.OpenApiExample example) { } - public string Description { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public string ExternalValue { get; set; } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public string Summary { get; set; } - public bool UnresolvedReference { get; set; } - public Microsoft.OpenApi.Any.IOpenApiAny Value { get; set; } + public virtual string Description { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual string ExternalValue { get; set; } + public virtual Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } + public virtual string Summary { get; set; } + public virtual bool UnresolvedReference { get; set; } + public virtual Microsoft.OpenApi.Any.IOpenApiAny Value { get; set; } public Microsoft.OpenApi.Models.OpenApiExample GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public abstract class OpenApiExtensibleDictionary : System.Collections.Generic.Dictionary, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable @@ -626,27 +626,27 @@ namespace Microsoft.OpenApi.Models { public OpenApiHeader() { } public OpenApiHeader(Microsoft.OpenApi.Models.OpenApiHeader header) { } - public bool AllowEmptyValue { get; set; } - public bool AllowReserved { get; set; } - public System.Collections.Generic.IDictionary Content { get; set; } - public bool Deprecated { get; set; } - public string Description { get; set; } - public Microsoft.OpenApi.Any.IOpenApiAny Example { get; set; } - public System.Collections.Generic.IDictionary Examples { get; set; } - public bool Explode { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public bool Required { get; set; } - public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; set; } - public Microsoft.OpenApi.Models.ParameterStyle? Style { get; set; } - public bool UnresolvedReference { get; set; } + public virtual bool AllowEmptyValue { get; set; } + public virtual bool AllowReserved { get; set; } + public virtual System.Collections.Generic.IDictionary Content { get; set; } + public virtual bool Deprecated { get; set; } + public virtual string Description { get; set; } + public virtual Microsoft.OpenApi.Any.IOpenApiAny Example { get; set; } + public virtual System.Collections.Generic.IDictionary Examples { get; set; } + public virtual bool Explode { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual bool Required { get; set; } + public virtual Microsoft.OpenApi.Models.OpenApiSchema Schema { get; set; } + public virtual Microsoft.OpenApi.Models.ParameterStyle? Style { get; set; } + public virtual bool UnresolvedReference { get; set; } public Microsoft.OpenApi.Models.OpenApiHeader GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiInfo : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -680,22 +680,22 @@ namespace Microsoft.OpenApi.Models { public OpenApiLink() { } public OpenApiLink(Microsoft.OpenApi.Models.OpenApiLink link) { } - public string Description { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public string OperationId { get; set; } - public string OperationRef { get; set; } - public System.Collections.Generic.Dictionary Parameters { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public Microsoft.OpenApi.Models.RuntimeExpressionAnyWrapper RequestBody { get; set; } - public Microsoft.OpenApi.Models.OpenApiServer Server { get; set; } - public bool UnresolvedReference { get; set; } + public virtual string Description { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual string OperationId { get; set; } + public virtual string OperationRef { get; set; } + public virtual System.Collections.Generic.Dictionary Parameters { get; set; } + public virtual Microsoft.OpenApi.Models.RuntimeExpressionAnyWrapper RequestBody { get; set; } + public virtual Microsoft.OpenApi.Models.OpenApiServer Server { get; set; } + public virtual bool UnresolvedReference { get; set; } public Microsoft.OpenApi.Models.OpenApiLink GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiMediaType : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -762,50 +762,50 @@ namespace Microsoft.OpenApi.Models { public OpenApiParameter() { } public OpenApiParameter(Microsoft.OpenApi.Models.OpenApiParameter parameter) { } - public bool AllowEmptyValue { get; set; } - public bool AllowReserved { get; set; } - public System.Collections.Generic.IDictionary Content { get; set; } - public bool Deprecated { get; set; } - public string Description { get; set; } - public Microsoft.OpenApi.Any.IOpenApiAny Example { get; set; } - public System.Collections.Generic.IDictionary Examples { get; set; } - public bool Explode { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } - public string Name { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public bool Required { get; set; } - public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; set; } - public Microsoft.OpenApi.Models.ParameterStyle? Style { get; set; } - public bool UnresolvedReference { get; set; } + public virtual bool AllowEmptyValue { get; set; } + public virtual bool AllowReserved { get; set; } + public virtual System.Collections.Generic.IDictionary Content { get; set; } + public virtual bool Deprecated { get; set; } + public virtual string Description { get; set; } + public virtual Microsoft.OpenApi.Any.IOpenApiAny Example { get; set; } + public virtual System.Collections.Generic.IDictionary Examples { get; set; } + public virtual bool Explode { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } + public virtual string Name { get; set; } + public virtual bool Required { get; set; } + public virtual Microsoft.OpenApi.Models.OpenApiSchema Schema { get; set; } + public virtual Microsoft.OpenApi.Models.ParameterStyle? Style { get; set; } + public virtual bool UnresolvedReference { get; set; } public Microsoft.OpenApi.Models.OpenApiParameter GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiPathItem : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiPathItem() { } public OpenApiPathItem(Microsoft.OpenApi.Models.OpenApiPathItem pathItem) { } - public string Description { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public System.Collections.Generic.IDictionary Operations { get; set; } - public System.Collections.Generic.IList Parameters { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public System.Collections.Generic.IList Servers { get; set; } - public string Summary { get; set; } public bool UnresolvedReference { get; set; } + public virtual string Description { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual System.Collections.Generic.IDictionary Operations { get; set; } + public virtual System.Collections.Generic.IList Parameters { get; set; } + public virtual System.Collections.Generic.IList Servers { get; set; } + public virtual string Summary { get; set; } public void AddOperation(Microsoft.OpenApi.Models.OperationType operationType, Microsoft.OpenApi.Models.OpenApiOperation operation) { } public Microsoft.OpenApi.Models.OpenApiPathItem GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiPaths : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary { @@ -835,38 +835,38 @@ namespace Microsoft.OpenApi.Models { public OpenApiRequestBody() { } public OpenApiRequestBody(Microsoft.OpenApi.Models.OpenApiRequestBody requestBody) { } - public System.Collections.Generic.IDictionary Content { get; set; } - public string Description { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public bool Required { get; set; } public bool UnresolvedReference { get; set; } + public virtual System.Collections.Generic.IDictionary Content { get; set; } + public virtual string Description { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual bool Required { get; set; } public Microsoft.OpenApi.Models.OpenApiRequestBody GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiResponse : Microsoft.OpenApi.Interfaces.IEffective, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiResponse() { } public OpenApiResponse(Microsoft.OpenApi.Models.OpenApiResponse response) { } - public System.Collections.Generic.IDictionary Content { get; set; } - public string Description { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public System.Collections.Generic.IDictionary Headers { get; set; } - public System.Collections.Generic.IDictionary Links { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public bool UnresolvedReference { get; set; } + public virtual System.Collections.Generic.IDictionary Content { get; set; } + public virtual string Description { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual System.Collections.Generic.IDictionary Headers { get; set; } + public virtual System.Collections.Generic.IDictionary Links { get; set; } public Microsoft.OpenApi.Models.OpenApiResponse GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiResponses : Microsoft.OpenApi.Models.OpenApiExtensibleDictionary { @@ -935,23 +935,23 @@ namespace Microsoft.OpenApi.Models { public OpenApiSecurityScheme() { } public OpenApiSecurityScheme(Microsoft.OpenApi.Models.OpenApiSecurityScheme 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 Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public string Scheme { get; set; } - public Microsoft.OpenApi.Models.SecuritySchemeType Type { 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 void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiServer : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -981,18 +981,18 @@ namespace Microsoft.OpenApi.Models { public OpenApiTag() { } public OpenApiTag(Microsoft.OpenApi.Models.OpenApiTag tag) { } - public string Description { get; set; } - public System.Collections.Generic.IDictionary Extensions { get; set; } - public Microsoft.OpenApi.Models.OpenApiExternalDocs ExternalDocs { get; set; } - public string Name { get; set; } public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public bool UnresolvedReference { get; set; } + public virtual string Description { get; set; } + public virtual System.Collections.Generic.IDictionary Extensions { get; set; } + public virtual Microsoft.OpenApi.Models.OpenApiExternalDocs ExternalDocs { get; set; } + public virtual string Name { get; set; } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public virtual void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiXml : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { @@ -1100,6 +1100,19 @@ namespace Microsoft.OpenApi.Models OpenIdConnect = 3, } } +namespace Microsoft.OpenApi.Models.References +{ + public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback + { + public OpenApiCallbackReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public override System.Collections.Generic.IDictionary Extensions { get; set; } + public override System.Collections.Generic.Dictionary PathItems { get; set; } + public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV3WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + } +} namespace Microsoft.OpenApi.Services { public class CurrentKeys From e04d37fa2a8798f04c28dfb82e7477d6d7994ffd Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Mon, 10 Jul 2023 15:22:05 +0300 Subject: [PATCH 20/24] Fix broken tests --- .../ParseNodes/AnyListFieldMapParameter.cs | 1 - src/Microsoft.OpenApi/Models/OpenApiExample.cs | 4 ++-- src/Microsoft.OpenApi/Models/OpenApiHeader.cs | 4 ++-- .../Models/References/OpenApiExampleReference.cs | 2 +- .../Models/References/OpenApiHeaderReference.cs | 2 +- .../Models/References/OpenApiParameterReference.cs | 2 +- ...enceAsV31JsonWorks_produceTerseOutput=False.verified.txt | 2 +- ...renceAsV31JsonWorks_produceTerseOutput=True.verified.txt | 2 +- ...renceAsV3JsonWorks_produceTerseOutput=False.verified.txt | 2 +- ...erenceAsV3JsonWorks_produceTerseOutput=True.verified.txt | 2 +- .../PublicApi/PublicApi.approved.txt | 6 +++--- 11 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs b/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs index 794ab3cdf..667ce16ee 100644 --- a/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs +++ b/src/Microsoft.OpenApi.Readers/ParseNodes/AnyListFieldMapParameter.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Text.Json.Nodes; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 6243ae8aa..06870b2ae 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -31,7 +31,7 @@ public class OpenApiExample : IOpenApiSerializable, IOpenApiReferenceable, IOpen /// exclusive. To represent examples of media types that cannot naturally represented /// in JSON or YAML, use a string value to contain the example, escaping where necessary. /// - public virtual IOpenApiAny Value { get; set; } + public virtual OpenApiAny Value { get; set; } /// /// A URL that points to the literal example. diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index 3a3e90513..bd4a9ee44 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -71,7 +71,7 @@ public class OpenApiHeader : IOpenApiSerializable, IOpenApiReferenceable, IOpenA /// /// Example of the media type. /// - public virtual IOpenApiAny Example { get; set; } + public virtual OpenApiAny Example { get; set; } /// /// Examples of the media type. diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 18f69c219..75de42551 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -72,7 +72,7 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, public override string ExternalValue { get => Target.ExternalValue; set => Target.ExternalValue = value; } /// - public override IOpenApiAny Value { get => Target.Value; set => Target.Value = value; } + public override OpenApiAny Value { get => Target.Value; set => Target.Value = value; } /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 9e3a6e4d8..4bfeccd63 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -80,7 +80,7 @@ public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument, public override bool AllowReserved { get => Target.AllowReserved; set => Target.AllowReserved = value; } /// - public override IOpenApiAny Example { get => Target.Example; set => Target.Example = value; } + public override OpenApiAny Example { get => Target.Example; set => Target.Example = value; } /// public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index bfba44d32..905f63aa4 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -83,7 +83,7 @@ public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocumen public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } /// - public override IOpenApiAny Example { get => Target.Example; set => Target.Example = value; } + public override OpenApiAny Example { get => Target.Example; set => Target.Example = value; } /// public override ParameterLocation? In { get => Target.In; set => Target.In = value; } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt index f71202885..8d9c12611 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -3,7 +3,7 @@ "description": "This is is an example of a user", "value": [ { - "id": "1", + "id": 1, "name": "John Doe" } ] diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt index cddf257f8..c1549bf7c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file +{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":1,"name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt index f71202885..8d9c12611 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -3,7 +3,7 @@ "description": "This is is an example of a user", "value": [ { - "id": "1", + "id": 1, "name": "John Doe" } ] diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt index cddf257f8..c1549bf7c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -1 +1 @@ -{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":"1","name":"John Doe"}]} \ No newline at end of file +{"summary":"Example of a user","description":"This is is an example of a user","value":[{"id":1,"name":"John Doe"}]} \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 5b52899f7..74d46a503 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -474,7 +474,7 @@ namespace Microsoft.OpenApi.Models public virtual Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public virtual string Summary { get; set; } public virtual bool UnresolvedReference { get; set; } - public virtual Microsoft.OpenApi.Any.IOpenApiAny Value { get; set; } + public virtual Microsoft.OpenApi.Any.OpenApiAny Value { get; set; } public Microsoft.OpenApi.Models.OpenApiExample GetEffective(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV2WithoutReference(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } @@ -514,7 +514,7 @@ namespace Microsoft.OpenApi.Models public virtual System.Collections.Generic.IDictionary Content { get; set; } public virtual bool Deprecated { get; set; } public virtual string Description { get; set; } - public virtual Microsoft.OpenApi.Any.IOpenApiAny Example { get; set; } + public virtual Microsoft.OpenApi.Any.OpenApiAny Example { get; set; } public virtual System.Collections.Generic.IDictionary Examples { get; set; } public virtual bool Explode { get; set; } public virtual System.Collections.Generic.IDictionary Extensions { get; set; } @@ -650,7 +650,7 @@ namespace Microsoft.OpenApi.Models public virtual System.Collections.Generic.IDictionary Content { get; set; } public virtual bool Deprecated { get; set; } public virtual string Description { get; set; } - public virtual Microsoft.OpenApi.Any.IOpenApiAny Example { get; set; } + public virtual Microsoft.OpenApi.Any.OpenApiAny Example { get; set; } public virtual System.Collections.Generic.IDictionary Examples { get; set; } public virtual bool Explode { get; set; } public virtual System.Collections.Generic.IDictionary Extensions { get; set; } From 3fbaca04a5280ba32d26925ffb880ad9050cffb9 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 12 Jul 2023 11:43:21 +0300 Subject: [PATCH 21/24] Add guard clause for potentially null Target value --- .../Models/References/OpenApiTagReference.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 0fd2ba11b..4e23f6f38 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -52,16 +52,16 @@ public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description { get => _description ?? Target?.Description; set => _description = value; } /// - public override OpenApiExternalDocs ExternalDocs { get => Target.ExternalDocs; set => Target.ExternalDocs = value; } + public override OpenApiExternalDocs ExternalDocs { get => Target?.ExternalDocs; set => Target.ExternalDocs = value; } /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public override IDictionary Extensions { get => Target?.Extensions; set => Target.Extensions = value; } /// - public override string Name { get => Target.Name; set => Target.Name = value; } + public override string Name { get => Target?.Name; set => Target.Name = value; } /// public override void SerializeAsV3(IOpenApiWriter writer) From d25772f5d0d792f3a62a897439835b0f59a833e6 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 18 Jul 2023 19:36:40 +0300 Subject: [PATCH 22/24] Check for null or empty for strings --- .../Models/References/OpenApiExampleReference.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 75de42551..9722e7855 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -60,7 +60,11 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override string Summary { get => _summary ?? Target.Summary; set => _summary = value; } From 18f3e961b42f948cf542cb7607caa31813261e80 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Tue, 18 Jul 2023 20:42:15 +0300 Subject: [PATCH 23/24] Use local field for getter and setter --- src/Microsoft.OpenApi/Models/OpenApiParameter.cs | 2 +- .../Models/References/OpenApiParameterReference.cs | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index 2c89171ba..4a9923cef 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs @@ -430,7 +430,7 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) writer.WriteEndObject(); } - private ParameterStyle? GetDefaultStyleValue() + internal virtual ParameterStyle? GetDefaultStyleValue() { Style = In switch { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 905f63aa4..941d14c82 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -18,6 +18,8 @@ internal class OpenApiParameterReference : OpenApiParameter private OpenApiParameter _target; private readonly OpenApiReference _reference; private string _description; + private bool? _explode; + private ParameterStyle? _style; private OpenApiParameter Target { @@ -89,10 +91,18 @@ public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocumen public override ParameterLocation? In { get => Target.In; set => Target.In = value; } /// - public override ParameterStyle? Style { get => Target.Style; set => Target.Style = value; } + public override ParameterStyle? Style + { + get => _style ?? GetDefaultStyleValue(); + set => _style = value; + } /// - public override bool Explode { get => Target.Explode; set => Target.Explode = value; } + public override bool Explode + { + get => _explode ?? Style == ParameterStyle.Form; + set => _explode = value; + } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } From 16f255311dc2f684aaa104cbe3bf2b67d274f006 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 19 Jul 2023 00:23:23 +0300 Subject: [PATCH 24/24] Additional check for null or empty for string properties --- .../Models/References/OpenApiExampleReference.cs | 8 ++++++-- .../Models/References/OpenApiHeaderReference.cs | 6 +++++- .../Models/References/OpenApiLinkReference.cs | 6 +++++- .../Models/References/OpenApiParameterReference.cs | 6 +++++- .../Models/References/OpenApiPathItemReference.cs | 12 ++++++++++-- .../Models/References/OpenApiRequestBodyReference.cs | 7 +++++-- .../Models/References/OpenApiResponseReference.cs | 6 +++++- .../References/OpenApiSecuritySchemeReference.cs | 7 ++++++- .../Models/References/OpenApiTagReference.cs | 6 +++++- 9 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 9722e7855..d988ec290 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -60,14 +60,18 @@ public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, } /// - public override string Description + public override string Description { get => string.IsNullOrEmpty(_description) ? Target.Description : _description; set => _description = value; } /// - public override string Summary { get => _summary ?? Target.Summary; set => _summary = value; } + public override string Summary + { + get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary; + set => _summary = value; + } /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 4bfeccd63..a7ec90fca 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -56,7 +56,11 @@ public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument, } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override bool Required { get => Target.Required; set => Target.Required = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 47a767b59..d80c93083 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -67,7 +67,11 @@ public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument, st public override OpenApiServer Server { get => Target.Server; set => Target.Server = value; } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override Dictionary Parameters { get => Target.Parameters; set => Target.Parameters = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 941d14c82..6a12b0451 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -64,7 +64,11 @@ public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocumen public override string Name { get => Target.Name; set => Target.Name = value; } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override bool Required { get => Target.Required; set => Target.Required = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index 574f461ea..42f0a5920 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -59,10 +59,18 @@ public OpenApiPathItemReference(string referenceId, OpenApiDocument hostDocument } /// - public override string Summary { get => _summary ?? Target.Summary; set => _summary = value; } + public override string Summary + { + get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary; + set => _summary = value; + } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override IDictionary Operations { get => Target.Operations; set => Target.Operations = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 314a3f499..290d4b9b9 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -58,7 +58,11 @@ public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocum } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } @@ -69,7 +73,6 @@ public OpenApiRequestBodyReference(string referenceId, OpenApiDocument hostDocum /// public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - /// public override void SerializeAsV3(IOpenApiWriter writer) { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index d1f7041a3..b1f8d53a9 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -58,7 +58,11 @@ public OpenApiResponseReference(string referenceId, OpenApiDocument hostDocument } /// - public override string Description { get => _description ?? Target.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override IDictionary Content { get => Target.Content; set => Target.Content = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index 47cf17a05..ace26b5e0 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -16,6 +16,7 @@ internal class OpenApiSecuritySchemeReference : OpenApiSecurityScheme { private OpenApiSecurityScheme _target; private readonly OpenApiReference _reference; + private string _description; private OpenApiSecurityScheme Target { @@ -51,7 +52,11 @@ public OpenApiSecuritySchemeReference(string referenceId, OpenApiDocument hostDo } /// - public override string Description { get => Target.Description; set => Target.Description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override string Name { get => Target.Name; set => Target.Name = value; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs index 4e23f6f38..f79244564 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -52,7 +52,11 @@ public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument) } /// - public override string Description { get => _description ?? Target?.Description; set => _description = value; } + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = value; + } /// public override OpenApiExternalDocs ExternalDocs { get => Target?.ExternalDocs; set => Target.ExternalDocs = value; }