Skip to content

chore: implement tests for routing issues during serialization #2340

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 14, 2025
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiCallback.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,15 @@ public void AddPathItem(RuntimeExpression expression, IOpenApiPathItem pathItem)
/// </summary>
/// <param name="writer"></param>
/// <exception cref="System.NotImplementedException"></exception>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiCallback"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -97,7 +97,7 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio
/// <summary>
/// Serialize <see cref="OpenApiCallback"/> to Open Api v2.0
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
// Callback object does not exist in V2.
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiComponents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
/// Serialize <see cref="OpenApiComponents"/> to Open API v3.1.
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
Utils.CheckArgumentNull(writer);

Expand Down Expand Up @@ -136,7 +136,7 @@
/// Serialize <see cref="OpenApiComponents"/> to v3.0
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
Utils.CheckArgumentNull(writer);

Expand All @@ -156,7 +156,7 @@
/// <summary>
/// Serialize <see cref="OpenApiComponents"/>.
/// </summary>
private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,

Check warning on line 159 in src/Microsoft.OpenApi/Models/OpenApiComponents.cs

View workflow job for this annotation

GitHub Actions / Build

Refactor this method to reduce its Cognitive Complexity from 27 to the 15 allowed. (https://rules.sonarsource.com/csharp/RSPEC-3776)
Action<IOpenApiWriter, IOpenApiSerializable> callback, Action<IOpenApiWriter, IOpenApiReferenceHolder> action)
{
// Serialize each referenceable object as full object without reference if the reference in the object points to itself.
Expand Down Expand Up @@ -338,7 +338,7 @@
/// <summary>
/// Serialize <see cref="OpenApiComponents"/> to Open Api v2.0.
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
// Components object does not exist in V2.
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiContact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,23 @@ public OpenApiContact(OpenApiContact contact)
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.1
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_1);
}

/// <summary>
/// Serialize <see cref="OpenApiContact"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_0);
}

/// <summary>
/// Serialize <see cref="OpenApiContact"/> to Open Api v2.0
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi2_0);
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiEncoding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public OpenApiEncoding(OpenApiEncoding encoding)
/// Serialize <see cref="OpenApiEncoding"/> to Open Api v3.1
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
}
Expand All @@ -85,7 +85,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
/// Serialize <see cref="OpenApiEncoding"/> to Open Api v3.0
/// </summary>
/// <param name="writer"></param>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -124,7 +124,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v2.0.
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
// nothing here
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiExample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ internal OpenApiExample(IOpenApiExample example)
}

/// <inheritdoc/>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1);
}

/// <inheritdoc/>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0);
}
Expand Down Expand Up @@ -86,7 +86,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
}

/// <inheritdoc/>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi2_0);
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiExternalDocs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,23 +46,23 @@ public OpenApiExternalDocs(OpenApiExternalDocs externalDocs)
/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.1.
/// </summary>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_1);
}

/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_0);
}

/// <summary>
/// Serialize <see cref="OpenApiExternalDocs"/> to Open Api v2.0.
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi2_0);
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,15 @@ internal OpenApiHeader(IOpenApiHeader header)
/// <summary>
/// Serialize <see cref="OpenApiHeader"/> to Open Api v3.1
/// </summary>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV31(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiHeader"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -145,7 +145,7 @@ internal void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion versio
/// <summary>
/// Serialize to OpenAPI V2 document without using reference.
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
Utils.CheckArgumentNull(writer);

Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiLicense.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public OpenApiLicense(OpenApiLicense license)
/// <summary>
/// Serialize <see cref="OpenApiLicense"/> to Open Api v3.1
/// </summary>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_1);
writer.WriteProperty(OpenApiConstants.Identifier, Identifier);
Expand All @@ -62,7 +62,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
/// <summary>
/// Serialize <see cref="OpenApiLicense"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi3_0);
writer.WriteEndObject();
Expand All @@ -71,7 +71,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
/// <summary>
/// Serialize <see cref="OpenApiLicense"/> to Open Api v2.0
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
WriteInternal(writer, OpenApiSpecVersion.OpenApi2_0);
writer.WriteEndObject();
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiLink.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ internal OpenApiLink(IOpenApiLink link)
}

/// <inheritdoc/>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer));
}

/// <inheritdoc/>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -98,7 +98,7 @@ internal void SerializeInternal(IOpenApiWriter writer, Action<IOpenApiWriter, IO
}

/// <inheritdoc/>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
// Link object does not exist in V2.
}
Expand Down
12 changes: 6 additions & 6 deletions src/Microsoft.OpenApi/Models/OpenApiMediaType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,15 @@ public OpenApiMediaType(OpenApiMediaType? mediaType)
/// <summary>
/// Serialize <see cref="OpenApiMediaType"/> to Open Api v3.1.
/// </summary>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (w, element) => element.SerializeAsV31(w));
}

/// <summary>
/// Serialize <see cref="OpenApiMediaType"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (w, element) => element.SerializeAsV3(w));
}
Expand All @@ -99,7 +99,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
// examples
if (Examples != null && Examples.Any())
{
SerializeExamples(writer, Examples);
SerializeExamples(writer, Examples, callback);
}

// encoding
Expand All @@ -114,12 +114,12 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
/// <summary>
/// Serialize <see cref="OpenApiMediaType"/> to Open Api v2.0.
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
// Media type does not exist in V2.
}

