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/OpenApiCallback.cs b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs index f8a04bf85..dce353849 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiCallback.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiCallback.cs @@ -7,7 +7,6 @@ using Microsoft.OpenApi.Expressions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -19,13 +18,13 @@ 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. @@ -35,7 +34,7 @@ public class OpenApiCallback : IOpenApiSerializable, IOpenApiReferenceable, IOpe /// /// 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 @@ -83,7 +82,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)); @@ -92,7 +91,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)); @@ -111,7 +110,7 @@ private void SerializeInternal(IOpenApiWriter writer, writer = writer ?? throw Error.ArgumentNull(nameof(writer)); var target = this; - + if (Reference != null) { if (!writer.GetSettings().ShouldInlineReference(Reference)) @@ -124,6 +123,7 @@ private void SerializeInternal(IOpenApiWriter writer, target = GetEffective(Reference.HostDocument); } } + action(writer, target); } @@ -134,9 +134,9 @@ private 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 { @@ -147,7 +147,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)); @@ -156,13 +156,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/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs index a527342db..7b56745cd 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs @@ -16,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 4ecd1332a..801fbb0c4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiContact.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiContact.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; diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 4c9e5da35..6e3672941 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -12,7 +12,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/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index 853883f04..06870b2ae 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -18,20 +18,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 OpenApiAny Value { get; set; } + public virtual OpenApiAny Value { get; set; } /// /// A URL that points to the literal example. @@ -39,22 +39,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 @@ -79,7 +79,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)); @@ -89,13 +89,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)); @@ -124,7 +124,7 @@ private void SerializeInternal(IOpenApiWriter writer, ActionOpenApiExample public OpenApiExample GetEffective(OpenApiDocument doc) { - if (this.Reference != null) + if (Reference != null) { return doc.ResolveReferenceTo(this.Reference); } @@ -137,7 +137,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); } @@ -145,12 +145,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/OpenApiExtensibleDictionary.cs b/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs index 447e6f1c2..3539401e0 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs @@ -6,7 +6,6 @@ using System.Text.Json.Nodes; 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 b330a966d..66a248b31 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExternalDocs.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; diff --git a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs index bbb9ac7c5..bd4a9ee44 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiHeader.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiHeader.cs @@ -20,7 +20,7 @@ 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. @@ -30,63 +30,63 @@ public class OpenApiHeader : IOpenApiSerializable, IOpenApiReferenceable, IOpenA /// /// 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 OpenApiAny Example { get; set; } + public virtual OpenApiAny 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 @@ -117,7 +117,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)); @@ -126,7 +126,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)); @@ -162,9 +162,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 { @@ -175,7 +175,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)); @@ -184,13 +184,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/OpenApiInfo.cs b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs index 3b075c708..1ed93275e 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiInfo.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiInfo.cs @@ -6,7 +6,6 @@ using System.Text.Json.Nodes; 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/OpenApiLink.cs b/src/Microsoft.OpenApi/Models/OpenApiLink.cs index 001c57b8f..e9435e3ee 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiLink.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiLink.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -18,44 +17,44 @@ 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. @@ -86,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)); @@ -95,12 +94,12 @@ 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, Action action) { @@ -130,9 +129,9 @@ private 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 { @@ -143,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)); } @@ -151,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/OpenApiOAuthFlow.cs b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs index 0a7a55b39..2ba2272aa 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlow.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 System.Text.Json.Nodes; 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 ae8f8440a..6266b5b2d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.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 System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs index 7552a2e2b..4a9923cef 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; @@ -22,7 +22,7 @@ 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. @@ -35,31 +35,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 +68,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 +88,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 +100,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 +114,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 +124,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 OpenApiAny Example { get; set; } + public virtual OpenApiAny Example { get; set; } /// /// A map containing the representations for the parameter. @@ -135,12 +135,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 @@ -173,7 +173,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)); @@ -182,7 +182,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)); @@ -217,9 +217,9 @@ private 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 { @@ -230,7 +230,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)); @@ -239,13 +239,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(); @@ -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/OpenApiPathItem.cs b/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs index dc4bcd1bc..bcc826ef4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiPathItem.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiPathItem.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 { @@ -19,34 +18,34 @@ 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 @@ -91,7 +90,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)); @@ -100,7 +99,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)); @@ -137,9 +136,9 @@ private 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 { @@ -165,7 +164,7 @@ public void SerializeAsV2(IOpenApiWriter writer) } else { - target = this.GetEffective(Reference.HostDocument); + target = GetEffective(Reference.HostDocument); } } @@ -214,7 +213,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)); } @@ -223,13 +222,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 09058741a..51c5b2465 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -30,23 +30,23 @@ public class OpenApiRequestBody : IOpenApiSerializable, IOpenApiReferenceable, I /// 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 @@ -69,7 +69,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)); @@ -78,7 +78,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)); @@ -113,9 +113,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 { @@ -126,7 +126,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)); @@ -135,13 +135,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 8a90dc1ae..32faca799 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiResponse.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiResponse.cs @@ -7,7 +7,6 @@ using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; -using static Microsoft.OpenApi.Extensions.OpenApiSerializableExtensions; namespace Microsoft.OpenApi.Models { @@ -19,30 +18,30 @@ 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 @@ -76,7 +75,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)); @@ -85,7 +84,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)); @@ -120,9 +119,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 { @@ -133,7 +132,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)); @@ -142,13 +141,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/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 f4a06dc18..07b3c6161 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Text.Json.Nodes; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -18,50 +17,50 @@ 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 @@ -99,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); } @@ -107,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); } @@ -132,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)); @@ -141,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/OpenApiServerVariable.cs b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs index 3236a2b49..7194b6284 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiServerVariable.cs @@ -1,8 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Collections.Generic; -using System.Text.Json.Nodes; 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 d4528054d..bcc2c056d 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiTag.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 System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -17,22 +16,22 @@ 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 @@ -65,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)); } @@ -73,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)); } @@ -97,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)); @@ -106,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(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiXml.cs b/src/Microsoft.OpenApi/Models/OpenApiXml.cs index 3d007d7b6..91748c879 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiXml.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiXml.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 System.Text.Json.Nodes; 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..3d4cee9ce --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -0,0 +1,100 @@ +// 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 +{ + /// + /// 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 OpenApiReference _reference; + + private OpenApiCallback Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Callback, + ExternalResource = externalResource + }; + } + + /// + public override Dictionary PathItems { get => Target.PathItems; set => Target.PathItems = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs new file mode 100644 index 000000000..d988ec290 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -0,0 +1,117 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Example Object Reference. + /// + internal class OpenApiExampleReference : OpenApiExample + { + private OpenApiExample _target; + private readonly OpenApiReference _reference; + private string _summary; + private string _description; + + private OpenApiExample Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Example, + ExternalResource = externalResource + }; + } + + /// + public override string Description + { + get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _description = 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; } + + /// + public override string ExternalValue { get => Target.ExternalValue; set => Target.ExternalValue = value; } + + /// + public override OpenApiAny Value { get => Target.Value; set => Target.Value = value; } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, referenceElement) => referenceElement.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs new file mode 100644 index 000000000..a7ec90fca --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -0,0 +1,132 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + internal class OpenApiHeaderReference : OpenApiHeader + { + private OpenApiHeader _target; + private readonly OpenApiReference _reference; + private string _description; + + private OpenApiHeader Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Header, + ExternalResource = externalResource + }; + } + + /// + 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; } + + /// + 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 OpenApiAny 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 void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV31WithoutReference(writer)); + } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs new file mode 100644 index 000000000..d80c93083 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -0,0 +1,117 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Link Object Reference. + /// + internal class OpenApiLinkReference : OpenApiLink + { + private OpenApiLink _target; + private readonly OpenApiReference _reference; + private string _description; + + private OpenApiLink Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Link, + ExternalResource = externalResource + }; + } + + /// + 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 => string.IsNullOrEmpty(_description) ? Target.Description : _description; + set => _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 void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs new file mode 100644 index 000000000..6a12b0451 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -0,0 +1,151 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Parameter Object Reference. + /// + internal class OpenApiParameterReference : OpenApiParameter + { + private OpenApiParameter _target; + private readonly OpenApiReference _reference; + private string _description; + private bool? _explode; + private ParameterStyle? _style; + + private OpenApiParameter Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Parameter, + ExternalResource = externalResource + }; + } + + /// + public override string Name { get => Target.Name; set => Target.Name = 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; } + + /// + 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 OpenApiAny Example { get => Target.Example; set => Target.Example = value; } + + /// + public override ParameterLocation? In { get => Target.In; set => Target.In = value; } + + /// + public override ParameterStyle? Style + { + get => _style ?? GetDefaultStyleValue(); + set => _style = value; + } + + /// + public override bool Explode + { + get => _explode ?? Style == ParameterStyle.Form; + set => _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 void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs new file mode 100644 index 000000000..42f0a5920 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -0,0 +1,119 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +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 OpenApiReference _reference; + private string _description; + private string _summary; + + private OpenApiPathItem Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.PathItem, + ExternalResource = externalResource + }; + } + + /// + public override string Summary + { + get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary; + set => _summary = 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; } + + /// + 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 void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs new file mode 100644 index 000000000..290d4b9b9 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -0,0 +1,110 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Request Body Object Reference. + /// + internal class OpenApiRequestBodyReference : OpenApiRequestBody + { + private OpenApiRequestBody _target; + private readonly OpenApiReference _reference; + private string _description; + + private OpenApiRequestBody Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.RequestBody, + ExternalResource = externalResource + }; + } + + /// + 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; } + + /// + public override bool Required { get => Target.Required; set => Target.Required = value; } + + /// + public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, Target); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs new file mode 100644 index 000000000..b1f8d53a9 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -0,0 +1,113 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Response Object Reference. + /// + internal class OpenApiResponseReference : OpenApiResponse + { + private OpenApiResponse _target; + private readonly OpenApiReference _reference; + private string _description; + + private OpenApiResponse Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// 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)) + { + throw Error.Argument(nameof(referenceId), SRResource.ReferenceIdIsNullOrEmpty); + } + if (hostDocument == null) + { + throw Error.Argument(nameof(hostDocument), SRResource.HostDocumentIsNull); + } + + _reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = ReferenceType.Response, + ExternalResource = externalResource + }; + } + + /// + 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; } + + /// + 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 void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, (writer, element) => element.SerializeAsV3WithoutReference(writer)); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer, this); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs new file mode 100644 index 000000000..ace26b5e0 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -0,0 +1,119 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Security Scheme Object Reference. + /// + internal class OpenApiSecuritySchemeReference : OpenApiSecurityScheme + { + private OpenApiSecurityScheme _target; + private readonly OpenApiReference _reference; + private string _description; + + private OpenApiSecurityScheme Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiSecuritySchemeReference(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, + HostDocument = hostDocument, + Type = ReferenceType.SecurityScheme + }; + } + + /// + 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; } + + /// + 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 void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer, SerializeAsV3WithoutReference); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer, + Action action) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + action(writer); + } + } +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs new file mode 100644 index 000000000..f79244564 --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs @@ -0,0 +1,103 @@ +// 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.Properties; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References +{ + /// + /// Tag Object Reference + /// + internal class OpenApiTagReference : OpenApiTag + { + private OpenApiTag _target; + private readonly OpenApiReference _reference; + private string _description; + + private OpenApiTag Target + { + get + { + _target ??= _reference.HostDocument.ResolveReferenceTo(_reference); + return _target; + } + } + + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + public OpenApiTagReference(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, + HostDocument = hostDocument, + Type = ReferenceType.Tag + }; + } + + /// + 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; } + + /// + public override IDictionary Extensions { get => Target?.Extensions; set => Target.Extensions = value; } + + /// + public override string Name { get => Target?.Name; set => Target.Name = value; } + + /// + public override void SerializeAsV3(IOpenApiWriter writer) + { + SerializeInternal(writer); + } + + /// + public override void SerializeAsV31(IOpenApiWriter writer) + { + SerializeInternal(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)); + } + + /// + private void SerializeInternal(IOpenApiWriter writer) + { + writer = writer ?? throw Error.ArgumentNull(nameof(writer)); + writer.WriteValue(Name); + } + } +} diff --git a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs index 18f1a59d6..6c149fbf2 100644 --- a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs +++ b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs @@ -377,5 +377,27 @@ internal static string WorkspaceRequredForExternalReferenceResolution { return ResourceManager.GetString("WorkspaceRequredForExternalReferenceResolution", resourceCulture); } } + + /// + /// Looks up a localized string similar to The HostDocument is null.. + /// + internal static string HostDocumentIsNull + { + get + { + 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 ReferenceIdIsNullOrEmpty + { + get + { + 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 36369938b..1764637b8 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -54,6 +54,10 @@ + + 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 new file mode 100644 index 000000000..3bb0efa15 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.SerializeReferencedCallbackAsV3JsonWorks_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.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 new file mode 100644 index 000000000..c2fd2b9db --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -0,0 +1,182 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + public class OpenApiCallbackReferenceTests + { + private 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"; + + 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 _); + 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 CallbackReferenceResolutionWorks() + { + // Assert + 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] + [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 + _localCallbackReference.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 + _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 new file mode 100644 index 000000000..f71202885 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_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.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..cddf257f8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_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.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..f71202885 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_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.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..cddf257f8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_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.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.SerializeExampleReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..8d9c12611 --- /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..c1549bf7c --- /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..8d9c12611 --- /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..c1549bf7c --- /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 new file mode 100644 index 000000000..5ef061cbb --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -0,0 +1,159 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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 + description: This is is an example of a user + value: + - id: 1 + name: John Doe +"; + + 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(); + _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 external user", + Description = "This is an example of an external user" + }; + } + + [Fact] + public void ExampleReferenceResolutionWorks() + { + // Assert + 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 SerializeExampleReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localExampleReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeExampleReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localExampleReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + } +} 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..f43e25a40 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_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.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..1b29be17d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_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.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..f43e25a40 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_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.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..1b29be17d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_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.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 new file mode 100644 index 000000000..8b29b212e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_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.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..243908873 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_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.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs new file mode 100644 index 000000000..3ab1895d1 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -0,0 +1,146 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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 +"; + + 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(); + _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 external created post" + }; + } + + [Fact] + public void HeaderReferenceResolutionWorks() + { + // Assert + 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 SerializeHeaderReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localHeaderReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeHeaderReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localHeaderReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeHeaderReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localHeaderReference.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..6fe727ea0 --- /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": "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 new file mode 100644 index 000000000..e3df412e9 --- /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":"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 new file mode 100644 index 000000000..6fe727ea0 --- /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": "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 new file mode 100644 index 000000000..e3df412e9 --- /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":"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 new file mode 100644 index 000000000..ccd4d3de6 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -0,0 +1,165 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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}"; + + 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 +"; + + private readonly OpenApiLinkReference _localLinkReference; + private readonly OpenApiLinkReference _externalLinkReference; + private readonly OpenApiDocument _openApiDoc; + private readonly OpenApiDocument _openApiDoc_2; + + public OpenApiLinkReferenceTests() + { + var reader = new OpenApiStringReader(); + _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 LinkReferenceResolutionWorks() + { + // Assert + 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 SerializeLinkReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localLinkReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeLinkReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localLinkReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + } +} 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..f0066344e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "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.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..2b7ff1cfb --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"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 new file mode 100644 index 000000000..f0066344e --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "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=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..2b7ff1cfb --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.SerializeParameterReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"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.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 new file mode 100644 index 000000000..593c76761 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -0,0 +1,148 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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 +"; + + 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(); + _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 ParameterReferenceResolutionWorks() + { + // Assert + 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] + [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 + _localParameterReference.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 + _localParameterReference.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 + _localParameterReference.SerializeAsV2(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..844f5ee81 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_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.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..f43044ef8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV31JsonWorks_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.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..844f5ee81 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_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.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..f43044ef8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeCallbackReferenceAsV3JsonWorks_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.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..86685c051 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_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.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.SerializeParameterReferenceAsV2JsonWorksAsync_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..efa477cae --- /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-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 new file mode 100644 index 000000000..86a82aacc --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -0,0 +1,157 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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: + description: User path item description + summary: User path item summary + 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 +"; + + 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(); + _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 = "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 PathItemReferenceResolutionWorks() + { + // Assert + 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 SerializePathItemReferenceAsV3JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localPathItemReference.SerializeAsV3(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializePathItemReferenceAsV31JsonWorks(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localPathItemReference.SerializeAsV31(writer); + writer.Flush(); + + // Assert + await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializePathItemReferenceAsV2JsonWorksAsync(bool produceTerseOutput) + { + // Arrange + var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput }); + + // Act + _localPathItemReference.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..cdbbe00d1 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "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.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..e82312f67 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"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 new file mode 100644 index 000000000..cdbbe00d1 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1,10 @@ +{ + "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=True.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt new file mode 100644 index 000000000..e82312f67 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.SerializeRequestBodyReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +{"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 new file mode 100644 index 000000000..f96345842 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -0,0 +1,141 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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 +"; + + 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(); + _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 RequestBodyReferenceResolutionWorks() + { + // Assert + 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] + [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 + _localRequestBodyReference.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 + _localRequestBodyReference.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 new file mode 100644 index 000000000..f3a654a50 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -0,0 +1,126 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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' +"; + + 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(); + _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 ResponseReferenceResolutionWorks() + { + // Assert + 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] + [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 + _localResponseReference.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 + _localResponseReference.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 new file mode 100644 index 000000000..a0bf9ea38 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -0,0 +1,92 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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 +"; + + readonly OpenApiSecuritySchemeReference _openApiSecuritySchemeReference; + + public OpenApiSecuritySchemeReferenceTests() + { + var reader = new OpenApiStringReader(); + OpenApiDocument openApiDoc = reader.Read(OpenApi, out _); + _openApiSecuritySchemeReference = new("mySecurityScheme", openApiDoc); + } + + [Fact] + public void SecuritySchemeResolutionWorks() + { + // Assert + 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.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 new file mode 100644 index 000000000..dd019c493 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeSecuritySchemeReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ +"user" \ 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.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt new file mode 100644 index 000000000..dd019c493 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ +"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 new file mode 100644 index 000000000..dd019c493 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV31JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +"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 new file mode 100644 index 000000000..dd019c493 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=False.verified.txt @@ -0,0 +1 @@ +"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 new file mode 100644 index 000000000..dd019c493 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.SerializeTagReferenceAsV3JsonWorks_produceTerseOutput=True.verified.txt @@ -0,0 +1 @@ +"user" \ 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 new file mode 100644 index 000000000..bff7b6b8c --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -0,0 +1,115 @@ +// 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; + +namespace Microsoft.OpenApi.Tests.Models.References +{ + [Collection("DefaultSettings")] + [UsesVerify] + 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 TagReferenceResolutionWorks() + { + // Assert + Assert.Equal("user", _openApiTagReference.Name); + Assert.Equal("Users operations", _openApiTagReference.Description); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task SerializeTagReferenceAsV3JsonWorks(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 SerializeTagReferenceAsV31JsonWorks(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); + } + } +} diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index c12a59de5..74d46a503 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -232,34 +232,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) { } @@ -468,20 +468,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.OpenApiAny 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.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) { } - 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 @@ -508,27 +508,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.OpenApiAny 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.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; } + 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 { @@ -562,22 +562,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 { @@ -644,50 +644,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.OpenApiAny 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.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; } + 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 { @@ -717,38 +717,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 { @@ -817,23 +817,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 { @@ -863,18 +863,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 { @@ -982,6 +982,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