diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 13a34f171..2ddce58b7 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -36,3 +36,18 @@ jobs:
shell: pwsh
run: |
dotnet test Microsoft.OpenApi.sln -c Release -v n
+
+ validate-trimming:
+ name: Validate Project for Trimming
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 8.x
+
+ - name: Validate Trimming warnings
+ run: dotnet publish -c Release -r win-x64 /p:TreatWarningsAsErrors=true /warnaserror -f net8.0
+ working-directory: ./test/Microsoft.OpenApi.Trimming.Tests
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 7e81a456d..b4f6003dc 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -30,13 +30,13 @@ jobs:
id: getversion
- name: Push to registry - Nightly
if: ${{ github.ref == 'refs/heads/dev' }}
- uses: docker/build-push-action@v6.10.0
+ uses: docker/build-push-action@v6.12.0
with:
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly
- name: Push to registry - Release
if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/support/v1' }}
- uses: docker/build-push-action@v6.10.0
+ uses: docker/build-push-action@v6.12.0
with:
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.getversion.outputs.version }}
diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj
index 52672405e..1e13eb157 100644
--- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj
+++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj
@@ -9,7 +9,7 @@
enable
hidi
./../../artifacts
- 2.0.0-preview4
+ 2.0.0-preview5
OpenAPI.NET CLI tool for slicing OpenAPI documents
true
@@ -29,10 +29,10 @@
-
-
+
+
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs
index 069f8cd67..c7bf1a558 100644
--- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs
+++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs
@@ -113,7 +113,7 @@ public static async Task TransformOpenApiDocumentAsync(HidiOptions options, ILog
var walker = new OpenApiWalker(powerShellFormatter);
walker.Walk(document);
}
- WriteOpenApi(options, openApiFormat, openApiVersion, document, logger);
+ await WriteOpenApiAsync(options, openApiFormat, openApiVersion, document, logger, cancellationToken).ConfigureAwait(false);
}
catch (TaskCanceledException)
{
@@ -191,7 +191,7 @@ private static OpenApiDocument ApplyFilters(HidiOptions options, ILogger logger,
return document;
}
- private static void WriteOpenApi(HidiOptions options, OpenApiFormat openApiFormat, OpenApiSpecVersion openApiVersion, OpenApiDocument document, ILogger logger)
+ private static async Task WriteOpenApiAsync(HidiOptions options, OpenApiFormat openApiFormat, OpenApiSpecVersion openApiVersion, OpenApiDocument document, ILogger logger, CancellationToken cancellationToken)
{
using (logger.BeginScope("Output"))
{
@@ -216,11 +216,11 @@ private static void WriteOpenApi(HidiOptions options, OpenApiFormat openApiForma
var stopwatch = new Stopwatch();
stopwatch.Start();
- document.Serialize(writer, openApiVersion);
+ await document.SerializeAsync(writer, openApiVersion, cancellationToken).ConfigureAwait(false);
stopwatch.Stop();
logger.LogTrace("Finished serializing in {ElapsedMilliseconds}ms", stopwatch.ElapsedMilliseconds);
- textWriter.Flush();
+ await textWriter.FlushAsync(cancellationToken).ConfigureAwait(false);
}
}
@@ -769,7 +769,7 @@ internal static async Task PluginManifestAsync(HidiOptions options, ILogger logg
// Write OpenAPI to Output folder
options.Output = new(Path.Combine(options.OutputFolder, "openapi.json"));
options.TerseOutput = true;
- WriteOpenApi(options, OpenApiFormat.Json, OpenApiSpecVersion.OpenApi3_1, document, logger);
+ await WriteOpenApiAsync(options, OpenApiFormat.Json, OpenApiSpecVersion.OpenApi3_1, document, logger, cancellationToken).ConfigureAwait(false);
// Create OpenAIPluginManifest from ApiDependency and OpenAPI document
var manifest = new OpenAIPluginManifest(document.Info?.Title ?? "Title", document.Info?.Title ?? "Title", "https://go.microsoft.com/fwlink/?LinkID=288890", document.Info?.Contact?.Email ?? "placeholder@contoso.com", document.Info?.License?.Url.ToString() ?? "https://placeholderlicenseurl.com")
diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj
index 94f633208..624fe822f 100644
--- a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj
+++ b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj
@@ -1,12 +1,14 @@
-
+
- netstandard2.0;net6.0;
+ netstandard2.0;net8.0;
latest
true
- 2.0.0-preview4
+ 2.0.0-preview5
OpenAPI.NET Readers for JSON and YAML documents
true
+ true
+ true
true
NU5048
diff --git a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs
index 217db91b3..2f1ce2b37 100644
--- a/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs
+++ b/src/Microsoft.OpenApi.Readers/OpenApiYamlReader.cs
@@ -9,7 +9,6 @@
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Reader;
using SharpYaml.Serialization;
-using System.Linq;
using Microsoft.OpenApi.Models;
using System;
using System.Text;
@@ -86,6 +85,7 @@ public static ReadResult Read(JsonNode jsonNode, OpenApiReaderSettings settings,
///
public T ReadFragment(MemoryStream input,
OpenApiSpecVersion version,
+ OpenApiDocument openApiDocument,
out OpenApiDiagnostic diagnostic,
OpenApiReaderSettings settings = null) where T : IOpenApiElement
{
@@ -105,13 +105,13 @@ public T ReadFragment(MemoryStream input,
return default;
}
- return ReadFragment(jsonNode, version, out diagnostic, settings);
+ return ReadFragment(jsonNode, version, openApiDocument, out diagnostic, settings);
}
///
- public static T ReadFragment(JsonNode input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement
+ public static T ReadFragment(JsonNode input, OpenApiSpecVersion version, OpenApiDocument openApiDocument, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement
{
- return _jsonReader.ReadFragment(input, version, out diagnostic, settings);
+ return _jsonReader.ReadFragment(input, version, openApiDocument, out diagnostic, settings);
}
///
diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs
index 1cd4f24ac..7eee12251 100644
--- a/src/Microsoft.OpenApi.Workbench/MainModel.cs
+++ b/src/Microsoft.OpenApi.Workbench/MainModel.cs
@@ -270,7 +270,7 @@ internal async Task ParseDocumentAsync()
stopwatch.Reset();
stopwatch.Start();
- Output = WriteContents(document);
+ Output = await WriteContentsAsync(document);
stopwatch.Stop();
RenderTime = $"{stopwatch.ElapsedMilliseconds} ms";
@@ -299,15 +299,15 @@ internal async Task ParseDocumentAsync()
///
/// Write content from the given document based on the format and version set in this class.
///
- private string WriteContents(OpenApiDocument document)
+ private async Task WriteContentsAsync(OpenApiDocument document)
{
var outputStream = new MemoryStream();
- document.Serialize(
+ await document.SerializeAsync(
outputStream,
Version,
Format,
- new()
+ (Writers.OpenApiWriterSettings)new()
{
InlineLocalReferences = InlineLocal,
InlineExternalReferences = InlineExternal
@@ -315,7 +315,7 @@ private string WriteContents(OpenApiDocument document)
outputStream.Position = 0;
- return new StreamReader(outputStream).ReadToEnd();
+ return await new StreamReader(outputStream).ReadToEndAsync();
}
private static MemoryStream CreateStream(string text)
diff --git a/src/Microsoft.OpenApi.Workbench/Microsoft.OpenApi.Workbench.csproj b/src/Microsoft.OpenApi.Workbench/Microsoft.OpenApi.Workbench.csproj
index ab6c09b54..32229a9ad 100644
--- a/src/Microsoft.OpenApi.Workbench/Microsoft.OpenApi.Workbench.csproj
+++ b/src/Microsoft.OpenApi.Workbench/Microsoft.OpenApi.Workbench.csproj
@@ -13,9 +13,9 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
+
-
+
diff --git a/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs b/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs
index 5d59a8de2..9d284db1a 100755
--- a/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs
+++ b/src/Microsoft.OpenApi/Extensions/OpenApiSerializableExtensions.cs
@@ -3,6 +3,8 @@
using System.Globalization;
using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Properties;
@@ -22,10 +24,11 @@ public static class OpenApiSerializableExtensions
/// The Open API element.
/// The output stream.
/// The Open API specification version.
- public static void SerializeAsJson(this T element, Stream stream, OpenApiSpecVersion specVersion)
+ /// The cancellation token.
+ public static Task SerializeAsJsonAsync(this T element, Stream stream, OpenApiSpecVersion specVersion, CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
- element.Serialize(stream, specVersion, OpenApiFormat.Json);
+ return element.SerializeAsync(stream, specVersion, OpenApiFormat.Json, cancellationToken);
}
///
@@ -35,10 +38,11 @@ public static void SerializeAsJson(this T element, Stream stream, OpenApiSpec
/// The Open API element.
/// The output stream.
/// The Open API specification version.
- public static void SerializeAsYaml(this T element, Stream stream, OpenApiSpecVersion specVersion)
+ /// The cancellation token.
+ public static Task SerializeAsYamlAsync(this T element, Stream stream, OpenApiSpecVersion specVersion, CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
- element.Serialize(stream, specVersion, OpenApiFormat.Yaml);
+ return element.SerializeAsync(stream, specVersion, OpenApiFormat.Yaml, cancellationToken);
}
///
@@ -50,14 +54,16 @@ public static void SerializeAsYaml(this T element, Stream stream, OpenApiSpec
/// The given stream.
/// The Open API specification version.
/// The output format (JSON or YAML).
- public static void Serialize(
+ /// The cancellation token.
+ public static Task SerializeAsync(
this T element,
Stream stream,
OpenApiSpecVersion specVersion,
- OpenApiFormat format)
+ OpenApiFormat format,
+ CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
- element.Serialize(stream, specVersion, format, null);
+ return element.SerializeAsync(stream, specVersion, format, null, cancellationToken);
}
///
@@ -70,12 +76,14 @@ public static void Serialize(
/// The Open API specification version.
/// The output format (JSON or YAML).
/// Provide configuration settings for controlling writing output
- public static void Serialize(
+ /// The cancellation token.
+ public static Task SerializeAsync(
this T element,
Stream stream,
OpenApiSpecVersion specVersion,
OpenApiFormat format,
- OpenApiWriterSettings settings)
+ OpenApiWriterSettings settings,
+ CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
Utils.CheckArgumentNull(stream);
@@ -88,7 +96,7 @@ public static void Serialize(
OpenApiFormat.Yaml => new OpenApiYamlWriter(streamWriter, settings),
_ => throw new OpenApiException(string.Format(SRResource.OpenApiFormatNotSupported, format)),
};
- element.Serialize(writer, specVersion);
+ return element.SerializeAsync(writer, specVersion, cancellationToken);
}
///
@@ -98,7 +106,8 @@ public static void Serialize(
/// The Open API element.
/// The output writer.
/// Version of the specification the output should conform to
- public static void Serialize(this T element, IOpenApiWriter writer, OpenApiSpecVersion specVersion)
+ /// The cancellation token.
+ public static Task SerializeAsync(this T element, IOpenApiWriter writer, OpenApiSpecVersion specVersion, CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
Utils.CheckArgumentNull(element);
@@ -122,7 +131,7 @@ public static void Serialize(this T element, IOpenApiWriter writer, OpenApiSp
throw new OpenApiException(string.Format(SRResource.OpenApiSpecVersionNotSupported, specVersion));
}
- writer.Flush();
+ return writer.FlushAsync(cancellationToken);
}
///
@@ -131,12 +140,14 @@ public static void Serialize(this T element, IOpenApiWriter writer, OpenApiSp
/// the
/// The Open API element.
/// The Open API specification version.
- public static string SerializeAsJson(
+ /// The cancellation token.
+ public static Task SerializeAsJsonAsync(
this T element,
- OpenApiSpecVersion specVersion)
+ OpenApiSpecVersion specVersion,
+ CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
- return element.Serialize(specVersion, OpenApiFormat.Json);
+ return element.SerializeAsync(specVersion, OpenApiFormat.Json, cancellationToken);
}
///
@@ -145,12 +156,14 @@ public static string SerializeAsJson(
/// the
/// The Open API element.
/// The Open API specification version.
- public static string SerializeAsYaml(
+ /// The cancellation token.
+ public static Task SerializeAsYamlAsync(
this T element,
- OpenApiSpecVersion specVersion)
+ OpenApiSpecVersion specVersion,
+ CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
- return element.Serialize(specVersion, OpenApiFormat.Yaml);
+ return element.SerializeAsync(specVersion, OpenApiFormat.Yaml, cancellationToken);
}
///
@@ -160,20 +173,26 @@ public static string SerializeAsYaml(
/// The Open API element.
/// The Open API specification version.
/// Open API document format.
- public static string Serialize(
+ /// The cancellation token.
+ public static async Task SerializeAsync(
this T element,
OpenApiSpecVersion specVersion,
- OpenApiFormat format)
+ OpenApiFormat format,
+ CancellationToken cancellationToken = default)
where T : IOpenApiSerializable
{
Utils.CheckArgumentNull(element);
using var stream = new MemoryStream();
- element.Serialize(stream, specVersion, format);
+ await element.SerializeAsync(stream, specVersion, format, cancellationToken).ConfigureAwait(false);
stream.Position = 0;
using var streamReader = new StreamReader(stream);
- return streamReader.ReadToEnd();
+#if NET7_0_OR_GREATER
+ return await streamReader.ReadToEndAsync(cancellationToken).ConfigureAwait(false);
+#else
+ return await streamReader.ReadToEndAsync().ConfigureAwait(false);
+#endif
}
}
}
diff --git a/src/Microsoft.OpenApi/Extensions/StringExtensions.cs b/src/Microsoft.OpenApi/Extensions/StringExtensions.cs
index 00c26575e..b644050ab 100644
--- a/src/Microsoft.OpenApi/Extensions/StringExtensions.cs
+++ b/src/Microsoft.OpenApi/Extensions/StringExtensions.cs
@@ -2,47 +2,61 @@
// Licensed under the MIT license.
using System;
using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.OpenApi.Attributes;
+using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Reader;
namespace Microsoft.OpenApi.Extensions
{
///
/// String extension methods.
///
- public static class StringExtensions
+ internal static class StringExtensions
{
- private static readonly ConcurrentDictionary> EnumDisplayCache = new();
+ private static readonly ConcurrentDictionary> EnumDisplayCache = new();
- ///
- /// Gets the enum value based on the given enum type and display name.
- ///
- /// The display name.
- public static T GetEnumFromDisplayName<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(this string displayName)
+ internal static bool TryGetEnumFromDisplayName<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(this string displayName, ParsingContext parsingContext, out T result) where T : Enum
+ {
+ if (TryGetEnumFromDisplayName(displayName, out result))
+ {
+ return true;
+ }
+
+ parsingContext.Diagnostic.Errors.Add(new OpenApiError(parsingContext.GetLocation(), $"Enum value {displayName} is not recognized."));
+ return false;
+
+ }
+ internal static bool TryGetEnumFromDisplayName<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(this string displayName, out T result) where T : Enum
{
var type = typeof(T);
- if (!type.IsEnum)
- return default;
- var displayMap = EnumDisplayCache.GetOrAdd(type, _ => new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase));
+ var displayMap = EnumDisplayCache.GetOrAdd(type, _=> GetEnumValues(type));
if (displayMap.TryGetValue(displayName, out var cachedValue))
- return (T)cachedValue;
-
+ {
+ result = (T)cachedValue;
+ return true;
+ }
- foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Static))
+ result = default;
+ return false;
+ }
+ private static ReadOnlyDictionary GetEnumValues([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] Type enumType) where T : Enum
+ {
+ var result = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ foreach (var field in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
{
- var displayAttribute = field.GetCustomAttribute();
- if (displayAttribute != null && displayAttribute.Name.Equals(displayName, StringComparison.OrdinalIgnoreCase))
+ if (field.GetCustomAttribute() is {} displayAttribute)
{
var enumValue = (T)field.GetValue(null);
- displayMap.TryAdd(displayName, enumValue);
- return enumValue;
+ result.Add(displayAttribute.Name, enumValue);
}
}
-
- return default;
+ return new ReadOnlyDictionary(result);
}
internal static string ToFirstCharacterLowerCase(this string input)
=> string.IsNullOrEmpty(input) ? string.Empty : char.ToLowerInvariant(input[0]) + input.Substring(1);
diff --git a/src/Microsoft.OpenApi/Helpers/JsonNodeCloneHelper.cs b/src/Microsoft.OpenApi/Helpers/JsonNodeCloneHelper.cs
index d6e9cb9df..caab84e7b 100644
--- a/src/Microsoft.OpenApi/Helpers/JsonNodeCloneHelper.cs
+++ b/src/Microsoft.OpenApi/Helpers/JsonNodeCloneHelper.cs
@@ -1,40 +1,15 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Text.Json;
using System.Text.Json.Nodes;
-using System.Text.Json.Serialization;
-using Microsoft.OpenApi.Any;
namespace Microsoft.OpenApi.Helpers
{
internal static class JsonNodeCloneHelper
{
- private static readonly JsonSerializerOptions options = new()
- {
- ReferenceHandler = ReferenceHandler.IgnoreCycles
- };
-
internal static JsonNode Clone(JsonNode value)
{
- var jsonString = Serialize(value);
- if (string.IsNullOrEmpty(jsonString))
- {
- return null;
- }
-
- var result = JsonSerializer.Deserialize(jsonString, options);
- return result;
- }
-
- private static string Serialize(object obj)
- {
- if (obj == null)
- {
- return null;
- }
- var result = JsonSerializer.Serialize(obj, options);
- return result;
+ return value.DeepClone();
}
}
}
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs
index 9398551dd..3b9c85d2f 100644
--- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReader.cs
@@ -2,9 +2,9 @@
// Licensed under the MIT license.
using System.IO;
-using System.Text.Json.Nodes;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
namespace Microsoft.OpenApi.Interfaces
@@ -36,9 +36,10 @@ public interface IOpenApiReader
///
/// Memory stream containing OpenAPI description to parse.
/// Version of the OpenAPI specification that the fragment conforms to.
+ /// The OpenApiDocument object to which the fragment belongs, used to lookup references.
/// Returns diagnostic object containing errors detected during parsing.
/// The OpenApiReader settings.
/// Instance of newly created IOpenApiElement.
- T ReadFragment(MemoryStream input, OpenApiSpecVersion version, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement;
+ T ReadFragment(MemoryStream input, OpenApiSpecVersion version, OpenApiDocument openApiDocument, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement;
}
}
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs
index 0920fb1ef..43088bf6b 100644
--- a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceable.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using Microsoft.OpenApi.Models;
-using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Interfaces
{
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs
new file mode 100644
index 000000000..fc4c1daed
--- /dev/null
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceableWithTarget.cs
@@ -0,0 +1,17 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.OpenApi.Interfaces
+{
+ ///
+ /// A generic interface for OpenApiReferenceable objects that have a target.
+ ///
+ ///
+ public interface IOpenApiReferenceableWithTarget : IOpenApiReferenceable
+ {
+ ///
+ /// Gets the resolved target object.
+ ///
+ T Target { get; }
+ }
+}
diff --git a/src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs b/src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs
index 97d1d3c9b..073962a35 100644
--- a/src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs
+++ b/src/Microsoft.OpenApi/Interfaces/IOpenApiVersionService.cs
@@ -28,7 +28,7 @@ internal interface IOpenApiVersionService
/// document fragment node
/// A host document instance.
/// Instance of OpenAPIElement
- T LoadElement(ParseNode node, OpenApiDocument doc = null) where T : IOpenApiElement;
+ T LoadElement(ParseNode node, OpenApiDocument doc) where T : IOpenApiElement;
///
/// Converts a generic RootNode instance into a strongly typed OpenApiDocument
diff --git a/src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs b/src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs
index c3edebe1b..c3cb9b256 100644
--- a/src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs
+++ b/src/Microsoft.OpenApi/Interfaces/IStreamLoader.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System;
-using System.ComponentModel;
using System.IO;
using System.Threading.Tasks;
using Microsoft.OpenApi.Models;
@@ -20,14 +19,5 @@ public interface IStreamLoader
/// Identifier of some source of an OpenAPI Description
/// A data object that can be processed by a reader to generate an
Task LoadAsync(Uri uri);
-
- ///
- /// Use Uri to locate data and convert into an input object.
- ///
- ///
- ///
- [Obsolete("Use the Async overload")]
- [EditorBrowsable(EditorBrowsableState.Never)]
- Stream Load(Uri uri);
}
}
diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
index e0b815f5d..46cb80f08 100644
--- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
+++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj
@@ -1,11 +1,13 @@
- netstandard2.0
+ netstandard2.0;net8.0
Latest
true
- 2.0.0-preview4
+ 2.0.0-preview5
.NET models with JSON and YAML writers for OpenAPI specification
true
+ true
+ true
true
NU5048
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs
index 9cbae6350..22b9f0df2 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumFlagsExtension.cs
@@ -5,7 +5,6 @@
using System;
using Microsoft.OpenApi.Extensions;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Writers;
using System.Text.Json.Nodes;
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs
index a6df2444b..df1e664e1 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiEnumValuesDescriptionExtension.cs
@@ -7,7 +7,6 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.OpenApi.Extensions;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Writers;
using System.Text.Json.Nodes;
@@ -41,10 +40,9 @@ public class OpenApiEnumValuesDescriptionExtension : IOpenApiExtension
public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
{
if (writer is null) throw new ArgumentNullException(nameof(writer));
- if (specVersion is OpenApiSpecVersion.OpenApi2_0 or OpenApiSpecVersion.OpenApi3_0 &&
- !string.IsNullOrEmpty(EnumName) &&
+ if (!string.IsNullOrEmpty(EnumName) &&
ValuesDescriptions.Any())
- { // when we upgrade to 3.1, we don't need to write this extension as JSON schema will support writing enum values
+ {
writer.WriteStartObject();
writer.WriteProperty(nameof(Name).ToFirstCharacterLowerCase(), EnumName);
writer.WriteProperty("modelAsString", false);
diff --git a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs
index f64eebf3f..57d057e59 100644
--- a/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs
+++ b/src/Microsoft.OpenApi/MicrosoftExtensions/OpenApiPagingExtension.cs
@@ -5,7 +5,6 @@
using System;
using Microsoft.OpenApi.Extensions;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Writers;
using System.Text.Json.Nodes;
diff --git a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs
index f672b7dd1..5b43b5187 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiComponents.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiComponents.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
-using System.Linq;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Writers;
@@ -319,7 +318,7 @@ private void RenderComponents(IOpenApiWriter writer, Action schemas))
+ if (loops.TryGetValue(typeof(OpenApiSchema), out var schemas))
{
writer.WriteOptionalMap(OpenApiConstants.Schemas, Schemas, callback);
}
diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs
index 268007141..1ce80f092 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs
@@ -83,11 +83,6 @@ public class OpenApiDocument : IOpenApiSerializable, IOpenApiExtensible, IOpenAp
///
public IDictionary? Extensions { get; set; } = new Dictionary();
- ///
- /// The unique hash code of the generated OpenAPI document
- ///
- public string HashCode => GenerateHashValue(this);
-
///
public IDictionary? Annotations { get; set; }
@@ -243,7 +238,7 @@ public void SerializeAsV2(IOpenApiWriter writer)
{
var loops = writer.GetSettings().LoopDetector.Loops;
- if (loops.TryGetValue(typeof(OpenApiSchema), out List
- public IList? Tags { get; set; } = new List();
+ public IList? Tags { get; set; } = [];
///
/// A short summary of what the operation does.
@@ -121,7 +121,7 @@ public OpenApiOperation() { }
///
public OpenApiOperation(OpenApiOperation? operation)
{
- Tags = operation?.Tags != null ? new List(operation.Tags) : null;
+ Tags = operation?.Tags != null ? new List(operation.Tags) : null;
Summary = operation?.Summary ?? Summary;
Description = operation?.Description ?? Description;
ExternalDocs = operation?.ExternalDocs != null ? new(operation?.ExternalDocs) : null;
@@ -237,18 +237,18 @@ public void SerializeAsV2(IOpenApiWriter writer)
List parameters;
if (Parameters == null)
{
- parameters = new();
+ parameters = [];
}
else
{
- parameters = new(Parameters);
+ parameters = [.. Parameters];
}
if (RequestBody != null)
{
// consumes
- var consumes = RequestBody.Content.Keys.Distinct().ToList();
- if (consumes.Any())
+ var consumes = new HashSet(RequestBody.Content?.Keys.Distinct(StringComparer.OrdinalIgnoreCase) ?? [], StringComparer.OrdinalIgnoreCase);
+ if (consumes.Count > 0)
{
// This is form data. We need to split the request body into multiple parameters.
if (consumes.Contains("application/x-www-form-urlencoded") ||
@@ -261,19 +261,13 @@ public void SerializeAsV2(IOpenApiWriter writer)
parameters.Add(RequestBody.ConvertToBodyParameter());
}
}
- else if (RequestBody.Reference != null)
+ else if (RequestBody.Reference != null && RequestBody.Reference.HostDocument is {} hostDocument)
{
- var hostDocument = RequestBody.Reference.HostDocument;
parameters.Add(
new OpenApiParameterReference(RequestBody.Reference.Id, hostDocument));
-
- if (hostDocument != null)
- {
- consumes = RequestBody.Content.Keys.Distinct().ToList();
- }
}
- if (consumes.Any())
+ if (consumes.Count > 0)
{
writer.WritePropertyName(OpenApiConstants.Consumes);
writer.WriteStartArray();
@@ -289,15 +283,15 @@ public void SerializeAsV2(IOpenApiWriter writer)
{
var produces = Responses
.Where(static r => r.Value.Content != null)
- .SelectMany(static r => r.Value.Content?.Keys)
+ .SelectMany(static r => r.Value.Content?.Keys ?? [])
.Concat(
Responses
.Where(static r => r.Value.Reference is {HostDocument: not null})
- .SelectMany(static r => r.Value.Content?.Keys))
- .Distinct()
- .ToList();
+ .SelectMany(static r => r.Value.Content?.Keys ?? []))
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .ToArray();
- if (produces.Any())
+ if (produces.Length > 0)
{
// produces
writer.WritePropertyName(OpenApiConstants.Produces);
diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
index f3eb6c76f..bdaba739e 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
@@ -5,7 +5,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Helpers;
using Microsoft.OpenApi.Interfaces;
diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs
index c9e5441a9..d2ffa88ed 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs
@@ -650,7 +650,7 @@ internal void WriteAsItemsProperties(IOpenApiWriter writer)
/// The open api writer.
/// The list of required properties in parent schema.
/// The property name that will be serialized.
- internal void SerializeAsV2(
+ internal virtual void SerializeAsV2(
IOpenApiWriter writer,
ISet parentRequiredProperties,
string propertyName)
@@ -846,7 +846,11 @@ where Type.Value.HasFlag(flag)
writer.WriteOptionalCollection(OpenApiConstants.Type, list, (w, s) => w.WriteValue(s));
}
+#if NET5_0_OR_GREATER
+ private static readonly Array jsonSchemaTypeValues = System.Enum.GetValues();
+#else
private static readonly Array jsonSchemaTypeValues = System.Enum.GetValues(typeof(JsonSchemaType));
+#endif
private void DowncastTypeArrayToV2OrV3(JsonSchemaType schemaType, IOpenApiWriter writer, OpenApiSpecVersion version)
{
diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs
index 33a07beda..d9227be25 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs
@@ -17,7 +17,7 @@ public class OpenApiSecurityScheme : IOpenApiReferenceable, IOpenApiExtensible
///
/// REQUIRED. The type of the security scheme. Valid values are "apiKey", "http", "oauth2", "openIdConnect".
///
- public virtual 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.
@@ -32,7 +32,7 @@ public class OpenApiSecurityScheme : IOpenApiReferenceable, IOpenApiExtensible
///
/// REQUIRED. The location of the API key. Valid values are "query", "header" or "cookie".
///
- public virtual ParameterLocation In { get; set; }
+ public virtual ParameterLocation? In { get; set; }
///
/// REQUIRED. The name of the HTTP Authorization scheme to be used
@@ -82,10 +82,10 @@ public OpenApiSecurityScheme() { }
///
public OpenApiSecurityScheme(OpenApiSecurityScheme securityScheme)
{
- Type = securityScheme?.Type ?? Type;
+ Type = securityScheme?.Type;
Description = securityScheme?.Description ?? Description;
Name = securityScheme?.Name ?? Name;
- In = securityScheme?.In ?? In;
+ In = securityScheme?.In;
Scheme = securityScheme?.Scheme ?? Scheme;
BearerFormat = securityScheme?.BearerFormat ?? BearerFormat;
Flows = securityScheme?.Flows != null ? new(securityScheme?.Flows) : null;
@@ -111,7 +111,7 @@ public virtual void SerializeAsV3(IOpenApiWriter writer)
SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0, (writer, element) => element.SerializeAsV3(writer));
}
- internal virtual void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
+ internal virtual void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version,
Action callback)
{
Utils.CheckArgumentNull(writer);
diff --git a/src/Microsoft.OpenApi/Models/OpenApiTag.cs b/src/Microsoft.OpenApi/Models/OpenApiTag.cs
index 8e9321fe8..58fa99694 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiTag.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiTag.cs
@@ -11,7 +11,7 @@ namespace Microsoft.OpenApi.Models
///
/// Tag Object.
///
- public class OpenApiTag : IOpenApiReferenceable, IOpenApiExtensible
+ public class OpenApiTag : IOpenApiSerializable, IOpenApiExtensible
{
///
/// The name of the tag.
@@ -38,11 +38,6 @@ public class OpenApiTag : IOpenApiReferenceable, IOpenApiExtensible
///
public bool UnresolvedReference { get; set; }
- ///
- /// Reference.
- ///
- public OpenApiReference Reference { get; set; }
-
///
/// Parameterless constructor
///
@@ -58,7 +53,6 @@ public OpenApiTag(OpenApiTag tag)
ExternalDocs = tag?.ExternalDocs != null ? new(tag.ExternalDocs) : null;
Extensions = tag?.Extensions != null ? new Dictionary(tag.Extensions) : null;
UnresolvedReference = tag?.UnresolvedReference ?? UnresolvedReference;
- Reference = tag?.Reference != null ? new(tag.Reference) : null;
}
///
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs
index 632aa485f..81985cb12 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs
@@ -12,12 +12,20 @@ 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
+ public class OpenApiCallbackReference : OpenApiCallback, IOpenApiReferenceableWithTarget
{
+#nullable enable
internal OpenApiCallback _target;
private readonly OpenApiReference _reference;
- private OpenApiCallback Target
+ ///
+ /// Gets the target callback.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiCallback Target
+#nullable restore
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs
index 310ff0a8e..c36c43d9a 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs
@@ -12,14 +12,20 @@ namespace Microsoft.OpenApi.Models.References
///
/// Example Object Reference.
///
- public class OpenApiExampleReference : OpenApiExample
+ public class OpenApiExampleReference : OpenApiExample, IOpenApiReferenceableWithTarget
{
internal OpenApiExample _target;
private readonly OpenApiReference _reference;
private string _summary;
private string _description;
- private OpenApiExample Target
+ ///
+ /// Gets the target example.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiExample Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs
index 2ffb0c3de..e8275c23c 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs
@@ -12,13 +12,19 @@ namespace Microsoft.OpenApi.Models.References
///
/// Header Object Reference.
///
- public class OpenApiHeaderReference : OpenApiHeader
+ public class OpenApiHeaderReference : OpenApiHeader, IOpenApiReferenceableWithTarget
{
internal OpenApiHeader _target;
private readonly OpenApiReference _reference;
private string _description;
- private OpenApiHeader Target
+ ///
+ /// Gets the target header.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiHeader Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs
index a3c33503e..05817ddc9 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs
@@ -11,13 +11,19 @@ namespace Microsoft.OpenApi.Models.References
///
/// Link Object Reference.
///
- public class OpenApiLinkReference : OpenApiLink
+ public class OpenApiLinkReference : OpenApiLink, IOpenApiReferenceableWithTarget
{
internal OpenApiLink _target;
private readonly OpenApiReference _reference;
private string _description;
- private OpenApiLink Target
+ ///
+ /// Gets the target link.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiLink Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs
index 2c2a6c90d..9df1e7be2 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs
@@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Models.References
///
/// Parameter Object Reference.
///
- public class OpenApiParameterReference : OpenApiParameter
+ public class OpenApiParameterReference : OpenApiParameter, IOpenApiReferenceableWithTarget
{
internal OpenApiParameter _target;
private readonly OpenApiReference _reference;
@@ -20,7 +20,13 @@ public class OpenApiParameterReference : OpenApiParameter
private bool? _explode;
private ParameterStyle? _style;
- private OpenApiParameter Target
+ ///
+ /// Gets the target parameter.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiParameter Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs
index f757b7a07..fad8922ae 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs
@@ -11,14 +11,20 @@ namespace Microsoft.OpenApi.Models.References
///
/// Path Item Object Reference: to describe the operations available on a single path.
///
- public class OpenApiPathItemReference : OpenApiPathItem
+ public class OpenApiPathItemReference : OpenApiPathItem, IOpenApiReferenceableWithTarget
{
internal OpenApiPathItem _target;
private readonly OpenApiReference _reference;
private string _description;
private string _summary;
- private OpenApiPathItem Target
+ ///
+ /// Gets the target path item.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiPathItem Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs
index 8e3a81ad8..598d70310 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs
@@ -11,13 +11,19 @@ namespace Microsoft.OpenApi.Models.References
///
/// Request Body Object Reference.
///
- public class OpenApiRequestBodyReference : OpenApiRequestBody
+ public class OpenApiRequestBodyReference : OpenApiRequestBody, IOpenApiReferenceableWithTarget
{
internal OpenApiRequestBody _target;
private readonly OpenApiReference _reference;
private string _description;
- private OpenApiRequestBody Target
+ ///
+ /// Gets the target request body.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiRequestBody Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs
index c24652504..0e4ac30ac 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs
@@ -11,13 +11,19 @@ namespace Microsoft.OpenApi.Models.References
///
/// Response Object Reference.
///
- public class OpenApiResponseReference : OpenApiResponse
+ public class OpenApiResponseReference : OpenApiResponse, IOpenApiReferenceableWithTarget
{
internal OpenApiResponse _target;
private readonly OpenApiReference _reference;
private string _description;
- private OpenApiResponse Target
+ ///
+ /// Gets the target response.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiResponse Target
{
get
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
index 011e0b930..da2f9b745 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs
@@ -12,23 +12,76 @@ namespace Microsoft.OpenApi.Models.References
///
/// Schema reference object
///
- public class OpenApiSchemaReference : OpenApiSchema
+ public class OpenApiSchemaReference : OpenApiSchema, IOpenApiReferenceableWithTarget
{
- internal OpenApiSchema _target;
+#nullable enable
+ private OpenApiSchema? _target;
private readonly OpenApiReference _reference;
- private string _description;
- private JsonNode _default;
- private JsonNode _example;
- private IList _examples;
+ private string? _description;
+ private JsonNode? _default;
+ private JsonNode? _example;
+ private IList? _examples;
+ private bool? _nullable;
+ private IDictionary? _properties;
+ private string? _title;
+ private string? _schema;
+ private string? _comment;
+ private string? _id;
+ private string? _dynamicRef;
+ private string? _dynamicAnchor;
+ private IDictionary? _vocabulary;
+ private IDictionary? _definitions;
+ private decimal? _v31ExclusiveMaximum;
+ private decimal? _v31ExclusiveMinimum;
+ private bool? _unEvaluatedProperties;
+ private JsonSchemaType? _type;
+ private string? _const;
+ private string? _format;
+ private decimal? _maximum;
+ private bool? _exclusiveMaximum;
+ private decimal? _minimum;
+ private bool? _exclusiveMinimum;
+ private int? _maxLength;
+ private int? _minLength;
+ private string? _pattern;
+ private decimal? _multipleOf;
+ private bool? _readOnly;
+ private bool? _writeOnly;
+ private IList? _allOf;
+ private IList? _oneOf;
+ private IList? _anyOf;
+ private OpenApiSchema? _not;
+ private ISet? _required;
+ private OpenApiSchema _items;
+ private int? _maxItems;
+ private int? _minItems;
+ private bool? _uniqueItems;
+ private IDictionary? _patternProperties;
+ private int? _maxProperties;
+ private int? _minProperties;
+ private bool? _additionalPropertiesAllowed;
+ private OpenApiSchema? _additionalProperties;
+ private OpenApiDiscriminator? _discriminator;
+ private OpenApiExternalDocs? _externalDocs;
+ private bool? _deprecated;
+ private OpenApiXml? _xml;
+ private IDictionary? _extensions;
+ private bool? _unevaluatedProperties;
+ private IList? _enum;
- private OpenApiSchema Target
+ ///
+ /// Gets the target schema.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiSchema? Target
+#nullable restore
{
get
{
_target ??= Reference.HostDocument?.ResolveReferenceTo(_reference);
- OpenApiSchema resolved = new OpenApiSchema(_target);
- if (!string.IsNullOrEmpty(_description)) resolved.Description = _description;
- return resolved;
+ return _target;
}
}
@@ -69,123 +122,111 @@ internal OpenApiSchemaReference(OpenApiSchema target, string referenceId)
}
///
- public override string Title { get => Target.Title; set => Target.Title = value; }
+ public override string Title { get => string.IsNullOrEmpty(_title) ? Target?.Title : _title; set => _title = value; }
///
- public override string Schema { get => Target.Schema; set => Target.Schema = value; }
+ public override string Schema { get => string.IsNullOrEmpty(_schema) ? Target?.Schema : _schema; set => _schema = value; }
///
- public override string Id { get => Target.Id; set => Target.Id = value; }
+ public override string Id { get => string.IsNullOrEmpty(_id) ? Target?.Id : _id; set => _id = value; }
///
- public override string Comment { get => Target.Comment; set => Target.Comment = value; }
+ public override string Comment { get => string.IsNullOrEmpty(_comment) ? Target?.Comment : _comment; set => _comment = value; }
///
- public override IDictionary Vocabulary { get => Target.Vocabulary; set => Target.Vocabulary = value; }
+ public override IDictionary Vocabulary { get => _vocabulary is not null ? _vocabulary : Target?.Vocabulary; set => _vocabulary = value; }
///
- public override string DynamicRef { get => Target.DynamicRef; set => Target.DynamicRef = value; }
+ public override string DynamicRef { get => string.IsNullOrEmpty(_dynamicRef) ? Target?.DynamicRef : _dynamicRef; set => _dynamicRef = value; }
///
- public override string DynamicAnchor { get => Target.DynamicAnchor; set => Target.DynamicAnchor = value; }
+ public override string DynamicAnchor { get => string.IsNullOrEmpty(_dynamicAnchor) ? Target?.DynamicAnchor : _dynamicAnchor; set => _dynamicAnchor = value; }
///
- public override IDictionary Definitions { get => Target.Definitions; set => Target.Definitions = value; }
+ public override IDictionary Definitions { get => _definitions is not null ? _definitions : Target?.Definitions; set => _definitions = value; }
///
- public override decimal? V31ExclusiveMaximum { get => Target.V31ExclusiveMaximum; set => Target.V31ExclusiveMaximum = value; }
+ public override decimal? V31ExclusiveMaximum { get => _v31ExclusiveMaximum is not null ? _v31ExclusiveMaximum.Value : Target?.V31ExclusiveMaximum; set => _v31ExclusiveMaximum = value; }
///
- public override decimal? V31ExclusiveMinimum { get => Target.V31ExclusiveMinimum; set => Target.V31ExclusiveMinimum = value; }
+ public override decimal? V31ExclusiveMinimum { get => _v31ExclusiveMinimum is not null ? _v31ExclusiveMinimum.Value : Target?.V31ExclusiveMinimum; set => _v31ExclusiveMinimum = value; }
///
- public override bool UnEvaluatedProperties { get => Target.UnEvaluatedProperties; set => Target.UnEvaluatedProperties = value; }
+ public override bool UnEvaluatedProperties { get => _unEvaluatedProperties is not null ? _unEvaluatedProperties.Value : Target?.UnEvaluatedProperties ?? false; set => _unEvaluatedProperties = value; }
///
- public override JsonSchemaType? Type { get => Target.Type; set => Target.Type = value; }
+ public override JsonSchemaType? Type { get => _type is not null ? _type.Value : Target?.Type; set => _type = value; }
///
- public override string Const { get => Target.Const; set => Target.Const = value; }
+ public override string Const { get => string.IsNullOrEmpty(_const) ? Target?.Const : _const; set => _const = value; }
///
- public override string Format { get => Target.Format; set => Target.Format = value; }
+ public override string Format { get => string.IsNullOrEmpty(_format) ? Target?.Format : _format; set => _format = value; }
///
public override string Description
{
- get => string.IsNullOrEmpty(_description) ? Target.Description : _description;
+ get => string.IsNullOrEmpty(_description) ? Target?.Description : _description;
set => _description = value;
}
///
- public override decimal? Maximum { get => Target.Maximum; set => Target.Maximum = value; }
+ public override decimal? Maximum { get => _maximum is not null ? _maximum : Target?.Maximum; set => _maximum = value; }
///
- public override bool? ExclusiveMaximum { get => Target.ExclusiveMaximum; set => Target.ExclusiveMaximum = value; }
+ public override bool? ExclusiveMaximum { get => _exclusiveMaximum is not null ? _exclusiveMaximum : Target?.ExclusiveMaximum; set => _exclusiveMaximum = value; }
///
- public override decimal? Minimum { get => Target.Minimum; set => Target.Minimum = value; }
+ public override decimal? Minimum { get => _minimum is not null ? _minimum : Target?.Minimum; set => _minimum = value; }
///
- public override bool? ExclusiveMinimum { get => Target.ExclusiveMinimum; set => Target.ExclusiveMinimum = value; }
+ public override bool? ExclusiveMinimum { get => _exclusiveMinimum is not null ? _exclusiveMinimum : Target?.ExclusiveMinimum; set => _exclusiveMinimum = value; }
///
- public override int? MaxLength { get => Target.MaxLength; set => Target.MaxLength = value; }
+ public override int? MaxLength { get => _maxLength is not null ? _maxLength : Target?.MaxLength; set => _maxLength = value; }
///
- public override int? MinLength { get => Target.MinLength; set => Target.MinLength = value; }
+ public override int? MinLength { get => _minLength is not null ? _minLength : Target?.MinLength; set => _minLength = value; }
///
- public override string Pattern { get => Target.Pattern; set => Target.Pattern = value; }
+ public override string Pattern { get => string.IsNullOrEmpty(_pattern) ? Target?.Pattern : _pattern; set => _pattern = value; }
///
- public override decimal? MultipleOf { get => Target.MultipleOf; set => Target.MultipleOf = value; }
+ public override decimal? MultipleOf { get => _multipleOf is not null ? _multipleOf : Target?.MultipleOf; set => _multipleOf = value; }
///
- public override JsonNode Default
- {
- get => _default ??= Target.Default;
- set => _default = value;
- }
+ public override JsonNode Default { get => _default is not null ? _default : Target?.Default; set => _default = value; }
///
- public override bool ReadOnly { get => Target.ReadOnly; set => Target.ReadOnly = value; }
+ public override bool ReadOnly { get => _readOnly is not null ? _readOnly.Value : Target?.ReadOnly ?? false; set => _readOnly = value; }
///
- public override bool WriteOnly { get => Target.WriteOnly; set => Target.WriteOnly = value; }
+ public override bool WriteOnly { get => _writeOnly is not null ? _writeOnly.Value : Target?.WriteOnly ?? false; set => _writeOnly = value; }
///
- public override IList AllOf { get => Target.AllOf; set => Target.AllOf = value; }
+ public override IList AllOf { get => _allOf is not null ? _allOf : Target?.AllOf; set => _allOf = value; }
///
- public override IList OneOf { get => Target.OneOf; set => Target.OneOf = value; }
+ public override IList OneOf { get => _oneOf is not null ? _oneOf : Target?.OneOf; set => _oneOf = value; }
///
- public override IList AnyOf { get => Target.AnyOf; set => Target.AnyOf = value; }
+ public override IList AnyOf { get => _anyOf is not null ? _anyOf : Target?.AnyOf; set => _anyOf = value; }
///
- public override OpenApiSchema Not { get => Target.Not; set => Target.Not = value; }
+ public override OpenApiSchema Not { get => _not is not null ? _not : Target?.Not; set => _not = value; }
///
- public override ISet Required { get => Target.Required; set => Target.Required = value; }
+ public override ISet Required { get => _required is not null ? _required : Target?.Required; set => _required = value; }
///
- public override OpenApiSchema Items { get => Target.Items; set => Target.Items = value; }
+ public override OpenApiSchema Items { get => _items is not null ? _items : Target?.Items; set => _items = value; }
///
- public override int? MaxItems { get => Target.MaxItems; set => Target.MaxItems = value; }
+ public override int? MaxItems { get => _maxItems is not null ? _maxItems : Target?.MaxItems; set => _maxItems = value; }
///
- public override int? MinItems { get => Target.MinItems; set => Target.MinItems = value; }
+ public override int? MinItems { get => _minItems is not null ? _minItems : Target?.MinItems; set => _minItems = value; }
///
- public override bool? UniqueItems { get => Target.UniqueItems; set => Target.UniqueItems = value; }
+ public override bool? UniqueItems { get => _uniqueItems is not null ? _uniqueItems : Target?.UniqueItems; set => _uniqueItems = value; }
///
- public override IDictionary Properties { get => Target.Properties; set => Target.Properties = value; }
+ public override IDictionary Properties { get => _properties is not null ? _properties : Target?.Properties; set => _properties = value; }
///
- public override IDictionary PatternProperties { get => Target.PatternProperties; set => Target.PatternProperties = value; }
+ public override IDictionary PatternProperties { get => _patternProperties is not null ? _patternProperties : Target?.PatternProperties; set => _patternProperties = value; }
///
- public override int? MaxProperties { get => Target.MaxProperties; set => Target.MaxProperties = value; }
+ public override int? MaxProperties { get => _maxProperties is not null ? _maxProperties : Target?.MaxProperties; set => _maxProperties = value; }
///
- public override int? MinProperties { get => Target.MinProperties; set => Target.MinProperties = value; }
+ public override int? MinProperties { get => _minProperties is not null ? _minProperties : Target?.MinProperties; set => _minProperties = value; }
///
- public override bool AdditionalPropertiesAllowed { get => Target.AdditionalPropertiesAllowed; set => Target.AdditionalPropertiesAllowed = value; }
+ public override bool AdditionalPropertiesAllowed { get => _additionalPropertiesAllowed is not null ? _additionalPropertiesAllowed.Value : Target?.AdditionalPropertiesAllowed ?? true; set => _additionalPropertiesAllowed = value; }
///
- public override OpenApiSchema AdditionalProperties { get => Target.AdditionalProperties; set => Target.AdditionalProperties = value; }
+ public override OpenApiSchema AdditionalProperties { get => _additionalProperties is not null ? _additionalProperties : Target?.AdditionalProperties; set => _additionalProperties = value; }
///
- public override OpenApiDiscriminator Discriminator { get => Target.Discriminator; set => Target.Discriminator = value; }
+ public override OpenApiDiscriminator Discriminator { get => _discriminator is not null ? _discriminator : Target?.Discriminator; set => _discriminator = value; }
///
- public override JsonNode Example
- {
- get => _example ??= Target.Example;
- set => _example = value;
- }
+ public override JsonNode Example { get => _example is not null ? _example : Target?.Example; set => _example = value; }
///
- public override IList Examples
- {
- get => _examples ??= Target.Examples;
- set => Target.Examples = value;
- }
+ public override IList Examples { get => _examples is not null ? _examples : Target?.Examples; set => _examples = value; }
///
- public override IList Enum { get => Target.Enum; set => Target.Enum = value; }
+ public override IList Enum { get => _enum is not null ? _enum : Target?.Enum; set => _enum = value; }
///
- public override bool Nullable { get => Target.Nullable; set => Target.Nullable = value; }
+ public override bool Nullable { get => _nullable is not null ? _nullable.Value : Target?.Nullable ?? false; set => _nullable = value; }
///
- public override bool UnevaluatedProperties { get => Target.UnevaluatedProperties; set => Target.UnevaluatedProperties = value; }
+ public override bool UnevaluatedProperties { get => _unevaluatedProperties is not null ? _unevaluatedProperties.Value : Target?.UnevaluatedProperties ?? false; set => _unevaluatedProperties = value; }
///
- public override OpenApiExternalDocs ExternalDocs { get => Target.ExternalDocs; set => Target.ExternalDocs = value; }
+ public override OpenApiExternalDocs ExternalDocs { get => _externalDocs is not null ? _externalDocs : Target?.ExternalDocs; set => _externalDocs = value; }
///
- public override bool Deprecated { get => Target.Deprecated; set => Target.Deprecated = value; }
+ public override bool Deprecated { get => _deprecated is not null ? _deprecated.Value : Target?.Deprecated ?? false; set => _deprecated = value; }
///
- public override OpenApiXml Xml { get => Target.Xml; set => Target.Xml = value; }
+ public override OpenApiXml Xml { get => _xml is not null ? _xml : Target?.Xml; set => _xml = value; }
///
- public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; }
+ public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; }
///
public override void SerializeAsV31(IOpenApiWriter writer)
@@ -222,18 +263,33 @@ public override void SerializeAsV3(IOpenApiWriter writer)
_reference.SerializeAsV3(writer);
return;
}
-
+
SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer));
writer.GetSettings().LoopDetector.PopLoop();
}
+ ///
+ internal override void SerializeAsV2(
+ IOpenApiWriter writer,
+ ISet parentRequiredProperties,
+ string propertyName)
+ {
+ if (!writer.GetSettings().ShouldInlineReference(_reference))
+ {
+ _reference.SerializeAsV2(writer);
+ }
+ else
+ {
+ base.SerializeAsV2(writer, parentRequiredProperties, propertyName);
+ }
+ }
+
///
public override void SerializeAsV2(IOpenApiWriter writer)
{
if (!writer.GetSettings().ShouldInlineReference(_reference))
{
_reference.SerializeAsV2(writer);
- return;
}
else
{
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
index e635de6f9..dcd5009b1 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
@@ -11,13 +11,19 @@ namespace Microsoft.OpenApi.Models.References
///
/// Security Scheme Object Reference.
///
- public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme
+ public class OpenApiSecuritySchemeReference : OpenApiSecurityScheme, IOpenApiReferenceableWithTarget
{
internal OpenApiSecurityScheme _target;
private readonly OpenApiReference _reference;
private string _description;
- private OpenApiSecurityScheme Target
+ ///
+ /// Gets the target security scheme.
+ ///
+ ///
+ /// If the reference is not resolved, this will return null.
+ ///
+ public OpenApiSecurityScheme Target
{
get
{
@@ -71,7 +77,7 @@ public override string Description
public override string Name { get => Target.Name; set => Target.Name = value; }
///
- public override ParameterLocation In { get => Target.In; set => Target.In = value; }
+ public override ParameterLocation? In { get => Target.In; set => Target.In = value; }
///
public override string Scheme { get => Target.Scheme; set => Target.Scheme = value; }
@@ -89,7 +95,7 @@ public override string Description
public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; }
///
- public override SecuritySchemeType Type { get => Target.Type; set => Target.Type = value; }
+ public override SecuritySchemeType? Type { get => Target.Type; set => Target.Type = value; }
///
public override void SerializeAsV3(IOpenApiWriter writer)
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs
index 664f784f3..ae15b4085 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiTagReference.cs
@@ -1,7 +1,9 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
+using System;
using System.Collections.Generic;
+using System.Linq;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Writers;
@@ -10,21 +12,24 @@ namespace Microsoft.OpenApi.Models.References
///
/// Tag Object Reference
///
- public class OpenApiTagReference : OpenApiTag
+ public class OpenApiTagReference : OpenApiTag, IOpenApiReferenceableWithTarget
{
internal OpenApiTag _target;
- private readonly OpenApiReference _reference;
- private string _description;
- private OpenApiTag Target
+ ///
+ /// Reference.
+ ///
+ public OpenApiReference Reference { get; set; }
+
+ ///
+ /// Resolved target of the reference.
+ ///
+ public OpenApiTag Target
{
get
{
- _target ??= Reference.HostDocument?.ResolveReferenceTo(_reference);
- _target ??= new OpenApiTag() { Name = _reference.Id };
- OpenApiTag resolved = new OpenApiTag(_target);
- if (!string.IsNullOrEmpty(_description)) resolved.Description = _description;
- return resolved;
+ _target ??= Reference.HostDocument?.Tags.FirstOrDefault(t => StringComparer.Ordinal.Equals(t.Name, Reference.Id));
+ return _target;
}
}
@@ -37,50 +42,43 @@ public OpenApiTagReference(string referenceId, OpenApiDocument hostDocument)
{
Utils.CheckArgumentNullOrEmpty(referenceId);
- _reference = new OpenApiReference()
+ Reference = new OpenApiReference()
{
Id = referenceId,
HostDocument = hostDocument,
Type = ReferenceType.Tag
};
-
- Reference = _reference;
}
- internal OpenApiTagReference(OpenApiTag target, string referenceId)
+ ///
+ /// Copy Constructor
+ ///
+ /// The source to copy information from.
+ public OpenApiTagReference(OpenApiTagReference source):base()
{
- _target = target;
-
- _reference = new OpenApiReference()
- {
- Id = referenceId,
- Type = ReferenceType.Tag,
- };
+ Reference = source?.Reference != null ? new(source.Reference) : null;
+ _target = source?._target;
}
+ private const string ReferenceErrorMessage = "Setting the value from the reference is not supported, use the target property instead.";
///
- public override string Description
- {
- get => string.IsNullOrEmpty(_description) ? Target?.Description : _description;
- set => _description = value;
- }
+ public override string Description { get => Target.Description; set => throw new InvalidOperationException(ReferenceErrorMessage); }
///
- public override OpenApiExternalDocs ExternalDocs { get => Target?.ExternalDocs; set => Target.ExternalDocs = value; }
+ public override OpenApiExternalDocs ExternalDocs { get => Target.ExternalDocs; set => throw new InvalidOperationException(ReferenceErrorMessage); }
///
- public override IDictionary Extensions { get => Target?.Extensions; set => Target.Extensions = value; }
+ public override IDictionary Extensions { get => Target.Extensions; set => throw new InvalidOperationException(ReferenceErrorMessage); }
///
- public override string Name { get => Target?.Name; set => Target.Name = value; }
+ public override string Name { get => Target.Name; set => throw new InvalidOperationException(ReferenceErrorMessage); }
///
public override void SerializeAsV3(IOpenApiWriter writer)
{
- if (!writer.GetSettings().ShouldInlineReference(_reference))
+ if (!writer.GetSettings().ShouldInlineReference(Reference))
{
- _reference.SerializeAsV3(writer);
- return;
+ Reference.SerializeAsV3(writer);
}
else
{
@@ -91,10 +89,9 @@ public override void SerializeAsV3(IOpenApiWriter writer)
///
public override void SerializeAsV31(IOpenApiWriter writer)
{
- if (!writer.GetSettings().ShouldInlineReference(_reference))
+ if (!writer.GetSettings().ShouldInlineReference(Reference))
{
- _reference.SerializeAsV31(writer);
- return;
+ Reference.SerializeAsV31(writer);
}
else
{
@@ -105,10 +102,9 @@ public override void SerializeAsV31(IOpenApiWriter writer)
///
public override void SerializeAsV2(IOpenApiWriter writer)
{
- if (!writer.GetSettings().ShouldInlineReference(_reference))
+ if (!writer.GetSettings().ShouldInlineReference(Reference))
{
- _reference.SerializeAsV2(writer);
- return;
+ Reference.SerializeAsV2(writer);
}
else
{
@@ -119,7 +115,7 @@ public override void SerializeAsV2(IOpenApiWriter writer)
///
private void SerializeInternal(IOpenApiWriter writer)
{
- Utils.CheckArgumentNull(writer);;
+ Utils.CheckArgumentNull(writer);
writer.WriteValue(Name);
}
}
diff --git a/src/Microsoft.OpenApi/Models/RuntimeExpressionAnyWrapper.cs b/src/Microsoft.OpenApi/Models/RuntimeExpressionAnyWrapper.cs
index dca24c3e5..35a08a422 100644
--- a/src/Microsoft.OpenApi/Models/RuntimeExpressionAnyWrapper.cs
+++ b/src/Microsoft.OpenApi/Models/RuntimeExpressionAnyWrapper.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Expressions;
using Microsoft.OpenApi.Helpers;
using Microsoft.OpenApi.Interfaces;
diff --git a/src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs b/src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs
index 9f09bb457..5340d2aef 100644
--- a/src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs
+++ b/src/Microsoft.OpenApi/Reader/OpenApiDiagnostic.cs
@@ -48,26 +48,26 @@ public void AppendDiagnostic(OpenApiDiagnostic diagnosticToAdd, string fileNameT
}
}
}
-}
-///
-/// Extension class for IList to add the Method "AddRange" used above
-///
-public static class IDiagnosticExtensions
-{
///
- /// Extension method for IList so that another list can be added to the current list.
+ /// Extension class for IList to add the Method "AddRange" used above
///
- ///
- ///
- ///
- public static void AddRange(this ICollection collection, IEnumerable enumerable)
+ internal static class IDiagnosticExtensions
{
- if (collection is null || enumerable is null) return;
-
- foreach (var cur in enumerable)
+ ///
+ /// Extension method for IList so that another list can be added to the current list.
+ ///
+ ///
+ ///
+ ///
+ public static void AddRange(this ICollection collection, IEnumerable enumerable)
{
- collection.Add(cur);
+ if (collection is null || enumerable is null) return;
+
+ foreach (var cur in enumerable)
+ {
+ collection.Add(cur);
+ }
}
}
}
diff --git a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs
index 71cf3f8c3..4aad45278 100644
--- a/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs
+++ b/src/Microsoft.OpenApi/Reader/OpenApiJsonReader.cs
@@ -148,10 +148,12 @@ public async Task ReadAsync(Stream input,
///
public T ReadFragment(MemoryStream input,
OpenApiSpecVersion version,
+ OpenApiDocument openApiDocument,
out OpenApiDiagnostic diagnostic,
OpenApiReaderSettings settings = null) where T : IOpenApiElement
{
- if (input is null) throw new ArgumentNullException(nameof(input));
+ Utils.CheckArgumentNull(input);
+ Utils.CheckArgumentNull(openApiDocument);
JsonNode jsonNode;
@@ -167,12 +169,13 @@ public T ReadFragment(MemoryStream input,
return default;
}
- return ReadFragment(jsonNode, version, out diagnostic);
+ return ReadFragment(jsonNode, version, openApiDocument, out diagnostic);
}
///
public T ReadFragment(JsonNode input,
OpenApiSpecVersion version,
+ OpenApiDocument openApiDocument,
out OpenApiDiagnostic diagnostic,
OpenApiReaderSettings settings = null) where T : IOpenApiElement
{
@@ -187,7 +190,7 @@ public T ReadFragment(JsonNode input,
try
{
// Parse the OpenAPI element
- element = context.ParseFragment(input, version);
+ element = context.ParseFragment(input, version, openApiDocument);
}
catch (OpenApiException ex)
{
diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs
index 31b939548..33bea8fb5 100644
--- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs
+++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs
@@ -61,14 +61,15 @@ public static ReadResult Load(MemoryStream stream,
/// Stream containing OpenAPI description to parse.
/// Version of the OpenAPI specification that the fragment conforms to.
///
+ /// The OpenApiDocument object to which the fragment belongs, used to lookup references.
/// Returns diagnostic object containing errors detected during parsing.
/// The OpenApiReader settings.
/// Instance of newly created IOpenApiElement.
/// The OpenAPI element.
- public static T Load(MemoryStream input, OpenApiSpecVersion version, string format, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement
+ public static T Load(MemoryStream input, OpenApiSpecVersion version, string format, OpenApiDocument openApiDocument, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement
{
format ??= InspectStreamFormat(input);
- return OpenApiReaderRegistry.GetReader(format).ReadFragment(input, version, out diagnostic, settings);
+ return OpenApiReaderRegistry.GetReader(format).ReadFragment(input, version, openApiDocument, out diagnostic, settings);
}
///
@@ -91,13 +92,14 @@ public static async Task LoadAsync(string url, OpenApiReaderSettings
/// The path to the OpenAPI file
/// Version of the OpenAPI specification that the fragment conforms to.
/// The OpenApiReader settings.
+ /// The OpenApiDocument object to which the fragment belongs, used to lookup references.
///
/// Instance of newly created IOpenApiElement.
/// The OpenAPI element.
- public static async Task LoadAsync(string url, OpenApiSpecVersion version, OpenApiReaderSettings settings = null, CancellationToken token = default) where T : IOpenApiElement
+ public static async Task LoadAsync(string url, OpenApiSpecVersion version, OpenApiDocument openApiDocument, OpenApiReaderSettings settings = null, CancellationToken token = default) where T : IOpenApiElement
{
var (stream, format) = await RetrieveStreamAndFormatAsync(url, token).ConfigureAwait(false);
- return await LoadAsync(stream, version, format, settings, token);
+ return await LoadAsync(stream, version, openApiDocument, format, settings, token);
}
///
@@ -129,7 +131,11 @@ public static async Task LoadAsync(Stream input, string format = nul
var result = await InternalLoadAsync(preparedStream, format, settings, cancellationToken).ConfigureAwait(false);
if (!settings.LeaveStreamOpen)
{
+#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER
+ await input.DisposeAsync().ConfigureAwait(false);
+#else
input.Dispose();
+#endif
}
return result;
}
@@ -141,27 +147,30 @@ public static async Task LoadAsync(Stream input, string format = nul
///
///
///
+ /// The document used to lookup tag or schema references.
///
///
///
///
public static async Task LoadAsync(Stream input,
OpenApiSpecVersion version,
+ OpenApiDocument openApiDocument,
string format = null,
OpenApiReaderSettings settings = null,
CancellationToken token = default) where T : IOpenApiElement
{
+ Utils.CheckArgumentNull(openApiDocument);
if (input is null) throw new ArgumentNullException(nameof(input));
if (input is MemoryStream memoryStream)
{
- return Load(memoryStream, version, format, out var _, settings);
+ return Load(memoryStream, version, format, openApiDocument, out var _, settings);
}
else
{
memoryStream = new MemoryStream();
await input.CopyToAsync(memoryStream, 81920, token).ConfigureAwait(false);
memoryStream.Position = 0;
- return Load(memoryStream, version, format, out var _, settings);
+ return Load(memoryStream, version, format, openApiDocument, out var _, settings);
}
}
@@ -191,12 +200,14 @@ public static ReadResult Parse(string input,
///
/// The input string.
///
+ /// The OpenApiDocument object to which the fragment belongs, used to lookup references.
/// The diagnostic entity containing information from the reading process.
/// The Open API format
/// The OpenApi reader settings.
/// An OpenAPI document instance.
public static T Parse(string input,
OpenApiSpecVersion version,
+ OpenApiDocument openApiDocument,
out OpenApiDiagnostic diagnostic,
string format = null,
OpenApiReaderSettings settings = null) where T : IOpenApiElement
@@ -205,7 +216,7 @@ public static T Parse(string input,
format ??= InspectInputFormat(input);
settings ??= new OpenApiReaderSettings();
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input));
- return Load(stream, version, format, out diagnostic, settings);
+ return Load(stream, version, format, openApiDocument, out diagnostic, settings);
}
private static readonly OpenApiReaderSettings DefaultReaderSettings = new();
diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs
index e1eea86a1..b86b5a9c6 100644
--- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs
+++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Concurrent;
-using System.Collections.Generic;
using Microsoft.OpenApi.Interfaces;
namespace Microsoft.OpenApi.Reader
diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs
index fa0040ff8..33f03eedb 100644
--- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs
+++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs
@@ -5,7 +5,6 @@
using System.Collections.Generic;
using System.IO;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.MicrosoftExtensions;
using Microsoft.OpenApi.Validations;
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs
index ad8394b58..92dd24138 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyFieldMapParameter.cs
@@ -3,7 +3,6 @@
using System;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Reader.ParseNodes
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs
index a4dc41b7f..4d365125b 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/AnyMapFieldMapParameter.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
namespace Microsoft.OpenApi.Reader.ParseNodes
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs
index 6654344cd..96235271e 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/ListNode.cs
@@ -6,7 +6,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Models;
@@ -22,7 +21,7 @@ public ListNode(ParsingContext context, JsonArray jsonArray) : base(
_nodeList = jsonArray;
}
- public override List CreateList(Func map, OpenApiDocument hostDocument = null)
+ public override List CreateList(Func map, OpenApiDocument hostDocument)
{
if (_nodeList == null)
{
@@ -44,14 +43,14 @@ public override List CreateListOfAny()
return list;
}
- public override List CreateSimpleList(Func map)
+ public override List CreateSimpleList(Func map, OpenApiDocument openApiDocument)
{
if (_nodeList == null)
{
throw new OpenApiReaderException($"Expected list while parsing {typeof(T).Name}", _nodeList);
}
- return _nodeList.Select(n => map(new(Context, n), null)).ToList();
+ return _nodeList.Select(n => map(new(Context, n), openApiDocument)).ToList();
}
public IEnumerator GetEnumerator()
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs
index 919f1d85c..f39d9c345 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/MapNode.cs
@@ -8,6 +8,7 @@
using System.Linq;
using System.Text.Json;
using System.Text.Json.Nodes;
+using System.Text.Json.Serialization;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Interfaces;
@@ -48,7 +49,7 @@ public PropertyNode this[string key]
}
}
- public override Dictionary CreateMap(Func map, OpenApiDocument hostDocument = null)
+ public override Dictionary CreateMap(Func map, OpenApiDocument hostDocument)
{
var jsonMap = _node ?? throw new OpenApiReaderException($"Expected map while parsing {typeof(T).Name}", Context);
var nodes = jsonMap.Select(
@@ -114,7 +115,7 @@ IEnumerator IEnumerable.GetEnumerator()
public override string GetRaw()
{
- var x = JsonSerializer.Serialize(_node);
+ var x = JsonSerializer.Serialize(_node, SourceGenerationContext.Default.JsonObject);
return x;
}
@@ -176,4 +177,7 @@ public override JsonNode CreateAny()
return _node;
}
}
+
+ [JsonSerializable(typeof(JsonObject))]
+ internal partial class SourceGenerationContext : JsonSerializerContext { }
}
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs
index 44d626f35..9fbf3f47a 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/ParseNode.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Models;
@@ -47,17 +46,17 @@ public static ParseNode Create(ParsingContext context, JsonNode node)
return new ValueNode(context, node as JsonValue);
}
- public virtual List CreateList(Func map, OpenApiDocument hostDocument = null)
+ public virtual List CreateList(Func map, OpenApiDocument hostDocument)
{
throw new OpenApiReaderException("Cannot create list from this type of node.", Context);
}
- public virtual Dictionary CreateMap(Func map, OpenApiDocument hostDocument = null)
+ public virtual Dictionary CreateMap(Func map, OpenApiDocument hostDocument)
{
throw new OpenApiReaderException("Cannot create map from this type of node.", Context);
}
- public virtual List CreateSimpleList(Func map)
+ public virtual List CreateSimpleList(Func map, OpenApiDocument openApiDocument)
{
throw new OpenApiReaderException("Cannot create simple list from this type of node.", Context);
}
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs
index 5f8031e87..9517e5363 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/PropertyNode.cs
@@ -5,7 +5,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Models;
@@ -28,7 +27,7 @@ public void ParseField(
T parentInstance,
IDictionary> fixedFields,
IDictionary, Action> patternFields,
- OpenApiDocument hostDocument = null)
+ OpenApiDocument hostDocument)
{
if (fixedFields.TryGetValue(Name, out var fixedFieldMap))
{
diff --git a/src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs b/src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs
index ec9fefde5..f83d2ba66 100644
--- a/src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs
+++ b/src/Microsoft.OpenApi/Reader/ParseNodes/ValueNode.cs
@@ -4,7 +4,6 @@
using System;
using System.Globalization;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
namespace Microsoft.OpenApi.Reader.ParseNodes
diff --git a/src/Microsoft.OpenApi/Reader/ParsingContext.cs b/src/Microsoft.OpenApi/Reader/ParsingContext.cs
index 7a8b07244..485686e89 100644
--- a/src/Microsoft.OpenApi/Reader/ParsingContext.cs
+++ b/src/Microsoft.OpenApi/Reader/ParsingContext.cs
@@ -5,7 +5,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Nodes;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
@@ -105,8 +104,9 @@ public OpenApiDocument Parse(JsonNode jsonNode)
///
///
/// OpenAPI version of the fragment
+ /// The OpenApiDocument object to which the fragment belongs, used to lookup references.
/// An OpenApiDocument populated based on the passed yamlDocument
- public T ParseFragment(JsonNode jsonNode, OpenApiSpecVersion version) where T : IOpenApiElement
+ public T ParseFragment(JsonNode jsonNode, OpenApiSpecVersion version, OpenApiDocument openApiDocument) where T : IOpenApiElement
{
var node = ParseNode.Create(this, jsonNode);
@@ -116,16 +116,16 @@ public T ParseFragment(JsonNode jsonNode, OpenApiSpecVersion version) where T
{
case OpenApiSpecVersion.OpenApi2_0:
VersionService = new OpenApiV2VersionService(Diagnostic);
- element = this.VersionService.LoadElement(node);
+ element = this.VersionService.LoadElement(node, openApiDocument);
break;
case OpenApiSpecVersion.OpenApi3_0:
this.VersionService = new OpenApiV3VersionService(Diagnostic);
- element = this.VersionService.LoadElement(node);
+ element = this.VersionService.LoadElement(node, openApiDocument);
break;
case OpenApiSpecVersion.OpenApi3_1:
this.VersionService = new OpenApiV31VersionService(Diagnostic);
- element = this.VersionService.LoadElement(node);
+ element = this.VersionService.LoadElement(node, openApiDocument);
break;
}
diff --git a/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs b/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs
index 746ca0c96..bb230c4a9 100644
--- a/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs
+++ b/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System;
-using System.ComponentModel;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
@@ -17,7 +16,7 @@ namespace Microsoft.OpenApi.Reader.Services
public class DefaultStreamLoader : IStreamLoader
{
private readonly Uri baseUrl;
- private HttpClient _httpClient = new();
+ private readonly HttpClient _httpClient = new();
///
/// The default stream loader
@@ -27,16 +26,6 @@ public DefaultStreamLoader(Uri baseUrl)
{
this.baseUrl = baseUrl;
}
-///
-
- [Obsolete]
- [EditorBrowsable(EditorBrowsableState.Never)]
- public Stream Load(Uri uri)
- {
-#pragma warning disable VSTHRD002 // Avoid problematic synchronous waits
- return LoadAsync(uri).GetAwaiter().GetResult();
-#pragma warning restore VSTHRD002 // Avoid problematic synchronous waits
- }
///
/// Use Uri to locate data and convert into an input object.
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs
index 2cb8dea9c..d225899cc 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiContactDeserializer.cs
@@ -35,7 +35,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiContact LoadContact(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiContact LoadContact(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node as MapNode;
var contact = new OpenApiContact();
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs
index f33d98465..37e146793 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs
@@ -28,16 +28,16 @@ internal static partial class OpenApiV2Deserializer
{"host", (_, n, _) => n.Context.SetTempStorage("host", n.GetScalarValue())},
{"basePath", (_, n, _) => n.Context.SetTempStorage("basePath", n.GetScalarValue())},
{
- "schemes", (_, n, _) => n.Context.SetTempStorage(
+ "schemes", (_, n, doc) => n.Context.SetTempStorage(
"schemes",
n.CreateSimpleList(
- (s, p) => s.GetScalarValue()))
+ (s, p) => s.GetScalarValue(), doc))
},
{
"consumes",
- (_, n, _) =>
+ (_, n, doc) =>
{
- var consumes = n.CreateSimpleList((s, p) => s.GetScalarValue());
+ var consumes = n.CreateSimpleList((s, p) => s.GetScalarValue(), doc);
if (consumes.Count > 0)
{
n.Context.SetTempStorage(TempStorageKeys.GlobalConsumes, consumes);
@@ -45,8 +45,8 @@ internal static partial class OpenApiV2Deserializer
}
},
{
- "produces", (_, n, _) => {
- var produces = n.CreateSimpleList((s, p) => s.GetScalarValue());
+ "produces", (_, n, doc) => {
+ var produces = n.CreateSimpleList((s, p) => s.GetScalarValue(), doc);
if (produces.Count > 0)
{
n.Context.SetTempStorage(TempStorageKeys.GlobalProduces, produces);
@@ -64,12 +64,9 @@ internal static partial class OpenApiV2Deserializer
},
{
"parameters",
- (o, n, _) =>
+ (o, n, doc) =>
{
- if (o.Components == null)
- {
- o.Components = new();
- }
+ o.Components ??= new();
o.Components.Parameters = n.CreateMap(LoadParameter, o);
@@ -77,7 +74,8 @@ internal static partial class OpenApiV2Deserializer
{
var parameter = LoadParameter(node: p, loadRequestBody: true, hostDocument: d);
return parameter != null ? CreateRequestBody(p.Context, parameter) : null;
- }
+ },
+ doc
);
}
},
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs
index 8e90fb4e7..6fc438542 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiExternalDocsDeserializer.cs
@@ -33,7 +33,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiExternalDocs LoadExternalDocs(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiExternalDocs LoadExternalDocs(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("externalDocs");
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs
index b4ddf7300..4a994bdc5 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiHeaderDeserializer.cs
@@ -32,7 +32,7 @@ internal static partial class OpenApiV2Deserializer
},
{
"items",
- (o, n, _) => GetOrCreateSchema(o).Items = LoadSchema(n)
+ (o, n, doc) => GetOrCreateSchema(o).Items = LoadSchema(n, doc)
},
{
"collectionFormat",
@@ -102,14 +102,14 @@ private static OpenApiSchema GetOrCreateSchema(OpenApiHeader p)
return p.Schema ??= new();
}
- public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("header");
var header = new OpenApiHeader();
foreach (var property in mapNode)
{
- property.ParseField(header, _headerFixedFields, _headerPatternFields);
+ property.ParseField(header, _headerFixedFields, _headerPatternFields, hostDocument);
}
var schema = node.Context.GetFromTempStorage("schema");
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs
index 90a8535b1..74c3ac917 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiInfoDeserializer.cs
@@ -47,7 +47,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiInfo LoadInfo(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiInfo LoadInfo(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Info");
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs
index f1f7a7b93..8eae690ed 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiLicenseDeserializer.cs
@@ -31,7 +31,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiLicense LoadLicense(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiLicense LoadLicense(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("OpenApiLicense");
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs
index d65f7a16b..35d20ca4a 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiOperationDeserializer.cs
@@ -24,8 +24,7 @@ internal static partial class OpenApiV2Deserializer
"tags", (o, n, doc) => o.Tags = n.CreateSimpleList(
(valueNode, doc) =>
LoadTagByReference(
- valueNode.Context,
- valueNode.GetScalarValue(), doc))
+ valueNode.GetScalarValue(), doc), doc)
},
{
"summary",
@@ -48,16 +47,16 @@ internal static partial class OpenApiV2Deserializer
(o, n, t) => o.Parameters = n.CreateList(LoadParameter, t)
},
{
- "consumes", (_, n, _) => {
- var consumes = n.CreateSimpleList((s, p) => s.GetScalarValue());
+ "consumes", (_, n, doc) => {
+ var consumes = n.CreateSimpleList((s, p) => s.GetScalarValue(), doc);
if (consumes.Count > 0) {
n.Context.SetTempStorage(TempStorageKeys.OperationConsumes,consumes);
}
}
},
{
- "produces", (_, n, _) => {
- var produces = n.CreateSimpleList((s, p) => s.GetScalarValue());
+ "produces", (_, n, doc) => {
+ var produces = n.CreateSimpleList((s, p) => s.GetScalarValue(), doc);
if (produces.Count > 0) {
n.Context.SetTempStorage(TempStorageKeys.OperationProduces, produces);
}
@@ -92,7 +91,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument hostDocument = null)
+ internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument hostDocument)
{
// Reset these temp storage parameters for each operation.
node.Context.SetTempStorage(TempStorageKeys.BodyParameter, null);
@@ -132,7 +131,7 @@ internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument h
return operation;
}
- public static OpenApiResponses LoadResponses(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiResponses LoadResponses(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Responses");
@@ -205,9 +204,8 @@ internal static OpenApiRequestBody CreateRequestBody(
return requestBody;
}
- private static OpenApiTag LoadTagByReference(
- ParsingContext context,
- string tagName, OpenApiDocument hostDocument = null)
+ private static OpenApiTagReference LoadTagByReference(
+ string tagName, OpenApiDocument hostDocument)
{
return new OpenApiTagReference(tagName, hostDocument);
}
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs
index 149c00fd3..6a5411070 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiParameterDeserializer.cs
@@ -50,7 +50,7 @@ internal static partial class OpenApiV2Deserializer
},
{
"items",
- (o, n, t) => GetOrCreateSchema(o).Items = LoadSchema(n)
+ (o, n, t) => GetOrCreateSchema(o).Items = LoadSchema(n, t)
},
{
"collectionFormat",
@@ -138,7 +138,7 @@ private static void LoadStyle(OpenApiParameter p, string v)
}
}
- private static void LoadParameterExamplesExtension(OpenApiParameter parameter, ParseNode node, OpenApiDocument hostDocument = null)
+ private static void LoadParameterExamplesExtension(OpenApiParameter parameter, ParseNode node, OpenApiDocument hostDocument)
{
var examples = LoadExamplesExtension(node);
node.Context.SetTempStorage(TempStorageKeys.Examples, examples, parameter);
@@ -149,7 +149,7 @@ private static OpenApiSchema GetOrCreateSchema(OpenApiParameter p)
return p.Schema ??= new();
}
- private static void ProcessIn(OpenApiParameter o, ParseNode n, OpenApiDocument hostDocument = null)
+ private static void ProcessIn(OpenApiParameter o, ParseNode n, OpenApiDocument hostDocument)
{
var value = n.GetScalarValue();
switch (value)
@@ -172,7 +172,10 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n, OpenApiDocument h
case "query":
case "header":
case "path":
- o.In = value.GetEnumFromDisplayName();
+ if (value.TryGetEnumFromDisplayName(out var _in))
+ {
+ o.In = _in;
+ }
break;
default:
o.In = null;
@@ -180,12 +183,12 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n, OpenApiDocument h
}
}
- public static OpenApiParameter LoadParameter(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiParameter LoadParameter(ParseNode node, OpenApiDocument hostDocument)
{
return LoadParameter(node, false, hostDocument);
}
- public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBody, OpenApiDocument hostDocument = null)
+ public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBody, OpenApiDocument hostDocument)
{
// Reset the local variables every time this method is called.
node.Context.SetTempStorage(TempStorageKeys.ParameterIsBodyOrFormData, false);
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs
index 71fd2e736..bc1eb8da6 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathItemDeserializer.cs
@@ -43,7 +43,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))},
};
- public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("PathItem");
@@ -54,12 +54,12 @@ public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostD
return pathItem;
}
- private static void LoadPathParameters(OpenApiPathItem pathItem, ParseNode node, OpenApiDocument hostDocument = null)
+ private static void LoadPathParameters(OpenApiPathItem pathItem, ParseNode node, OpenApiDocument hostDocument)
{
node.Context.SetTempStorage(TempStorageKeys.BodyParameter, null);
node.Context.SetTempStorage(TempStorageKeys.FormParameters, null);
- pathItem.Parameters = node.CreateList(LoadParameter);
+ pathItem.Parameters = node.CreateList(LoadParameter, hostDocument);
// Build request body based on information determined while parsing OpenApiOperation
var bodyParameter = node.Context.GetFromTempStorage(TempStorageKeys.BodyParameter);
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs
index 9e0c0f08b..a048316d5 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiPathsDeserializer.cs
@@ -21,7 +21,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiPaths LoadPaths(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiPaths LoadPaths(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Paths");
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs
index 8436a09cd..11b12e8f8 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiResponseDeserializer.cs
@@ -104,7 +104,7 @@ private static void ProcessProduces(MapNode mapNode, OpenApiResponse response, P
context.SetTempStorage(TempStorageKeys.ResponseProducesSet, true, response);
}
- private static void LoadResponseExamplesExtension(OpenApiResponse response, ParseNode node, OpenApiDocument hostDocument = null)
+ private static void LoadResponseExamplesExtension(OpenApiResponse response, ParseNode node, OpenApiDocument hostDocument)
{
var examples = LoadExamplesExtension(node);
node.Context.SetTempStorage(TempStorageKeys.Examples, examples, response);
@@ -145,7 +145,7 @@ private static Dictionary LoadExamplesExtension(ParseNod
return examples;
}
- private static void LoadExamples(OpenApiResponse response, ParseNode node, OpenApiDocument hostDocument = null)
+ private static void LoadExamples(OpenApiResponse response, ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("examples");
@@ -178,7 +178,7 @@ private static void LoadExample(OpenApiResponse response, string mediaType, Pars
mediaTypeObject.Example = exampleNode;
}
- public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("response");
@@ -193,7 +193,7 @@ public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostD
foreach (var property in mapNode)
{
- property.ParseField(response, _responseFixedFields, _responsePatternFields);
+ property.ParseField(response, _responseFixedFields, _responsePatternFields, hostDocument);
}
foreach (var mediaType in response.Content.Values)
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs
index 53208fd40..78453f9d2 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSchemaDeserializer.cs
@@ -76,7 +76,7 @@ internal static partial class OpenApiV2Deserializer
},
{
"required",
- (o, n, _) => o.Required = new HashSet(n.CreateSimpleList((n2, p) => n2.GetScalarValue()))
+ (o, n, doc) => o.Required = new HashSet(n.CreateSimpleList((n2, p) => n2.GetScalarValue(), doc))
},
{
"enum",
@@ -93,14 +93,14 @@ internal static partial class OpenApiV2Deserializer
},
{
"items",
- (o, n, _) => o.Items = LoadSchema(n)
+ (o, n, doc) => o.Items = LoadSchema(n, doc)
},
{
"properties",
(o, n, t) => o.Properties = n.CreateMap(LoadSchema, t)
},
{
- "additionalProperties", (o, n, _) =>
+ "additionalProperties", (o, n, doc) =>
{
if (n is ValueNode)
{
@@ -108,7 +108,7 @@ internal static partial class OpenApiV2Deserializer
}
else
{
- o.AdditionalProperties = LoadSchema(n);
+ o.AdditionalProperties = LoadSchema(n, doc);
}
}
},
@@ -139,11 +139,11 @@ internal static partial class OpenApiV2Deserializer
},
{
"xml",
- (o, n, _) => o.Xml = LoadXml(n)
+ (o, n, doc) => o.Xml = LoadXml(n, doc)
},
{
"externalDocs",
- (o, n, _) => o.ExternalDocs = LoadExternalDocs(n)
+ (o, n, doc) => o.ExternalDocs = LoadExternalDocs(n, doc)
},
{
"example",
@@ -156,7 +156,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("schema");
@@ -171,7 +171,7 @@ public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocum
foreach (var propertyNode in mapNode)
{
- propertyNode.ParseField(schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields);
+ propertyNode.ParseField(schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields, hostDocument);
}
return schema;
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs
index 5e430206c..4dfdbba16 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecurityRequirementDeserializer.cs
@@ -12,7 +12,7 @@ namespace Microsoft.OpenApi.Reader.V2
///
internal static partial class OpenApiV2Deserializer
{
- public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("security");
@@ -24,7 +24,7 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node,
mapNode.Context,
property.Name);
- var scopes = property.Value.CreateSimpleList((n2, p) => n2.GetScalarValue());
+ var scopes = property.Value.CreateSimpleList((n2, p) => n2.GetScalarValue(), hostDocument);
if (scheme != null)
{
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs
index 4e142b479..43151c15a 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiSecuritySchemeDeserializer.cs
@@ -40,12 +40,24 @@ internal static partial class OpenApiV2Deserializer
case "oauth2":
o.Type = SecuritySchemeType.OAuth2;
break;
+
+ default:
+ n.Context.Diagnostic.Errors.Add(new OpenApiError(n.Context.GetLocation(), $"Security scheme type {type} is not recognized."));
+ break;
}
}
},
{"description", (o, n, _) => o.Description = n.GetScalarValue()},
{"name", (o, n, _) => o.Name = n.GetScalarValue()},
- {"in", (o, n, _) => o.In = n.GetScalarValue().GetEnumFromDisplayName()},
+ {"in", (o, n, _) =>
+ {
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var _in))
+ {
+ return;
+ }
+ o.In = _in;
+ }
+ },
{
"flow", (_, n, _) => _flowValue = n.GetScalarValue()
},
@@ -68,7 +80,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument)
{
// Reset the local variables every time this method is called.
// TODO: Change _flow to a tempStorage variable to make the deserializer thread-safe.
@@ -80,7 +92,7 @@ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDo
var securityScheme = new OpenApiSecurityScheme();
foreach (var property in mapNode)
{
- property.ParseField(securityScheme, _securitySchemeFixedFields, _securitySchemePatternFields);
+ property.ParseField(securityScheme, _securitySchemeFixedFields, _securitySchemePatternFields, hostDocument);
}
// Put the Flow object in the right Flows property based on the string in "flow"
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs
index 47c3c6a40..23614029a 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiTagDeserializer.cs
@@ -34,7 +34,7 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument = null)
+ public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument)
{
var mapNode = n.CheckMapNode("tag");
@@ -42,7 +42,7 @@ public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument = nul
foreach (var propertyNode in mapNode)
{
- propertyNode.ParseField(domainObject, _tagFixedFields, _tagPatternFields);
+ propertyNode.ParseField(domainObject, _tagFixedFields, _tagPatternFields, hostDocument);
}
return domainObject;
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs
index 0bafab857..0e90a4633 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiV2Deserializer.cs
@@ -72,7 +72,7 @@ private static void ProcessAnyFields(
}
}
- public static JsonNode LoadAny(ParseNode node, OpenApiDocument hostDocument = null)
+ public static JsonNode LoadAny(ParseNode node, OpenApiDocument hostDocument)
{
return node.CreateAny();
}
diff --git a/src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs b/src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs
index c630bd941..21c9be0fe 100644
--- a/src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V2/OpenApiXmlDeserializer.cs
@@ -54,14 +54,14 @@ internal static partial class OpenApiV2Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiXml LoadXml(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiXml LoadXml(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("xml");
var xml = new OpenApiXml();
foreach (var property in mapNode)
{
- property.ParseField(xml, _xmlFixedFields, _xmlPatternFields);
+ property.ParseField(xml, _xmlFixedFields, _xmlPatternFields, hostDocument);
}
return xml;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs
index faf50ebb1..bdf4a8716 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiCallbackDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Expressions;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
@@ -25,7 +24,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))},
};
- public static OpenApiCallback LoadCallback(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiCallback LoadCallback(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("callback");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs
index cc51187d2..a5e3d082b 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiComponentsDeserializer.cs
@@ -32,7 +32,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiComponents LoadComponents(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiComponents LoadComponents(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("components");
var components = new OpenApiComponents();
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs
index e4d98de64..cc5058b52 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiContactDeserializer.cs
@@ -35,7 +35,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiContact LoadContact(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiContact LoadContact(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node as MapNode;
var contact = new OpenApiContact();
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs
index c10532c2c..5f9db648e 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs
@@ -27,14 +27,14 @@ internal static partial class OpenApiV3Deserializer
private static readonly PatternFieldMap _discriminatorPatternFields = new();
- public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("discriminator");
var discriminator = new OpenApiDiscriminator();
foreach (var property in mapNode)
{
- property.ParseField(discriminator, _discriminatorFixedFields, _discriminatorPatternFields);
+ property.ParseField(discriminator, _discriminatorFixedFields, _discriminatorPatternFields, hostDocument);
}
return discriminator;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs
index 3fcdb9af7..842b75bf0 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiDocumentDeserializer.cs
@@ -4,7 +4,6 @@
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader.ParseNodes;
-using Microsoft.OpenApi.Services;
namespace Microsoft.OpenApi.Reader.V3
{
@@ -26,16 +25,7 @@ internal static partial class OpenApiV3Deserializer
{"servers", (o, n, _) => o.Servers = n.CreateList(LoadServer, o)},
{"paths", (o, n, _) => o.Paths = LoadPaths(n, o)},
{"components", (o, n, _) => o.Components = LoadComponents(n, o)},
- {"tags", (o, n, _) => {o.Tags = n.CreateList(LoadTag, o);
- foreach (var tag in o.Tags)
- {
- tag.Reference = new()
- {
- Id = tag.Name,
- Type = ReferenceType.Tag
- };
- }
- } },
+ {"tags", (o, n, _) => o.Tags = n.CreateList(LoadTag, o) },
{"externalDocs", (o, n, _) => o.ExternalDocs = LoadExternalDocs(n, o)},
{"security", (o, n, _) => o.SecurityRequirements = n.CreateList(LoadSecurityRequirement, o)}
};
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs
index 67cb19ecb..2345436dd 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiEncodingDeserializer.cs
@@ -25,7 +25,14 @@ internal static partial class OpenApiV3Deserializer
},
{
"style",
- (o, n, _) => o.Style = n.GetScalarValue().GetEnumFromDisplayName()
+ (o, n, _) =>
+ {
+ if(!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var style))
+ {
+ return;
+ }
+ o.Style = style;
+ }
},
{
"explode",
@@ -43,14 +50,14 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiEncoding LoadEncoding(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiEncoding LoadEncoding(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("encoding");
var encoding = new OpenApiEncoding();
foreach (var property in mapNode)
{
- property.ParseField(encoding, _encodingFixedFields, _encodingPatternFields);
+ property.ParseField(encoding, _encodingFixedFields, _encodingPatternFields, hostDocument);
}
return encoding;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs
index a73ee02b1..06d1d284a 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiExampleDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -41,7 +40,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("example");
@@ -55,7 +54,7 @@ public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDoc
var example = new OpenApiExample();
foreach (var property in mapNode)
{
- property.ParseField(example, _exampleFixedFields, _examplePatternFields);
+ property.ParseField(example, _exampleFixedFields, _examplePatternFields, hostDocument);
}
return example;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs
index 39712494c..a3f20bad0 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiExternalDocsDeserializer.cs
@@ -34,7 +34,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiExternalDocs LoadExternalDocs(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiExternalDocs LoadExternalDocs(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("externalDocs");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs
index bc09b9b10..7830c394e 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiHeaderDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -39,7 +38,14 @@ internal static partial class OpenApiV3Deserializer
},
{
"style",
- (o, n, _) => o.Style = n.GetScalarValue().GetEnumFromDisplayName()
+ (o, n, _) =>
+ {
+ if(!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var style))
+ {
+ return;
+ }
+ o.Style = style;
+ }
},
{
"explode",
@@ -64,7 +70,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("header");
@@ -78,7 +84,7 @@ public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocum
var header = new OpenApiHeader();
foreach (var property in mapNode)
{
- property.ParseField(header, _headerFixedFields, _headerPatternFields);
+ property.ParseField(header, _headerFixedFields, _headerPatternFields, hostDocument);
}
return header;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs
index dcbf5ba4b..dbe3a554c 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiInfoDeserializer.cs
@@ -47,7 +47,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, k, n, _) => o.AddExtension(k,LoadExtension(k, n))}
};
- public static OpenApiInfo LoadInfo(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiInfo LoadInfo(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Info");
var info = new OpenApiInfo();
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs
index e9054a0dd..d836c6e0f 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiLicenseDeserializer.cs
@@ -31,7 +31,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- internal static OpenApiLicense LoadLicense(ParseNode node, OpenApiDocument hostDocument = null)
+ internal static OpenApiLicense LoadLicense(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("License");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs
index a95b6ebf8..049ecc8cc 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiLinkDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -45,7 +44,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))},
};
- public static OpenApiLink LoadLink(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiLink LoadLink(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("link");
var link = new OpenApiLink();
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs
index 1c055293a..69fc53179 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiMediaTypeDeserializer.cs
@@ -64,7 +64,7 @@ internal static partial class OpenApiV3Deserializer
}
};
- public static OpenApiMediaType LoadMediaType(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiMediaType LoadMediaType(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode(OpenApiConstants.Content);
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs
index 8e8783efa..1a7f40c15 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowDeserializer.cs
@@ -38,14 +38,14 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiOAuthFlow LoadOAuthFlow(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiOAuthFlow LoadOAuthFlow(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("OAuthFlow");
var oauthFlow = new OpenApiOAuthFlow();
foreach (var property in mapNode)
{
- property.ParseField(oauthFlow, _oAuthFlowFixedFields, _oAuthFlowPatternFields);
+ property.ParseField(oauthFlow, _oAuthFlowFixedFields, _oAuthFlowPatternFields, hostDocument);
}
return oauthFlow;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs
index 2856be979..e4e003f9c 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiOAuthFlowsDeserializer.cs
@@ -28,14 +28,14 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiOAuthFlows LoadOAuthFlows(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiOAuthFlows LoadOAuthFlows(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("OAuthFlows");
var oAuthFlows = new OpenApiOAuthFlows();
foreach (var property in mapNode)
{
- property.ParseField(oAuthFlows, _oAuthFlowsFixedFields, _oAuthFlowsPatternFields);
+ property.ParseField(oAuthFlows, _oAuthFlowsFixedFields, _oAuthFlowsPatternFields, hostDocument);
}
return oAuthFlows;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs
index 33aadc141..1ebb57880 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiOperationDeserializer.cs
@@ -21,8 +21,7 @@ internal static partial class OpenApiV3Deserializer
"tags", (o, n, doc) => o.Tags = n.CreateSimpleList(
(valueNode, doc) =>
LoadTagByReference(
- valueNode.Context,
- valueNode.GetScalarValue(), doc))
+ valueNode.GetScalarValue(), doc), doc)
},
{
"summary",
@@ -34,7 +33,7 @@ internal static partial class OpenApiV3Deserializer
},
{
"externalDocs",
- (o, n, _) => o.ExternalDocs = LoadExternalDocs(n)
+ (o, n, doc) => o.ExternalDocs = LoadExternalDocs(n, doc)
},
{
"operationId",
@@ -76,7 +75,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))},
};
- internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument hostDocument = null)
+ internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Operation");
@@ -87,8 +86,7 @@ internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument h
return operation;
}
- private static OpenApiTag LoadTagByReference(
- ParsingContext context,
+ private static OpenApiTagReference LoadTagByReference(
string tagName, OpenApiDocument hostDocument)
{
return new OpenApiTagReference(tagName, hostDocument);
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs
index 0446c52b7..a71f633e5 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiParameterDeserializer.cs
@@ -1,8 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System;
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -26,11 +24,11 @@ internal static partial class OpenApiV3Deserializer
{
"in", (o, n, _) =>
{
- var inString = n.GetScalarValue();
-
- o.In = Enum.GetValues(typeof(ParameterLocation)).Cast()
- .Select( e => e.GetDisplayName() )
- .Contains(inString) ? n.GetScalarValue().GetEnumFromDisplayName() : null;
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var _in))
+ {
+ return;
+ }
+ o.In = _in;
}
},
{
@@ -55,7 +53,14 @@ internal static partial class OpenApiV3Deserializer
},
{
"style",
- (o, n, _) => o.Style = n.GetScalarValue().GetEnumFromDisplayName()
+ (o, n, _) =>
+ {
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var style))
+ {
+ return;
+ }
+ o.Style = style;
+ }
},
{
"explode",
@@ -109,7 +114,7 @@ internal static partial class OpenApiV3Deserializer
}
};
- public static OpenApiParameter LoadParameter(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiParameter LoadParameter(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("parameter");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs
index afcee89b5..9673c5f87 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathItemDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -49,7 +48,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("PathItem");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs
index d4343973c..e28a9d569 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiPathsDeserializer.cs
@@ -21,7 +21,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiPaths LoadPaths(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiPaths LoadPaths(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Paths");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs
index 435b576e1..79bb16638 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiRequestBodyDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -38,7 +37,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiRequestBody LoadRequestBody(ParseNode node, OpenApiDocument hostDocument= null)
+ public static OpenApiRequestBody LoadRequestBody(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("requestBody");
@@ -52,7 +51,7 @@ public static OpenApiRequestBody LoadRequestBody(ParseNode node, OpenApiDocument
var requestBody = new OpenApiRequestBody();
foreach (var property in mapNode)
{
- property.ParseField(requestBody, _requestBodyFixedFields, _requestBodyPatternFields);
+ property.ParseField(requestBody, _requestBodyFixedFields, _requestBodyPatternFields, hostDocument);
}
return requestBody;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs
index e65a1aafe..c159443ad 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponseDeserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -41,7 +40,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("response");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs
index 817cdcbf6..7288c04b1 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiResponsesDeserializer.cs
@@ -21,7 +21,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiResponses LoadResponses(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiResponses LoadResponses(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Responses");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs
index f3c02a6c8..bad6d04b8 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs
@@ -76,7 +76,7 @@ internal static partial class OpenApiV3Deserializer
},
{
"required",
- (o, n, _) => o.Required = new HashSet(n.CreateSimpleList((n2, p) => n2.GetScalarValue()))
+ (o, n, doc) => o.Required = new HashSet(n.CreateSimpleList((n2, p) => n2.GetScalarValue(), doc))
},
{
"enum",
@@ -92,7 +92,7 @@ internal static partial class OpenApiV3Deserializer
},
{
"oneOf",
- (o, n, _) => o.OneOf = n.CreateList(LoadSchema)
+ (o, n, doc) => o.OneOf = n.CreateList(LoadSchema, doc)
},
{
"anyOf",
@@ -100,18 +100,18 @@ internal static partial class OpenApiV3Deserializer
},
{
"not",
- (o, n, _) => o.Not = LoadSchema(n)
+ (o, n, doc) => o.Not = LoadSchema(n, doc)
},
{
"items",
- (o, n, _) => o.Items = LoadSchema(n)
+ (o, n, doc) => o.Items = LoadSchema(n, doc)
},
{
"properties",
(o, n, t) => o.Properties = n.CreateMap(LoadSchema, t)
},
{
- "additionalProperties", (o, n, _) =>
+ "additionalProperties", (o, n, doc) =>
{
if (n is ValueNode)
{
@@ -119,7 +119,7 @@ internal static partial class OpenApiV3Deserializer
}
else
{
- o.AdditionalProperties = LoadSchema(n);
+ o.AdditionalProperties = LoadSchema(n, doc);
}
}
},
@@ -141,7 +141,7 @@ internal static partial class OpenApiV3Deserializer
},
{
"discriminator",
- (o, n, _) => o.Discriminator = LoadDiscriminator(n)
+ (o, n, doc) => o.Discriminator = LoadDiscriminator(n, doc)
},
{
"readOnly",
@@ -153,11 +153,11 @@ internal static partial class OpenApiV3Deserializer
},
{
"xml",
- (o, n, _) => o.Xml = LoadXml(n)
+ (o, n, doc) => o.Xml = LoadXml(n, doc)
},
{
"externalDocs",
- (o, n, _) => o.ExternalDocs = LoadExternalDocs(n)
+ (o, n, doc) => o.ExternalDocs = LoadExternalDocs(n, doc)
},
{
"example",
@@ -174,7 +174,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode(OpenApiConstants.Schema);
@@ -190,7 +190,7 @@ public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocum
foreach (var propertyNode in mapNode)
{
- propertyNode.ParseField(schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields);
+ propertyNode.ParseField(schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields, hostDocument);
}
return schema;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs
index e1d4ddc2f..73610713c 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecurityRequirementDeserializer.cs
@@ -13,7 +13,7 @@ namespace Microsoft.OpenApi.Reader.V3
///
internal static partial class OpenApiV3Deserializer
{
- public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("security");
@@ -23,7 +23,7 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node,
{
var scheme = LoadSecuritySchemeByReference(mapNode.Context, property.Name);
- var scopes = property.Value.CreateSimpleList((value, p) => value.GetScalarValue());
+ var scopes = property.Value.CreateSimpleList((value, p) => value.GetScalarValue(), hostDocument);
if (scheme != null)
{
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs
index 4a794408a..18c4eae28 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System;
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -21,7 +20,14 @@ internal static partial class OpenApiV3Deserializer
{
{
"type",
- (o, n, _) => o.Type = n.GetScalarValue().GetEnumFromDisplayName()
+ (o, n, _) =>
+ {
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var type))
+ {
+ return;
+ }
+ o.Type = type;
+ }
},
{
"description",
@@ -33,7 +39,14 @@ internal static partial class OpenApiV3Deserializer
},
{
"in",
- (o, n, _) => o.In = n.GetScalarValue().GetEnumFromDisplayName()
+ (o, n, _) =>
+ {
+ if(!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var _in))
+ {
+ return;
+ }
+ o.In = _in;
+ }
},
{
"scheme",
@@ -59,7 +72,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("securityScheme");
var pointer = mapNode.GetReferencePointer();
@@ -72,7 +85,7 @@ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDo
var securityScheme = new OpenApiSecurityScheme();
foreach (var property in mapNode)
{
- property.ParseField(securityScheme, _securitySchemeFixedFields, _securitySchemePatternFields);
+ property.ParseField(securityScheme, _securitySchemeFixedFields, _securitySchemePatternFields, hostDocument);
}
return securityScheme;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs
index 9f56f764c..52ee335c0 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerDeserializer.cs
@@ -34,7 +34,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiServer LoadServer(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiServer LoadServer(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("server");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs
index 1bfa4fe04..9436e62fe 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiServerVariableDeserializer.cs
@@ -18,7 +18,7 @@ internal static partial class OpenApiV3Deserializer
{
{
"enum",
- (o, n, _) => o.Enum = n.CreateSimpleList((s, p) => s.GetScalarValue())
+ (o, n, doc) => o.Enum = n.CreateSimpleList((s, p) => s.GetScalarValue(), doc)
},
{
"default",
@@ -36,7 +36,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiServerVariable LoadServerVariable(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiServerVariable LoadServerVariable(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("serverVariable");
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs
index 218399cbb..e6efafae7 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiTagDeserializer.cs
@@ -34,7 +34,7 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument = null)
+ public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument)
{
var mapNode = n.CheckMapNode("tag");
@@ -42,7 +42,7 @@ public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument = nul
foreach (var propertyNode in mapNode)
{
- propertyNode.ParseField(domainObject, _tagFixedFields, _tagPatternFields);
+ propertyNode.ParseField(domainObject, _tagFixedFields, _tagPatternFields, hostDocument);
}
return domainObject;
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs
index 6fa8406bf..cad424c50 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs
@@ -24,7 +24,7 @@ private static void ParseMap(
T domainObject,
FixedFieldMap fixedFieldMap,
PatternFieldMap patternFieldMap,
- OpenApiDocument hostDocument = null)
+ OpenApiDocument hostDocument)
{
if (mapNode == null)
{
@@ -163,7 +163,7 @@ private static RuntimeExpressionAnyWrapper LoadRuntimeExpressionAnyWrapper(Parse
};
}
- public static OpenApiAny LoadAny(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiAny LoadAny(ParseNode node, OpenApiDocument hostDocument)
{
return new OpenApiAny(node.CreateAny());
}
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs
index c2ef954a5..372a8b26f 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3VersionService.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text.Json.Nodes;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Extensions;
@@ -123,7 +122,7 @@ public OpenApiReference ConvertToOpenApiReference(
if (id.StartsWith("/components/"))
{
var localSegments = segments[1].Split('/');
- var referencedType = localSegments[2].GetEnumFromDisplayName();
+ localSegments[2].TryGetEnumFromDisplayName(out var referencedType);
if (type == null)
{
type = referencedType;
@@ -200,25 +199,22 @@ private OpenApiReference ParseLocalReference(string localReference)
var segments = localReference.Split('/');
- if (segments.Length == 4) // /components/{type}/pet
+ if (segments.Length == 4 && segments[1] == "components") // /components/{type}/pet
{
- if (segments[1] == "components")
+ segments[2].TryGetEnumFromDisplayName(out var referenceType);
+ var refId = segments[3];
+ if (segments[2] == "pathItems")
{
- var referenceType = segments[2].GetEnumFromDisplayName();
- var refId = segments[3];
- if (segments[2] == "pathItems")
- {
- refId = "/" + segments[3];
- };
+ refId = "/" + segments[3];
+ }
- var parsedReference = new OpenApiReference
- {
- Type = referenceType,
- Id = refId
- };
+ var parsedReference = new OpenApiReference
+ {
+ Type = referenceType,
+ Id = refId
+ };
- return parsedReference;
- }
+ return parsedReference;
}
throw new OpenApiException(string.Format(SRResource.ReferenceHasInvalidFormat, localReference));
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs
index b57b641c4..51b66d348 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiXmlDeserializer.cs
@@ -44,14 +44,14 @@ internal static partial class OpenApiV3Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiXml LoadXml(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiXml LoadXml(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("xml");
var xml = new OpenApiXml();
foreach (var property in mapNode)
{
- property.ParseField(xml, _xmlFixedFields, _xmlPatternFields);
+ property.ParseField(xml, _xmlFixedFields, _xmlPatternFields, hostDocument);
}
return xml;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs
index 580ce1356..c0d4c5951 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiCallbackDeserializer.cs
@@ -4,7 +4,6 @@
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader.ParseNodes;
using Microsoft.OpenApi.Models.References;
-using System.Linq;
namespace Microsoft.OpenApi.Reader.V31
{
@@ -24,7 +23,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-", StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))},
};
- public static OpenApiCallback LoadCallback(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiCallback LoadCallback(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("callback");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs
index e70087d4b..c9dccde5d 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiComponentsDeserializer.cs
@@ -34,7 +34,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-", StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiComponents LoadComponents(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiComponents LoadComponents(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("components");
var components = new OpenApiComponents();
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs
index 7434deeec..801eb2de9 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiContactDeserializer.cs
@@ -38,7 +38,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiContact LoadContact(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiContact LoadContact(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node as MapNode;
var contact = new OpenApiContact();
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs
index 51122a9c8..90e904f60 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs
@@ -33,14 +33,14 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("discriminator");
var discriminator = new OpenApiDiscriminator();
foreach (var property in mapNode)
{
- property.ParseField(discriminator, _discriminatorFixedFields, _discriminatorPatternFields);
+ property.ParseField(discriminator, _discriminatorFixedFields, _discriminatorPatternFields, hostDocument);
}
return discriminator;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs
index 8137fb460..0d1e08479 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiDocumentDeserializer.cs
@@ -1,8 +1,6 @@
-using System;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader.ParseNodes;
-using Microsoft.OpenApi.Services;
namespace Microsoft.OpenApi.Reader.V31
{
@@ -25,16 +23,7 @@ internal static partial class OpenApiV31Deserializer
{"paths", (o, n, _) => o.Paths = LoadPaths(n, o)},
{"webhooks", (o, n, _) => o.Webhooks = n.CreateMap(LoadPathItem, o)},
{"components", (o, n, _) => o.Components = LoadComponents(n, o)},
- {"tags", (o, n, _) => {o.Tags = n.CreateList(LoadTag, o);
- foreach (var tag in o.Tags)
- {
- tag.Reference = new OpenApiReference()
- {
- Id = tag.Name,
- Type = ReferenceType.Tag
- };
- }
- } },
+ {"tags", (o, n, _) => o.Tags = n.CreateList(LoadTag, o) },
{"externalDocs", (o, n, _) => o.ExternalDocs = LoadExternalDocs(n, o)},
{"security", (o, n, _) => o.SecurityRequirements = n.CreateList(LoadSecurityRequirement, o)}
};
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs
index b54c5e75b..51a5b4ef6 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiEncodingDeserializer.cs
@@ -27,7 +27,11 @@ internal static partial class OpenApiV31Deserializer
{
"style", (o, n, _) =>
{
- o.Style = n.GetScalarValue().GetEnumFromDisplayName();
+ if(!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var style))
+ {
+ return;
+ }
+ o.Style = style;
}
},
{
@@ -50,14 +54,14 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiEncoding LoadEncoding(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiEncoding LoadEncoding(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("encoding");
var encoding = new OpenApiEncoding();
foreach (var property in mapNode)
{
- property.ParseField(encoding, _encodingFixedFields, _encodingPatternFields);
+ property.ParseField(encoding, _encodingFixedFields, _encodingPatternFields, hostDocument);
}
return encoding;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs
index 0035360d5..820c58985 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiExampleDeserializer.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -47,7 +46,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("example");
@@ -61,7 +60,7 @@ public static OpenApiExample LoadExample(ParseNode node, OpenApiDocument hostDoc
var example = new OpenApiExample();
foreach (var property in mapNode)
{
- property.ParseField(example, _exampleFixedFields, _examplePatternFields);
+ property.ParseField(example, _exampleFixedFields, _examplePatternFields, hostDocument);
}
return example;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs
index f42288fcf..56dd2bc77 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiExternalDocsDeserializer.cs
@@ -36,7 +36,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p, n))}
};
- public static OpenApiExternalDocs LoadExternalDocs(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiExternalDocs LoadExternalDocs(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("externalDocs");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs
index d3657db02..32c2b73fc 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiHeaderDeserializer.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -47,7 +46,11 @@ internal static partial class OpenApiV31Deserializer
{
"style", (o, n, _) =>
{
- o.Style = n.GetScalarValue().GetEnumFromDisplayName();
+ if(!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var style))
+ {
+ return;
+ }
+ o.Style = style;
}
},
{
@@ -81,7 +84,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("header");
@@ -95,7 +98,7 @@ public static OpenApiHeader LoadHeader(ParseNode node, OpenApiDocument hostDocum
var header = new OpenApiHeader();
foreach (var property in mapNode)
{
- property.ParseField(header, _headerFixedFields, _headerPatternFields);
+ property.ParseField(header, _headerFixedFields, _headerPatternFields, hostDocument);
}
return header;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs
index 6476e1acc..d3aed5511 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiInfoDeserializer.cs
@@ -62,7 +62,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, k, n, _) => o.AddExtension(k,LoadExtension(k, n))}
};
- public static OpenApiInfo LoadInfo(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiInfo LoadInfo(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Info");
var info = new OpenApiInfo();
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs
index efddbc2b1..303f2f65a 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiLicenseDeserializer.cs
@@ -38,7 +38,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- internal static OpenApiLicense LoadLicense(ParseNode node, OpenApiDocument hostDocument = null)
+ internal static OpenApiLicense LoadLicense(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("License");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs
index aa1e26ea1..a849985fb 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiLinkDeserializer.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -52,7 +51,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))},
};
- public static OpenApiLink LoadLink(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiLink LoadLink(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("link");
var link = new OpenApiLink();
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs
index c0ce9b843..36f90383c 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiMediaTypeDeserializer.cs
@@ -70,7 +70,7 @@ internal static partial class OpenApiV31Deserializer
}
};
- public static OpenApiMediaType LoadMediaType(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiMediaType LoadMediaType(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode(OpenApiConstants.Content);
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs
index 199cf14e7..5b18caecf 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowDeserializer.cs
@@ -41,14 +41,14 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiOAuthFlow LoadOAuthFlow(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiOAuthFlow LoadOAuthFlow(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("OAuthFlow");
var oauthFlow = new OpenApiOAuthFlow();
foreach (var property in mapNode)
{
- property.ParseField(oauthFlow, _oAuthFlowFixedFileds, _oAuthFlowPatternFields);
+ property.ParseField(oauthFlow, _oAuthFlowFixedFileds, _oAuthFlowPatternFields, hostDocument);
}
return oauthFlow;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs
index 28316ec9b..b20b96775 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiOAuthFlowsDeserializer.cs
@@ -10,7 +10,7 @@ namespace Microsoft.OpenApi.Reader.V31
///
internal static partial class OpenApiV31Deserializer
{
- private static readonly FixedFieldMap _oAuthFlowsFixedFileds =
+ private static readonly FixedFieldMap _oAuthFlowsFixedFields =
new()
{
{"implicit", (o, n, t) => o.Implicit = LoadOAuthFlow(n, t)},
@@ -25,14 +25,14 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiOAuthFlows LoadOAuthFlows(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiOAuthFlows LoadOAuthFlows(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("OAuthFlows");
var oAuthFlows = new OpenApiOAuthFlows();
foreach (var property in mapNode)
{
- property.ParseField(oAuthFlows, _oAuthFlowsFixedFileds, _oAuthFlowsPatternFields);
+ property.ParseField(oAuthFlows, _oAuthFlowsFixedFields, _oAuthFlowsPatternFields, hostDocument);
}
return oAuthFlows;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs
index fb143e4c6..2d6c831e3 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiOperationDeserializer.cs
@@ -17,7 +17,7 @@ internal static partial class OpenApiV31Deserializer
{
"tags", (o, n, doc) => o.Tags = n.CreateSimpleList(
(valueNode, doc) =>
- LoadTagByReference(valueNode.GetScalarValue(), doc))
+ LoadTagByReference(valueNode.GetScalarValue(), doc), doc)
},
{
"summary", (o, n, _) =>
@@ -93,7 +93,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))},
};
- internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument hostDocument = null)
+ internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Operation");
@@ -104,7 +104,7 @@ internal static OpenApiOperation LoadOperation(ParseNode node, OpenApiDocument h
return operation;
}
- private static OpenApiTag LoadTagByReference(string tagName, OpenApiDocument hostDocument = null)
+ private static OpenApiTagReference LoadTagByReference(string tagName, OpenApiDocument hostDocument)
{
var tagObject = new OpenApiTagReference(tagName, hostDocument);
return tagObject;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs
index e8f4e5a93..7a2c3d90e 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiParameterDeserializer.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -25,11 +23,11 @@ internal static partial class OpenApiV31Deserializer
{
"in", (o, n, _) =>
{
- var inString = n.GetScalarValue();
- o.In = Enum.GetValues(typeof(ParameterLocation)).Cast()
- .Select( e => e.GetDisplayName() )
- .Contains(inString) ? n.GetScalarValue().GetEnumFromDisplayName() : null;
-
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var _in))
+ {
+ return;
+ }
+ o.In = _in;
}
},
{
@@ -65,7 +63,11 @@ internal static partial class OpenApiV31Deserializer
{
"style", (o, n, _) =>
{
- o.Style = n.GetScalarValue().GetEnumFromDisplayName();
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var style))
+ {
+ return;
+ }
+ o.Style = style;
}
},
{
@@ -130,7 +132,7 @@ internal static partial class OpenApiV31Deserializer
}
};
- public static OpenApiParameter LoadParameter(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiParameter LoadParameter(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("parameter");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs
index 8797b03e6..7c5fb189e 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathItemDeserializer.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -51,7 +50,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiPathItem LoadPathItem(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("PathItem");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs
index e9fef44a8..c72394bf2 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiPathsDeserializer.cs
@@ -18,7 +18,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiPaths LoadPaths(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiPaths LoadPaths(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Paths");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs
index 7acea65c0..e26ec20f9 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiRequestBodyDeserializer.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -41,7 +40,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiRequestBody LoadRequestBody(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiRequestBody LoadRequestBody(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("requestBody");
@@ -55,7 +54,7 @@ public static OpenApiRequestBody LoadRequestBody(ParseNode node, OpenApiDocument
var requestBody = new OpenApiRequestBody();
foreach (var property in mapNode)
{
- property.ParseField(requestBody, _requestBodyFixedFields, _requestBodyPatternFields);
+ property.ParseField(requestBody, _requestBodyFixedFields, _requestBodyPatternFields, hostDocument);
}
return requestBody;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs
index 611574bf2..8e4057a91 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponseDeserializer.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using Microsoft.OpenApi.Extensions;
+using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -46,7 +45,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiResponse LoadResponse(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("response");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs
index 42cb3b826..228a0045e 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiResponsesDeserializer.cs
@@ -21,7 +21,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiResponses LoadResponses(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiResponses LoadResponses(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("Responses");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs
index ad943dce4..87ecc8f00 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs
@@ -8,7 +8,6 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
-using System.Text.Json.Nodes;
namespace Microsoft.OpenApi.Reader.V31
{
@@ -106,7 +105,7 @@ internal static partial class OpenApiV31Deserializer
},
{
"required",
- (o, n, _) => o.Required = new HashSet(n.CreateSimpleList((n2, p) => n2.GetScalarValue()))
+ (o, n, doc) => o.Required = new HashSet(n.CreateSimpleList((n2, p) => n2.GetScalarValue(), doc))
},
{
"enum",
@@ -114,7 +113,7 @@ internal static partial class OpenApiV31Deserializer
},
{
"type",
- (o, n, _) =>
+ (o, n, doc) =>
{
if (n is ValueNode)
{
@@ -122,7 +121,7 @@ internal static partial class OpenApiV31Deserializer
}
else
{
- var list = n.CreateSimpleList((n2, p) => n2.GetScalarValue());
+ var list = n.CreateSimpleList((n2, p) => n2.GetScalarValue(), doc);
JsonSchemaType combinedType = 0;
foreach(var type in list)
{
@@ -151,11 +150,11 @@ internal static partial class OpenApiV31Deserializer
},
{
"not",
- (o, n, _) => o.Not = LoadSchema(n)
+ (o, n, doc) => o.Not = LoadSchema(n, doc)
},
{
"items",
- (o, n, _) => o.Items = LoadSchema(n)
+ (o, n, doc) => o.Items = LoadSchema(n, doc)
},
{
"properties",
@@ -166,7 +165,7 @@ internal static partial class OpenApiV31Deserializer
(o, n, t) => o.PatternProperties = n.CreateMap(LoadSchema, t)
},
{
- "additionalProperties", (o, n, _) =>
+ "additionalProperties", (o, n, doc) =>
{
if (n is ValueNode)
{
@@ -174,7 +173,7 @@ internal static partial class OpenApiV31Deserializer
}
else
{
- o.AdditionalProperties = LoadSchema(n);
+ o.AdditionalProperties = LoadSchema(n, doc);
}
}
},
@@ -203,7 +202,7 @@ internal static partial class OpenApiV31Deserializer
},
{
"discriminator",
- (o, n, _) => o.Discriminator = LoadDiscriminator(n)
+ (o, n, doc) => o.Discriminator = LoadDiscriminator(n, doc)
},
{
"readOnly",
@@ -215,11 +214,11 @@ internal static partial class OpenApiV31Deserializer
},
{
"xml",
- (o, n, _) => o.Xml = LoadXml(n)
+ (o, n, doc) => o.Xml = LoadXml(n, doc)
},
{
"externalDocs",
- (o, n, _) => o.ExternalDocs = LoadExternalDocs(n)
+ (o, n, doc) => o.ExternalDocs = LoadExternalDocs(n, doc)
},
{
"example",
@@ -240,7 +239,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode(OpenApiConstants.Schema);
@@ -261,7 +260,7 @@ public static OpenApiSchema LoadSchema(ParseNode node, OpenApiDocument hostDocum
if (isRecognized)
{
- propertyNode.ParseField(schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields);
+ propertyNode.ParseField(schema, _openApiSchemaFixedFields, _openApiSchemaPatternFields, hostDocument);
}
else
{
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs
index 94753dafa..b204c83d4 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecurityRequirementDeserializer.cs
@@ -13,7 +13,7 @@ namespace Microsoft.OpenApi.Reader.V31
///
internal static partial class OpenApiV31Deserializer
{
- public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("security");
@@ -23,7 +23,7 @@ public static OpenApiSecurityRequirement LoadSecurityRequirement(ParseNode node,
{
var scheme = LoadSecuritySchemeByReference(property.Name, hostDocument);
- var scopes = property.Value.CreateSimpleList((value, p) => value.GetScalarValue());
+ var scopes = property.Value.CreateSimpleList((value, p) => value.GetScalarValue(), hostDocument);
if (scheme != null)
{
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
index 7b5ff5cb8..b56352c22 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System;
-using System.Linq;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -22,7 +21,11 @@ internal static partial class OpenApiV31Deserializer
{
"type", (o, n, _) =>
{
- o.Type = n.GetScalarValue().GetEnumFromDisplayName();
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var type))
+ {
+ return;
+ }
+ o.Type = type;
}
},
{
@@ -40,7 +43,11 @@ internal static partial class OpenApiV31Deserializer
{
"in", (o, n, _) =>
{
- o.In = n.GetScalarValue().GetEnumFromDisplayName();
+ if (!n.GetScalarValue().TryGetEnumFromDisplayName(n.Context, out var _in))
+ {
+ return;
+ }
+ o.In = _in;
}
},
{
@@ -75,7 +82,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("securityScheme");
@@ -89,7 +96,7 @@ public static OpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDo
var securityScheme = new OpenApiSecurityScheme();
foreach (var property in mapNode)
{
- property.ParseField(securityScheme, _securitySchemeFixedFields, _securitySchemePatternFields);
+ property.ParseField(securityScheme, _securitySchemeFixedFields, _securitySchemePatternFields, hostDocument);
}
return securityScheme;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs
index efe25fedb..2ae8ac340 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerDeserializer.cs
@@ -40,7 +40,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiServer LoadServer(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiServer LoadServer(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("server");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs
index e5344554d..0c6e8b756 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiServerVariableDeserializer.cs
@@ -17,9 +17,9 @@ internal static partial class OpenApiV31Deserializer
new()
{
{
- "enum", (o, n, _) =>
+ "enum", (o, n, doc) =>
{
- o.Enum = n.CreateSimpleList((s, p) => s.GetScalarValue());
+ o.Enum = n.CreateSimpleList((s, p) => s.GetScalarValue(), doc);
}
},
{
@@ -42,7 +42,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiServerVariable LoadServerVariable(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiServerVariable LoadServerVariable(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("serverVariable");
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs
index a6dfe5f1f..f1b0065cc 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiTagDeserializer.cs
@@ -40,7 +40,7 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument = null)
+ public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument)
{
var mapNode = n.CheckMapNode("tag");
@@ -48,7 +48,7 @@ public static OpenApiTag LoadTag(ParseNode n, OpenApiDocument hostDocument = nul
foreach (var propertyNode in mapNode)
{
- propertyNode.ParseField(domainObject, _tagFixedFields, _tagPatternFields);
+ propertyNode.ParseField(domainObject, _tagFixedFields, _tagPatternFields, hostDocument);
}
return domainObject;
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs
index a037dc3c1..7c3441eed 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Any;
@@ -128,7 +127,7 @@ private static RuntimeExpressionAnyWrapper LoadRuntimeExpressionAnyWrapper(Parse
};
}
- public static JsonNode LoadAny(ParseNode node, OpenApiDocument hostDocument = null)
+ public static JsonNode LoadAny(ParseNode node, OpenApiDocument hostDocument)
{
return node.CreateAny();
}
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs
index 333ec53bb..f564c37ab 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31VersionService.cs
@@ -124,7 +124,7 @@ public OpenApiReference ConvertToOpenApiReference(
if (id.StartsWith("/components/"))
{
var localSegments = segments[1].Split('/');
- var referencedType = localSegments[2].GetEnumFromDisplayName();
+ localSegments[2].TryGetEnumFromDisplayName(out var referencedType);
if (type == null)
{
type = referencedType;
@@ -188,7 +188,7 @@ private OpenApiReference ParseLocalReference(string localReference, string summa
if (segments.Length == 4 && segments[1] == "components") // /components/{type}/pet
{
- var referenceType = segments[2].GetEnumFromDisplayName();
+ segments[2].TryGetEnumFromDisplayName(out var referenceType);
var refId = segments[3];
if (segments[2] == "pathItems")
{
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs
index 4c7a17b85..13870f341 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiXmlDeserializer.cs
@@ -54,14 +54,14 @@ internal static partial class OpenApiV31Deserializer
{s => s.StartsWith("x-"), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
};
- public static OpenApiXml LoadXml(ParseNode node, OpenApiDocument hostDocument = null)
+ public static OpenApiXml LoadXml(ParseNode node, OpenApiDocument hostDocument)
{
var mapNode = node.CheckMapNode("xml");
var xml = new OpenApiXml();
foreach (var property in mapNode)
{
- property.ParseField(xml, _xmlFixedFields, _xmlPatternFields);
+ property.ParseField(xml, _xmlFixedFields, _xmlPatternFields, hostDocument);
}
return xml;
diff --git a/src/Microsoft.OpenApi/Services/CopyReferences.cs b/src/Microsoft.OpenApi/Services/CopyReferences.cs
index 73bb667b6..22f1c5ad3 100644
--- a/src/Microsoft.OpenApi/Services/CopyReferences.cs
+++ b/src/Microsoft.OpenApi/Services/CopyReferences.cs
@@ -4,183 +4,248 @@
using System.Collections.Generic;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.References;
-namespace Microsoft.OpenApi.Services
+namespace Microsoft.OpenApi.Services;
+internal class CopyReferences(OpenApiDocument target) : OpenApiVisitorBase
{
- internal class CopyReferences : OpenApiVisitorBase
+ private readonly OpenApiDocument _target = target;
+ public OpenApiComponents Components = new();
+
+ ///
+ /// Visits IOpenApiReferenceable instances that are references and not in components.
+ ///
+ /// An IOpenApiReferenceable object.
+ public override void Visit(IOpenApiReferenceable referenceable)
{
- private readonly OpenApiDocument _target;
- public OpenApiComponents Components = new();
-
- public CopyReferences(OpenApiDocument target)
+ switch (referenceable)
{
- _target = target;
+ case OpenApiSchemaReference openApiSchemaReference:
+ AddSchemaToComponents(openApiSchemaReference.Target, openApiSchemaReference.Reference.Id);
+ break;
+ case OpenApiSchema schema:
+ AddSchemaToComponents(schema);
+ break;
+ case OpenApiParameterReference openApiParameterReference:
+ AddParameterToComponents(openApiParameterReference.Target, openApiParameterReference.Reference.Id);
+ break;
+ case OpenApiParameter parameter:
+ AddParameterToComponents(parameter);
+ break;
+ case OpenApiResponseReference openApiResponseReference:
+ AddResponseToComponents(openApiResponseReference.Target, openApiResponseReference.Reference.Id);
+ break;
+ case OpenApiResponse response:
+ AddResponseToComponents(response);
+ break;
+ case OpenApiRequestBodyReference openApiRequestBodyReference:
+ AddRequestBodyToComponents(openApiRequestBodyReference.Target, openApiRequestBodyReference.Reference.Id);
+ break;
+ case OpenApiRequestBody requestBody:
+ AddRequestBodyToComponents(requestBody);
+ break;
+ case OpenApiExampleReference openApiExampleReference:
+ AddExampleToComponents(openApiExampleReference.Target, openApiExampleReference.Reference.Id);
+ break;
+ case OpenApiExample example:
+ AddExampleToComponents(example);
+ break;
+ case OpenApiHeaderReference openApiHeaderReference:
+ AddHeaderToComponents(openApiHeaderReference.Target, openApiHeaderReference.Reference.Id);
+ break;
+ case OpenApiHeader header:
+ AddHeaderToComponents(header);
+ break;
+ case OpenApiCallbackReference openApiCallbackReference:
+ AddCallbackToComponents(openApiCallbackReference.Target, openApiCallbackReference.Reference.Id);
+ break;
+ case OpenApiCallback callback:
+ AddCallbackToComponents(callback);
+ break;
+ case OpenApiLinkReference openApiLinkReference:
+ AddLinkToComponents(openApiLinkReference.Target, openApiLinkReference.Reference.Id);
+ break;
+ case OpenApiLink link:
+ AddLinkToComponents(link);
+ break;
+ case OpenApiSecuritySchemeReference openApiSecuritySchemeReference:
+ AddSecuritySchemeToComponents(openApiSecuritySchemeReference.Target, openApiSecuritySchemeReference.Reference.Id);
+ break;
+ case OpenApiSecurityScheme securityScheme:
+ AddSecuritySchemeToComponents(securityScheme);
+ break;
+ case OpenApiPathItemReference openApiPathItemReference:
+ AddPathItemToComponents(openApiPathItemReference.Target, openApiPathItemReference.Reference.Id);
+ break;
+ case OpenApiPathItem pathItem:
+ AddPathItemToComponents(pathItem);
+ break;
+ default:
+ break;
}
- ///
- /// Visits IOpenApiReferenceable instances that are references and not in components.
- ///
- /// An IOpenApiReferenceable object.
- public override void Visit(IOpenApiReferenceable referenceable)
+ base.Visit(referenceable);
+ }
+
+ private void AddSchemaToComponents(OpenApiSchema schema, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureSchemasExist();
+ if (!Components.Schemas.ContainsKey(referenceId ?? schema.Reference.Id))
{
- switch (referenceable)
- {
- case OpenApiSchema schema:
- EnsureComponentsExist();
- EnsureSchemasExist();
- if (!Components.Schemas.ContainsKey(schema.Reference.Id))
- {
- Components.Schemas.Add(schema.Reference.Id, schema);
- }
- break;
-
- case OpenApiParameter parameter:
- EnsureComponentsExist();
- EnsureParametersExist();
- if (!Components.Parameters.ContainsKey(parameter.Reference.Id))
- {
- Components.Parameters.Add(parameter.Reference.Id, parameter);
- }
- break;
-
- case OpenApiResponse response:
- EnsureComponentsExist();
- EnsureResponsesExist();
- if (!Components.Responses.ContainsKey(response.Reference.Id))
- {
- Components.Responses.Add(response.Reference.Id, response);
- }
- break;
-
- case OpenApiRequestBody requestBody:
- EnsureComponentsExist();
- EnsureResponsesExist();
- EnsureRequestBodiesExist();
- if (!Components.RequestBodies.ContainsKey(requestBody.Reference.Id))
- {
- Components.RequestBodies.Add(requestBody.Reference.Id, requestBody);
- }
- break;
-
- case OpenApiExample example:
- EnsureComponentsExist();
- EnsureExamplesExist();
- if (!Components.Examples.ContainsKey(example.Reference.Id))
- {
- Components.Examples.Add(example.Reference.Id, example);
- }
- break;
-
- case OpenApiHeader header:
- EnsureComponentsExist();
- EnsureHeadersExist();
- if (!Components.Headers.ContainsKey(header.Reference.Id))
- {
- Components.Headers.Add(header.Reference.Id, header);
- }
- break;
-
- case OpenApiCallback callback:
- EnsureComponentsExist();
- EnsureCallbacksExist();
- if (!Components.Callbacks.ContainsKey(callback.Reference.Id))
- {
- Components.Callbacks.Add(callback.Reference.Id, callback);
- }
- break;
-
- case OpenApiLink link:
- EnsureComponentsExist();
- EnsureLinksExist();
- if (!Components.Links.ContainsKey(link.Reference.Id))
- {
- Components.Links.Add(link.Reference.Id, link);
- }
- break;
-
- case OpenApiSecurityScheme securityScheme:
- EnsureComponentsExist();
- EnsureSecuritySchemesExist();
- if (!Components.SecuritySchemes.ContainsKey(securityScheme.Reference.Id))
- {
- Components.SecuritySchemes.Add(securityScheme.Reference.Id, securityScheme);
- }
- break;
-
- default:
- break;
- }
-
- base.Visit(referenceable);
+ Components.Schemas.Add(referenceId ?? schema.Reference.Id, schema);
}
+ }
- ///
- /// Visits
- ///
- /// The OpenApiSchema to be visited.
- public override void Visit(OpenApiSchema schema)
+ private void AddParameterToComponents(OpenApiParameter parameter, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureParametersExist();
+ if (!Components.Parameters.ContainsKey(referenceId ?? parameter.Reference.Id))
{
- // This is needed to handle schemas used in Responses in components
- if (schema.Reference != null)
- {
- EnsureComponentsExist();
- EnsureSchemasExist();
- if (!Components.Schemas.ContainsKey(schema.Reference.Id))
- {
- Components.Schemas.Add(schema.Reference.Id, schema);
- }
- }
- base.Visit(schema);
+ Components.Parameters.Add(referenceId ?? parameter.Reference.Id, parameter);
}
+ }
- private void EnsureComponentsExist()
+ private void AddResponseToComponents(OpenApiResponse response, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureResponsesExist();
+ if (!Components.Responses.ContainsKey(referenceId ?? response.Reference.Id))
{
- _target.Components ??= new();
+ Components.Responses.Add(referenceId ?? response.Reference.Id, response);
}
-
- private void EnsureSchemasExist()
+ }
+ private void AddRequestBodyToComponents(OpenApiRequestBody requestBody, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureRequestBodiesExist();
+ if (!Components.RequestBodies.ContainsKey(referenceId ?? requestBody.Reference.Id))
{
- _target.Components.Schemas ??= new Dictionary();
+ Components.RequestBodies.Add(referenceId ?? requestBody.Reference.Id, requestBody);
}
-
- private void EnsureParametersExist()
+ }
+ private void AddLinkToComponents(OpenApiLink link, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureLinksExist();
+ if (!Components.Links.ContainsKey(referenceId ?? link.Reference.Id))
{
- _target.Components.Parameters ??= new Dictionary();
+ Components.Links.Add(referenceId ?? link.Reference.Id, link);
}
-
- private void EnsureResponsesExist()
+ }
+ private void AddCallbackToComponents(OpenApiCallback callback, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureCallbacksExist();
+ if (!Components.Callbacks.ContainsKey(referenceId ?? callback.Reference.Id))
{
- _target.Components.Responses ??= new Dictionary();
+ Components.Callbacks.Add(referenceId ?? callback.Reference.Id, callback);
}
-
- private void EnsureRequestBodiesExist()
+ }
+ private void AddHeaderToComponents(OpenApiHeader header, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureHeadersExist();
+ if (!Components.Headers.ContainsKey(referenceId ?? header.Reference.Id))
{
- _target.Components.RequestBodies ??= new Dictionary();
+ Components.Headers.Add(referenceId ?? header.Reference.Id, header);
}
-
- private void EnsureExamplesExist()
+ }
+ private void AddExampleToComponents(OpenApiExample example, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureExamplesExist();
+ if (!Components.Examples.ContainsKey(referenceId ?? example.Reference.Id))
{
- _target.Components.Examples ??= new Dictionary();
+ Components.Examples.Add(referenceId ?? example.Reference.Id, example);
}
-
- private void EnsureHeadersExist()
+ }
+ private void AddPathItemToComponents(OpenApiPathItem pathItem, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsurePathItemsExist();
+ if (!Components.PathItems.ContainsKey(referenceId ?? pathItem.Reference.Id))
{
- _target.Components.Headers ??= new Dictionary();
+ Components.PathItems.Add(referenceId ?? pathItem.Reference.Id, pathItem);
}
-
- private void EnsureCallbacksExist()
+ }
+ private void AddSecuritySchemeToComponents(OpenApiSecurityScheme securityScheme, string referenceId = null)
+ {
+ EnsureComponentsExist();
+ EnsureSecuritySchemesExist();
+ if (!Components.SecuritySchemes.ContainsKey(referenceId ?? securityScheme.Reference.Id))
{
- _target.Components.Callbacks ??= new Dictionary();
+ Components.SecuritySchemes.Add(referenceId ?? securityScheme.Reference.Id, securityScheme);
}
+ }
- private void EnsureLinksExist()
+ ///
+ public override void Visit(OpenApiSchema schema)
+ {
+ // This is needed to handle schemas used in Responses in components
+ if (schema is OpenApiSchemaReference openApiSchemaReference)
{
- _target.Components.Links ??= new Dictionary();
+ AddSchemaToComponents(openApiSchemaReference.Target, openApiSchemaReference.Reference.Id);
}
-
- private void EnsureSecuritySchemesExist()
+ else if (schema.Reference != null)
{
- _target.Components.SecuritySchemes ??= new Dictionary();
+ AddSchemaToComponents(schema);
}
+ base.Visit(schema);
+ }
+
+ private void EnsureComponentsExist()
+ {
+ _target.Components ??= new();
+ }
+
+ private void EnsureSchemasExist()
+ {
+ _target.Components.Schemas ??= new Dictionary();
+ }
+
+ private void EnsureParametersExist()
+ {
+ _target.Components.Parameters ??= new Dictionary();
+ }
+
+ private void EnsureResponsesExist()
+ {
+ _target.Components.Responses ??= new Dictionary();
+ }
+
+ private void EnsureRequestBodiesExist()
+ {
+ _target.Components.RequestBodies ??= new Dictionary();
+ }
+
+ private void EnsureExamplesExist()
+ {
+ _target.Components.Examples ??= new Dictionary();
+ }
+
+ private void EnsureHeadersExist()
+ {
+ _target.Components.Headers ??= new Dictionary();
+ }
+
+ private void EnsureCallbacksExist()
+ {
+ _target.Components.Callbacks ??= new Dictionary();
+ }
+
+ private void EnsureLinksExist()
+ {
+ _target.Components.Links ??= new Dictionary();
+ }
+
+ private void EnsureSecuritySchemesExist()
+ {
+ _target.Components.SecuritySchemes ??= new Dictionary();
+ }
+ private void EnsurePathItemsExist()
+ {
+ _target.Components.PathItems ??= new Dictionary();
}
}
diff --git a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs
index c731d4d8b..a889628b3 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs
@@ -7,6 +7,7 @@
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.References;
namespace Microsoft.OpenApi.Services
{
@@ -262,6 +263,13 @@ public virtual void Visit(OpenApiTag tag)
{
}
+ ///
+ /// Visits
+ ///
+ public virtual void Visit(OpenApiTagReference tag)
+ {
+ }
+
///
/// Visits
///
@@ -304,6 +312,13 @@ public virtual void Visit(IList openApiTags)
{
}
+ ///
+ /// Visits list of
+ ///
+ public virtual void Visit(IList openApiTags)
+ {
+ }
+
///
/// Visits list of
///
diff --git a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs
index 2dd882ce7..9321b3b17 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs
@@ -80,6 +80,28 @@ internal void Walk(IList tags)
}
}
+ ///
+ /// Visits list of and child objects
+ ///
+ internal void Walk(IList tags)
+ {
+ if (tags == null)
+ {
+ return;
+ }
+
+ _visitor.Visit(tags);
+
+ // Visit tags
+ if (tags != null)
+ {
+ for (var i = 0; i < tags.Count; i++)
+ {
+ Walk(i.ToString(), () => Walk(tags[i]));
+ }
+ }
+ }
+
///
/// Visits and child objects
///
@@ -424,15 +446,22 @@ internal void Walk(OpenApiTag tag)
return;
}
- if (tag is OpenApiTagReference)
+ _visitor.Visit(tag);
+ _visitor.Visit(tag.ExternalDocs);
+ _visitor.Visit(tag as IOpenApiExtensible);
+ }
+
+ ///
+ /// Visits and child objects
+ ///
+ internal void Walk(OpenApiTagReference tag)
+ {
+ if (tag == null)
{
- Walk(tag as IOpenApiReferenceable);
return;
}
- _visitor.Visit(tag);
- _visitor.Visit(tag.ExternalDocs);
- _visitor.Visit(tag as IOpenApiExtensible);
+ Walk(tag as IOpenApiReferenceable);
}
///
diff --git a/src/Microsoft.OpenApi/Services/OpenApiWorkspace.cs b/src/Microsoft.OpenApi/Services/OpenApiWorkspace.cs
index b227b06e9..f92e6f322 100644
--- a/src/Microsoft.OpenApi/Services/OpenApiWorkspace.cs
+++ b/src/Microsoft.OpenApi/Services/OpenApiWorkspace.cs
@@ -54,6 +54,7 @@ public int ComponentsCount()
{
return _IOpenApiReferenceableRegistry.Count + _artifactsRegistry.Count;
}
+ private const string ComponentSegmentSeparator = "/";
///
/// Registers a document's components into the workspace
@@ -63,13 +64,13 @@ public void RegisterComponents(OpenApiDocument document)
{
if (document?.Components == null) return;
- string baseUri = document.BaseUri + OpenApiConstants.ComponentsSegment;
+ string baseUri = getBaseUri(document);
string location;
// Register Schema
foreach (var item in document.Components.Schemas)
{
- location = item.Value.Id ?? baseUri + ReferenceType.Schema.GetDisplayName() + "/" + item.Key;
+ location = item.Value.Id ?? baseUri + ReferenceType.Schema.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
@@ -77,67 +78,108 @@ public void RegisterComponents(OpenApiDocument document)
// Register Parameters
foreach (var item in document.Components.Parameters)
{
- location = baseUri + ReferenceType.Parameter.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.Parameter.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register Responses
foreach (var item in document.Components.Responses)
{
- location = baseUri + ReferenceType.Response.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.Response.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register RequestBodies
foreach (var item in document.Components.RequestBodies)
{
- location = baseUri + ReferenceType.RequestBody.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.RequestBody.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register Links
foreach (var item in document.Components.Links)
{
- location = baseUri + ReferenceType.Link.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.Link.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register Callbacks
foreach (var item in document.Components.Callbacks)
{
- location = baseUri + ReferenceType.Callback.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.Callback.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register PathItems
foreach (var item in document.Components.PathItems)
{
- location = baseUri + ReferenceType.PathItem.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.PathItem.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register Examples
foreach (var item in document.Components.Examples)
{
- location = baseUri + ReferenceType.Example.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.Example.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register Headers
foreach (var item in document.Components.Headers)
{
- location = baseUri + ReferenceType.Header.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.Header.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
// Register SecuritySchemes
foreach (var item in document.Components.SecuritySchemes)
{
- location = baseUri + ReferenceType.SecurityScheme.GetDisplayName() + "/" + item.Key;
+ location = baseUri + ReferenceType.SecurityScheme.GetDisplayName() + ComponentSegmentSeparator + item.Key;
RegisterComponent(location, item.Value);
}
}
+ private string getBaseUri(OpenApiDocument openApiDocument)
+ {
+ return openApiDocument.BaseUri + OpenApiConstants.ComponentsSegment;
+ }
+
+ ///
+ /// Registers a component for a document in the workspace
+ ///
+ /// The document to register the component for.
+ /// The component to register.
+ /// The id of the component.
+ /// The type of the component to register.
+ /// true if the component is successfully registered; otherwise false.
+ /// openApiDocument is null
+ /// componentToRegister is null
+ /// id is null or empty
+ public bool RegisterComponentForDocument(OpenApiDocument openApiDocument, T componentToRegister, string id)
+ {
+ Utils.CheckArgumentNull(openApiDocument);
+ Utils.CheckArgumentNull(componentToRegister);
+ Utils.CheckArgumentNullOrEmpty(id);
+
+ var baseUri = getBaseUri(openApiDocument);
+
+ var location = componentToRegister switch
+ {
+ OpenApiSchema => baseUri + ReferenceType.Schema.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiParameter => baseUri + ReferenceType.Parameter.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiResponse => baseUri + ReferenceType.Response.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiRequestBody => baseUri + ReferenceType.RequestBody.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiLink => baseUri + ReferenceType.Link.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiCallback => baseUri + ReferenceType.Callback.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiPathItem => baseUri + ReferenceType.PathItem.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiExample => baseUri + ReferenceType.Example.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiHeader => baseUri + ReferenceType.Header.GetDisplayName() + ComponentSegmentSeparator + id,
+ OpenApiSecurityScheme => baseUri + ReferenceType.SecurityScheme.GetDisplayName() + ComponentSegmentSeparator + id,
+ _ => throw new ArgumentException($"Invalid component type {componentToRegister.GetType().Name}"),
+ };
+
+ return RegisterComponent(location, componentToRegister);
+ }
///
/// Registers a component in the component registry.
@@ -145,7 +187,7 @@ public void RegisterComponents(OpenApiDocument document)
///
///
/// true if the component is successfully registered; otherwise false.
- public bool RegisterComponent(string location, T component)
+ internal bool RegisterComponent(string location, T component)
{
var uri = ToLocationUrl(location);
if (component is IOpenApiReferenceable referenceable)
diff --git a/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs b/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs
index 4e05c44fd..61b9d3a0c 100644
--- a/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs
+++ b/src/Microsoft.OpenApi/Validations/Rules/RuleHelpers.cs
@@ -52,7 +52,7 @@ public static void ValidateDataTypeMismatch(
}
// convert value to JsonElement and access the ValueKind property to determine the type.
- var jsonElement = JsonDocument.Parse(JsonSerializer.Serialize(value)).RootElement;
+ var valueKind = value.GetValueKind();
var type = schema.Type.ToIdentifier();
var format = schema.Format;
@@ -60,7 +60,7 @@ public static void ValidateDataTypeMismatch(
// Before checking the type, check first if the schema allows null.
// If so and the data given is also null, this is allowed for any type.
- if (nullable && jsonElement.ValueKind is JsonValueKind.Null)
+ if (nullable && valueKind is JsonValueKind.Null)
{
return;
}
@@ -70,7 +70,7 @@ public static void ValidateDataTypeMismatch(
// It is not against the spec to have a string representing an object value.
// 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
- if (jsonElement.ValueKind is JsonValueKind.String)
+ if (valueKind is JsonValueKind.String)
{
return;
}
@@ -110,7 +110,7 @@ public static void ValidateDataTypeMismatch(
// It is not against the spec to have a string representing an array value.
// 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
- if (jsonElement.ValueKind is JsonValueKind.String)
+ if (valueKind is JsonValueKind.String)
{
return;
}
@@ -138,7 +138,7 @@ public static void ValidateDataTypeMismatch(
if (type is "integer" or "number" && format is "int32")
{
- if (jsonElement.ValueKind is not JsonValueKind.Number)
+ if (valueKind is not JsonValueKind.Number)
{
context.CreateWarning(
ruleName,
@@ -150,7 +150,7 @@ public static void ValidateDataTypeMismatch(
if (type is "integer" or "number" && format is "int64")
{
- if (jsonElement.ValueKind is not JsonValueKind.Number)
+ if (valueKind is not JsonValueKind.Number)
{
context.CreateWarning(
ruleName,
@@ -162,7 +162,7 @@ public static void ValidateDataTypeMismatch(
if (type is "integer")
{
- if (jsonElement.ValueKind is not JsonValueKind.Number)
+ if (valueKind is not JsonValueKind.Number)
{
context.CreateWarning(
ruleName,
@@ -174,7 +174,7 @@ public static void ValidateDataTypeMismatch(
if (type is "number" && format is "float")
{
- if (jsonElement.ValueKind is not JsonValueKind.Number)
+ if (valueKind is not JsonValueKind.Number)
{
context.CreateWarning(
ruleName,
@@ -186,7 +186,7 @@ public static void ValidateDataTypeMismatch(
if (type is "number" && format is "double")
{
- if (jsonElement.ValueKind is not JsonValueKind.Number)
+ if (valueKind is not JsonValueKind.Number)
{
context.CreateWarning(
ruleName,
@@ -198,7 +198,7 @@ public static void ValidateDataTypeMismatch(
if (type is "number")
{
- if (jsonElement.ValueKind is not JsonValueKind.Number)
+ if (valueKind is not JsonValueKind.Number)
{
context.CreateWarning(
ruleName,
@@ -210,7 +210,7 @@ public static void ValidateDataTypeMismatch(
if (type is "string" && format is "byte")
{
- if (jsonElement.ValueKind is not JsonValueKind.String)
+ if (valueKind is not JsonValueKind.String)
{
context.CreateWarning(
ruleName,
@@ -222,7 +222,7 @@ public static void ValidateDataTypeMismatch(
if (type is "string" && format is "date")
{
- if (jsonElement.ValueKind is not JsonValueKind.String)
+ if (valueKind is not JsonValueKind.String)
{
context.CreateWarning(
ruleName,
@@ -234,7 +234,7 @@ public static void ValidateDataTypeMismatch(
if (type is "string" && format is "date-time")
{
- if (jsonElement.ValueKind is not JsonValueKind.String)
+ if (valueKind is not JsonValueKind.String)
{
context.CreateWarning(
ruleName,
@@ -246,7 +246,7 @@ public static void ValidateDataTypeMismatch(
if (type is "string" && format is "password")
{
- if (jsonElement.ValueKind is not JsonValueKind.String)
+ if (valueKind is not JsonValueKind.String)
{
context.CreateWarning(
ruleName,
@@ -258,7 +258,7 @@ public static void ValidateDataTypeMismatch(
if (type is "string")
{
- if (jsonElement.ValueKind is not JsonValueKind.String)
+ if (valueKind is not JsonValueKind.String)
{
context.CreateWarning(
ruleName,
@@ -270,7 +270,7 @@ public static void ValidateDataTypeMismatch(
if (type is "boolean")
{
- if (jsonElement.ValueKind is not JsonValueKind.True && jsonElement.ValueKind is not JsonValueKind.False)
+ if (valueKind is not JsonValueKind.True && valueKind is not JsonValueKind.False)
{
context.CreateWarning(
ruleName,
diff --git a/src/Microsoft.OpenApi/Validations/ValidationRule.cs b/src/Microsoft.OpenApi/Validations/ValidationRule.cs
index bccb28be6..a72beb5c1 100644
--- a/src/Microsoft.OpenApi/Validations/ValidationRule.cs
+++ b/src/Microsoft.OpenApi/Validations/ValidationRule.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System;
-using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Properties;
@@ -44,16 +43,6 @@ public class ValidationRule : ValidationRule
{
private readonly Action _validate;
- ///
- /// Initializes a new instance of the class.
- ///
- /// Action to perform the validation.
- [Obsolete("Please use the other constructor and specify a name")]
- public ValidationRule(Action validate)
- : this (Guid.NewGuid().ToString("D"), validate)
- {
- }
-
///
/// Initializes a new instance of the class.
///
diff --git a/src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs b/src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs
index 9ea04b400..78be4e37f 100644
--- a/src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs
+++ b/src/Microsoft.OpenApi/Writers/IOpenApiWriter.cs
@@ -1,6 +1,9 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
+using System.Threading;
+using System.Threading.Tasks;
+
namespace Microsoft.OpenApi.Writers
{
///
@@ -71,6 +74,7 @@ public interface IOpenApiWriter
///
/// Flush the writer.
///
- void Flush();
+ /// The cancellation token.
+ Task FlushAsync(CancellationToken cancellationToken = default);
}
}
diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs
index b0ef0a174..fd2ff1387 100644
--- a/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs
+++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs
@@ -1,7 +1,9 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
+using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Text.Json;
using System.Text.Json.Nodes;
using Microsoft.OpenApi.Any;
@@ -49,7 +51,7 @@ public static void WriteExtensions(this IOpenApiWriter writer, IDictionaryThe JsonNode value
public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
{
- Utils.CheckArgumentNull(writer);;
+ Utils.CheckArgumentNull(writer);
if (node == null)
{
@@ -57,8 +59,7 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
return;
}
- var element = JsonDocument.Parse(node.ToJsonString()).RootElement;
- switch (element.ValueKind)
+ switch (node.GetValueKind())
{
case JsonValueKind.Array: // Array
writer.WriteArray(node as JsonArray);
@@ -67,13 +68,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
writer.WriteObject(node as JsonObject);
break;
case JsonValueKind.String: // Primitive
- writer.WritePrimitive(element);
+ writer.WritePrimitive(node);
break;
case JsonValueKind.Number: // Primitive
- writer.WritePrimitive(element);
+ writer.WritePrimitive(node);
break;
case JsonValueKind.True or JsonValueKind.False: // Primitive
- writer.WritePrimitive(element);
+ writer.WritePrimitive(node);
break;
case JsonValueKind.Null: // null
writer.WriteNull();
@@ -108,52 +109,71 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity)
writer.WriteEndObject();
}
- private static void WritePrimitive(this IOpenApiWriter writer, JsonElement primitive)
+ private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitive)
{
- if (writer == null)
- {
- Utils.CheckArgumentNull(writer);
- }
+ Utils.CheckArgumentNull(writer);
- if (primitive.ValueKind == JsonValueKind.String)
+ var valueKind = primitive.GetValueKind();
+
+ if (valueKind == JsonValueKind.String && primitive is JsonValue jsonStrValue)
{
- // check whether string is actual string or date time object
- if (primitive.TryGetDateTime(out var dateTime))
+ if (jsonStrValue.TryGetValue(out var dto))
{
- writer.WriteValue(dateTime);
+ writer.WriteValue(dto);
}
- else if (primitive.TryGetDateTimeOffset(out var dateTimeOffset))
+ else if (jsonStrValue.TryGetValue(out var dt))
{
- writer.WriteValue(dateTimeOffset);
+ writer.WriteValue(dt);
}
- else
+ else if (jsonStrValue.TryGetValue(out var strValue))
{
- writer.WriteValue(primitive.GetString());
+ // check whether string is actual string or date time object
+ if (DateTimeOffset.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset))
+ {
+ writer.WriteValue(dateTimeOffset);
+ }
+ else if (DateTime.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
+ { // order matters, DTO needs to be checked first!!!
+ writer.WriteValue(dateTime);
+ }
+ else
+ {
+ writer.WriteValue(strValue);
+ }
}
}
- if (primitive.ValueKind == JsonValueKind.Number)
+ else if (valueKind == JsonValueKind.Number && primitive is JsonValue jsonValue)
{
- if (primitive.TryGetDecimal(out var decimalValue))
+
+ if (jsonValue.TryGetValue(out var decimalValue))
{
writer.WriteValue(decimalValue);
}
- else if (primitive.TryGetDouble(out var doubleValue))
+ else if (jsonValue.TryGetValue(out var doubleValue))
{
writer.WriteValue(doubleValue);
}
- else if (primitive.TryGetInt64(out var longValue))
+ else if (jsonValue.TryGetValue(out var floatValue))
+ {
+ writer.WriteValue(floatValue);
+ }
+ else if (jsonValue.TryGetValue(out var longValue))
{
writer.WriteValue(longValue);
}
- else if (primitive.TryGetInt32(out var intValue))
+ else if (jsonValue.TryGetValue(out var intValue))
{
writer.WriteValue(intValue);
}
}
- if (primitive.ValueKind is JsonValueKind.True or JsonValueKind.False)
+ else if (valueKind is JsonValueKind.False)
+ {
+ writer.WriteValue(false);
+ }
+ else if (valueKind is JsonValueKind.True)
{
- writer.WriteValue(primitive.GetBoolean());
+ writer.WriteValue(true);
}
}
}
diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs
index 99b148652..7626f5908 100644
--- a/src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs
+++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs
@@ -3,15 +3,13 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
-using System.Linq;
-using System.Text.Json;
-using Microsoft.OpenApi.Any;
+using System.Threading;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Exceptions;
-using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Properties;
-using Microsoft.OpenApi.Services;
namespace Microsoft.OpenApi.Writers
{
@@ -45,7 +43,7 @@ public abstract class OpenApiWriterBase : IOpenApiWriter
/// Initializes a new instance of the class.
///
/// The text writer.
- public OpenApiWriterBase(TextWriter textWriter) : this(textWriter, null)
+ protected OpenApiWriterBase(TextWriter textWriter) : this(textWriter, null)
{
}
@@ -54,7 +52,7 @@ public OpenApiWriterBase(TextWriter textWriter) : this(textWriter, null)
///
///
///
- public OpenApiWriterBase(TextWriter textWriter, OpenApiWriterSettings settings)
+ protected OpenApiWriterBase(TextWriter textWriter, OpenApiWriterSettings settings)
{
Writer = textWriter;
Writer.NewLine = "\n";
@@ -118,12 +116,14 @@ public OpenApiWriterBase(TextWriter textWriter, OpenApiWriterSettings settings)
///
public abstract void WriteRaw(string value);
- ///
- /// Flush the writer.
- ///
- public void Flush()
+ ///
+ public Task FlushAsync(CancellationToken cancellationToken = default)
{
- Writer.Flush();
+#if NET8_OR_GREATER
+ return Writer.FlushAsync(cancellationToken);
+#else
+ return Writer.FlushAsync();
+#endif
}
///
@@ -188,7 +188,7 @@ public virtual void WriteValue(long value)
/// The DateTime value.
public virtual void WriteValue(DateTime value)
{
- this.WriteValue(value.ToString("o"));
+ this.WriteValue(value.ToString("o", CultureInfo.InvariantCulture));
}
///
@@ -197,7 +197,7 @@ public virtual void WriteValue(DateTime value)
/// The DateTimeOffset value.
public virtual void WriteValue(DateTimeOffset value)
{
- this.WriteValue(value.ToString("o"));
+ this.WriteValue(value.ToString("o", CultureInfo.InvariantCulture));
}
///
diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterSettings.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterSettings.cs
index c647436ea..e6364affa 100644
--- a/src/Microsoft.OpenApi/Writers/OpenApiWriterSettings.cs
+++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterSettings.cs
@@ -1,67 +1,15 @@
-
-using System;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Services;
namespace Microsoft.OpenApi.Writers
{
- ///
- /// Indicates if and when the writer should convert references into complete object renderings
- ///
- [Obsolete("Use InlineLocalReference and InlineExternalReference settings instead")]
- public enum ReferenceInlineSetting
- {
- ///
- /// Render all references as $ref.
- ///
- DoNotInlineReferences,
- ///
- /// Render all local references as inline objects
- ///
- InlineLocalReferences,
- ///
- /// Render all references as inline objects.
- ///
- InlineAllReferences
- }
-
///
/// Configuration settings to control how OpenAPI documents are written
///
public class OpenApiWriterSettings
{
- [Obsolete("Use InlineLocalReference and InlineExternalReference settings instead")]
- private ReferenceInlineSetting referenceInline = ReferenceInlineSetting.DoNotInlineReferences;
-
internal LoopDetector LoopDetector { get; } = new();
///
- /// Indicates how references in the source document should be handled.
- ///
- [Obsolete("Use InlineLocalReference and InlineExternalReference settings instead")]
- public ReferenceInlineSetting ReferenceInline
- {
- get { return referenceInline; }
- set
- {
- referenceInline = value;
- switch (referenceInline)
- {
- case ReferenceInlineSetting.DoNotInlineReferences:
- InlineLocalReferences = false;
- InlineExternalReferences = false;
- break;
- case ReferenceInlineSetting.InlineLocalReferences:
- InlineLocalReferences = true;
- InlineExternalReferences = false;
- break;
- case ReferenceInlineSetting.InlineAllReferences:
- InlineLocalReferences = true;
- InlineExternalReferences = true;
- break;
- }
- }
- }
- ///
/// Indicates if local references should be rendered as an inline object
///
public bool InlineLocalReferences { get; set; }
@@ -76,10 +24,5 @@ internal bool ShouldInlineReference(OpenApiReference reference)
return (reference.IsLocal && InlineLocalReferences)
|| (reference.IsExternal && InlineExternalReferences);
}
-
- internal bool ShouldInlineReference()
- {
- return InlineLocalReferences || InlineExternalReferences;
- }
}
}
diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj
index a0cc5337f..b611d0b32 100644
--- a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj
+++ b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj
@@ -11,12 +11,12 @@
-
+
-
-
-
+
+
+
diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
index 12293c4e5..77f2c9ae9 100644
--- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
+++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs
@@ -3,11 +3,9 @@
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
-using Microsoft.OpenApi.Readers;
using Microsoft.OpenApi.Services;
using Microsoft.OpenApi.Tests.UtilityFiles;
using Moq;
-using SharpYaml.Tokens;
using Xunit;
namespace Microsoft.OpenApi.Hidi.Tests
diff --git a/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs
index 91dd59919..edbf143fe 100644
--- a/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs
+++ b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs
@@ -4,6 +4,7 @@
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
+using Microsoft.OpenApi.Models.References;
namespace Microsoft.OpenApi.Tests.UtilityFiles
{
@@ -19,6 +20,17 @@ public static class OpenApiDocumentMock
public static OpenApiDocument CreateOpenApiDocument()
{
var applicationJsonMediaType = "application/json";
+ const string getTeamsActivityByPeriodPath = "/reports/microsoft.graph.getTeamsUserActivityCounts(period={period})";
+ const string getTeamsActivityByDatePath = "/reports/microsoft.graph.getTeamsUserActivityUserDetail(date={date})";
+ const string usersPath = "/users";
+ const string usersByIdPath = "/users/{user-id}";
+ const string messagesByIdPath = "/users/{user-id}/messages/{message-id}";
+ const string administrativeUnitRestorePath = "/administrativeUnits/{administrativeUnit-id}/microsoft.graph.restore";
+ const string logoPath = "/applications/{application-id}/logo";
+ const string securityProfilesPath = "/security/hostSecurityProfiles";
+ const string communicationsCallsKeepAlivePath = "/communications/calls/{call-id}/microsoft.graph.keepAlive";
+ const string eventsDeltaPath = "/groups/{group-id}/events/{event-id}/calendar/events/microsoft.graph.delta";
+ const string refPath = "/applications/{application-id}/createdOnBehalfOf/$ref";
var document = new OpenApiDocument
{
@@ -57,22 +69,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/reports/microsoft.graph.getTeamsUserActivityCounts(period={period})"] = new()
+ [getTeamsActivityByPeriodPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "reports.Functions"
- }
- }
- },
OperationId = "reports.getTeamsUserActivityCounts",
Summary = "Invoke function getTeamsUserActivityUserCounts",
Parameters = new List
@@ -131,22 +134,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/reports/microsoft.graph.getTeamsUserActivityUserDetail(date={date})"] = new()
+ [getTeamsActivityByDatePath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "reports.Functions"
- }
- }
- },
OperationId = "reports.getTeamsUserActivityUserDetail-a3f1",
Summary = "Invoke function getTeamsUserActivityUserDetail",
Parameters = new List
@@ -203,22 +197,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/users"] = new()
+ [usersPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "users.user"
- }
- }
- },
OperationId = "users.user.ListUser",
Summary = "Get entities from users",
Responses = new()
@@ -266,22 +251,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/users/{user-id}"] = new()
+ [usersByIdPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "users.user"
- }
- }
- },
OperationId = "users.user.GetUser",
Summary = "Get entity from users by key",
Responses = new()
@@ -315,15 +291,6 @@ public static OpenApiDocument CreateOpenApiDocument()
{
OperationType.Patch, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "users.user"
- }
- }
- },
OperationId = "users.user.UpdateUser",
Summary = "Update entity in users",
Responses = new()
@@ -339,22 +306,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/users/{user-id}/messages/{message-id}"] = new()
+ [messagesByIdPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "users.message"
- }
- }
- },
OperationId = "users.GetMessages",
Summary = "Get messages from users",
Description = "The messages in a mailbox or folder. Read-only. Nullable.",
@@ -403,22 +361,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/administrativeUnits/{administrativeUnit-id}/microsoft.graph.restore"] = new()
+ [administrativeUnitRestorePath] = new()
{
Operations = new Dictionary
{
{
OperationType.Post, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "administrativeUnits.Actions"
- }
- }
- },
OperationId = "administrativeUnits.restore",
Summary = "Invoke action restore",
Parameters = new List
@@ -470,22 +419,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/applications/{application-id}/logo"] = new()
+ [logoPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Put, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "applications.application"
- }
- }
- },
OperationId = "applications.application.UpdateLogo",
Summary = "Update media content for application in applications",
Responses = new()
@@ -501,22 +441,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/security/hostSecurityProfiles"] = new()
+ [securityProfilesPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "security.hostSecurityProfile"
- }
- }
- },
OperationId = "security.ListHostSecurityProfiles",
Summary = "Get hostSecurityProfiles from security",
Responses = new()
@@ -564,22 +495,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/communications/calls/{call-id}/microsoft.graph.keepAlive"] = new()
+ [communicationsCallsKeepAlivePath] = new()
{
Operations = new Dictionary
{
{
OperationType.Post, new OpenApiOperation
{
- Tags = new List
- {
- {
- new()
- {
- Name = "communications.Actions"
- }
- }
- },
OperationId = "communications.calls.call.keepAlive",
Summary = "Invoke action keepAlive",
Parameters = new List
@@ -621,20 +543,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/groups/{group-id}/events/{event-id}/calendar/events/microsoft.graph.delta"] = new()
+ [eventsDeltaPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- new()
- {
- Name = "groups.Functions"
- }
- },
OperationId = "groups.group.events.event.calendar.events.delta",
Summary = "Invoke function delta",
Parameters = new List
@@ -711,20 +626,13 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
},
- ["/applications/{application-id}/createdOnBehalfOf/$ref"] = new()
+ [refPath] = new()
{
Operations = new Dictionary
{
{
OperationType.Get, new OpenApiOperation
{
- Tags = new List
- {
- new()
- {
- Name = "applications.directoryObject"
- }
- },
OperationId = "applications.GetRefCreatedOnBehalfOf",
Summary = "Get ref of createdOnBehalfOf from applications"
}
@@ -755,8 +663,68 @@ public static OpenApiDocument CreateOpenApiDocument()
}
}
}
+ },
+ Tags = new List
+ {
+ new()
+ {
+ Name = "reports.Functions",
+ Description = "The reports.Functions operations"
+ },
+ new()
+ {
+ Name = "users.user",
+ Description = "The users.user operations"
+ },
+ new()
+ {
+ Name = "users.message",
+ Description = "The users.message operations"
+ },
+ new()
+ {
+ Name = "administrativeUnits.Actions",
+ Description = "The administrativeUnits.Actions operations"
+ },
+ new()
+ {
+ Name = "applications.application",
+ Description = "The applications.application operations"
+ },
+ new()
+ {
+ Name = "security.hostSecurityProfile",
+ Description = "The security.hostSecurityProfile operations"
+ },
+ new()
+ {
+ Name = "communications.Actions",
+ Description = "The communications.Actions operations"
+ },
+ new()
+ {
+ Name = "groups.Functions",
+ Description = "The groups.Functions operations"
+ },
+ new()
+ {
+ Name = "applications.directoryObject",
+ Description = "The applications.directoryObject operations"
+ }
}
};
+ document.Paths[getTeamsActivityByPeriodPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("reports.Functions", document));
+ document.Paths[getTeamsActivityByDatePath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("reports.Functions", document));
+ document.Paths[usersPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("users.user", document));
+ document.Paths[usersByIdPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("users.user", document));
+ document.Paths[usersByIdPath].Operations[OperationType.Patch].Tags!.Add(new OpenApiTagReference("users.user", document));
+ document.Paths[messagesByIdPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("users.message", document));
+ document.Paths[administrativeUnitRestorePath].Operations[OperationType.Post].Tags!.Add(new OpenApiTagReference("administrativeUnits.Actions", document));
+ document.Paths[logoPath].Operations[OperationType.Put].Tags!.Add(new OpenApiTagReference("applications.application", document));
+ document.Paths[securityProfilesPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("security.hostSecurityProfile", document));
+ document.Paths[communicationsCallsKeepAlivePath].Operations[OperationType.Post].Tags!.Add(new OpenApiTagReference("communications.Actions", document));
+ document.Paths[eventsDeltaPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("groups.Functions", document));
+ document.Paths[refPath].Operations[OperationType.Get].Tags!.Add(new OpenApiTagReference("applications.directoryObject", document));
return document;
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj
index 5a2e85fed..eb42a0b5b 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj
+++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj
@@ -15,13 +15,13 @@
-
-
+
+
-
+
-
-
+
+
diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs
index 497de0088..667bedbd1 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs
@@ -1,11 +1,8 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System.Collections.Generic;
using System.Threading.Tasks;
using System;
-using FluentAssertions;
-using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Models;
using Xunit;
using System.IO;
@@ -27,8 +24,8 @@ public async Task DetectedSpecificationVersionShouldBeV2_0()
{
var actual = await OpenApiDocument.LoadAsync("V2Tests/Samples/basic.v2.yaml");
- actual.Diagnostic.Should().NotBeNull();
- actual.Diagnostic.SpecificationVersion.Should().Be(OpenApiSpecVersion.OpenApi2_0);
+ Assert.NotNull(actual.Diagnostic);
+ Assert.Equal(OpenApiSpecVersion.OpenApi2_0, actual.Diagnostic.SpecificationVersion);
}
[Fact]
@@ -36,8 +33,8 @@ public async Task DetectedSpecificationVersionShouldBeV3_0()
{
var actual = await OpenApiDocument.LoadAsync("V3Tests/Samples/OpenApiDocument/minimalDocument.yaml");
- actual.Diagnostic.Should().NotBeNull();
- actual.Diagnostic.SpecificationVersion.Should().Be(OpenApiSpecVersion.OpenApi3_0);
+ Assert.NotNull(actual.Diagnostic);
+ Assert.Equal(OpenApiSpecVersion.OpenApi3_0, actual.Diagnostic.SpecificationVersion);
}
[Fact]
@@ -56,7 +53,7 @@ public async Task DiagnosticReportMergedForExternalReferenceAsync()
Assert.NotNull(result);
Assert.NotNull(result.Document.Workspace);
- result.Diagnostic.Errors.Should().BeEmpty();
+ Assert.Empty(result.Diagnostic.Errors);
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs
index 1f6cbb7e8..83d7c33d5 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Models;
using Xunit;
@@ -21,7 +20,7 @@ public async Task ThrowOpenApiUnsupportedSpecVersionException()
}
catch (OpenApiUnsupportedSpecVersionException exception)
{
- exception.SpecificationVersion.Should().Be("1.0.0");
+ Assert.Equal("1.0.0", exception.SpecificationVersion);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs
index 0e5eae1c8..e8d22a14a 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System.Collections.Generic;
-using FluentAssertions;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
@@ -33,9 +32,9 @@ public void BrokenSimpleList()
var result = OpenApiDocument.Parse(input, "yaml");
- result.Diagnostic.Errors.Should().BeEquivalentTo(new List() {
+ Assert.Equivalent(new List() {
new OpenApiError(new OpenApiReaderException("Expected a value."))
- });
+ }, result.Diagnostic.Errors);
}
[Fact]
@@ -59,12 +58,12 @@ public void BadSchema()
var res= OpenApiDocument.Parse(input, "yaml");
- res.Diagnostic.Errors.Should().BeEquivalentTo(new List
+ Assert.Equivalent(new List
{
new(new OpenApiReaderException("schema must be a map/object") {
Pointer = "#/paths/~1foo/get/responses/200/content/application~1json/schema"
})
- });
+ }, res.Diagnostic.Errors);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs
index abdbfcb9c..59c8a81f8 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV2Tests.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Reader.V2;
@@ -31,9 +30,9 @@ public void ParseExternalReferenceToV2OpenApi()
var reference = versionService.ConvertToOpenApiReference(input, null);
// Assert
- reference.ExternalResource.Should().Be(externalResource);
- reference.Type.Should().NotBeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(externalResource, reference.ExternalResource);
+ Assert.NotNull(reference.Type);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -49,9 +48,9 @@ public void ParseExternalReference()
var reference = versionService.ConvertToOpenApiReference(input, null);
// Assert
- reference.ExternalResource.Should().Be(externalResource);
- reference.Type.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(externalResource, reference.ExternalResource);
+ Assert.Null(reference.Type);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -67,9 +66,9 @@ public void ParseLocalParameterReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -85,9 +84,9 @@ public void ParseLocalSchemaReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -103,9 +102,9 @@ public void ParseTagReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -121,9 +120,9 @@ public void ParseSecuritySchemeReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs
index 6f4d53acb..0104f5208 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/ConvertToOpenApiReferenceV3Tests.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Reader.V3;
@@ -31,9 +30,9 @@ public void ParseExternalReference()
var reference = versionService.ConvertToOpenApiReference(input, null);
// Assert
- reference.Type.Should().BeNull();
- reference.ExternalResource.Should().Be(externalResource);
- reference.Id.Should().Be(id);
+ Assert.Null(reference.Type);
+ Assert.Equal(externalResource, reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -49,9 +48,9 @@ public void ParseLocalParameterReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -67,9 +66,9 @@ public void ParseLocalSchemaReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -85,9 +84,9 @@ public void ParseTagReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -103,9 +102,9 @@ public void ParseSecuritySchemeReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().BeNull();
- reference.Id.Should().Be(id);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Null(reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
[Fact]
@@ -120,8 +119,8 @@ public void ParseLocalFileReference()
var reference = versionService.ConvertToOpenApiReference(input, referenceType);
// Assert
- reference.Type.Should().Be(referenceType);
- reference.ExternalResource.Should().Be(input);
+ Assert.Equal(referenceType, reference.Type);
+ Assert.Equal(input, reference.ExternalResource);
}
[Fact]
@@ -138,9 +137,9 @@ public void ParseExternalPathReference()
var reference = versionService.ConvertToOpenApiReference(input, null);
// Assert
- reference.Type.Should().BeNull();
- reference.ExternalResource.Should().Be(externalResource);
- reference.Id.Should().Be(id);
+ Assert.Null(reference.Type);
+ Assert.Equal(externalResource, reference.ExternalResource);
+ Assert.Equal(id, reference.Id);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/Resources.cs b/test/Microsoft.OpenApi.Readers.Tests/Resources.cs
index 431c86e04..856e87427 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/Resources.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/Resources.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System;
using System.IO;
namespace Microsoft.OpenApi.Readers.Tests
diff --git a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs
index 9e7d19c7f..8de46ad64 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT license.
using System.Text.Json.Nodes;
-using FluentAssertions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
@@ -44,9 +43,9 @@ public void ParseCustomExtension()
var fooExtension = actual.Document.Info.Extensions["x-foo"] as FooExtension;
- fooExtension.Should().NotBeNull();
- fooExtension.Bar.Should().Be("hey");
- fooExtension.Baz.Should().Be("hi!");
+ Assert.NotNull(fooExtension);
+ Assert.Equal("hey", fooExtension.Bar);
+ Assert.Equal("hi!", fooExtension.Baz);
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs
index 209edcc4d..ae725bcb1 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs
@@ -30,7 +30,7 @@ public async Task EquivalentV2AndV3DocumentsShouldProduceEquivalentObjects(strin
result2.Document.Should().BeEquivalentTo(result1.Document,
options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri));
- result1.Diagnostic.Errors.Should().BeEquivalentTo(result2.Diagnostic.Errors);
+ Assert.Equivalent(result2.Diagnostic.Errors, result1.Diagnostic.Errors);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs
index 413d3ee7b..e16ff425f 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiContactTests.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -23,18 +22,18 @@ public void ParseStringContactFragmentShouldSucceed()
""";
// Act
- var contact = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi2_0, out var diagnostic);
+ var contact = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi2_0, new(), out var diagnostic);
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
- contact.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiContact
{
Email = "support@swagger.io",
Name = "API Support",
Url = new("http://www.swagger.io/support")
- });
+ }, contact);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs
index b3fead6b1..02938f4b0 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using FluentAssertions;
@@ -281,11 +280,11 @@ public async Task ShouldAssignSchemaToAllResponses()
var json = response.Value.Content["application/json"];
Assert.NotNull(json);
- json.Schema.Should().BeEquivalentTo(targetSchema);
+ Assert.Equivalent(targetSchema, json.Schema);
var xml = response.Value.Content["application/xml"];
Assert.NotNull(xml);
- xml.Schema.Should().BeEquivalentTo(targetSchema);
+ Assert.Equivalent(targetSchema, xml.Schema);
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs
index 80948f93b..cc15d8427 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs
@@ -28,7 +28,7 @@ public void ParseHeaderWithDefaultShouldSucceed()
}
// Act
- var header = OpenApiV2Deserializer.LoadHeader(node);
+ var header = OpenApiV2Deserializer.LoadHeader(node, new());
// Assert
header.Should().BeEquivalentTo(
@@ -57,7 +57,7 @@ public void ParseHeaderWithEnumShouldSucceed()
}
// Act
- var header = OpenApiV2Deserializer.LoadHeader(node);
+ var header = OpenApiV2Deserializer.LoadHeader(node, new());
// Assert
header.Should().BeEquivalentTo(
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs
index 4142e9fcd..7c76c424c 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs
@@ -5,10 +5,10 @@
using System.IO;
using System.Text;
using System.Text.Json.Nodes;
+using System.Threading.Tasks;
using FluentAssertions;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
-using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader.ParseNodes;
using Microsoft.OpenApi.Reader.V2;
@@ -57,104 +57,6 @@ public class OpenApiOperationTests
}
};
- private static readonly OpenApiOperation _operationWithFormData =
- new OpenApiOperation
- {
- Summary = "Updates a pet in the store with form data",
- Description = "",
- OperationId = "updatePetWithForm",
- Parameters = new List
- {
- new OpenApiParameter
- {
- Name = "petId",
- In = ParameterLocation.Path,
- Description = "ID of pet that needs to be updated",
- Required = true,
- Schema = new()
- {
- Type = JsonSchemaType.String
- }
- }
- },
- RequestBody = new OpenApiRequestBody
- {
- Content =
- {
- ["application/x-www-form-urlencoded"] = new OpenApiMediaType
- {
- Schema = new()
- {
- Type = JsonSchemaType.Object,
- Properties =
- {
- ["name"] = new()
- {
- Description = "Updated name of the pet",
- Type = JsonSchemaType.String
- },
- ["status"] = new()
- {
- Description = "Updated status of the pet",
- Type = JsonSchemaType.String
- }
- },
- Required = new HashSet
- {
- "name"
- }
- }
- },
- ["multipart/form-data"] = new OpenApiMediaType
- {
- Schema = new()
- {
- Type = JsonSchemaType.Object,
- Properties =
- {
- ["name"] = new()
- {
- Description = "Updated name of the pet",
- Type = JsonSchemaType.String
- },
- ["status"] = new()
- {
- Description = "Updated status of the pet",
- Type = JsonSchemaType.String
- }
- },
- Required = new HashSet
- {
- "name"
- }
- }
- }
- }
- },
- Responses = new OpenApiResponses
- {
- ["200"] = new OpenApiResponse
- {
- Description = "Pet updated.",
- Content = new Dictionary
- {
- ["application/json"] = new OpenApiMediaType(),
- ["application/xml"] = new OpenApiMediaType()
- }
-
- },
- ["405"] = new OpenApiResponse
- {
- Description = "Invalid input",
- Content = new Dictionary
- {
- ["application/json"] = new OpenApiMediaType(),
- ["application/xml"] = new OpenApiMediaType()
- }
- }
- }
- };
-
private static readonly OpenApiOperation _operationWithBody = new OpenApiOperation
{
Summary = "Updates a pet in the store with request body",
@@ -227,28 +129,28 @@ public void ParseBasicOperationShouldSucceed()
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
// Assert
- operation.Should().BeEquivalentTo(_basicOperation);
+ Assert.Equivalent(_basicOperation, operation);
}
[Fact]
- public void ParseBasicOperationTwiceShouldYieldSameObject()
+ public async Task ParseBasicOperationTwiceShouldYieldSameObject()
{
// Arrange
MapNode node;
using (var stream = new MemoryStream(
- Encoding.Default.GetBytes(_basicOperation.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0))))
+ Encoding.Default.GetBytes(await _basicOperation.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0))))
{
node = TestHelper.CreateYamlMapNode(stream);
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
// Assert
- operation.Should().BeEquivalentTo(_basicOperation);
+ Assert.Equivalent(_basicOperation, operation);
}
[Fact]
@@ -262,25 +164,25 @@ public void ParseOperationWithBodyShouldSucceed()
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
// Assert
operation.Should().BeEquivalentTo(_operationWithBody, options => options.IgnoringCyclicReferences());
}
[Fact]
- public void ParseOperationWithBodyTwiceShouldYieldSameObject()
+ public async Task ParseOperationWithBodyTwiceShouldYieldSameObject()
{
// Arrange
MapNode node;
using (var stream = new MemoryStream(
- Encoding.Default.GetBytes(_operationWithBody.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0))))
+ Encoding.Default.GetBytes(await _operationWithBody.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0))))
{
node = TestHelper.CreateYamlMapNode(stream);
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
// Assert
operation.Should().BeEquivalentTo(_operationWithBody, options => options.IgnoringCyclicReferences());
@@ -297,7 +199,7 @@ public void ParseOperationWithResponseExamplesShouldSucceed()
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
// Assert
operation.Should().BeEquivalentTo(
@@ -361,7 +263,7 @@ public void ParseOperationWithEmptyProducesArraySetsResponseSchemaIfExists()
node = TestHelper.CreateYamlMapNode(stream);
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
var expected = @"{
""produces"": [
""application/octet-stream""
@@ -385,7 +287,7 @@ public void ParseOperationWithEmptyProducesArraySetsResponseSchemaIfExists()
// Assert
var actual = stringBuilder.ToString();
- actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -397,14 +299,14 @@ public void ParseOperationWithBodyAndEmptyConsumesSetsRequestBodySchemaIfExists(
node = TestHelper.CreateYamlMapNode(stream);
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
// Assert
operation.Should().BeEquivalentTo(_operationWithBody, options => options.IgnoringCyclicReferences());
}
[Fact]
- public void ParseV2ResponseWithExamplesExtensionWorks()
+ public async Task ParseV2ResponseWithExamplesExtensionWorks()
{
// Arrange
MapNode node;
@@ -414,8 +316,8 @@ public void ParseV2ResponseWithExamplesExtensionWorks()
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
- var actual = operation.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
+ var actual = await operation.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
var expected = @"summary: Get all pets
@@ -450,11 +352,11 @@ public void ParseV2ResponseWithExamplesExtensionWorks()
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void LoadV3ExamplesInResponseAsExtensionsWorks()
+ public async Task LoadV3ExamplesInResponseAsExtensionsWorks()
{
// Arrange
MapNode node;
@@ -464,8 +366,8 @@ public void LoadV3ExamplesInResponseAsExtensionsWorks()
}
// Act
- var operation = OpenApiV3Deserializer.LoadOperation(node);
- var actual = operation.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var operation = OpenApiV3Deserializer.LoadOperation(node, new());
+ var actual = await operation.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
var expected = @"summary: Get all pets
@@ -500,11 +402,11 @@ public void LoadV3ExamplesInResponseAsExtensionsWorks()
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void LoadV2OperationWithBodyParameterExamplesWorks()
+ public async Task LoadV2OperationWithBodyParameterExamplesWorks()
{
// Arrange
MapNode node;
@@ -514,8 +416,8 @@ public void LoadV2OperationWithBodyParameterExamplesWorks()
}
// Act
- var operation = OpenApiV2Deserializer.LoadOperation(node);
- var actual = operation.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var operation = OpenApiV2Deserializer.LoadOperation(node, new());
+ var actual = await operation.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
var expected = @"summary: Get all pets
@@ -551,11 +453,11 @@ public void LoadV2OperationWithBodyParameterExamplesWorks()
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void LoadV3ExamplesInRequestBodyParameterAsExtensionsWorks()
+ public async Task LoadV3ExamplesInRequestBodyParameterAsExtensionsWorks()
{
// Arrange
MapNode node;
@@ -565,8 +467,8 @@ public void LoadV3ExamplesInRequestBodyParameterAsExtensionsWorks()
}
// Act
- var operation = OpenApiV3Deserializer.LoadOperation(node);
- var actual = operation.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var operation = OpenApiV3Deserializer.LoadOperation(node, new());
+ var actual = await operation.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
var expected = @"summary: Get all pets
@@ -603,7 +505,7 @@ public void LoadV3ExamplesInRequestBodyParameterAsExtensionsWorks()
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs
index 0b4b1a77e..1b6300faf 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs
@@ -28,12 +28,12 @@ public void ParseBodyParameterShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
// Body parameter is currently not translated via LoadParameter.
// This design may be revisited and this unit test may likely change.
- parameter.Should().BeNull();
+ Assert.Null(parameter);
}
[Fact]
@@ -47,10 +47,10 @@ public void ParsePathParameterShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Path,
@@ -61,7 +61,8 @@ public void ParsePathParameterShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ },
+ parameter);
}
[Fact]
@@ -75,10 +76,10 @@ public void ParseQueryParameterShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Query,
@@ -95,7 +96,8 @@ public void ParseQueryParameterShouldSucceed()
},
Style = ParameterStyle.Form,
Explode = true
- });
+ },
+ parameter);
}
[Fact]
@@ -109,10 +111,10 @@ public void ParseParameterWithNullLocationShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
@@ -123,7 +125,8 @@ public void ParseParameterWithNullLocationShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ },
+ parameter);
}
[Fact]
@@ -137,10 +140,10 @@ public void ParseParameterWithNoLocationShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
@@ -151,7 +154,8 @@ public void ParseParameterWithNoLocationShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ },
+ parameter);
}
[Fact]
@@ -165,17 +169,18 @@ public void ParseParameterWithNoSchemaShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
Name = "username",
Description = "username to fetch",
Required = false
- });
+ },
+ parameter);
}
[Fact]
@@ -189,10 +194,10 @@ public void ParseParameterWithUnknownLocationShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
@@ -203,7 +208,8 @@ public void ParseParameterWithUnknownLocationShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ },
+ parameter);
}
[Fact]
@@ -217,7 +223,7 @@ public void ParseParameterWithDefaultShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
// Assert
parameter.Should().BeEquivalentTo(
@@ -247,7 +253,7 @@ public void ParseParameterWithEnumShouldSucceed()
}
// Act
- var parameter = OpenApiV2Deserializer.LoadParameter(node);
+ var parameter = OpenApiV2Deserializer.LoadParameter(node, new());
var expected = new OpenApiParameter
{
In = ParameterLocation.Path,
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs
index 47f3903fa..d33b9964f 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiPathItemTests.cs
@@ -5,7 +5,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader.ParseNodes;
using Microsoft.OpenApi.Reader.V2;
@@ -257,10 +256,10 @@ public void ParseBasicPathItemWithFormDataShouldSucceed()
}
// Act
- var pathItem = OpenApiV2Deserializer.LoadPathItem(node);
+ var pathItem = OpenApiV2Deserializer.LoadPathItem(node, new());
// Assert
- pathItem.Should().BeEquivalentTo(_basicPathItemWithFormData);
+ Assert.Equivalent(_basicPathItemWithFormData, pathItem);
}
[Fact]
@@ -274,7 +273,7 @@ public void ParsePathItemWithFormDataPathParameterShouldSucceed()
}
// Act
- var pathItem = OpenApiV2Deserializer.LoadPathItem(node);
+ var pathItem = OpenApiV2Deserializer.LoadPathItem(node, new());
// Assert
// FormData parameters at in the path level are pushed into Operation request bodies.
@@ -293,7 +292,7 @@ public void ParsePathItemBodyDataPathParameterShouldSucceed()
}
// Act
- var pathItem = OpenApiV2Deserializer.LoadPathItem(node);
+ var pathItem = OpenApiV2Deserializer.LoadPathItem(node, new());
// Assert
// FormData parameters at in the path level are pushed into Operation request bodies.
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs
index aee5aab7e..1b36921d7 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs
@@ -11,6 +11,8 @@
using System.Text.Json.Nodes;
using System.Collections.Generic;
using FluentAssertions.Equivalency;
+using Microsoft.OpenApi.Models.References;
+using Microsoft.OpenApi.Writers;
namespace Microsoft.OpenApi.Readers.Tests.V2Tests
{
@@ -30,7 +32,7 @@ public void ParseSchemaWithDefaultShouldSucceed()
}
// Act
- var schema = OpenApiV2Deserializer.LoadSchema(node);
+ var schema = OpenApiV2Deserializer.LoadSchema(node, new());
// Assert
schema.Should().BeEquivalentTo(new OpenApiSchema
@@ -52,7 +54,7 @@ public void ParseSchemaWithExampleShouldSucceed()
}
// Act
- var schema = OpenApiV2Deserializer.LoadSchema(node);
+ var schema = OpenApiV2Deserializer.LoadSchema(node, new());
// Assert
schema.Should().BeEquivalentTo(
@@ -75,7 +77,7 @@ public void ParseSchemaWithEnumShouldSucceed()
}
// Act
- var schema = OpenApiV2Deserializer.LoadSchema(node);
+ var schema = OpenApiV2Deserializer.LoadSchema(node, new());
// Assert
var expected = new OpenApiSchema
@@ -95,5 +97,56 @@ public void ParseSchemaWithEnumShouldSucceed()
.Excluding((IMemberInfo memberInfo) =>
memberInfo.Path.EndsWith("Parent")));
}
+ [Fact]
+ public void PropertiesReferenceShouldWork()
+ {
+ var workingDocument = new OpenApiDocument()
+ {
+ Components = new OpenApiComponents(),
+ };
+ const string referenceId = "targetSchema";
+ var targetSchema = new OpenApiSchema()
+ {
+ Type = JsonSchemaType.Object,
+ Properties = new Dictionary
+ {
+ ["prop1"] = new OpenApiSchema()
+ {
+ Type = JsonSchemaType.String
+ }
+ }
+ };
+ workingDocument.Components.Schemas.Add(referenceId, targetSchema);
+ workingDocument.Workspace.RegisterComponents(workingDocument);
+ var referenceSchema = new OpenApiSchema()
+ {
+ Type = JsonSchemaType.Object,
+ Properties = new Dictionary
+ {
+ ["propA"] = new OpenApiSchemaReference(referenceId, workingDocument),
+ }
+ };
+
+ using var textWriter = new StringWriter();
+ var writer = new OpenApiJsonWriter(textWriter);
+ referenceSchema.SerializeAsV2(writer);
+
+ var json = textWriter.ToString();
+ var expected = JsonNode.Parse(
+ """
+ {
+ "type": "object",
+ "properties":
+ {
+ "propA":
+ {
+ "$ref": "#/definitions/targetSchema"
+ }
+ }
+ }
+ """
+ );
+ Assert.True(JsonNode.DeepEquals(JsonNode.Parse(json), expected));
+ }
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs
index 82565facd..562753a19 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSecuritySchemeTests.cs
@@ -4,7 +4,6 @@
using System;
using System.IO;
using System.Linq;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -33,15 +32,15 @@ public void ParseHttpSecuritySchemeShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node);
+ var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.Http,
Scheme = OpenApiConstants.Basic
- });
+ }, securityScheme);
}
[Fact]
@@ -58,16 +57,16 @@ public void ParseApiKeySecuritySchemeShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node);
+ var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.ApiKey,
Name = "api_key",
In = ParameterLocation.Header
- });
+ }, securityScheme);
}
[Fact]
@@ -83,10 +82,10 @@ public void ParseOAuth2ImplicitSecuritySchemeShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node);
+ var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
@@ -102,7 +101,7 @@ public void ParseOAuth2ImplicitSecuritySchemeShouldSucceed()
}
}
}
- });
+ }, securityScheme);
}
[Fact]
@@ -118,10 +117,10 @@ public void ParseOAuth2PasswordSecuritySchemeShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node);
+ var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
@@ -137,7 +136,7 @@ public void ParseOAuth2PasswordSecuritySchemeShouldSucceed()
}
}
}
- });
+ }, securityScheme);
}
[Fact]
@@ -153,10 +152,10 @@ public void ParseOAuth2ApplicationSecuritySchemeShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node);
+ var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
@@ -172,7 +171,7 @@ public void ParseOAuth2ApplicationSecuritySchemeShouldSucceed()
}
}
}
- });
+ }, securityScheme);
}
[Fact]
@@ -189,10 +188,10 @@ public void ParseOAuth2AccessCodeSecuritySchemeShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node);
+ var securityScheme = OpenApiV2Deserializer.LoadSecurityScheme(node, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
@@ -208,7 +207,7 @@ public void ParseOAuth2AccessCodeSecuritySchemeShouldSucceed()
}
}
}
- });
+ }, securityScheme);
}
static YamlDocument LoadYamlDocument(Stream input)
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs
index e0c076ee3..95452e6ad 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs
@@ -1,5 +1,4 @@
using System.Linq;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -304,8 +303,8 @@ public void InvalidHostShouldYieldError()
};
var result = OpenApiDocument.Parse(input, "yaml", settings);
- result.Document.Servers.Count.Should().Be(0);
- result.Diagnostic.Should().BeEquivalentTo(
+ Assert.Empty(result.Document.Servers);
+ Assert.Equivalent(
new OpenApiDiagnostic
{
Errors =
@@ -313,7 +312,7 @@ public void InvalidHostShouldYieldError()
new OpenApiError("#/", "Invalid host")
},
SpecificationVersion = OpenApiSpecVersion.OpenApi2_0
- });
+ }, result.Diagnostic);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs
index 22747f0cf..5f8c9e9bb 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs
@@ -9,10 +9,9 @@
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Tests;
using Microsoft.OpenApi.Writers;
-using Microsoft.OpenApi.Services;
using Xunit;
-using System.Linq;
using VerifyXunit;
+using VerifyTests;
namespace Microsoft.OpenApi.Readers.Tests.V31Tests
{
@@ -200,7 +199,7 @@ public async Task ParseDocumentWithWebhooksShouldSucceed()
};
// Assert
- actual.Diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 });
+ Assert.Equivalent(new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 }, actual.Diagnostic);
actual.Document.Should().BeEquivalentTo(expected, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri));
}
@@ -391,8 +390,8 @@ public async Task ParseDocumentsWithReusablePathItemInWebhooksSucceeds()
.Excluding(x => x.Webhooks["pets"].Reference)
.Excluding(x => x.Workspace)
.Excluding(y => y.BaseUri));
- actual.Diagnostic.Should().BeEquivalentTo(
- new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 });
+ Assert.Equivalent(
+ new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1 }, actual.Diagnostic);
}
[Fact]
@@ -460,11 +459,11 @@ public async Task ParseDocumentWithPatternPropertiesInSchemaWorks()
prop3:
type: string";
- var actualMediaType = mediaType.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1);
+ var actualMediaType = await mediaType.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1);
// Assert
- actualSchema.Should().BeEquivalentTo(expectedSchema);
- actualMediaType.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expectedMediaType.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equivalent(expectedSchema, actualSchema);
+ Assert.Equal(expectedMediaType.MakeLineBreaksEnvironmentNeutral(), actualMediaType.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -501,7 +500,7 @@ public async Task ExternalDocumentDereferenceToOpenApiDocumentUsingJsonPointerWo
// Assert
result.Document.Workspace.Contains("./externalResource.yaml");
- responseSchema.Properties.Count.Should().Be(2); // reference has been resolved
+ Assert.Equal(2, responseSchema.Properties.Count); // reference has been resolved
}
[Fact]
@@ -524,7 +523,7 @@ public async Task ParseExternalDocumentDereferenceToOpenApiDocumentByIdWorks()
result.Document.Workspace.RegisterComponents(doc2);
// Assert
- requestBodySchema.Properties.Count.Should().Be(2); // reference has been resolved
+ Assert.Equal(2, requestBodySchema.Properties.Count); // reference has been resolved
}
[Fact]
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs
index 8ecfcf7d5..409dd4c79 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiInfoTests.cs
@@ -1,7 +1,6 @@
using System;
using System.IO;
using System.Linq;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -30,10 +29,10 @@ public void ParseBasicInfoShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var openApiInfo = OpenApiV31Deserializer.LoadInfo(node);
+ var openApiInfo = OpenApiV31Deserializer.LoadInfo(node, new());
// Assert
- openApiInfo.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiInfo
{
Title = "Basic Info",
@@ -52,7 +51,7 @@ public void ParseBasicInfoShouldSucceed()
Name = "Apache 2.0",
Url = new Uri("http://www.apache.org/licenses/LICENSE-2.0.html")
}
- });
+ }, openApiInfo);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs
index cb617064e..05bc9281b 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiLicenseTests.cs
@@ -3,7 +3,6 @@
using System.IO;
using System.Linq;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Microsoft.OpenApi.Reader.ParseNodes;
@@ -33,15 +32,15 @@ public void ParseLicenseWithSpdxIdentifierShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var license = OpenApiV31Deserializer.LoadLicense(node);
+ var license = OpenApiV31Deserializer.LoadLicense(node, new());
// Assert
- license.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiLicense
{
Name = "Apache 2.0",
Identifier = "Apache-2.0"
- });
+ }, license);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs
index 312353ba8..abcaa9df6 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs
@@ -1,9 +1,9 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
using FluentAssertions;
@@ -86,10 +86,10 @@ public async Task ParseBasicV31SchemaShouldSucceed()
// Act
var schema = await OpenApiModelFactory.LoadAsync(
- System.IO.Path.Combine(SampleFolderPath, "jsonSchema.json"), OpenApiSpecVersion.OpenApi3_1);
+ Path.Combine(SampleFolderPath, "jsonSchema.json"), OpenApiSpecVersion.OpenApi3_1, new());
// Assert
- schema.Should().BeEquivalentTo(expectedObject);
+ Assert.Equivalent(expectedObject, schema);
}
[Fact]
@@ -112,10 +112,10 @@ public void ParseSchemaWithTypeArrayWorks()
};
// Act
- var actual = OpenApiModelFactory.Parse(schema, OpenApiSpecVersion.OpenApi3_1, out _);
+ var actual = OpenApiModelFactory.Parse(schema, OpenApiSpecVersion.OpenApi3_1, new(), out _);
// Assert
- actual.Should().BeEquivalentTo(expected);
+ Assert.Equivalent(expected, actual);
}
[Fact]
@@ -148,10 +148,10 @@ public void TestSchemaCopyConstructorWithTypeArrayWorks()
};
// Assert
- schemaWithArrayCopy.Type.Should().NotBe(schemaWithTypeArray.Type);
+ Assert.NotEqual(schemaWithTypeArray.Type, schemaWithArrayCopy.Type);
schemaWithTypeArray.Type = JsonSchemaType.String | JsonSchemaType.Null;
- simpleSchemaCopy.Type.Should().NotBe(simpleSchema.Type);
+ Assert.NotEqual(simpleSchema.Type, simpleSchemaCopy.Type);
simpleSchema.Type = JsonSchemaType.String;
}
@@ -161,7 +161,7 @@ public async Task ParseV31SchemaShouldSucceed()
var path = Path.Combine(SampleFolderPath, "schema.yaml");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
var expectedSchema = new OpenApiSchema
{
Type = JsonSchemaType.Object,
@@ -176,7 +176,7 @@ public async Task ParseV31SchemaShouldSucceed()
};
// Assert
- schema.Should().BeEquivalentTo(expectedSchema);
+ Assert.Equivalent(expectedSchema, schema);
}
[Fact]
@@ -184,7 +184,7 @@ public async Task ParseAdvancedV31SchemaShouldSucceed()
{
// Arrange and Act
var path = Path.Combine(SampleFolderPath, "advancedSchema.yaml");
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
var expectedSchema = new OpenApiSchema
{
@@ -275,10 +275,10 @@ public void ParseSchemaWithExamplesShouldSucceed()
- ubuntu
";
// Act
- var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, out _, "yaml");
+ var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml");
// Assert
- schema.Examples.Should().HaveCount(2);
+ Assert.Equal(2, schema.Examples.Count);
}
[Fact]
@@ -299,9 +299,9 @@ public void CloningSchemaWithExamplesAndEnumsShouldSucceed()
clone.Default = 6;
// Assert
- clone.Enum.Should().NotBeEquivalentTo(schema.Enum);
- clone.Examples.Should().NotBeEquivalentTo(schema.Examples);
- clone.Default.Should().NotBeEquivalentTo(schema.Default);
+ Assert.Equivalent(new int[] {1, 2, 3, 4}, clone.Enum.Select(static x => x.GetValue()).ToArray());
+ Assert.Equivalent(new int[] {2, 3, 4}, clone.Examples.Select(static x => x.GetValue()).ToArray());
+ Assert.Equivalent(6, clone.Default.GetValue());
}
[Fact]
@@ -314,13 +314,13 @@ public async Task SerializeV31SchemaWithMultipleTypesAsV3Works()
var path = Path.Combine(SampleFolderPath, "schemaWithTypeArray.yaml");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
var writer = new StringWriter();
schema.SerializeAsV3(new OpenApiYamlWriter(writer));
var schema1String = writer.ToString();
- schema1String.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schema1String.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -333,13 +333,13 @@ public async Task SerializeV31SchemaWithMultipleTypesAsV2Works()
var path = Path.Combine(SampleFolderPath, "schemaWithTypeArray.yaml");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
var writer = new StringWriter();
schema.SerializeAsV2(new OpenApiYamlWriter(writer));
var schema1String = writer.ToString();
- schema1String.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schema1String.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -353,13 +353,13 @@ public async Task SerializeV3SchemaWithNullableAsV31Works()
var path = Path.Combine(SampleFolderPath, "schemaWithNullable.yaml");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_0);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_0, new());
var writer = new StringWriter();
schema.SerializeAsV31(new OpenApiYamlWriter(writer));
var schemaString = writer.ToString();
- schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -374,13 +374,13 @@ public async Task SerializeV2SchemaWithNullableExtensionAsV31Works()
var path = Path.Combine(SampleFolderPath, "schemaWithNullableExtension.yaml");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi2_0);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi2_0, new());
var writer = new StringWriter();
schema.SerializeAsV31(new OpenApiYamlWriter(writer));
var schemaString = writer.ToString();
- schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -393,13 +393,13 @@ public void SerializeSchemaWithTypeArrayAndNullableDoesntEmitType()
var expected = @"{ }";
- var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, out _, "yaml");
+ var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml");
var writer = new StringWriter();
schema.SerializeAsV2(new OpenApiYamlWriter(writer));
var schemaString = writer.ToString();
- schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral());
}
[Theory]
@@ -411,10 +411,10 @@ public async Task LoadSchemaWithNullableExtensionAsV31Works(string filePath)
var path = Path.Combine(SampleFolderPath, filePath);
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
// Assert
- schema.Type.Should().Be(JsonSchemaType.String | JsonSchemaType.Null);
+ Assert.Equal(JsonSchemaType.String | JsonSchemaType.Null, schema.Type);
}
[Fact]
@@ -451,7 +451,7 @@ public async Task SerializeSchemaWithJsonSchemaKeywordsWorks()
var path = Path.Combine(SampleFolderPath, "schemaWithJsonSchemaKeywords.yaml");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
// serialization
var writer = new StringWriter();
@@ -459,8 +459,8 @@ public async Task SerializeSchemaWithJsonSchemaKeywordsWorks()
var schemaString = writer.ToString();
// Assert
- schema.Vocabulary.Keys.Count.Should().Be(5);
- schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(5, schema.Vocabulary.Keys.Count);
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -495,15 +495,15 @@ public async Task ParseSchemaWithConstWorks()
var path = Path.Combine(SampleFolderPath, "schemaWithConst.json");
// Act
- var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1);
- schema.Properties["status"].Const.Should().Be("active");
- schema.Properties["user"].Properties["role"].Const.Should().Be("admin");
+ var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new());
+ Assert.Equal("active", schema.Properties["status"].Const);
+ Assert.Equal("admin", schema.Properties["user"].Properties["role"].Const);
// serialization
var writer = new StringWriter();
schema.SerializeAsV31(new OpenApiJsonWriter(writer));
var schemaString = writer.ToString();
- schemaString.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -517,8 +517,8 @@ public void ParseSchemaWithUnrecognizedKeywordsWorks()
""x-test"": ""test""
}
";
- var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, out _, "json");
- schema.UnrecognizedKeywords.Should().HaveCount(2);
+ var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "json");
+ Assert.Equal(2, schema.UnrecognizedKeywords.Count);
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs
index 1e50ca6e0..7a1b43f2f 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs
@@ -4,7 +4,6 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Expressions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
@@ -25,10 +24,10 @@ public OpenApiCallbackTests()
public async Task ParseBasicCallbackShouldSucceed()
{
// Act
- var callback = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var callback = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- callback.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiCallback
{
PathItems =
@@ -59,7 +58,7 @@ public async Task ParseBasicCallbackShouldSucceed()
}
}
}
- });
+ }, callback);
}
[Fact]
@@ -76,10 +75,10 @@ public async Task ParseCallbackWithReferenceShouldSucceed()
var callback = subscribeOperation.Callbacks["simpleHook"];
- result.Diagnostic.Should().BeEquivalentTo(
- new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 });
+ Assert.Equivalent(
+ new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }, result.Diagnostic);
- callback.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiCallback
{
PathItems =
@@ -117,7 +116,7 @@ public async Task ParseCallbackWithReferenceShouldSucceed()
Id = "simpleHook",
HostDocument = result.Document
}
- });
+ }, callback);
}
[Fact]
@@ -130,12 +129,12 @@ public async Task ParseMultipleCallbacksWithReferenceShouldSucceed()
var path = result.Document.Paths.First().Value;
var subscribeOperation = path.Operations[OperationType.Post];
- result.Diagnostic.Should().BeEquivalentTo(
- new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 });
+ Assert.Equivalent(
+ new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }, result.Diagnostic);
var callback1 = subscribeOperation.Callbacks["simpleHook"];
- callback1.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiCallback
{
PathItems =
@@ -173,10 +172,10 @@ public async Task ParseMultipleCallbacksWithReferenceShouldSucceed()
Id = "simpleHook",
HostDocument = result.Document
}
- });
+ }, callback1);
var callback2 = subscribeOperation.Callbacks["callback2"];
- callback2.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiCallback
{
PathItems =
@@ -209,10 +208,10 @@ public async Task ParseMultipleCallbacksWithReferenceShouldSucceed()
},
}
}
- });
+ }, callback2);
var callback3 = subscribeOperation.Callbacks["callback3"];
- callback3.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiCallback
{
PathItems =
@@ -252,7 +251,7 @@ public async Task ParseMultipleCallbacksWithReferenceShouldSucceed()
}
}
}
- });
+ }, callback3);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs
index d6d0422c4..a2e5fd61d 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiContactTests.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -23,18 +22,18 @@ public void ParseStringContactFragmentShouldSucceed()
""";
// Act
- var contact = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic, OpenApiConstants.Json);
+ var contact = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic, OpenApiConstants.Json);
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
- contact.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiContact
{
Email = "support@swagger.io",
Name = "API Support",
Url = new("http://www.swagger.io/support")
- });
+ }, contact);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs
index ba62c7f33..6ab83bf3c 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs
@@ -3,7 +3,6 @@
using System.IO;
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -31,10 +30,10 @@ public async Task ParseBasicDiscriminatorShouldSucceed()
memoryStream.Position = 0;
// Act
- var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, out var diagnostic);
+ var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, new(), out var diagnostic);
// Assert
- discriminator.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiDiscriminator
{
PropertyName = "pet_type",
@@ -43,7 +42,7 @@ public async Task ParseBasicDiscriminatorShouldSucceed()
["puppy"] = "#/components/schemas/Dog",
["kitten"] = "Cat"
}
- });
+ }, discriminator);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs
index c281206e3..a46b32f09 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs
@@ -17,7 +17,6 @@
using Microsoft.OpenApi.Validations;
using Microsoft.OpenApi.Validations.Rules;
using Microsoft.OpenApi.Writers;
-using SharpYaml.Model;
using Xunit;
namespace Microsoft.OpenApi.Readers.Tests.V3Tests
@@ -32,7 +31,7 @@ public OpenApiDocumentTests()
OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader());
}
- private static T Clone(T element) where T : IOpenApiSerializable
+ private static async Task CloneAsync(T element) where T : IOpenApiSerializable
{
using var stream = new MemoryStream();
var streamWriter = new FormattingStreamWriter(stream, CultureInfo.InvariantCulture);
@@ -41,15 +40,15 @@ private static T Clone(T element) where T : IOpenApiSerializable
InlineLocalReferences = true
});
element.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
stream.Position = 0;
using var streamReader = new StreamReader(stream);
- var result = streamReader.ReadToEnd();
- return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_0, out var _);
+ var result = await streamReader.ReadToEndAsync();
+ return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_0, new(), out var _);
}
- private static OpenApiSecurityScheme CloneSecurityScheme(OpenApiSecurityScheme element)
+ private static async Task CloneSecuritySchemeAsync(OpenApiSecurityScheme element)
{
using var stream = new MemoryStream();
var streamWriter = new FormattingStreamWriter(stream, CultureInfo.InvariantCulture);
@@ -58,12 +57,12 @@ private static OpenApiSecurityScheme CloneSecurityScheme(OpenApiSecurityScheme e
InlineLocalReferences = true
});
element.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
stream.Position = 0;
using var streamReader = new StreamReader(stream);
- var result = streamReader.ReadToEnd();
- return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_0, out var _);
+ var result = await streamReader.ReadToEndAsync();
+ return OpenApiModelFactory.Parse(result, OpenApiSpecVersion.OpenApi3_0, new(), out var _);
}
[Fact]
@@ -89,11 +88,11 @@ public void ParseDocumentFromInlineStringShouldSucceed()
Paths = new OpenApiPaths()
}, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri));
- result.Diagnostic.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiDiagnostic()
{
SpecificationVersion = OpenApiSpecVersion.OpenApi3_0
- });
+ }, result.Diagnostic);
}
[Fact]
@@ -108,16 +107,16 @@ public void ParseInlineStringWithoutProvidingFormatSucceeds()
""";
var readResult = OpenApiDocument.Parse(stringOpenApiDoc);
- readResult.Document.Info.Title.Should().Be("Sample API");
+ Assert.Equal("Sample API", readResult.Document.Info.Title);
}
[Fact]
public async Task ParseBasicDocumentWithMultipleServersShouldSucceed()
{
- var path = System.IO.Path.Combine(SampleFolderPath, "basicDocumentWithMultipleServers.yaml");
+ var path = Path.Combine(SampleFolderPath, "basicDocumentWithMultipleServers.yaml");
var result = await OpenApiDocument.LoadAsync(path);
- result.Diagnostic.Errors.Should().BeEmpty();
+ Assert.Empty(result.Diagnostic.Errors);
result.Document.Should().BeEquivalentTo(
new OpenApiDocument
{
@@ -145,13 +144,13 @@ public async Task ParseBasicDocumentWithMultipleServersShouldSucceed()
[Fact]
public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic()
{
- using var stream = Resources.GetStream(System.IO.Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml"));
+ using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "brokenMinimalDocument.yaml"));
// Copy stream to MemoryStream
using var memoryStream = new MemoryStream();
await stream.CopyToAsync(memoryStream);
memoryStream.Position = 0;
- var result = OpenApiDocument.Load(memoryStream);
+ var result = await OpenApiDocument.LoadAsync(memoryStream);
result.Document.Should().BeEquivalentTo(
new OpenApiDocument
@@ -163,7 +162,7 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic()
Paths = new OpenApiPaths()
}, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri));
- result.Diagnostic.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiDiagnostic
{
Errors =
@@ -171,13 +170,13 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic()
new OpenApiValidatorError(nameof(OpenApiInfoRules.InfoRequiredFields),"#/info/title", "The field 'title' in 'info' object is REQUIRED.")
},
SpecificationVersion = OpenApiSpecVersion.OpenApi3_0
- });
+ }, result.Diagnostic);
}
[Fact]
public async Task ParseMinimalDocumentShouldSucceed()
{
- var result = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "minimalDocument.yaml"));
+ var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "minimalDocument.yaml"));
result.Document.Should().BeEquivalentTo(
new OpenApiDocument
@@ -190,17 +189,17 @@ public async Task ParseMinimalDocumentShouldSucceed()
Paths = new OpenApiPaths()
}, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri));
- result.Diagnostic.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiDiagnostic()
{
SpecificationVersion = OpenApiSpecVersion.OpenApi3_0
- });
+ }, result.Diagnostic);
}
[Fact]
public async Task ParseStandardPetStoreDocumentShouldSucceed()
{
- using var stream = Resources.GetStream(System.IO.Path.Combine(SampleFolderPath, "petStore.yaml"));
+ using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml"));
var actual = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml);
var components = new OpenApiComponents
@@ -579,14 +578,14 @@ public async Task ParseStandardPetStoreDocumentShouldSucceed()
actual.Document.Should().BeEquivalentTo(expectedDoc, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri));
- actual.Diagnostic.Should().BeEquivalentTo(
- new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 });
+ Assert.Equivalent(
+ new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }, actual.Diagnostic);
}
[Fact]
public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
{
- using var stream = Resources.GetStream(System.IO.Path.Combine(SampleFolderPath, "petStoreWithTagAndSecurity.yaml"));
+ using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStoreWithTagAndSecurity.yaml"));
var actual = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml);
var components = new OpenApiComponents
@@ -681,7 +680,7 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
};
// Create a clone of the schema to avoid modifying things in components.
- var petSchema = Clone(components.Schemas["pet1"]);
+ var petSchema = await CloneAsync(components.Schemas["pet1"]);
petSchema.Reference = new()
{
Id = "pet1",
@@ -689,7 +688,7 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
HostDocument = actual.Document
};
- var newPetSchema = Clone(components.Schemas["newPet"]);
+ var newPetSchema = await CloneAsync(components.Schemas["newPet"]);
newPetSchema.Reference = new()
{
@@ -698,7 +697,7 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
HostDocument = actual.Document
};
- var errorModelSchema = Clone(components.Schemas["errorModel"]);
+ var errorModelSchema = await CloneAsync(components.Schemas["errorModel"]);
errorModelSchema.Reference = new()
{
@@ -707,29 +706,11 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
HostDocument = actual.Document
};
- var tag1 = new OpenApiTag
- {
- Name = "tagName1",
- Description = "tagDescription1",
- Reference = new OpenApiReference
- {
- Id = "tagName1",
- Type = ReferenceType.Tag
- }
- };
-
+ var tagReference1 = new OpenApiTagReference("tagName1", null);
- var tag2 = new OpenApiTag
- {
- Name = "tagName2",
- Reference = new OpenApiReference
- {
- Id = "tagName2",
- Type = ReferenceType.Tag
- }
- };
+ var tagReference2 = new OpenApiTagReference("tagName2", null);
- var securityScheme1 = CloneSecurityScheme(components.SecuritySchemes["securitySchemeName1"]);
+ var securityScheme1 = await CloneSecuritySchemeAsync(components.SecuritySchemes["securitySchemeName1"]);
securityScheme1.Reference = new OpenApiReference
{
@@ -737,7 +718,7 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
Type = ReferenceType.SecurityScheme
};
- var securityScheme2 = CloneSecurityScheme(components.SecuritySchemes["securitySchemeName2"]);
+ var securityScheme2 = await CloneSecuritySchemeAsync(components.SecuritySchemes["securitySchemeName2"]);
securityScheme2.Reference = new OpenApiReference
{
@@ -781,10 +762,10 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
{
[OperationType.Get] = new OpenApiOperation
{
- Tags = new List
+ Tags = new List
{
- tag1,
- tag2
+ tagReference1,
+ tagReference2
},
Description = "Returns all pets from the system that the user has access to",
OperationId = "findPets",
@@ -869,10 +850,10 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
},
[OperationType.Post] = new OpenApiOperation
{
- Tags = new List
+ Tags = new List
{
- tag1,
- tag2
+ tagReference1,
+ tagReference2
},
Description = "Creates a new pet in the store. Duplicates are allowed",
OperationId = "addPet",
@@ -1063,6 +1044,11 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
{
Name = "tagName1",
Description = "tagDescription1"
+ },
+ new OpenApiTag
+ {
+ Name = "tagName2",
+ Description = "tagDescription2"
}
},
SecurityRequirements = new List
@@ -1080,36 +1066,41 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed()
}
};
+ tagReference1.Reference.HostDocument = expected;
+ tagReference2.Reference.HostDocument = expected;
+
actual.Document.Should().BeEquivalentTo(expected, options => options
- .Excluding(x => x.HashCode)
- .Excluding(m => m.Tags[0].Reference)
.Excluding(x => x.Paths["/pets"].Operations[OperationType.Get].Tags[0].Reference)
.Excluding(x => x.Paths["/pets"].Operations[OperationType.Get].Tags[0].Reference.HostDocument)
+ .Excluding(x => x.Paths["/pets"].Operations[OperationType.Get].Tags[0].Target)
.Excluding(x => x.Paths["/pets"].Operations[OperationType.Post].Tags[0].Reference.HostDocument)
+ .Excluding(x => x.Paths["/pets"].Operations[OperationType.Post].Tags[0].Target)
.Excluding(x => x.Paths["/pets"].Operations[OperationType.Get].Tags[1].Reference.HostDocument)
+ .Excluding(x => x.Paths["/pets"].Operations[OperationType.Get].Tags[1].Target)
.Excluding(x => x.Paths["/pets"].Operations[OperationType.Post].Tags[1].Reference.HostDocument)
+ .Excluding(x => x.Paths["/pets"].Operations[OperationType.Post].Tags[1].Target)
.Excluding(x => x.Workspace)
.Excluding(y => y.BaseUri));
- actual.Diagnostic.Should().BeEquivalentTo(
- new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 });
+ Assert.Equivalent(
+ new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }, actual.Diagnostic);
}
[Fact]
public async Task ParsePetStoreExpandedShouldSucceed()
{
- var actual = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "petStoreExpanded.yaml"));
+ var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml"));
// TODO: Create the object in memory and compare with the one read from YAML file.
- actual.Diagnostic.Should().BeEquivalentTo(
- new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 });
+ Assert.Equivalent(
+ new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }, actual.Diagnostic);
}
[Fact]
public async Task GlobalSecurityRequirementShouldReferenceSecurityScheme()
{
- var result = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "securedApi.yaml"));
+ var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "securedApi.yaml"));
var securityRequirement = result.Document.SecurityRequirements[0];
@@ -1120,7 +1111,7 @@ public async Task GlobalSecurityRequirementShouldReferenceSecurityScheme()
[Fact]
public async Task HeaderParameterShouldAllowExample()
{
- var result = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml"));
+ var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml"));
var exampleHeader = result.Document.Components?.Headers?["example-header"];
Assert.NotNull(exampleHeader);
@@ -1188,7 +1179,7 @@ public async Task ParseDocumentWithReferencedSecuritySchemeWorks()
ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences
};
- var result = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"), settings);
+ var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"), settings);
var securityScheme = result.Document.Components.SecuritySchemes["OAuth2"];
// Assert
@@ -1200,7 +1191,7 @@ public async Task ParseDocumentWithReferencedSecuritySchemeWorks()
public async Task ParseDocumentWithJsonSchemaReferencesWorks()
{
// Arrange
- using var stream = Resources.GetStream(System.IO.Path.Combine(SampleFolderPath, "docWithJsonSchema.yaml"));
+ using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithJsonSchema.yaml"));
// Act
var settings = new OpenApiReaderSettings
@@ -1213,14 +1204,14 @@ public async Task ParseDocumentWithJsonSchemaReferencesWorks()
var expectedSchema = new OpenApiSchemaReference("User", result.Document);
// Assert
- actualSchema.Should().BeEquivalentTo(expectedSchema);
+ Assert.Equivalent(expectedSchema, actualSchema);
}
[Fact]
public async Task ValidateExampleShouldNotHaveDataTypeMismatch()
{
// Act
- var result = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "documentWithDateExampleInSchema.yaml"), new OpenApiReaderSettings
+ var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "documentWithDateExampleInSchema.yaml"), new OpenApiReaderSettings
{
ReferenceResolution = ReferenceResolutionSetting.ResolveLocalReferences
@@ -1320,12 +1311,12 @@ public async Task ParseDocWithRefsUsingProxyReferencesSucceeds()
format: int32
default: 10";
- using var stream = Resources.GetStream(System.IO.Path.Combine(SampleFolderPath, "minifiedPetStore.yaml"));
+ using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minifiedPetStore.yaml"));
// Act
var doc = (await OpenApiDocument.LoadAsync(stream)).Document;
var actualParam = doc.Paths["/pets"].Operations[OperationType.Get].Parameters[0];
- var outputDoc = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0).MakeLineBreaksEnvironmentNeutral();
+ var outputDoc = (await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0)).MakeLineBreaksEnvironmentNeutral();
var expectedParam = expected.Paths["/pets"].Operations[OperationType.Get].Parameters[0];
// Assert
@@ -1334,7 +1325,7 @@ public async Task ParseDocWithRefsUsingProxyReferencesSucceeds()
.Excluding(x => x.Schema.Default.Parent)
.Excluding(x => x.Schema.Default.Options)
.IgnoringCyclicReferences());
- outputDoc.Should().BeEquivalentTo(expectedSerializedDoc.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expectedSerializedDoc.MakeLineBreaksEnvironmentNeutral(), outputDoc);
}
[Fact]
@@ -1377,11 +1368,11 @@ public void ParseBasicDocumentWithServerVariableShouldSucceed()
Paths = new()
};
- result.Diagnostic.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiDiagnostic
{
SpecificationVersion = OpenApiSpecVersion.OpenApi3_0
- });
+ }, result.Diagnostic);
result.Document.Should().BeEquivalentTo(expected, options => options.Excluding(x => x.BaseUri));
}
@@ -1403,14 +1394,26 @@ public void ParseBasicDocumentWithServerVariableAndNoDefaultShouldFail()
paths: {}
""", "yaml");
- result.Diagnostic.Errors.Should().NotBeEmpty();
+ Assert.NotEmpty(result.Diagnostic.Errors);
}
[Fact]
public async Task ParseDocumentWithEmptyPathsSucceeds()
{
- var result = await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "docWithEmptyPaths.yaml"));
- result.Diagnostic.Errors.Should().BeEmpty();
+ var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithEmptyPaths.yaml"));
+ Assert.Empty(result.Diagnostic.Errors);
+ }
+
+ [Fact]
+ public async Task ParseDocumentWithExampleReferencesPasses()
+ {
+ // Act & Assert: Ensure no NullReferenceException is thrown
+ Func act = async () =>
+ {
+ await OpenApiDocument.LoadAsync(System.IO.Path.Combine(SampleFolderPath, "docWithExampleReferences.yaml"));
+ };
+
+ await act.Should().NotThrowAsync();
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs
index 91e428c49..874cf6b04 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs
@@ -3,7 +3,6 @@
using System.IO;
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -24,14 +23,14 @@ public OpenApiEncodingTests()
public async Task ParseBasicEncodingShouldSucceed()
{
// Act
- var encoding = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var encoding = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- encoding.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiEncoding
{
ContentType = "application/xml; charset=utf-8"
- });
+ }, encoding);
}
[Fact]
@@ -40,10 +39,10 @@ public async Task ParseAdvancedEncodingShouldSucceed()
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedEncoding.yaml"));
// Act
- var encoding = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0);
+ var encoding = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- encoding.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiEncoding
{
ContentType = "image/png, image/jpeg",
@@ -59,7 +58,7 @@ public async Task ParseAdvancedEncodingShouldSucceed()
}
}
}
- });
+ }, encoding);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs
index 633a0f688..2a8691ab3 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs
@@ -5,7 +5,6 @@
using System.Text.Json.Nodes;
using System.Threading.Tasks;
using FluentAssertions;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -25,7 +24,7 @@ public OpenApiExampleTests()
[Fact]
public async Task ParseAdvancedExampleShouldSucceed()
{
- var example = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var example = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
var expected = new OpenApiExample
{
Value = new JsonObject
@@ -78,7 +77,7 @@ public async Task ParseAdvancedExampleShouldSucceed()
public async Task ParseExampleForcedStringSucceed()
{
var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "explicitString.yaml"));
- result.Diagnostic.Errors.Should().BeEmpty();
+ Assert.Empty(result.Diagnostic.Errors);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs
index fdd5ae8ee..9a11ef5c3 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs
@@ -27,7 +27,7 @@ public OpenApiInfoTests()
public async Task ParseAdvancedInfoShouldSucceed()
{
// Act
- var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
openApiInfo.Should().BeEquivalentTo(
@@ -84,10 +84,10 @@ public async Task ParseAdvancedInfoShouldSucceed()
public async Task ParseBasicInfoShouldSucceed()
{
// Act
- var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- openApiInfo.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiInfo
{
Title = "Basic Info",
@@ -105,7 +105,7 @@ public async Task ParseBasicInfoShouldSucceed()
Name = "Apache 2.0",
Url = new Uri("http://www.apache.org/licenses/LICENSE-2.0.html")
}
- });
+ }, openApiInfo);
}
[Fact]
@@ -114,15 +114,15 @@ public async Task ParseMinimalInfoShouldSucceed()
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minimalInfo.yaml"));
// Act
- var openApiInfo = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0);
+ var openApiInfo = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- openApiInfo.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiInfo
{
Title = "Minimal Info",
Version = "1.0.1"
- });
+ }, openApiInfo);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs
index 6197cca71..e3c1435fd 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs
@@ -28,7 +28,7 @@ public OpenApiMediaTypeTests()
public async Task ParseMediaTypeWithExampleShouldSucceed()
{
// Act
- var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
mediaType.Should().BeEquivalentTo(
@@ -49,7 +49,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed()
public async Task ParseMediaTypeWithExamplesShouldSucceed()
{
// Act
- var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
mediaType.Should().BeEquivalentTo(
@@ -77,7 +77,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed()
}
[Fact]
- public void ParseMediaTypeWithEmptyArrayInExamplesWorks()
+ public async Task ParseMediaTypeWithEmptyArrayInExamplesWorks()
{
// Arrange
var expected = @"{
@@ -106,12 +106,11 @@ public void ParseMediaTypeWithEmptyArrayInExamplesWorks()
}
// Act
- var mediaType = OpenApiV3Deserializer.LoadMediaType(node);
- var serialized = mediaType.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var mediaType = OpenApiV3Deserializer.LoadMediaType(node, new());
+ var serialized = await mediaType.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
- serialized.MakeLineBreaksEnvironmentNeutral()
- .Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), serialized.MakeLineBreaksEnvironmentNeutral());
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs
index 7dcb5e28a..22167e0ee 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs
@@ -34,13 +34,17 @@ public async Task OperationWithSecurityRequirementShouldReferenceSecurityScheme(
[Fact]
public async Task ParseOperationWithParameterWithNoLocationShouldSucceed()
{
+ var openApiDocument = new OpenApiDocument
+ {
+ Tags = { new OpenApiTag() { Name = "user" } }
+ };
// Act
- var operation = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0);
+ var operation = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0, openApiDocument);
var expectedOp = new OpenApiOperation
{
Tags =
{
- new OpenApiTagReference("user", null)
+ new OpenApiTagReference("user", openApiDocument)
},
Summary = "Logs user into the system",
Description = "",
@@ -73,8 +77,11 @@ public async Task ParseOperationWithParameterWithNoLocationShouldSucceed()
// Assert
expectedOp.Should().BeEquivalentTo(operation,
- options => options.Excluding(x => x.Tags[0].Reference.HostDocument)
- .Excluding(x => x.Tags[0].Extensions));
+ options =>
+ options.Excluding(x => x.Tags[0].Reference.HostDocument)
+ .Excluding(x => x.Tags[0].Reference)
+ .Excluding(x => x.Tags[0].Target)
+ .Excluding(x => x.Tags[0].Extensions));
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs
index a40cb4144..8a30fc9ba 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs
@@ -2,15 +2,12 @@
// Licensed under the MIT license.
using System.Collections.Generic;
-using System;
using System.IO;
using FluentAssertions;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
using Microsoft.OpenApi.Reader.V3;
-using Microsoft.OpenApi.Services;
using System.Threading.Tasks;
namespace Microsoft.OpenApi.Readers.Tests.V3Tests
@@ -32,10 +29,10 @@ public async Task ParsePathParameterShouldSucceed()
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "pathParameter.yaml"));
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Path,
@@ -46,17 +43,17 @@ public async Task ParsePathParameterShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ }, parameter);
}
[Fact]
public async Task ParseQueryParameterShouldSucceed()
{
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Query,
@@ -73,17 +70,17 @@ public async Task ParseQueryParameterShouldSucceed()
},
Style = ParameterStyle.Form,
Explode = true
- });
+ }, parameter);
}
[Fact]
public async Task ParseQueryParameterWithObjectTypeShouldSucceed()
{
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Query,
@@ -97,7 +94,7 @@ public async Task ParseQueryParameterWithObjectTypeShouldSucceed()
}
},
Style = ParameterStyle.Form
- });
+ }, parameter);
}
[Fact]
@@ -107,10 +104,10 @@ public async Task ParseQueryParameterWithObjectTypeAndContentShouldSucceed()
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameterWithObjectTypeAndContent.yaml"));
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Query,
@@ -141,17 +138,17 @@ public async Task ParseQueryParameterWithObjectTypeAndContentShouldSucceed()
}
}
}
- });
+ }, parameter);
}
[Fact]
public async Task ParseHeaderParameterShouldSucceed()
{
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = ParameterLocation.Header,
@@ -169,17 +166,17 @@ public async Task ParseHeaderParameterShouldSucceed()
Format = "int64",
}
}
- });
+ }, parameter);
}
[Fact]
public async Task ParseParameterWithNullLocationShouldSucceed()
{
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
@@ -190,7 +187,7 @@ public async Task ParseParameterWithNullLocationShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ }, parameter);
}
[Fact]
@@ -200,10 +197,10 @@ public async Task ParseParameterWithNoLocationShouldSucceed()
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml"));
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
@@ -214,7 +211,7 @@ public async Task ParseParameterWithNoLocationShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ }, parameter);
}
[Fact]
@@ -224,10 +221,10 @@ public async Task ParseParameterWithUnknownLocationShouldSucceed()
using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml"));
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- parameter.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiParameter
{
In = null,
@@ -238,14 +235,14 @@ public async Task ParseParameterWithUnknownLocationShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ }, parameter);
}
[Fact]
public async Task ParseParameterWithExampleShouldSucceed()
{
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
parameter.Should().BeEquivalentTo(
@@ -268,7 +265,7 @@ public async Task ParseParameterWithExampleShouldSucceed()
public async Task ParseParameterWithExamplesShouldSucceed()
{
// Act
- var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
parameter.Should().BeEquivalentTo(
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs
index 3a9ef0bd8..2d41ed2e2 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs
@@ -30,7 +30,7 @@ public async Task ResponseWithReferencedHeaderShouldReferenceComponent()
var expected = response.Headers.First().Value;
var actual = result.Document.Components.Headers.First().Value;
- actual.Description.Should().BeEquivalentTo(expected.Description);
+ Assert.Equal(expected.Description, actual.Description);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs
index 8e52ad6aa..8d94822ef 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs
@@ -3,7 +3,6 @@
using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Text.Json.Nodes;
using FluentAssertions;
using Microsoft.OpenApi.Any;
@@ -45,17 +44,17 @@ public void ParsePrimitiveSchemaShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var schema = OpenApiV3Deserializer.LoadSchema(node);
+ var schema = OpenApiV3Deserializer.LoadSchema(node, new());
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
- schema.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSchema
{
Type = JsonSchemaType.String,
Format = "email"
- });
+ }, schema);
}
[Fact]
@@ -68,10 +67,10 @@ public void ParseExampleStringFragmentShouldSucceed()
}";
// Act
- var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic);
+ var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic);
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
openApiAny.Should().BeEquivalentTo(new OpenApiAny(
new JsonObject
@@ -91,10 +90,10 @@ public void ParseEnumFragmentShouldSucceed()
]";
// Act
- var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic);
+ var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic);
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
openApiAny.Should().BeEquivalentTo(new OpenApiAny(
new JsonArray
@@ -116,12 +115,12 @@ public void ParsePathFragmentShouldSucceed()
";
// Act
- var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, out var diagnostic, "yaml");
+ var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic, "yaml");
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
- openApiAny.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiPathItem
{
Summary = "externally referenced path item",
@@ -138,7 +137,7 @@ public void ParsePathFragmentShouldSucceed()
}
}
}
- });
+ }, openApiAny);
}
[Fact]
@@ -157,12 +156,12 @@ public void ParseDictionarySchemaShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var schema = OpenApiV3Deserializer.LoadSchema(node);
+ var schema = OpenApiV3Deserializer.LoadSchema(node, new());
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
- schema.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSchema
{
Type = JsonSchemaType.Object,
@@ -170,7 +169,7 @@ public void ParseDictionarySchemaShouldSucceed()
{
Type = JsonSchemaType.String
}
- });
+ }, schema);
}
}
@@ -189,10 +188,10 @@ public void ParseBasicSchemaWithExampleShouldSucceed()
var node = new MapNode(context, asJsonNode);
// Act
- var schema = OpenApiV3Deserializer.LoadSchema(node);
+ var schema = OpenApiV3Deserializer.LoadSchema(node, new());
// Assert
- diagnostic.Should().BeEquivalentTo(new OpenApiDiagnostic());
+ Assert.Equivalent(new OpenApiDiagnostic(), diagnostic);
schema.Should().BeEquivalentTo(
new OpenApiSchema
@@ -236,11 +235,11 @@ public async Task ParseBasicSchemaWithReferenceShouldSucceed()
// Assert
var components = result.Document.Components;
- result.Diagnostic.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiDiagnostic()
{
SpecificationVersion = OpenApiSpecVersion.OpenApi3_0
- });
+ }, result.Diagnostic);
var expectedComponents = new OpenApiComponents
{
@@ -290,7 +289,7 @@ public async Task ParseBasicSchemaWithReferenceShouldSucceed()
}
};
- components.Should().BeEquivalentTo(expectedComponents);
+ Assert.Equivalent(expectedComponents, components);
}
[Fact]
@@ -383,11 +382,11 @@ public async Task ParseAdvancedSchemaWithReferenceShouldSucceed()
};
// We serialize so that we can get rid of the schema BaseUri properties which show up as diffs
- var actual = result.Document.Components.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
- var expected = expectedComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await result.Document.Components.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
+ var expected = await expectedComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs
index 3f99bb2c5..b0f02270c 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs
@@ -4,7 +4,6 @@
using System;
using System.IO;
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -24,57 +23,57 @@ public OpenApiSecuritySchemeTests()
public async Task ParseHttpSecuritySchemeShouldSucceed()
{
// Act
- var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.Http,
Scheme = OpenApiConstants.Basic
- });
+ }, securityScheme);
}
[Fact]
public async Task ParseApiKeySecuritySchemeShouldSucceed()
{
// Act
- var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.ApiKey,
Name = "api_key",
In = ParameterLocation.Header
- });
+ }, securityScheme);
}
[Fact]
public async Task ParseBearerSecuritySchemeShouldSucceed()
{
// Act
- var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.Http,
Scheme = OpenApiConstants.Bearer,
BearerFormat = OpenApiConstants.Jwt
- });
+ }, securityScheme);
}
[Fact]
public async Task ParseOAuth2SecuritySchemeShouldSucceed()
{
// Act
- var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
@@ -90,23 +89,23 @@ public async Task ParseOAuth2SecuritySchemeShouldSucceed()
}
}
}
- });
+ }, securityScheme);
}
[Fact]
public async Task ParseOpenIdConnectSecuritySchemeShouldSucceed()
{
// Act
- var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0);
+ var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- securityScheme.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OpenIdConnect,
Description = "Sample Description",
OpenIdConnectUrl = new Uri("http://www.example.com")
- });
+ }, securityScheme);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs
index fc23865ba..6485aad21 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs
@@ -4,7 +4,6 @@
using System;
using System.IO;
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Reader;
using Xunit;
@@ -25,17 +24,17 @@ public OpenApiXmlTests()
public async Task ParseBasicXmlShouldSucceed()
{
// Act
- var xml = await OpenApiModelFactory.LoadAsync(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), OpenApiSpecVersion.OpenApi3_0);
+ var xml = await OpenApiModelFactory.LoadAsync(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), OpenApiSpecVersion.OpenApi3_0, new());
// Assert
- xml.Should().BeEquivalentTo(
+ Assert.Equivalent(
new OpenApiXml
{
Name = "name1",
Namespace = new Uri("http://example.com/schema/namespaceSample"),
Prefix = "samplePrefix",
Wrapped = true
- });
+ }, xml);
}
}
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/docWithExampleReferences.yaml b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/docWithExampleReferences.yaml
new file mode 100644
index 000000000..da2708545
--- /dev/null
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/docWithExampleReferences.yaml
@@ -0,0 +1,68 @@
+openapi: 3.0.3
+info:
+ version: 1.1.4
+ title: GitHub v3 REST API
+ description: GitHub's v3 REST API.
+paths:
+ /actions/hosted-runners/{hosted_runner_id}:
+ get:
+ summary: Get a GitHub-hosted runner for an organization
+ description: |-
+ Gets a GitHub-hosted runner configured in an organization.
+ OAuth app tokens and personal access tokens (classic) need the `manage_runners:org` scope to use this endpoint.
+ responses:
+ '200':
+ description: Response
+ content:
+ application/json:
+ schema:
+ "$ref": "#/components/schemas/actions-hosted-runner"
+ examples:
+ default:
+ "$ref": "#/components/examples/actions-hosted-runner"
+ /oidc/customization/sub:
+ get:
+ summary: Get the customization template for an OIDC subject claim for an organization
+ description: |-
+ Gets the customization template for an OpenID Connect (OIDC) subject claim.
+ OAuth app tokens and personal access tokens (classic) need the `read:org` scope to use this endpoint.
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ "$ref": "#/components/schemas/oidc-custom-sub"
+ examples:
+ default:
+ "$ref": "#/components/examples/oidc-custom-sub"
+ responses:
+ '200':
+ description: A JSON serialized template for OIDC subject claim customization
+ content:
+ application/json:
+ schema:
+ "$ref": "#/components/schemas/oidc-custom-sub"
+components:
+ schemas:
+ actions-hosted-runner:
+ title: GitHub-hosted runner
+ type: object
+ oidc-custom-sub:
+ title: Actions OIDC Subject customization
+ description: Actions OIDC Subject customization
+ type: object
+ examples:
+ actions-hosted-runner:
+ value:
+ id: 5
+ name: My hosted ubuntu runner
+ runner_group_id: 2
+ platform: linux-x64
+ oidc-custom-sub:
+ value:
+ include_claim_keys:
+ - repo
+ - context
+
+
+
\ No newline at end of file
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/petStoreWithTagAndSecurity.yaml b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/petStoreWithTagAndSecurity.yaml
index 528804491..78a85fae6 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/petStoreWithTagAndSecurity.yaml
+++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/petStoreWithTagAndSecurity.yaml
@@ -210,6 +210,8 @@ components:
tags:
- name: tagName1
description: tagDescription1
+ - name: tagName2
+ description: tagDescription2
security:
- securitySchemeName1: []
securitySchemeName2:
diff --git a/test/Microsoft.OpenApi.Tests/Attributes/DisplayAttributeTests.cs b/test/Microsoft.OpenApi.Tests/Attributes/DisplayAttributeTests.cs
index 182108260..4ce1c644a 100644
--- a/test/Microsoft.OpenApi.Tests/Attributes/DisplayAttributeTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Attributes/DisplayAttributeTests.cs
@@ -45,7 +45,8 @@ public void GetDisplayNameExtensionShouldUseDisplayAttribute(ApiLevel apiLevel,
[InlineData(ApiLevel.Corporate, "corporate")]
public void GetEnumFromDisplayNameShouldReturnEnumValue(ApiLevel expected, string displayName)
{
- Assert.Equal(expected, displayName.GetEnumFromDisplayName());
+ displayName.TryGetEnumFromDisplayName(out var result);
+ Assert.Equal(expected, result);
}
[Theory]
@@ -54,7 +55,8 @@ public void GetEnumFromDisplayNameShouldReturnEnumValue(ApiLevel expected, strin
[InlineData(UserType.Editor, "editor")]
public void GetEnumFromDisplayNameShouldReturnEnumValueForFlagsEnum(UserType expected, string displayName)
{
- Assert.Equal(expected, displayName.GetEnumFromDisplayName());
+ displayName.TryGetEnumFromDisplayName(out var result);
+ Assert.Equal(expected, result);
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Expressions/RuntimeExpressionTests.cs b/test/Microsoft.OpenApi.Tests/Expressions/RuntimeExpressionTests.cs
index 70c7dc90d..4b79c786a 100644
--- a/test/Microsoft.OpenApi.Tests/Expressions/RuntimeExpressionTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Expressions/RuntimeExpressionTests.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using FluentAssertions;
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Expressions;
using Microsoft.OpenApi.Properties;
@@ -39,7 +38,7 @@ public void BuildRuntimeExpressionThrowsInvalidFormat(string expression)
// Assert
var exception = Assert.Throws(test);
- Assert.Equal(String.Format(SRResource.RuntimeExpressionHasInvalidFormat, expression), exception.Message);
+ Assert.Equal(string.Format(SRResource.RuntimeExpressionHasInvalidFormat, expression), exception.Message);
}
[Fact]
@@ -184,11 +183,11 @@ public void CompositeRuntimeExpressionContainsMultipleExpressions()
var compositeExpression = runtimeExpression as CompositeExpression;
Assert.Equal(2, compositeExpression.ContainedExpressions.Count);
- compositeExpression.ContainedExpressions.Should().BeEquivalentTo(new List
+ Assert.Equivalent(new List
{
new UrlExpression(),
new RequestExpression(new HeaderExpression("foo"))
- });
+ }, compositeExpression.ContainedExpressions);
}
[Fact]
@@ -222,17 +221,17 @@ public void CompositeRuntimeExpressionWithMultipleRuntimeExpressionsAndFakeBrace
var runtimeExpression = RuntimeExpression.Build(expression);
// Assert
- runtimeExpression.Should().NotBeNull();
- runtimeExpression.Should().BeOfType(typeof(CompositeExpression));
+ Assert.NotNull(runtimeExpression);
+ Assert.IsType(runtimeExpression);
var response = (CompositeExpression)runtimeExpression;
- response.Expression.Should().Be(expression);
+ Assert.Equal(expression, response.Expression);
var compositeExpression = runtimeExpression as CompositeExpression;
- compositeExpression.ContainedExpressions.Should().BeEquivalentTo(new List
+ Assert.Equivalent(new List
{
new UrlExpression(),
new RequestExpression(new HeaderExpression("foo"))
- });
+ }, compositeExpression.ContainedExpressions);
}
[Theory]
@@ -244,7 +243,8 @@ public void CompositeRuntimeExpressionWithInvalidRuntimeExpressions(string expre
Action test = () => RuntimeExpression.Build(expression);
// Assert
- test.Should().Throw().WithMessage(String.Format(SRResource.RuntimeExpressionHasInvalidFormat, invalidExpression));
+ var result = Assert.Throws(test);
+ Assert.Equal(result.Message, string.Format(SRResource.RuntimeExpressionHasInvalidFormat, invalidExpression));
}
[Theory]
@@ -262,15 +262,15 @@ public void CompositeRuntimeExpressionWithoutRecognizedRuntimeExpressions(string
var runtimeExpression = RuntimeExpression.Build(expression);
// Assert
- runtimeExpression.Should().NotBeNull();
- runtimeExpression.Should().BeOfType(typeof(CompositeExpression));
+ Assert.NotNull(runtimeExpression);
+ Assert.IsType(runtimeExpression);
var response = (CompositeExpression)runtimeExpression;
- response.Expression.Should().Be(expression);
+ Assert.Equal(expression, response.Expression);
var compositeExpression = runtimeExpression as CompositeExpression;
// The whole string is treated as the template without any contained expressions.
- compositeExpression.ContainedExpressions.Should().BeEmpty();
+ Assert.Empty(compositeExpression.ContainedExpressions);
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Expressions/SourceExpressionTests.cs b/test/Microsoft.OpenApi.Tests/Expressions/SourceExpressionTests.cs
index 5ed80bf6e..8e9523946 100644
--- a/test/Microsoft.OpenApi.Tests/Expressions/SourceExpressionTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Expressions/SourceExpressionTests.cs
@@ -25,7 +25,7 @@ public void BuildSourceExpressionThrowsInvalidFormat(string expression)
// Assert
var exception = Assert.Throws(test);
- Assert.Equal(String.Format(SRResource.SourceExpressionHasInvalidFormat, expression), exception.Message);
+ Assert.Equal(string.Format(SRResource.SourceExpressionHasInvalidFormat, expression), exception.Message);
}
[Fact]
diff --git a/test/Microsoft.OpenApi.Tests/Extensions/OpenApiServerExtensionsTests.cs b/test/Microsoft.OpenApi.Tests/Extensions/OpenApiServerExtensionsTests.cs
index b8f581541..e15527c64 100644
--- a/test/Microsoft.OpenApi.Tests/Extensions/OpenApiServerExtensionsTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Extensions/OpenApiServerExtensionsTests.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using FluentAssertions;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Xunit;
@@ -24,7 +23,7 @@ public void ShouldSubstituteServerVariableWithProvidedValues()
var url = variable.ReplaceServerUrlVariables(new Dictionary {{"version", "v2"}});
- url.Should().Be("http://example.com/api/v2");
+ Assert.Equal("http://example.com/api/v2", url);
}
[Fact]
@@ -42,7 +41,7 @@ public void ShouldSubstituteServerVariableWithDefaultValues()
var url = variable.ReplaceServerUrlVariables(new Dictionary(0));
- url.Should().Be("http://example.com/api/v1");
+ Assert.Equal("http://example.com/api/v1", url);
}
[Fact]
diff --git a/test/Microsoft.OpenApi.Tests/Extensions/OpenApiTypeMapperTests.cs b/test/Microsoft.OpenApi.Tests/Extensions/OpenApiTypeMapperTests.cs
index deec23c4e..c41bd6e98 100644
--- a/test/Microsoft.OpenApi.Tests/Extensions/OpenApiTypeMapperTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Extensions/OpenApiTypeMapperTests.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
-using FluentAssertions;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Xunit;
@@ -66,7 +65,7 @@ public void MapTypeToOpenApiPrimitiveTypeShouldSucceed(Type type, OpenApiSchema
var actual = OpenApiTypeMapper.MapTypeToOpenApiPrimitiveType(type);
// Assert
- actual.Should().BeEquivalentTo(expected);
+ Assert.Equivalent(expected, actual);
}
[Theory]
@@ -77,7 +76,7 @@ public void MapOpenApiSchemaTypeToSimpleTypeShouldSucceed(OpenApiSchema schema,
var actual = OpenApiTypeMapper.MapOpenApiPrimitiveTypeToSimpleType(schema);
// Assert
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj
index 634c70257..f8f8930e2 100644
--- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj
+++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj
@@ -8,15 +8,15 @@
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtensionTests.cs b/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtensionTests.cs
index f7256f8e6..51f5d7b48 100644
--- a/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtensionTests.cs
+++ b/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiPrimaryErrorMessageExtensionTests.cs
@@ -4,7 +4,6 @@
// ------------------------------------------------------------
using System.IO;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Writers;
using Xunit;
diff --git a/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs b/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs
index 4972f3230..5850aef26 100644
--- a/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs
+++ b/test/Microsoft.OpenApi.Tests/MicrosoftExtensions/OpenApiReservedParameterExtensionTests.cs
@@ -1,10 +1,8 @@
using System;
using System.IO;
using Microsoft.OpenApi.MicrosoftExtensions;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Writers;
using Xunit;
-using System.Text.Json.Nodes;
namespace Microsoft.OpenApi.Tests.MicrosoftExtensions;
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiCallbackTests.cs
index ad2c9ffdb..8c729b7c4 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiCallbackTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiCallbackTests.cs
@@ -105,7 +105,7 @@ public async Task SerializeAdvancedCallbackAsV3JsonWorksAsync(bool produceTerseO
// Act
AdvancedCallback.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -122,7 +122,7 @@ public async Task SerializeReferencedCallbackAsV3JsonWorksAsync(bool produceTers
// Act
CallbackProxy.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -139,7 +139,7 @@ public async Task SerializeReferencedCallbackAsV3JsonWithoutReferenceWorksAsync(
// Act
ReferencedCallback.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs
index a959edbf6..738002b1e 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiComponentsTests.cs
@@ -2,8 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
-using FluentAssertions;
-using Microsoft.OpenApi.Any;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
@@ -274,37 +273,37 @@ public class OpenApiComponentsTests
};
[Fact]
- public void SerializeBasicComponentsAsJsonWorks()
+ public async Task SerializeBasicComponentsAsJsonWorks()
{
// Arrange
var expected = @"{ }";
// Act
- var actual = BasicComponents.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await BasicComponents.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeBasicComponentsAsYamlWorks()
+ public async Task SerializeBasicComponentsAsYamlWorks()
{
// Arrange
var expected = @"{ }";
// Act
- var actual = BasicComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await BasicComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvancedComponentsAsJsonV3Works()
+ public async Task SerializeAdvancedComponentsAsJsonV3Works()
{
// Arrange
var expected =
@@ -347,16 +346,16 @@ public void SerializeAdvancedComponentsAsJsonV3Works()
""";
// Act
- var actual = AdvancedComponents.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvancedComponents.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvancedComponentsWithReferenceAsJsonV3Works()
+ public async Task SerializeAdvancedComponentsWithReferenceAsJsonV3Works()
{
// Arrange
var expected =
@@ -405,16 +404,16 @@ public void SerializeAdvancedComponentsWithReferenceAsJsonV3Works()
""";
// Act
- var actual = AdvancedComponentsWithReference.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvancedComponentsWithReference.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvancedComponentsAsYamlV3Works()
+ public async Task SerializeAdvancedComponentsAsYamlV3Works()
{
// Arrange
var expected =
@@ -444,16 +443,16 @@ public void SerializeAdvancedComponentsAsYamlV3Works()
""";
// Act
- var actual = AdvancedComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvancedComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvancedComponentsWithReferenceAsYamlV3Works()
+ public async Task SerializeAdvancedComponentsWithReferenceAsYamlV3Works()
{
// Arrange
var expected =
@@ -486,16 +485,16 @@ public void SerializeAdvancedComponentsWithReferenceAsYamlV3Works()
""";
// Act
- var actual = AdvancedComponentsWithReference.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvancedComponentsWithReference.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeBrokenComponentsAsJsonV3Works()
+ public async Task SerializeBrokenComponentsAsJsonV3Works()
{
// Arrange
var expected = """
@@ -523,16 +522,16 @@ public void SerializeBrokenComponentsAsJsonV3Works()
""";
// Act
- var actual = BrokenComponents.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await BrokenComponents.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeBrokenComponentsAsYamlV3Works()
+ public async Task SerializeBrokenComponentsAsYamlV3Works()
{
// Arrange
var expected =
@@ -553,16 +552,16 @@ public void SerializeBrokenComponentsAsYamlV3Works()
""";
// Act
- var actual = BrokenComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await BrokenComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeTopLevelReferencingComponentsAsYamlV3Works()
+ public async Task SerializeTopLevelReferencingComponentsAsYamlV3Works()
{
// Arrange
// Arrange
@@ -579,16 +578,16 @@ public void SerializeTopLevelReferencingComponentsAsYamlV3Works()
""";
// Act
- var actual = TopLevelReferencingComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await TopLevelReferencingComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeTopLevelSelfReferencingWithOtherPropertiesComponentsAsYamlV3Works()
+ public async Task SerializeTopLevelSelfReferencingWithOtherPropertiesComponentsAsYamlV3Works()
{
// Arrange
var expected = @"schemas:
@@ -604,16 +603,16 @@ public void SerializeTopLevelSelfReferencingWithOtherPropertiesComponentsAsYamlV
type: string";
// Act
- var actual = TopLevelSelfReferencingComponentsWithOtherProperties.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await TopLevelSelfReferencingComponentsWithOtherProperties.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeComponentsWithPathItemsAsJsonWorks()
+ public async Task SerializeComponentsWithPathItemsAsJsonWorks()
{
// Arrange
var expected = @"{
@@ -659,16 +658,16 @@ public void SerializeComponentsWithPathItemsAsJsonWorks()
}
}";
// Act
- var actual = ComponentsWithPathItem.SerializeAsJson(OpenApiSpecVersion.OpenApi3_1);
+ var actual = await ComponentsWithPathItem.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeComponentsWithPathItemsAsYamlWorks()
+ public async Task SerializeComponentsWithPathItemsAsYamlWorks()
{
// Arrange
var expected = @"pathItems:
@@ -696,12 +695,12 @@ public void SerializeComponentsWithPathItemsAsYamlWorks()
type: integer";
// Act
- var actual = ComponentsWithPathItem.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1);
+ var actual = await ComponentsWithPathItem.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiContactTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiContactTests.cs
index 06c00fec4..aec4815e0 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiContactTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiContactTests.cs
@@ -2,7 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
-using FluentAssertions;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
@@ -32,24 +32,24 @@ public class OpenApiContactTests
[InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json, "{ }")]
[InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml, "{ }")]
[InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml, "{ }")]
- public void SerializeBasicContactWorks(
+ public async Task SerializeBasicContactWorks(
OpenApiSpecVersion version,
OpenApiFormat format,
string expected)
{
// Arrange & Act
- var actual = BasicContact.Serialize(version, format);
+ var actual = await BasicContact.SerializeAsync(version, format);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Theory]
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
- public void SerializeAdvanceContactAsJsonWorks(OpenApiSpecVersion version)
+ public async Task SerializeAdvanceContactAsJsonWorks(OpenApiSpecVersion version)
{
// Arrange
var expected =
@@ -63,18 +63,18 @@ public void SerializeAdvanceContactAsJsonWorks(OpenApiSpecVersion version)
""";
// Act
- var actual = AdvanceContact.SerializeAsJson(version);
+ var actual = await AdvanceContact.SerializeAsJsonAsync(version);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Theory]
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
- public void SerializeAdvanceContactAsYamlWorks(OpenApiSpecVersion version)
+ public async Task SerializeAdvanceContactAsYamlWorks(OpenApiSpecVersion version)
{
// Arrange
var expected =
@@ -86,12 +86,12 @@ public void SerializeAdvanceContactAsYamlWorks(OpenApiSpecVersion version)
""";
// Act
- var actual = AdvanceContact.SerializeAsYaml(version);
+ var actual = await AdvanceContact.SerializeAsYamlAsync(version);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
index 5d493fc55..752ec7d9f 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs
@@ -6,7 +6,6 @@
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
-using FluentAssertions;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
@@ -18,7 +17,6 @@
using Microsoft.VisualBasic;
using VerifyXunit;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.OpenApi.Tests.Models
{
@@ -1355,7 +1353,7 @@ public async Task SerializeAdvancedDocumentAsV3JsonWorksAsync(bool produceTerseO
// Act
AdvancedDocument.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -1372,7 +1370,7 @@ public async Task SerializeAdvancedDocumentWithReferenceAsV3JsonWorksAsync(bool
// Act
AdvancedDocumentWithReference.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -1389,7 +1387,7 @@ public async Task SerializeAdvancedDocumentWithServerVariableAsV2JsonWorksAsync(
// Act
AdvancedDocumentWithServerVariable.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -1406,7 +1404,7 @@ public async Task SerializeAdvancedDocumentAsV2JsonWorksAsync(bool produceTerseO
// Act
AdvancedDocument.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -1423,7 +1421,7 @@ public async Task SerializeDuplicateExtensionsAsV3JsonWorksAsync(bool produceTer
// Act
DuplicateExtensions.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -1440,7 +1438,7 @@ public async Task SerializeDuplicateExtensionsAsV2JsonWorksAsync(bool produceTer
// Act
DuplicateExtensions.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -1457,14 +1455,14 @@ public async Task SerializeAdvancedDocumentWithReferenceAsV2JsonWorksAsync(bool
// Act
AdvancedDocumentWithReference.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
}
[Fact]
- public void SerializeSimpleDocumentWithTopLevelReferencingComponentsAsYamlV2Works()
+ public async Task SerializeSimpleDocumentWithTopLevelReferencingComponentsAsYamlV2Works()
{
// Arrange
var expected = @"swagger: '2.0'
@@ -1481,16 +1479,15 @@ public void SerializeSimpleDocumentWithTopLevelReferencingComponentsAsYamlV2Work
type: string";
// Act
- var actual = SimpleDocumentWithTopLevelReferencingComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await SimpleDocumentWithTopLevelReferencingComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeSimpleDocumentWithTopLevelSelfReferencingComponentsAsYamlV3Works()
+ public async Task SerializeSimpleDocumentWithTopLevelSelfReferencingComponentsAsYamlV3Works()
{
// Arrange
var expected = @"swagger: '2.0'
@@ -1501,16 +1498,15 @@ public void SerializeSimpleDocumentWithTopLevelSelfReferencingComponentsAsYamlV3
schema1: { }";
// Act
- var actual = SimpleDocumentWithTopLevelSelfReferencingComponents.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await SimpleDocumentWithTopLevelSelfReferencingComponents.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeSimpleDocumentWithTopLevelSelfReferencingWithOtherPropertiesComponentsAsYamlV3Works()
+ public async Task SerializeSimpleDocumentWithTopLevelSelfReferencingWithOtherPropertiesComponentsAsYamlV3Works()
{
// Arrange
var expected = @"swagger: '2.0'
@@ -1530,16 +1526,15 @@ public void SerializeSimpleDocumentWithTopLevelSelfReferencingWithOtherPropertie
type: string";
// Act
- var actual = SimpleDocumentWithTopLevelSelfReferencingComponentsWithOtherProperties.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await SimpleDocumentWithTopLevelSelfReferencingComponentsWithOtherProperties.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeDocumentWithReferenceButNoComponents()
+ public async Task SerializeDocumentWithReferenceButNoComponents()
{
// Arrange
var document = new OpenApiDocument()
@@ -1584,14 +1579,14 @@ public void SerializeDocumentWithReferenceButNoComponents()
};
// Act
- var actual = document.Serialize(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json);
+ var actual = await document.SerializeAsync(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json);
// Assert
Assert.NotEmpty(actual);
}
[Fact]
- public void SerializeRelativePathAsV2JsonWorks()
+ public async Task SerializeRelativePathAsV2JsonWorks()
{
// Arrange
var expected =
@@ -1612,16 +1607,15 @@ public void SerializeRelativePathAsV2JsonWorks()
};
// Act
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeRelativePathWithHostAsV2JsonWorks()
+ public async Task SerializeRelativePathWithHostAsV2JsonWorks()
{
// Arrange
var expected =
@@ -1643,16 +1637,15 @@ public void SerializeRelativePathWithHostAsV2JsonWorks()
};
// Act
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeRelativeRootPathWithHostAsV2JsonWorks()
+ public async Task SerializeRelativeRootPathWithHostAsV2JsonWorks()
{
// Arrange
var expected =
@@ -1673,12 +1666,11 @@ public void SerializeRelativeRootPathWithHostAsV2JsonWorks()
};
// Act
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
@@ -1696,8 +1688,17 @@ public async Task TestHashCodesForSimilarOpenApiDocuments()
Test whether reading in two similar documents yield the same hash code,
And reading in similar documents(one has a whitespace) yields the same hash code as the result is terse
*/
- Assert.True(doc1.HashCode != null && doc2.HashCode != null && doc1.HashCode.Equals(doc2.HashCode));
- Assert.Equal(doc1.HashCode, doc3.HashCode);
+ var doc1HashCode = await doc1.GetHashCodeAsync();
+ var doc2HashCode = await doc2.GetHashCodeAsync();
+ var doc3HashCode = await doc3.GetHashCodeAsync();
+ Assert.NotNull(doc1HashCode);
+ Assert.NotNull(doc2HashCode);
+ Assert.NotNull(doc3HashCode);
+ Assert.NotEmpty(doc1HashCode);
+ Assert.NotEmpty(doc2HashCode);
+ Assert.NotEmpty(doc3HashCode);
+ Assert.Equal(doc1HashCode, doc2HashCode);
+ Assert.Equal(doc1HashCode, doc3HashCode);
}
private static async Task ParseInputFileAsync(string filePath)
@@ -1707,7 +1708,7 @@ private static async Task ParseInputFileAsync(string filePath)
}
[Fact]
- public void SerializeV2DocumentWithNonArraySchemaTypeDoesNotWriteOutCollectionFormat()
+ public async Task SerializeV2DocumentWithNonArraySchemaTypeDoesNotWriteOutCollectionFormat()
{
// Arrange
var expected = @"swagger: '2.0'
@@ -1750,16 +1751,15 @@ public void SerializeV2DocumentWithNonArraySchemaTypeDoesNotWriteOutCollectionFo
};
// Act
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0);
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeV2DocumentWithStyleAsNullDoesNotWriteOutStyleValue()
+ public async Task SerializeV2DocumentWithStyleAsNullDoesNotWriteOutStyleValue()
{
// Arrange
var expected = @"openapi: 3.0.4
@@ -1839,12 +1839,11 @@ public void SerializeV2DocumentWithStyleAsNullDoesNotWriteOutStyleValue()
};
// Act
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
@@ -1898,7 +1897,7 @@ public void SerializeExamplesDoesNotThrowNullReferenceException()
};
OpenApiJsonWriter apiWriter = new OpenApiJsonWriter(new StringWriter());
- doc.Invoking(d => d.SerializeAsV3(apiWriter)).Should().NotThrow();
+ doc.SerializeAsV3(apiWriter);
}
[Theory]
@@ -1912,7 +1911,7 @@ public async Task SerializeDocumentWithWebhooksAsV3JsonWorks(bool produceTerseOu
// Act
DocumentWithWebhooks.SerializeAsV31(writer);
- writer.Flush();
+ await writer.FlushAsync();
var actual = outputStringWriter.GetStringBuilder().ToString();
// Assert
@@ -1920,7 +1919,7 @@ public async Task SerializeDocumentWithWebhooksAsV3JsonWorks(bool produceTerseOu
}
[Fact]
- public void SerializeDocumentWithWebhooksAsV3YamlWorks()
+ public async Task SerializeDocumentWithWebhooksAsV3YamlWorks()
{
// Arrange
var expected = @"openapi: '3.1.1'
@@ -1956,16 +1955,16 @@ public void SerializeDocumentWithWebhooksAsV3YamlWorks()
description: Return a 200 status to indicate that the data was received successfully";
// Act
- var actual = DocumentWithWebhooks.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1);
+ var actual = await DocumentWithWebhooks.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().BeEquivalentTo(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeDocumentWithRootJsonSchemaDialectPropertyWorks()
+ public async Task SerializeDocumentWithRootJsonSchemaDialectPropertyWorks()
{
// Arrange
var doc = new OpenApiDocument
@@ -1986,10 +1985,10 @@ public void SerializeDocumentWithRootJsonSchemaDialectPropertyWorks()
paths: { }";
// Act
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1);
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1);
// Assert
- actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -2015,7 +2014,7 @@ public async Task SerializeV31DocumentWithRefsInWebhooksWorks()
webhooks[OperationType.Get].SerializeAsV31(writer);
var actual = stringWriter.ToString();
- actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
@@ -2062,12 +2061,12 @@ public async Task SerializeDocWithDollarIdInDollarRefSucceeds()
type: number
";
var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithDollarId.yaml")).Document;
- var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1);
- actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+ var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1);
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral());
}
[Fact]
- public void SerializeDocumentTagsWithMultipleExtensionsWorks()
+ public async Task SerializeDocumentTagsWithMultipleExtensionsWorks()
{
var expected = @"{
""openapi"": ""3.0.4"",
@@ -2116,8 +2115,8 @@ public void SerializeDocumentTagsWithMultipleExtensionsWorks()
}
};
- var actual = doc.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
- actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral());
+ var actual = await doc.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
+ Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral());
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiEncodingTests.cs
index fe699f7aa..fd0b21c9d 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiEncodingTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiEncodingTests.cs
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using FluentAssertions;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Xunit;
@@ -24,19 +24,19 @@ public class OpenApiEncodingTests
[Theory]
[InlineData(OpenApiFormat.Json, "{ }")]
[InlineData(OpenApiFormat.Yaml, "{ }")]
- public void SerializeBasicEncodingAsV3Works(OpenApiFormat format, string expected)
+ public async Task SerializeBasicEncodingAsV3Works(OpenApiFormat format, string expected)
{
// Arrange & Act
- var actual = BasicEncoding.Serialize(OpenApiSpecVersion.OpenApi3_0, format);
+ var actual = await BasicEncoding.SerializeAsync(OpenApiSpecVersion.OpenApi3_0, format);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvanceEncodingAsV3JsonWorks()
+ public async Task SerializeAdvanceEncodingAsV3JsonWorks()
{
// Arrange
var expected =
@@ -50,16 +50,16 @@ public void SerializeAdvanceEncodingAsV3JsonWorks()
""";
// Act
- var actual = AdvanceEncoding.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvanceEncoding.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvanceEncodingAsV3YamlWorks()
+ public async Task SerializeAdvanceEncodingAsV3YamlWorks()
{
// Arrange
var expected =
@@ -71,12 +71,12 @@ public void SerializeAdvanceEncodingAsV3YamlWorks()
""";
// Act
- var actual = AdvanceEncoding.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvanceEncoding.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
}
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiExampleTests.cs
index 023f4d78f..d1e2cd8f5 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiExampleTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiExampleTests.cs
@@ -8,7 +8,6 @@
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
-using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Models.References;
using Microsoft.OpenApi.Writers;
@@ -108,7 +107,7 @@ public async Task SerializeAdvancedExampleAsV3JsonWorksAsync(bool produceTerseOu
// Act
AdvancedExample.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -125,7 +124,7 @@ public async Task SerializeReferencedExampleAsV3JsonWorksAsync(bool produceTerse
// Act
OpenApiExampleReference.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -142,7 +141,7 @@ public async Task SerializeReferencedExampleAsV3JsonWithoutReferenceWorksAsync(b
// Act
ReferencedExample.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiExternalDocsTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiExternalDocsTests.cs
index 25bf6315d..a2bee2e58 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiExternalDocsTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiExternalDocsTests.cs
@@ -1,7 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
-using FluentAssertions;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Xunit;
@@ -24,19 +24,19 @@ public class OpenApiExternalDocsTests
[Theory]
[InlineData(OpenApiFormat.Json, "{ }")]
[InlineData(OpenApiFormat.Yaml, "{ }")]
- public void SerializeBasicExternalDocsAsV3Works(OpenApiFormat format, string expected)
+ public async Task SerializeBasicExternalDocsAsV3Works(OpenApiFormat format, string expected)
{
// Arrange & Act
- var actual = BasicExDocs.Serialize(OpenApiSpecVersion.OpenApi3_0, format);
+ var actual = await BasicExDocs.SerializeAsync(OpenApiSpecVersion.OpenApi3_0, format);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvanceExDocsAsV3JsonWorks()
+ public async Task SerializeAdvanceExDocsAsV3JsonWorks()
{
// Arrange
var expected =
@@ -48,16 +48,16 @@ public void SerializeAdvanceExDocsAsV3JsonWorks()
""";
// Act
- var actual = AdvanceExDocs.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvanceExDocs.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
[Fact]
- public void SerializeAdvanceExDocsAsV3YamlWorks()
+ public async Task SerializeAdvanceExDocsAsV3YamlWorks()
{
// Arrange
var expected =
@@ -67,12 +67,12 @@ public void SerializeAdvanceExDocsAsV3YamlWorks()
""";
// Act
- var actual = AdvanceExDocs.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0);
+ var actual = await AdvanceExDocs.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
actual = actual.MakeLineBreaksEnvironmentNeutral();
expected = expected.MakeLineBreaksEnvironmentNeutral();
- actual.Should().Be(expected);
+ Assert.Equal(expected, actual);
}
#endregion
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiHeaderTests.cs
index 72c4fdfaa..e368c587b 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiHeaderTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiHeaderTests.cs
@@ -48,7 +48,7 @@ public async Task SerializeAdvancedHeaderAsV3JsonWorksAsync(bool produceTerseOut
// Act
AdvancedHeader.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -65,7 +65,7 @@ public async Task SerializeReferencedHeaderAsV3JsonWorksAsync(bool produceTerseO
// Act
OpenApiHeaderReference.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -82,7 +82,7 @@ public async Task SerializeReferencedHeaderAsV3JsonWithoutReferenceWorksAsync(bo
// Act
ReferencedHeader.SerializeAsV3(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -99,7 +99,7 @@ public async Task SerializeAdvancedHeaderAsV2JsonWorksAsync(bool produceTerseOut
// Act
AdvancedHeader.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -116,7 +116,7 @@ public async Task SerializeReferencedHeaderAsV2JsonWorksAsync(bool produceTerseO
// Act
OpenApiHeaderReference.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
@@ -133,7 +133,7 @@ public async Task SerializeReferencedHeaderAsV2JsonWithoutReferenceWorksAsync(bo
// Act
ReferencedHeader.SerializeAsV2(writer);
- writer.Flush();
+ await writer.FlushAsync();
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs
index 980ce0565..65ded8841 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiInfoTests.cs
@@ -2,7 +2,7 @@
// Licensed under the MIT license.
using System.Collections.Generic;
-using FluentAssertions;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Interfaces;
@@ -62,15 +62,15 @@ public static IEnumerable