private static void SerializeExamples(IOpenApiWriter writer, Dictionary<string, IOpenApiExample> examples)
private static void SerializeExamples(IOpenApiWriter writer, Dictionary<string, IOpenApiExample> examples, Action<IOpenApiWriter, IOpenApiSerializable> callback)
{
/* Special case for writing out empty arrays as valid response examples
* Check if there is any example with an empty array as its value and set the flag `hasEmptyArray` to true
Expand All @@ -143,7 +143,7 @@ private static void SerializeExamples(IOpenApiWriter writer, Dictionary<string,
}
else
{
writer.WriteOptionalMap(OpenApiConstants.Examples, examples, (w, e) => e.SerializeAsV3(w));
writer.WriteOptionalMap(OpenApiConstants.Examples, examples, callback);
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiOAuthFlows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,15 @@ public OpenApiOAuthFlows(OpenApiOAuthFlows oAuthFlows)
/// <summary>
/// Serialize <see cref="OpenApiOAuthFlows"/> to Open Api v3.1
/// </summary>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiOAuthFlows"/> to Open Api v3.0
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -109,7 +109,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
/// <summary>
/// Serialize <see cref="OpenApiOAuthFlows"/> to Open Api v2.0
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
// OAuthFlows object does not exist in V2.
}
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
{
return;
}
_tags = value is HashSet<OpenApiTagReference> tags && tags.Comparer is OpenApiTagComparer ?

Check warning on line 42 in src/Microsoft.OpenApi/Models/OpenApiOperation.cs

View workflow job for this annotation

GitHub Actions / Build

Change this condition so that it does not always evaluate to 'True'. (https://rules.sonarsource.com/csharp/RSPEC-2589)
tags :
new HashSet<OpenApiTagReference>(value, OpenApiTagComparer.Instance);
}
Expand Down Expand Up @@ -158,15 +158,15 @@
/// <summary>
/// Serialize <see cref="OpenApiOperation"/> to Open Api v3.1.
/// </summary>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
}

/// <summary>
/// Serialize <see cref="OpenApiOperation"/> to Open Api v3.0.
/// </summary>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -228,7 +228,7 @@
/// <summary>
/// Serialize <see cref="OpenApiOperation"/> to Open Api v2.0.
/// </summary>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)

Check warning on line 231 in src/Microsoft.OpenApi/Models/OpenApiOperation.cs

View workflow job for this annotation

GitHub Actions / Build

Refactor this method to reduce its Cognitive Complexity from 28 to the 15 allowed. (https://rules.sonarsource.com/csharp/RSPEC-3776)
{
Utils.CheckArgumentNull(writer);

Expand Down Expand Up @@ -338,7 +338,7 @@

writer.WriteOptionalCollection(OpenApiConstants.Schemes, schemes, (w, s) =>
{
if (!string.IsNullOrEmpty(s) && s is not null)

Check warning on line 341 in src/Microsoft.OpenApi/Models/OpenApiOperation.cs

View workflow job for this annotation

GitHub Actions / Build

Change this condition so that it does not always evaluate to 'True'. (https://rules.sonarsource.com/csharp/RSPEC-2589)
{
w.WriteValue(s);
}
Expand All @@ -361,7 +361,7 @@
{
if (tags?.Count > 0)
{
foreach (var tag in tags)

Check warning on line 364 in src/Microsoft.OpenApi/Models/OpenApiOperation.cs

View workflow job for this annotation

GitHub Actions / Build

Loops should be simplified using the "Where" LINQ method (https://rules.sonarsource.com/csharp/RSPEC-3267)
{
if (tag.Target is null)
{
Expand Down
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi/Models/OpenApiParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,13 @@
}

/// <inheritdoc/>
public void SerializeAsV31(IOpenApiWriter writer)
public virtual void SerializeAsV31(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1, (writer, element) => element.SerializeAsV31(writer));
}

/// <inheritdoc/>
public void SerializeAsV3(IOpenApiWriter writer)
public virtual void SerializeAsV3(IOpenApiWriter writer)
{
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
Expand Down Expand Up @@ -179,7 +179,7 @@
/// </summary>
/// <param name="writer">Writer to use for the serialization</param>
/// <param name="extensionsClone">Extensions clone</param>
internal virtual void WriteRequestBodySchemaForV2(IOpenApiWriter writer, Dictionary<string, IOpenApiExtension>? extensionsClone)

Check warning on line 182 in src/Microsoft.OpenApi/Models/OpenApiParameter.cs

View workflow job for this annotation

GitHub Actions / Build

Refactor this method to reduce its Cognitive Complexity from 23 to the 15 allowed. (https://rules.sonarsource.com/csharp/RSPEC-3776)
{
// In V2 parameter's type can't be a reference to a custom object schema or can't be of type object
// So in that case map the type as string.
Expand Down Expand Up @@ -214,7 +214,7 @@
if (targetSchema is not null)
{
targetSchema.WriteAsItemsProperties(writer);
var extensions = Schema?.Extensions;

Check warning on line 217 in src/Microsoft.OpenApi/Models/OpenApiParameter.cs

View workflow job for this annotation

GitHub Actions / Build

Remove this unnecessary check for null. (https://rules.sonarsource.com/csharp/RSPEC-2589)
if (extensions != null)
{
foreach (var key in extensions.Keys)
Expand All @@ -231,7 +231,7 @@

if (this.In == ParameterLocation.Query && Schema?.Type == JsonSchemaType.Array)
{
if (this.Style == ParameterStyle.Form && this.Explode == true)

Check warning on line 234 in src/Microsoft.OpenApi/Models/OpenApiParameter.cs

View workflow job for this annotation

GitHub Actions / Build

Remove the unnecessary Boolean literal(s). (https://rules.sonarsource.com/csharp/RSPEC-1125)
{
writer.WriteProperty("collectionFormat", "multi");
}
Expand All @@ -248,7 +248,7 @@
}

/// <inheritdoc/>
public void SerializeAsV2(IOpenApiWriter writer)
public virtual void SerializeAsV2(IOpenApiWriter writer)
{
Utils.CheckArgumentNull(writer);

Expand Down
Loading