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 schemas)) + if (loops.TryGetValue(typeof(OpenApiSchema), out var schemas)) { var openApiSchemas = schemas.Cast().Distinct().ToList() .ToDictionary(k => k.Reference.Id); @@ -414,14 +409,15 @@ private static void WriteHostInfoV2(IOpenApiWriter writer, IList? return url; }) .Where( - u => Uri.Compare( + u => u is not null && + Uri.Compare( u, firstServerUrl, UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase) == 0 && u.IsAbsoluteUri) - .Select(u => u.Scheme) + .Select(u => u!.Scheme) .Distinct() .ToList(); @@ -457,22 +453,24 @@ public void SetReferenceHostDocument() /// /// Takes in an OpenApi document instance and generates its hash value /// - /// The OpenAPI description to hash. + /// Propagates notification that operations should be canceled. /// The hash value. - public static string GenerateHashValue(OpenApiDocument doc) + public async Task GetHashCodeAsync(CancellationToken cancellationToken = default) { using HashAlgorithm sha = SHA512.Create(); using var cryptoStream = new CryptoStream(Stream.Null, sha, CryptoStreamMode.Write); using var streamWriter = new StreamWriter(cryptoStream); var openApiJsonWriter = new OpenApiJsonWriter(streamWriter, new() { Terse = true }); - doc.SerializeAsV3(openApiJsonWriter); - openApiJsonWriter.Flush(); + SerializeAsV3(openApiJsonWriter); + await openApiJsonWriter.FlushAsync(cancellationToken).ConfigureAwait(false); +#if NET5_0_OR_GREATER + await cryptoStream.FlushFinalBlockAsync(cancellationToken).ConfigureAwait(false); +#else cryptoStream.FlushFinalBlock(); - var hash = sha.Hash; - - return ConvertByteArrayToString(hash); +#endif + return ConvertByteArrayToString(sha.Hash ?? []); } private static string ConvertByteArrayToString(byte[] hash) @@ -503,21 +501,6 @@ private static string ConvertByteArrayToString(byte[] hash) throw new ArgumentException(Properties.SRResource.LocalReferenceRequiresType); } - // Special case for Tag - if (reference.Type == ReferenceType.Tag) - { - foreach (var tag in this.Tags ?? Enumerable.Empty()) - { - if (tag.Name == reference.Id) - { - tag.Reference = reference; - return tag; - } - } - - return null; - } - string uriLocation; if (reference.Id.Contains("/")) // this means its a URL reference { @@ -587,6 +570,67 @@ public static ReadResult Parse(string input, { return OpenApiModelFactory.Parse(input, format, settings); } + /// + /// Adds a component to the components object of the current document and registers it to the underlying workspace. + /// + /// The component to add + /// The id for the component + /// The type of the component + /// Whether the component was added to the components. + /// Thrown when the component is null. + /// Thrown when the id is null or empty. + public bool AddComponent(string id, T componentToRegister) + { + Utils.CheckArgumentNull(componentToRegister); + Utils.CheckArgumentNullOrEmpty(id); + Components ??= new(); + switch (componentToRegister) + { + case OpenApiSchema openApiSchema: + Components.Schemas ??= new Dictionary(); + Components.Schemas.Add(id, openApiSchema); + break; + case OpenApiParameter openApiParameter: + Components.Parameters ??= new Dictionary(); + Components.Parameters.Add(id, openApiParameter); + break; + case OpenApiResponse openApiResponse: + Components.Responses ??= new Dictionary(); + Components.Responses.Add(id, openApiResponse); + break; + case OpenApiRequestBody openApiRequestBody: + Components.RequestBodies ??= new Dictionary(); + Components.RequestBodies.Add(id, openApiRequestBody); + break; + case OpenApiLink openApiLink: + Components.Links ??= new Dictionary(); + Components.Links.Add(id, openApiLink); + break; + case OpenApiCallback openApiCallback: + Components.Callbacks ??= new Dictionary(); + Components.Callbacks.Add(id, openApiCallback); + break; + case OpenApiPathItem openApiPathItem: + Components.PathItems ??= new Dictionary(); + Components.PathItems.Add(id, openApiPathItem); + break; + case OpenApiExample openApiExample: + Components.Examples ??= new Dictionary(); + Components.Examples.Add(id, openApiExample); + break; + case OpenApiHeader openApiHeader: + Components.Headers ??= new Dictionary(); + Components.Headers.Add(id, openApiHeader); + break; + case OpenApiSecurityScheme openApiSecurityScheme: + Components.SecuritySchemes ??= new Dictionary(); + Components.SecuritySchemes.Add(id, openApiSecurityScheme); + break; + default: + throw new ArgumentException($"Component type {componentToRegister!.GetType().Name} is not supported."); + } + return Workspace?.RegisterComponentForDocument(this, componentToRegister, id) ?? false; + } } internal class FindSchemaReferences : OpenApiVisitorBase diff --git a/src/Microsoft.OpenApi/Models/OpenApiExample.cs b/src/Microsoft.OpenApi/Models/OpenApiExample.cs index ef8a64b7a..1fc7ca900 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExample.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExample.cs @@ -1,10 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Text.Json.Nodes; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Helpers; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; diff --git a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs index 6e54cd894..efd586e80 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs @@ -26,7 +26,7 @@ public class OpenApiOperation : IOpenApiSerializable, IOpenApiExtensible, IOpenA /// A list of tags for API documentation control. /// Tags can be used for logical grouping of operations by resources or any other qualifier. /// - 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 BasicInfoJsonExpected() [Theory] [MemberData(nameof(BasicInfoJsonExpected))] - public void SerializeBasicInfoAsJsonWorks(OpenApiSpecVersion version, string expected) + public async Task SerializeBasicInfoAsJsonWorks(OpenApiSpecVersion version, string expected) { // Arrange & Act - var actual = BasicInfo.SerializeAsJson(version); + var actual = await BasicInfo.SerializeAsJsonAsync(version); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } public static IEnumerable BasicInfoYamlExpected() @@ -91,15 +91,15 @@ public static IEnumerable BasicInfoYamlExpected() [Theory] [MemberData(nameof(BasicInfoYamlExpected))] - public void SerializeBasicInfoAsYamlWorks(OpenApiSpecVersion version, string expected) + public async Task SerializeBasicInfoAsYamlWorks(OpenApiSpecVersion version, string expected) { // Arrange & Act - var actual = BasicInfo.SerializeAsYaml(version); + var actual = await BasicInfo.SerializeAsYamlAsync(version); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } public static IEnumerable AdvanceInfoJsonExpect() @@ -136,15 +136,15 @@ public static IEnumerable AdvanceInfoJsonExpect() [Theory] [MemberData(nameof(AdvanceInfoJsonExpect))] - public void SerializeAdvanceInfoAsJsonWorks(OpenApiSpecVersion version, string expected) + public async Task SerializeAdvanceInfoAsJsonWorks(OpenApiSpecVersion version, string expected) { // Arrange & Act - var actual = AdvanceInfo.SerializeAsJson(version); + var actual = await AdvanceInfo.SerializeAsJsonAsync(version); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } public static IEnumerable AdvanceInfoYamlExpect() @@ -177,19 +177,19 @@ public static IEnumerable AdvanceInfoYamlExpect() [Theory] [MemberData(nameof(AdvanceInfoYamlExpect))] - public void SerializeAdvanceInfoAsYamlWorks(OpenApiSpecVersion version, string expected) + public async Task SerializeAdvanceInfoAsYamlWorks(OpenApiSpecVersion version, string expected) { // Arrange & Act - var actual = AdvanceInfo.SerializeAsYaml(version); + var actual = await AdvanceInfo.SerializeAsYamlAsync(version); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void InfoVersionShouldAcceptDateStyledAsVersions() + public async Task InfoVersionShouldAcceptDateStyledAsVersions() { // Arrange var info = new OpenApiInfo @@ -205,16 +205,16 @@ public void InfoVersionShouldAcceptDateStyledAsVersions() """; // Act - var actual = info.Serialize(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml); + var actual = await info.SerializeAsync(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeInfoObjectWithSummaryAsV31YamlWorks() + public async Task SerializeInfoObjectWithSummaryAsV31YamlWorks() { // Arrange var expected = @"title: Sample Pet Store App @@ -223,7 +223,7 @@ public void SerializeInfoObjectWithSummaryAsV31YamlWorks() summary: This is a sample server for a pet store."; // Act - var actual = InfoWithSummary.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1); + var actual = await InfoWithSummary.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); @@ -232,7 +232,7 @@ public void SerializeInfoObjectWithSummaryAsV31YamlWorks() } [Fact] - public void SerializeInfoObjectWithSummaryAsV31JsonWorks() + public async Task SerializeInfoObjectWithSummaryAsV31JsonWorks() { // Arrange var expected = @"{ @@ -243,7 +243,7 @@ public void SerializeInfoObjectWithSummaryAsV31JsonWorks() }"; // Act - var actual = InfoWithSummary.SerializeAsJson(OpenApiSpecVersion.OpenApi3_1); + var actual = await InfoWithSummary.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiLicenseTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiLicenseTests.cs index bff5efe2c..7daa55e29 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiLicenseTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiLicenseTests.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; @@ -38,7 +38,7 @@ public class OpenApiLicenseTests [Theory] [InlineData(OpenApiSpecVersion.OpenApi3_0)] [InlineData(OpenApiSpecVersion.OpenApi2_0)] - public void SerializeBasicLicenseAsJsonWorks(OpenApiSpecVersion version) + public async Task SerializeBasicLicenseAsJsonWorks(OpenApiSpecVersion version) { // Arrange var expected = @@ -49,35 +49,35 @@ public void SerializeBasicLicenseAsJsonWorks(OpenApiSpecVersion version) """; // Act - var actual = BasicLicense.SerializeAsJson(version); + var actual = await BasicLicense.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 SerializeBasicLicenseAsYamlWorks(OpenApiSpecVersion version) + public async Task SerializeBasicLicenseAsYamlWorks(OpenApiSpecVersion version) { // Arrange var expected = "name: Apache 2.0"; // Act - var actual = BasicLicense.SerializeAsYaml(version); + var actual = await BasicLicense.SerializeAsYamlAsync(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 SerializeAdvanceLicenseAsJsonWorks(OpenApiSpecVersion version) + public async Task SerializeAdvanceLicenseAsJsonWorks(OpenApiSpecVersion version) { // Arrange var expected = @@ -90,18 +90,18 @@ public void SerializeAdvanceLicenseAsJsonWorks(OpenApiSpecVersion version) """; // Act - var actual = AdvanceLicense.SerializeAsJson(version); + var actual = await AdvanceLicense.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 SerializeAdvanceLicenseAsYamlWorks(OpenApiSpecVersion version) + public async Task SerializeAdvanceLicenseAsYamlWorks(OpenApiSpecVersion version) { // Arrange var expected = @@ -112,12 +112,12 @@ public void SerializeAdvanceLicenseAsYamlWorks(OpenApiSpecVersion version) """; // Act - var actual = AdvanceLicense.SerializeAsYaml(version); + var actual = await AdvanceLicense.SerializeAsYamlAsync(version); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] @@ -136,7 +136,7 @@ public void ShouldCopyFromOriginalObjectWithoutMutating() } [Fact] - public void SerializeLicenseWithIdentifierAsJsonWorks() + public async Task SerializeLicenseWithIdentifierAsJsonWorks() { // Arrange var expected = @@ -146,21 +146,21 @@ public void SerializeLicenseWithIdentifierAsJsonWorks() }"; // Act - var actual = LicenseWithIdentifier.SerializeAsJson(OpenApiSpecVersion.OpenApi3_1); + var actual = await LicenseWithIdentifier.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1); // Assert Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); } [Fact] - public void SerializeLicenseWithIdentifierAsYamlWorks() + public async Task SerializeLicenseWithIdentifierAsYamlWorks() { // Arrange var expected = @"name: Apache 2.0 identifier: Apache-2.0"; // Act - var actual = LicenseWithIdentifier.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1); + var actual = await LicenseWithIdentifier.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1); // Assert Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiLinkTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiLinkTests.cs index 194d909b1..e1a949348 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiLinkTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiLinkTests.cs @@ -83,7 +83,7 @@ public async Task SerializeAdvancedLinkAsV3JsonWorksAsync(bool produceTerseOutpu // Act AdvancedLink.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -100,7 +100,7 @@ public async Task SerializeReferencedLinkAsV3JsonWorksAsync(bool produceTerseOut // Act LinkReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -117,7 +117,7 @@ public async Task SerializeReferencedLinkAsV3JsonWithoutReferenceWorksAsync(bool // Act ReferencedLink.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs index d4eecf7ee..b1f6ca474 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiMediaTypeTests.cs @@ -3,8 +3,7 @@ using System.Collections.Generic; using System.Text.Json.Nodes; -using FluentAssertions; -using Microsoft.OpenApi.Any; +using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; @@ -133,19 +132,19 @@ public OpenApiMediaTypeTests(ITestOutputHelper output) [Theory] [InlineData(OpenApiFormat.Json, "{ }")] [InlineData(OpenApiFormat.Yaml, "{ }")] - public void SerializeBasicMediaTypeAsV3Works(OpenApiFormat format, string expected) + public async Task SerializeBasicMediaTypeAsV3Works(OpenApiFormat format, string expected) { // Arrange & Act - var actual = BasicMediaType.Serialize(OpenApiSpecVersion.OpenApi3_0, format); + var actual = await BasicMediaType.SerializeAsync(OpenApiSpecVersion.OpenApi3_0, format); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvanceMediaTypeAsV3JsonWorks() + public async Task SerializeAdvanceMediaTypeAsV3JsonWorks() { // Arrange var expected = @@ -164,16 +163,16 @@ public void SerializeAdvanceMediaTypeAsV3JsonWorks() """; // Act - var actual = AdvanceMediaType.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvanceMediaType.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvanceMediaTypeAsV3YamlWorks() + public async Task SerializeAdvanceMediaTypeAsV3YamlWorks() { // Arrange var expected = @@ -188,16 +187,16 @@ public void SerializeAdvanceMediaTypeAsV3YamlWorks() """; // Act - var actual = AdvanceMediaType.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvanceMediaType.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeMediaTypeWithObjectExampleAsV3YamlWorks() + public async Task SerializeMediaTypeWithObjectExampleAsV3YamlWorks() { // Arrange var expected = @@ -223,16 +222,16 @@ public void SerializeMediaTypeWithObjectExampleAsV3YamlWorks() """; // Act - var actual = MediaTypeWithObjectExample.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await MediaTypeWithObjectExample.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeMediaTypeWithObjectExampleAsV3JsonWorks() + public async Task SerializeMediaTypeWithObjectExampleAsV3JsonWorks() { // Arrange var expected = @@ -274,16 +273,16 @@ public void SerializeMediaTypeWithObjectExampleAsV3JsonWorks() """; // Act - var actual = MediaTypeWithObjectExample.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await MediaTypeWithObjectExample.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeMediaTypeWithXmlExampleAsV3YamlWorks() + public async Task SerializeMediaTypeWithXmlExampleAsV3YamlWorks() { // Arrange var expected = @@ -298,16 +297,16 @@ public void SerializeMediaTypeWithXmlExampleAsV3YamlWorks() """; // Act - var actual = MediaTypeWithXmlExample.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await MediaTypeWithXmlExample.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeMediaTypeWithXmlExampleAsV3JsonWorks() + public async Task SerializeMediaTypeWithXmlExampleAsV3JsonWorks() { // Arrange var expected = @@ -326,16 +325,16 @@ public void SerializeMediaTypeWithXmlExampleAsV3JsonWorks() """; // Act - var actual = MediaTypeWithXmlExample.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await MediaTypeWithXmlExample.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeMediaTypeWithObjectExamplesAsV3YamlWorks() + public async Task SerializeMediaTypeWithObjectExamplesAsV3YamlWorks() { // Arrange var expected = @@ -363,17 +362,17 @@ public void SerializeMediaTypeWithObjectExamplesAsV3YamlWorks() """; // Act - var actual = MediaTypeWithObjectExamples.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await MediaTypeWithObjectExamples.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); _output.WriteLine(actual); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeMediaTypeWithObjectExamplesAsV3JsonWorks() + public async Task SerializeMediaTypeWithObjectExamplesAsV3JsonWorks() { // Arrange var expected = @@ -419,13 +418,13 @@ public void SerializeMediaTypeWithObjectExamplesAsV3JsonWorks() """; // Act - var actual = MediaTypeWithObjectExamples.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await MediaTypeWithObjectExamples.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); _output.WriteLine(actual); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] @@ -440,8 +439,11 @@ public void MediaTypeCopyConstructorWorks() }; // Assert - MediaTypeWithObjectExamples.Examples.Should().NotBeEquivalentTo(clone.Examples); - MediaTypeWithObjectExamples.Example.Should().Be(null); + Assert.Equal(42, clone.Example.GetValue()); + Assert.Empty(clone.Examples); + Assert.Empty(clone.Encoding); + Assert.Empty(clone.Extensions); + Assert.Null(MediaTypeWithObjectExamples.Example); } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowTests.cs index 3327887c9..b3e788625 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowTests.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using System.Collections.Generic; -using FluentAssertions; +using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Xunit; @@ -37,7 +37,7 @@ public class OpenApiOAuthFlowTests }; [Fact] - public void SerializeBasicOAuthFlowAsV3JsonWorks() + public async Task SerializeBasicOAuthFlowAsV3JsonWorks() { // Arrange var expected = @@ -48,32 +48,32 @@ public void SerializeBasicOAuthFlowAsV3JsonWorks() """; // Act - var actual = BasicOAuthFlow.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicOAuthFlow.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeBasicOAuthFlowAsV3YamlWorks() + public async Task SerializeBasicOAuthFlowAsV3YamlWorks() { // Arrange var expected = @"scopes: { }"; // Act - var actual = BasicOAuthFlow.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicOAuthFlow.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializePartialOAuthFlowAsV3JsonWorks() + public async Task SerializePartialOAuthFlowAsV3JsonWorks() { // Arrange var expected = @@ -88,16 +88,16 @@ public void SerializePartialOAuthFlowAsV3JsonWorks() """; // Act - var actual = PartialOAuthFlow.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await PartialOAuthFlow.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeCompleteOAuthFlowAsV3JsonWorks() + public async Task SerializeCompleteOAuthFlowAsV3JsonWorks() { // Arrange var expected = @@ -114,12 +114,12 @@ public void SerializeCompleteOAuthFlowAsV3JsonWorks() """; // Act - var actual = CompleteOAuthFlow.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await CompleteOAuthFlow.SerializeAsJsonAsync(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/OpenApiOAuthFlowsTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowsTests.cs index 1bb473a89..161c669fa 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowsTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiOAuthFlowsTests.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using System.Collections.Generic; -using FluentAssertions; +using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Xunit; @@ -51,39 +51,39 @@ public class OpenApiOAuthFlowsTests }; [Fact] - public void SerializeBasicOAuthFlowsAsV3JsonWorks() + public async Task SerializeBasicOAuthFlowsAsV3JsonWorks() { // Arrange var expected = @"{ }"; // Act - var actual = BasicOAuthFlows.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicOAuthFlows.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeBasicOAuthFlowsAsV3YamlWorks() + public async Task SerializeBasicOAuthFlowsAsV3YamlWorks() { // Arrange var expected = @"{ }"; // Act - var actual = BasicOAuthFlows.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicOAuthFlows.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOAuthFlowsWithSingleFlowAsV3JsonWorks() + public async Task SerializeOAuthFlowsWithSingleFlowAsV3JsonWorks() { // Arrange var expected = @@ -100,16 +100,16 @@ public void SerializeOAuthFlowsWithSingleFlowAsV3JsonWorks() """; // Act - var actual = OAuthFlowsWithSingleFlow.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await OAuthFlowsWithSingleFlow.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOAuthFlowsWithMultipleFlowsAsV3JsonWorks() + public async Task SerializeOAuthFlowsWithMultipleFlowsAsV3JsonWorks() { // Arrange var expected = @@ -134,12 +134,12 @@ public void SerializeOAuthFlowsWithMultipleFlowsAsV3JsonWorks() """; // Act - var actual = OAuthFlowsWithMultipleFlows.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await OAuthFlowsWithMultipleFlows.SerializeAsJsonAsync(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/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs index 5f6b5f4e7..1b0b27ada 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiOperationTests.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using System.Collections.Generic; -using FluentAssertions; +using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -87,9 +87,9 @@ public class OpenApiOperationTests private static readonly OpenApiOperation _advancedOperationWithTagsAndSecurity = new() { - Tags = new List + Tags = new List { - new OpenApiTagReference("tagId1", null) + new OpenApiTagReference("tagId1", new OpenApiDocument{ Tags = new List() { new OpenApiTag{Name = "tagId1"}} }) }, Summary = "summary1", Description = "operationDescription", @@ -256,7 +256,7 @@ public class OpenApiOperationTests }; [Fact] - public void SerializeBasicOperationAsV3JsonWorks() + public async Task SerializeBasicOperationAsV3JsonWorks() { // Arrange var expected = @@ -267,16 +267,16 @@ public void SerializeBasicOperationAsV3JsonWorks() """; // Act - var actual = _basicOperation.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await _basicOperation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOperationWithBodyAsV3JsonWorks() + public async Task SerializeOperationWithBodyAsV3JsonWorks() { // Arrange var expected = @@ -339,16 +339,16 @@ public void SerializeOperationWithBodyAsV3JsonWorks() """; // Act - var actual = _operationWithBody.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await _operationWithBody.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedOperationWithTagAndSecurityAsV3JsonWorks() + public async Task SerializeAdvancedOperationWithTagAndSecurityAsV3JsonWorks() { // Arrange var expected = @@ -423,16 +423,16 @@ public void SerializeAdvancedOperationWithTagAndSecurityAsV3JsonWorks() """; // Act - var actual = _advancedOperationWithTagsAndSecurity.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await _advancedOperationWithTagsAndSecurity.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeBasicOperationAsV2JsonWorks() + public async Task SerializeBasicOperationAsV2JsonWorks() { // Arrange var expected = @@ -443,16 +443,16 @@ public void SerializeBasicOperationAsV2JsonWorks() """; // Act - var actual = _basicOperation.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await _basicOperation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOperationWithFormDataAsV3JsonWorks() + public async Task SerializeOperationWithFormDataAsV3JsonWorks() { // Arrange var expected = @@ -522,16 +522,16 @@ public void SerializeOperationWithFormDataAsV3JsonWorks() """; // Act - var actual = _operationWithFormData.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await _operationWithFormData.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOperationWithFormDataAsV2JsonWorks() + public async Task SerializeOperationWithFormDataAsV2JsonWorks() { // Arrange var expected = @@ -578,16 +578,16 @@ public void SerializeOperationWithFormDataAsV2JsonWorks() """; // Act - var actual = _operationWithFormData.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await _operationWithFormData.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOperationWithBodyAsV2JsonWorks() + public async Task SerializeOperationWithBodyAsV2JsonWorks() { // Arrange var expected = @@ -647,16 +647,16 @@ public void SerializeOperationWithBodyAsV2JsonWorks() """; // Act - var actual = _operationWithBody.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await _operationWithBody.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedOperationWithTagAndSecurityAsV2JsonWorks() + public async Task SerializeAdvancedOperationWithTagAndSecurityAsV2JsonWorks() { // Arrange var expected = @@ -728,16 +728,16 @@ public void SerializeAdvancedOperationWithTagAndSecurityAsV2JsonWorks() """; // Act - var actual = _advancedOperationWithTagsAndSecurity.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await _advancedOperationWithTagsAndSecurity.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOperationWithNullCollectionAsV2JsonWorks() + public async Task SerializeOperationWithNullCollectionAsV2JsonWorks() { // Arrange var expected = @@ -753,12 +753,12 @@ public void SerializeOperationWithNullCollectionAsV2JsonWorks() }; // Act - var actual = operation.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] @@ -803,7 +803,7 @@ public void EnsureOpenApiOperationCopyConstructorCopiesNull() } [Fact] - public void EnsureOpenApiOperationCopyConstructor_SerializationResultsInSame() + public async Task EnsureOpenApiOperationCopyConstructor_SerializationResultsInSame() { var operations = new[] { @@ -816,12 +816,12 @@ public void EnsureOpenApiOperationCopyConstructor_SerializationResultsInSame() foreach (var operation in operations) { // Act - var expected = operation.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var expected = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); var openApiOperation = new OpenApiOperation(operation); - var actual = openApiOperation.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await openApiOperation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs index 95596b787..1c2e3329f 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs @@ -4,9 +4,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; @@ -185,7 +183,7 @@ public void WhenStyleIsFormTheDefaultValueOfExplodeShouldBeTrueOtherwiseFalse(Pa }; // Act & Assert - parameter.Explode.Should().Be(expectedExplode); + Assert.Equal(expectedExplode, parameter.Explode); } [Theory] @@ -194,7 +192,7 @@ public void WhenStyleIsFormTheDefaultValueOfExplodeShouldBeTrueOtherwiseFalse(Pa [InlineData(ParameterLocation.Header, ParameterStyle.Simple)] [InlineData(ParameterLocation.Cookie, ParameterStyle.Form)] [InlineData(null, ParameterStyle.Simple)] - public void WhenStyleAndInIsNullTheDefaultValueOfStyleShouldBeSimple(ParameterLocation? inValue, ParameterStyle expectedStyle) + public async Task WhenStyleAndInIsNullTheDefaultValueOfStyleShouldBeSimple(ParameterLocation? inValue, ParameterStyle expectedStyle) { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -207,13 +205,13 @@ public void WhenStyleAndInIsNullTheDefaultValueOfStyleShouldBeSimple(ParameterLo // Act & Assert parameter.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); - parameter.Style.Should().Be(expectedStyle); + Assert.Equal(expectedStyle, parameter.Style); } [Fact] - public void SerializeQueryParameterWithMissingStyleSucceeds() + public async Task SerializeQueryParameterWithMissingStyleSucceeds() { // Arrange var expected = @"name: id @@ -224,14 +222,14 @@ public void SerializeQueryParameterWithMissingStyleSucceeds() type: integer"; // Act - var actual = QueryParameterWithMissingStyle.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await QueryParameterWithMissingStyle.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral()); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); } [Fact] - public void SerializeBasicParameterAsV3JsonWorks() + public async Task SerializeBasicParameterAsV3JsonWorks() { // Arrange var expected = @@ -243,16 +241,16 @@ public void SerializeBasicParameterAsV3JsonWorks() """; // Act - var actual = BasicParameter.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicParameter.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedParameterAsV3JsonWorks() + public async Task SerializeAdvancedParameterAsV3JsonWorks() { // Arrange var expected = @@ -287,16 +285,16 @@ public void SerializeAdvancedParameterAsV3JsonWorks() """; // Act - var actual = AdvancedPathParameterWithSchema.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedPathParameterWithSchema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedParameterAsV2JsonWorks() + public async Task SerializeAdvancedParameterAsV2JsonWorks() { // Arrange var expected = @@ -317,12 +315,12 @@ public void SerializeAdvancedParameterAsV2JsonWorks() """; // Act - var actual = AdvancedPathParameterWithSchema.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await AdvancedPathParameterWithSchema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -336,7 +334,7 @@ public async Task SerializeReferencedParameterAsV3JsonWorksAsync(bool produceTer // Act OpenApiParameterReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -353,7 +351,7 @@ public async Task SerializeReferencedParameterAsV3JsonWithoutReferenceWorksAsync // Act ReferencedParameter.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -370,7 +368,7 @@ public async Task SerializeReferencedParameterAsV2JsonWorksAsync(bool produceTer // Act OpenApiParameterReference.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -387,7 +385,7 @@ public async Task SerializeReferencedParameterAsV2JsonWithoutReferenceWorksAsync // Act ReferencedParameter.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -404,7 +402,7 @@ public async Task SerializeParameterWithSchemaTypeObjectAsV2JsonWorksAsync(bool // Act AdvancedHeaderParameterWithSchemaTypeObject.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -421,7 +419,7 @@ public async Task SerializeParameterWithFormStyleAndExplodeFalseWorksAsync(bool // Act ParameterWithFormStyleAndExplodeFalse.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -438,7 +436,7 @@ public async Task SerializeParameterWithFormStyleAndExplodeTrueWorksAsync(bool p // Act ParameterWithFormStyleAndExplodeTrue.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiReferenceTests.cs index 1a8497e5a..2a27313ca 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiReferenceTests.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; @@ -28,12 +28,12 @@ public void SettingInternalReferenceForComponentsStyleReferenceShouldSucceed( }; // Assert - reference.ExternalResource.Should().BeNull(); - reference.Type.Should().Be(type); - reference.Id.Should().Be(id); + Assert.Null(reference.ExternalResource); + Assert.Equal(type, reference.Type); + Assert.Equal(id, reference.Id); - reference.ReferenceV3.Should().Be(input); - reference.ReferenceV2.Should().Be(input.Replace("schemas", "definitions").Replace("/components", "")); + Assert.Equal(input, reference.ReferenceV3); + Assert.Equal(input.Replace("schemas", "definitions").Replace("/components", ""), reference.ReferenceV2); } [Theory] @@ -54,10 +54,10 @@ public void SettingExternalReferenceV3ShouldSucceed(string expected, string exte }; // Assert - reference.ExternalResource.Should().Be(externalResource); - reference.Id.Should().Be(id); + Assert.Equal(externalResource, reference.ExternalResource); + Assert.Equal(id, reference.Id); - reference.ReferenceV3.Should().Be(expected); + Assert.Equal(expected, reference.ReferenceV3); } [Theory] @@ -78,14 +78,14 @@ public void SettingExternalReferenceV2ShouldSucceed(string expected, string exte }; // Assert - reference.ExternalResource.Should().Be(externalResource); - reference.Id.Should().Be(id); + Assert.Equal(externalResource, reference.ExternalResource); + Assert.Equal(id, reference.Id); - reference.ReferenceV2.Should().Be(expected); + Assert.Equal(expected, reference.ReferenceV2); } [Fact] - public void SerializeSchemaReferenceAsJsonV3Works() + public async Task SerializeSchemaReferenceAsJsonV3Works() { // Arrange var reference = new OpenApiReference { Type = ReferenceType.Schema, Id = "Pet" }; @@ -97,16 +97,16 @@ public void SerializeSchemaReferenceAsJsonV3Works() """; // Act - var actual = reference.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await reference.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); expected = expected.MakeLineBreaksEnvironmentNeutral(); actual = actual.MakeLineBreaksEnvironmentNeutral(); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeSchemaReferenceAsYamlV3Works() + public async Task SerializeSchemaReferenceAsYamlV3Works() { // Arrange var reference = new OpenApiReference @@ -118,14 +118,14 @@ public void SerializeSchemaReferenceAsYamlV3Works() var expected = @"$ref: '#/components/schemas/Pet'"; // Act - var actual = reference.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await reference.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeSchemaReferenceAsJsonV2Works() + public async Task SerializeSchemaReferenceAsJsonV2Works() { // Arrange var reference = new OpenApiReference @@ -142,14 +142,14 @@ public void SerializeSchemaReferenceAsJsonV2Works() """.MakeLineBreaksEnvironmentNeutral(); // Act - var actual = reference.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await reference.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert - actual.MakeLineBreaksEnvironmentNeutral().Should().Be(expected); + Assert.Equal(expected, actual.MakeLineBreaksEnvironmentNeutral()); } [Fact] - public void SerializeSchemaReferenceAsYamlV2Works() + public async Task SerializeSchemaReferenceAsYamlV2Works() { // Arrange var reference = new OpenApiReference @@ -160,14 +160,14 @@ public void SerializeSchemaReferenceAsYamlV2Works() var expected = @"$ref: '#/definitions/Pet'"; // Act - var actual = reference.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0); + var actual = await reference.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeExternalReferenceAsJsonV2Works() + public async Task SerializeExternalReferenceAsJsonV2Works() { // Arrange var reference = new OpenApiReference @@ -185,16 +185,16 @@ public void SerializeExternalReferenceAsJsonV2Works() """; // Act - var actual = reference.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await reference.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); expected = expected.MakeLineBreaksEnvironmentNeutral(); actual = actual.MakeLineBreaksEnvironmentNeutral(); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeExternalReferenceAsYamlV2Works() + public async Task SerializeExternalReferenceAsYamlV2Works() { // Arrange var reference = new OpenApiReference @@ -206,14 +206,14 @@ public void SerializeExternalReferenceAsYamlV2Works() var expected = @"$ref: main.json#/definitions/Pets"; // Act - var actual = reference.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0); + var actual = await reference.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeExternalReferenceAsJsonV3Works() + public async Task SerializeExternalReferenceAsJsonV3Works() { // Arrange var reference = new OpenApiReference { ExternalResource = "main.json", Type = ReferenceType.Schema, Id = "Pets" }; @@ -226,26 +226,26 @@ public void SerializeExternalReferenceAsJsonV3Works() """; // Act - var actual = reference.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await reference.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); expected = expected.MakeLineBreaksEnvironmentNeutral(); actual = actual.MakeLineBreaksEnvironmentNeutral(); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeExternalReferenceAsYamlV3Works() + public async Task SerializeExternalReferenceAsYamlV3Works() { // Arrange var reference = new OpenApiReference { ExternalResource = "main.json", Type = ReferenceType.Schema, Id = "Pets" }; var expected = @"$ref: main.json#/components/schemas/Pets"; // Act - var actual = reference.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await reference.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiRequestBodyTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiRequestBodyTests.cs index ebffa38fd..f391ef4d8 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiRequestBodyTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiRequestBodyTests.cs @@ -59,7 +59,7 @@ public async Task SerializeAdvancedRequestBodyAsV3JsonWorksAsync(bool produceTer // Act AdvancedRequestBody.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -76,7 +76,7 @@ public async Task SerializeReferencedRequestBodyAsV3JsonWorksAsync(bool produceT // Act OpenApiRequestBodyReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -93,7 +93,7 @@ public async Task SerializeReferencedRequestBodyAsV3JsonWithoutReferenceWorksAsy // Act ReferencedRequestBody.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs index f09d41da8..14d14e4be 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiResponseTests.cs @@ -5,7 +5,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; @@ -186,7 +185,7 @@ public OpenApiResponseTests(ITestOutputHelper output) [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json)] [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml)] [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml)] - public void SerializeBasicResponseWorks( + public async Task SerializeBasicResponseWorks( OpenApiSpecVersion version, OpenApiFormat format) { @@ -196,16 +195,16 @@ public void SerializeBasicResponseWorks( }" : @"description: "; // Act - var actual = BasicResponse.Serialize(version, format); + var actual = await BasicResponse.SerializeAsync(version, format); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedResponseAsV3JsonWorks() + public async Task SerializeAdvancedResponseAsV3JsonWorks() { // Arrange var expected = @"{ @@ -239,16 +238,16 @@ public void SerializeAdvancedResponseAsV3JsonWorks() }"; // Act - var actual = AdvancedV3Response.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedV3Response.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedResponseAsV3YamlWorks() + public async Task SerializeAdvancedResponseAsV3YamlWorks() { // Arrange var expected = @@ -272,16 +271,16 @@ public void SerializeAdvancedResponseAsV3YamlWorks() myextension: myextensionvalue"; // Act - var actual = AdvancedV3Response.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedV3Response.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedResponseAsV2JsonWorks() + public async Task SerializeAdvancedResponseAsV2JsonWorks() { // Arrange var expected = @"{ @@ -309,16 +308,16 @@ public void SerializeAdvancedResponseAsV2JsonWorks() }"; // Act - var actual = AdvancedV2Response.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await AdvancedV2Response.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedResponseAsV2YamlWorks() + public async Task SerializeAdvancedResponseAsV2YamlWorks() { // Arrange var expected = @@ -339,12 +338,12 @@ public void SerializeAdvancedResponseAsV2YamlWorks() type: integer"; // Act - var actual = AdvancedV2Response.SerializeAsYaml(OpenApiSpecVersion.OpenApi2_0); + var actual = await AdvancedV2Response.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -358,7 +357,7 @@ public async Task SerializeReferencedResponseAsV3JsonWorksAsync(bool produceTers // Act V3OpenApiResponseReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -375,7 +374,7 @@ public async Task SerializeReferencedResponseAsV3JsonWithoutReferenceWorksAsync( // Act ReferencedV3Response.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -392,7 +391,7 @@ public async Task SerializeReferencedResponseAsV2JsonWorksAsync(bool produceTers // Act V2OpenApiResponseReference.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -409,7 +408,7 @@ public async Task SerializeReferencedResponseAsV2JsonWithoutReferenceWorksAsync( // Act ReferencedV2Response.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index 75ea5ca47..5edd1c0d0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -215,22 +215,22 @@ public class OpenApiSchemaTests }; [Fact] - public void SerializeBasicSchemaAsV3JsonWorks() + public async Task SerializeBasicSchemaAsV3JsonWorks() { // Arrange var expected = @"{ }"; // Act - var actual = BasicSchema.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicSchema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedSchemaNumberAsV3JsonWorks() + public async Task SerializeAdvancedSchemaNumberAsV3JsonWorks() { // Arrange var expected = @@ -251,16 +251,16 @@ public void SerializeAdvancedSchemaNumberAsV3JsonWorks() """; // Act - var actual = AdvancedSchemaNumber.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedSchemaNumber.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedSchemaObjectAsV3JsonWorks() + public async Task SerializeAdvancedSchemaObjectAsV3JsonWorks() { // Arrange var expected = @@ -303,16 +303,16 @@ public void SerializeAdvancedSchemaObjectAsV3JsonWorks() """; // Act - var actual = AdvancedSchemaObject.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedSchemaObject.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedSchemaWithAllOfAsV3JsonWorks() + public async Task SerializeAdvancedSchemaWithAllOfAsV3JsonWorks() { // Arrange var expected = @@ -358,12 +358,12 @@ public void SerializeAdvancedSchemaWithAllOfAsV3JsonWorks() """; // Act - var actual = AdvancedSchemaWithAllOf.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedSchemaWithAllOf.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -377,7 +377,7 @@ public async Task SerializeReferencedSchemaAsV3WithoutReferenceJsonWorksAsync(bo // Act ReferencedSchema.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -394,7 +394,7 @@ public async Task SerializeReferencedSchemaAsV3JsonWorksAsync(bool produceTerseO // Act ReferencedSchema.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -411,14 +411,14 @@ public async Task SerializeSchemaWRequiredPropertiesAsV2JsonWorksAsync(bool prod // Act AdvancedSchemaWithRequiredPropertiesObject.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } [Fact] - public void SerializeAsV2ShouldSetFormatPropertyInParentSchemaIfPresentInChildrenSchema() + public async Task SerializeAsV2ShouldSetFormatPropertyInParentSchemaIfPresentInChildrenSchema() { // Arrange var schema = new OpenApiSchema @@ -440,7 +440,7 @@ public void SerializeAsV2ShouldSetFormatPropertyInParentSchemaIfPresentInChildre // Act // Serialize as V2 schema.SerializeAsV2(openApiJsonWriter); - openApiJsonWriter.Flush(); + await openApiJsonWriter.FlushAsync(); var v2Schema = outputStringWriter.GetStringBuilder().ToString().MakeLineBreaksEnvironmentNeutral(); @@ -458,7 +458,7 @@ public void SerializeAsV2ShouldSetFormatPropertyInParentSchemaIfPresentInChildre """.MakeLineBreaksEnvironmentNeutral(); // Assert - expectedV2Schema.Should().BeEquivalentTo(v2Schema); + Assert.Equal(v2Schema, expectedV2Schema); } [Fact] @@ -600,11 +600,11 @@ public void OpenApiWalkerVisitsOpenApiSchemaNot() walker.Walk(document); // Assert - visitor.Titles.Count.Should().Be(2); + Assert.Equal(2, visitor.Titles.Count); } [Fact] - public void SerializeSchemaWithUnrecognizedPropertiesWorks() + public async Task SerializeSchemaWithUnrecognizedPropertiesWorks() { // Arrange var schema = new OpenApiSchema @@ -624,10 +624,10 @@ public void SerializeSchemaWithUnrecognizedPropertiesWorks() }"; // Act - var actual = schema.SerializeAsJson(OpenApiSpecVersion.OpenApi3_1); + var actual = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1); // Assert - actual.MakeLineBreaksEnvironmentNeutral().Should().Be(expected.MakeLineBreaksEnvironmentNeutral()); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); } internal class SchemaVisitor : OpenApiVisitorBase diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs index 1e9e13323..af0343f57 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs @@ -72,18 +72,18 @@ public class OpenApiSecurityRequirementTests }; [Fact] - public void SerializeBasicSecurityRequirementAsV3JsonWorks() + public async Task SerializeBasicSecurityRequirementAsV3JsonWorks() { // Arrange var expected = @"{ }"; // Act - var actual = BasicSecurityRequirement.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicSecurityRequirement.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -97,14 +97,14 @@ public async Task SerializeSecurityRequirementAsV3JsonWorksAsync(bool produceTer // Act SecurityRequirementWithReferencedSecurityScheme.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } [Fact] - public void SerializeSecurityRequirementWithReferencedSecuritySchemeAsV3JsonWorks() + public async Task SerializeSecurityRequirementWithReferencedSecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -124,16 +124,16 @@ public void SerializeSecurityRequirementWithReferencedSecuritySchemeAsV3JsonWork """; // Act - var actual = SecurityRequirementWithReferencedSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await SecurityRequirementWithReferencedSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeSecurityRequirementWithReferencedSecuritySchemeAsV2JsonWorks() + public async Task SerializeSecurityRequirementWithReferencedSecuritySchemeAsV2JsonWorks() { // Arrange var expected = @@ -153,16 +153,16 @@ public void SerializeSecurityRequirementWithReferencedSecuritySchemeAsV2JsonWork """; // Act - var actual = SecurityRequirementWithReferencedSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + var actual = await SecurityRequirementWithReferencedSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeSecurityRequirementWithUnreferencedSecuritySchemeAsV3JsonShouldSkipUnserializableKeyValuePair() + public async Task SerializeSecurityRequirementWithUnreferencedSecuritySchemeAsV3JsonShouldSkipUnserializableKeyValuePair() { // Arrange var expected = @@ -178,16 +178,16 @@ public void SerializeSecurityRequirementWithUnreferencedSecuritySchemeAsV3JsonSh """; // Act - var actual = SecurityRequirementWithUnreferencedSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await SecurityRequirementWithUnreferencedSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeSecurityRequirementWithUnreferencedSecuritySchemeAsV2JsonShouldSkipUnserializableKeyValuePair() + public async Task SerializeSecurityRequirementWithUnreferencedSecuritySchemeAsV2JsonShouldSkipUnserializableKeyValuePair() { // Arrange var expected = @@ -204,12 +204,12 @@ public void SerializeSecurityRequirementWithUnreferencedSecuritySchemeAsV2JsonSh // Act var actual = - SecurityRequirementWithUnreferencedSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi2_0); + await SecurityRequirementWithUnreferencedSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi2_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] @@ -277,10 +277,10 @@ public void SchemesShouldConsiderOnlyReferenceIdForEquality() // Assert // Only the first two should be added successfully since the latter two are duplicates of securityScheme1. // Duplicate determination only considers Reference.Id. - addSecurityScheme1Duplicate.Should().Throw(); - addSecurityScheme1WithDifferentProperties.Should().Throw(); + Assert.Throws(addSecurityScheme1Duplicate); + Assert.Throws(addSecurityScheme1WithDifferentProperties); - securityRequirement.Should().HaveCount(2); + Assert.Equal(2, securityRequirement.Count); securityRequirement.Should().BeEquivalentTo( new OpenApiSecurityRequirement diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs index 58794373d..9c59ca4bd 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs @@ -5,7 +5,6 @@ using System.Globalization; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -115,7 +114,7 @@ public class OpenApiSecuritySchemeTests }; [Fact] - public void SerializeApiKeySecuritySchemeAsV3JsonWorks() + public async Task SerializeApiKeySecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -129,16 +128,16 @@ public void SerializeApiKeySecuritySchemeAsV3JsonWorks() """; // Act - var actual = ApiKeySecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await ApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeApiKeySecuritySchemeAsV3YamlWorks() + public async Task SerializeApiKeySecuritySchemeAsV3YamlWorks() { // Arrange var expected = @@ -150,16 +149,16 @@ public void SerializeApiKeySecuritySchemeAsV3YamlWorks() """; // Act - var actual = ApiKeySecurityScheme.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await ApiKeySecurityScheme.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeHttpBasicSecuritySchemeAsV3JsonWorks() + public async Task SerializeHttpBasicSecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -172,16 +171,16 @@ public void SerializeHttpBasicSecuritySchemeAsV3JsonWorks() """; // Act - var actual = HttpBasicSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await HttpBasicSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeHttpBearerSecuritySchemeAsV3JsonWorks() + public async Task SerializeHttpBearerSecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -195,16 +194,16 @@ public void SerializeHttpBearerSecuritySchemeAsV3JsonWorks() """; // Act - var actual = HttpBearerSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await HttpBearerSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOAuthSingleFlowSecuritySchemeAsV3JsonWorks() + public async Task SerializeOAuthSingleFlowSecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -225,16 +224,16 @@ public void SerializeOAuthSingleFlowSecuritySchemeAsV3JsonWorks() """; // Act - var actual = OAuth2SingleFlowSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await OAuth2SingleFlowSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOAuthMultipleFlowSecuritySchemeAsV3JsonWorks() + public async Task SerializeOAuthMultipleFlowSecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -271,16 +270,16 @@ public void SerializeOAuthMultipleFlowSecuritySchemeAsV3JsonWorks() """; // Act - var actual = OAuth2MultipleFlowSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await OAuth2MultipleFlowSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeOpenIdConnectSecuritySchemeAsV3JsonWorks() + public async Task SerializeOpenIdConnectSecuritySchemeAsV3JsonWorks() { // Arrange var expected = @@ -293,12 +292,12 @@ public void SerializeOpenIdConnectSecuritySchemeAsV3JsonWorks() """; // Act - var actual = OpenIdConnectSecurityScheme.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await OpenIdConnectSecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -312,7 +311,7 @@ public async Task SerializeReferencedSecuritySchemeAsV3JsonWorksAsync(bool produ // Act OpenApiSecuritySchemeReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -329,7 +328,7 @@ public async Task SerializeReferencedSecuritySchemeAsV3JsonWithoutReferenceWorks // Act ReferencedSecurityScheme.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiServerTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiServerTests.cs index 19fc00aeb..bbfacf01c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiServerTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiServerTests.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using System.Collections.Generic; -using FluentAssertions; +using System.Threading.Tasks; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Xunit; @@ -47,7 +47,7 @@ public class OpenApiServerTests }; [Fact] - public void SerializeBasicServerAsV3JsonWorks() + public async Task SerializeBasicServerAsV3JsonWorks() { // Arrange var expected = @@ -59,16 +59,16 @@ public void SerializeBasicServerAsV3JsonWorks() """; // Act - var actual = BasicServer.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await BasicServer.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedServerAsV3JsonWorks() + public async Task SerializeAdvancedServerAsV3JsonWorks() { // Arrange var expected = @@ -97,12 +97,12 @@ public void SerializeAdvancedServerAsV3JsonWorks() """; // Act - var actual = AdvancedServer.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedServer.SerializeAsJsonAsync(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/OpenApiServerVariableTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiServerVariableTests.cs index ca23e3b97..255bfe908 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiServerVariableTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiServerVariableTests.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; @@ -27,19 +27,19 @@ public class OpenApiServerVariableTests [Theory] [InlineData(OpenApiFormat.Json, "{ }")] [InlineData(OpenApiFormat.Yaml, "{ }")] - public void SerializeBasicServerVariableAsV3Works(OpenApiFormat format, string expected) + public async Task SerializeBasicServerVariableAsV3Works(OpenApiFormat format, string expected) { // Arrange & Act - var actual = BasicServerVariable.Serialize(OpenApiSpecVersion.OpenApi3_0, format); + var actual = await BasicServerVariable.SerializeAsync(OpenApiSpecVersion.OpenApi3_0, format); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedServerVariableAsV3JsonWorks() + public async Task SerializeAdvancedServerVariableAsV3JsonWorks() { // Arrange var expected = @@ -55,16 +55,16 @@ public void SerializeAdvancedServerVariableAsV3JsonWorks() """; // Act - var actual = AdvancedServerVariable.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedServerVariable.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedServerVariableAsV3YamlWorks() + public async Task SerializeAdvancedServerVariableAsV3YamlWorks() { // Arrange var expected = @@ -77,12 +77,12 @@ public void SerializeAdvancedServerVariableAsV3YamlWorks() """; // Act - var actual = AdvancedServerVariable.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_0); + var actual = await AdvancedServerVariable.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/OpenApiTagTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiTagTests.cs index 24c186b0b..508779adf 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiTagTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiTagTests.cs @@ -5,7 +5,6 @@ using System.Globalization; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -44,7 +43,7 @@ public async Task SerializeBasicTagAsV3JsonWithoutReferenceWorksAsync(bool produ // Act BasicTag.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -61,7 +60,7 @@ public async Task SerializeBasicTagAsV2JsonWithoutReferenceWorksAsync(bool produ // Act BasicTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -82,11 +81,11 @@ public void SerializeBasicTagAsV3YamlWithoutReferenceWorks() // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeBasicTagAsV2YamlWithoutReferenceWorks() + public async Task SerializeBasicTagAsV2YamlWithoutReferenceWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -95,17 +94,17 @@ public void SerializeBasicTagAsV2YamlWithoutReferenceWorks() // Act BasicTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedTagAsV3YamlWithoutReferenceWorks() + public async Task SerializeAdvancedTagAsV3YamlWithoutReferenceWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -122,17 +121,17 @@ public void SerializeAdvancedTagAsV3YamlWithoutReferenceWorks() // Act AdvancedTag.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedTagAsV2YamlWithoutReferenceWorks() + public async Task SerializeAdvancedTagAsV2YamlWithoutReferenceWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -149,13 +148,13 @@ public void SerializeAdvancedTagAsV2YamlWithoutReferenceWorks() // Act AdvancedTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -169,7 +168,7 @@ public async Task SerializeAdvancedTagAsV3JsonWorksAsync(bool produceTerseOutput // Act AdvancedTag.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -186,14 +185,14 @@ public async Task SerializeAdvancedTagAsV2JsonWorksAsync(bool produceTerseOutput // Act AdvancedTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } [Fact] - public void SerializeAdvancedTagAsV3YamlWorks() + public async Task SerializeAdvancedTagAsV3YamlWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -208,17 +207,17 @@ public void SerializeAdvancedTagAsV3YamlWorks() // Act AdvancedTag.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeAdvancedTagAsV2YamlWorks() + public async Task SerializeAdvancedTagAsV2YamlWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -233,13 +232,13 @@ public void SerializeAdvancedTagAsV2YamlWorks() // Act AdvancedTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -253,7 +252,7 @@ public async Task SerializeReferencedTagAsV3JsonWorksAsync(bool produceTerseOutp // Act ReferencedTag.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -270,14 +269,14 @@ public async Task SerializeReferencedTagAsV2JsonWorksAsync(bool produceTerseOutp // Act ReferencedTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } [Fact] - public void SerializeReferencedTagAsV3YamlWorks() + public async Task SerializeReferencedTagAsV3YamlWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -287,17 +286,17 @@ public void SerializeReferencedTagAsV3YamlWorks() // Act ReferencedTag.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Fact] - public void SerializeReferencedTagAsV2YamlWorks() + public async Task SerializeReferencedTagAsV2YamlWorks() { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); @@ -307,13 +306,13 @@ public void SerializeReferencedTagAsV2YamlWorks() // Act ReferencedTag.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be(expected); + Assert.Equal(expected, actual); } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiXmlTests.cs index 3a75b2336..9ff3569d4 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiXmlTests.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; @@ -34,22 +34,22 @@ public class OpenApiXmlTests [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json)] [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml)] [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml)] - public void SerializeBasicXmlWorks( + public async Task SerializeBasicXmlWorks( OpenApiSpecVersion version, OpenApiFormat format) { // Act - var actual = BasicXml.Serialize(version, format); + var actual = await BasicXml.SerializeAsync(version, format); // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); - actual.Should().Be("{ }"); + Assert.Equal("{ }", actual); } [Theory] [InlineData(OpenApiSpecVersion.OpenApi3_0)] [InlineData(OpenApiSpecVersion.OpenApi2_0)] - public void SerializeAdvancedXmlAsJsonWorks(OpenApiSpecVersion version) + public async Task SerializeAdvancedXmlAsJsonWorks(OpenApiSpecVersion version) { // Arrange var expected = @@ -65,18 +65,18 @@ public void SerializeAdvancedXmlAsJsonWorks(OpenApiSpecVersion version) """; // Act - var actual = AdvancedXml.SerializeAsJson(version); + var actual = await AdvancedXml.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 SerializeAdvancedXmlAsYamlWorks(OpenApiSpecVersion version) + public async Task SerializeAdvancedXmlAsYamlWorks(OpenApiSpecVersion version) { // Arrange var expected = @@ -90,12 +90,12 @@ public void SerializeAdvancedXmlAsYamlWorks(OpenApiSpecVersion version) """; // Act - var actual = AdvancedXml.SerializeAsYaml(version); + var actual = await AdvancedXml.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/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs index 8942e692c..38bf27215 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -9,7 +9,6 @@ using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; -using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -170,7 +169,7 @@ public async Task SerializeCallbackReferenceAsV3JsonWorks(bool produceTerseOutpu // Act _externalCallbackReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -187,7 +186,7 @@ public async Task SerializeCallbackReferenceAsV31JsonWorks(bool produceTerseOutp // Act _externalCallbackReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index a3342ade6..2cb0ff189 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -161,7 +160,7 @@ public async Task SerializeExampleReferenceAsV3JsonWorks(bool produceTerseOutput // Act _localExampleReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -178,7 +177,7 @@ public async Task SerializeExampleReferenceAsV31JsonWorks(bool produceTerseOutpu // Act _localExampleReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index c979e1eb0..d7fef6396 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -20,7 +19,7 @@ namespace Microsoft.OpenApi.Tests.Models.References public class OpenApiHeaderReferenceTests { // OpenApi doc with external $ref - private const string OpenApi= @" + private const string OpenApi = @" openapi: 3.0.0 info: title: Sample API @@ -120,7 +119,7 @@ public async Task SerializeHeaderReferenceAsV3JsonWorks(bool produceTerseOutput) // Act _localHeaderReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -137,7 +136,7 @@ public async Task SerializeHeaderReferenceAsV31JsonWorks(bool produceTerseOutput // Act _localHeaderReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -150,14 +149,43 @@ public async Task SerializeHeaderReferenceAsV2JsonWorksAsync(bool produceTerseOu { // Arrange var outputStringWriter = new StringWriter(CultureInfo.InvariantCulture); - var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput, InlineLocalReferences = true}); + var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = produceTerseOutput, InlineLocalReferences = true }); // Act _localHeaderReference.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); } + + [Fact] + public void OpenApiHeaderTargetShouldResolveReference() + { + var doc = new OpenApiDocument + { + Components = new OpenApiComponents + { + Headers = new System.Collections.Generic.Dictionary + { + { "header1", new OpenApiHeader + { + Description = "test header", + Schema = new OpenApiSchema + { + Type = JsonSchemaType.String + } + } + } + } + } + }; + + doc.Workspace.RegisterComponents(doc); + + var headerReference = new OpenApiHeaderReference("header1", doc); + Assert.Equal("test header", headerReference.Description); + Assert.Equal(JsonSchemaType.String, headerReference.Schema.Type); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index 3587a83d9..4845c2311 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -169,7 +168,7 @@ public async Task SerializeLinkReferenceAsV3JsonWorks(bool produceTerseOutput) // Act _localLinkReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -186,7 +185,7 @@ public async Task SerializeLinkReferenceAsV31JsonWorks(bool produceTerseOutput) // Act _localLinkReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs index 8745da455..5e95246ae 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -122,7 +121,7 @@ public async Task SerializeParameterReferenceAsV3JsonWorks(bool produceTerseOutp // Act _localParameterReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -139,7 +138,7 @@ public async Task SerializeParameterReferenceAsV31JsonWorks(bool produceTerseOut // Act _localParameterReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -156,7 +155,7 @@ public async Task SerializeParameterReferenceAsV2JsonWorksAsync(bool produceTers // Act _localParameterReference.SerializeAsV2(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index c23d564d5..510dfbda3 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -130,7 +129,7 @@ public async Task SerializePathItemReferenceAsV31JsonWorks(bool produceTerseOutp // Act _localPathItemReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index 7bd9ab35b..0f1d8f634 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -133,7 +132,7 @@ public async Task SerializeRequestBodyReferenceAsV3JsonWorks(bool produceTerseOu // Act _localRequestBodyReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -150,7 +149,7 @@ public async Task SerializeRequestBodyReferenceAsV31JsonWorks(bool produceTerseO // Act _localRequestBodyReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index 361006b64..b39d6040b 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -10,7 +10,6 @@ using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Readers; using Microsoft.OpenApi.Writers; -using Microsoft.OpenApi.Services; using VerifyXunit; using Xunit; @@ -115,7 +114,7 @@ public async Task SerializeResponseReferenceAsV3JsonWorks(bool produceTerseOutpu // Act _localResponseReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -132,7 +131,7 @@ public async Task SerializeResponseReferenceAsV31JsonWorks(bool produceTerseOutp // Act _localResponseReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index af9ab3c23..d13d63c9a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -67,7 +67,7 @@ public async Task SerializeSecuritySchemeReferenceAsV3JsonWorks(bool produceTers // Act _openApiSecuritySchemeReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -84,7 +84,7 @@ public async Task SerializeSecuritySchemeReferenceAsV31JsonWorks(bool produceTer // Act _openApiSecuritySchemeReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index 8ec0e1373..9d409c24b 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Globalization; using System.IO; using System.Threading.Tasks; @@ -64,10 +65,7 @@ public OpenApiTagReferenceTest() { OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); var result = OpenApiDocument.Parse(OpenApi, "yaml"); - _openApiTagReference = new("user", result.Document) - { - Description = "Users operations" - }; + _openApiTagReference = new("user", result.Document); } [Fact] @@ -75,7 +73,8 @@ public void TagReferenceResolutionWorks() { // Assert Assert.Equal("user", _openApiTagReference.Name); - Assert.Equal("Users operations", _openApiTagReference.Description); + Assert.Equal("Operations about users.", _openApiTagReference.Description); + Assert.Throws(() => _openApiTagReference.Description = "New Description"); } [Theory] @@ -89,7 +88,7 @@ public async Task SerializeTagReferenceAsV3JsonWorks(bool produceTerseOutput) // Act _openApiTagReference.SerializeAsV3(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); @@ -106,7 +105,7 @@ public async Task SerializeTagReferenceAsV31JsonWorks(bool produceTerseOutput) // Act _openApiTagReference.SerializeAsV31(writer); - writer.Flush(); + await writer.FlushAsync(); // Assert await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput); diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 642dd0b82..887fb3db8 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1,11 +1,8 @@ +[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")] [assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/Microsoft/OpenAPI.NET")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"Microsoft.OpenApi.Readers.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100957cb48387b2a5f54f5ce39255f18f26d32a39990db27cf48737afc6bc62759ba996b8a2bfb675d4e39f3d06ecb55a178b1b4031dcb2a767e29977d88cce864a0d16bfc1b3bebb0edf9fe285f10fffc0a85f93d664fa05af07faa3aad2e545182dbf787e3fd32b56aca95df1a3c4e75dec164a3f1a4c653d971b01ffc39eb3c4")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"Microsoft.OpenApi.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100957cb48387b2a5f54f5ce39255f18f26d32a39990db27cf48737afc6bc62759ba996b8a2bfb675d4e39f3d06ecb55a178b1b4031dcb2a767e29977d88cce864a0d16bfc1b3bebb0edf9fe285f10fffc0a85f93d664fa05af07faa3aad2e545182dbf787e3fd32b56aca95df1a3c4e75dec164a3f1a4c653d971b01ffc39eb3c4")] -[assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName=".NET Standard 2.0")] -public static class IDiagnosticExtensions -{ - public static void AddRange(this System.Collections.Generic.ICollection collection, System.Collections.Generic.IEnumerable enumerable) { } -} +[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName=".NET 8.0")] namespace Microsoft.OpenApi.Any { public class OpenApiAny : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtension @@ -148,6 +145,7 @@ namespace Microsoft.OpenApi.Extensions { public static class EnumExtensions { + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2075", Justification="Fields are never trimmed for enum types.")] public static T GetAttributeOfType(this System.Enum enumValue) where T : System.Attribute { } public static string GetDisplayName(this System.Enum enumValue) { } @@ -167,21 +165,21 @@ namespace Microsoft.OpenApi.Extensions } public static class OpenApiSerializableExtensions { - public static string Serialize(this T element, Microsoft.OpenApi.OpenApiSpecVersion specVersion, Microsoft.OpenApi.OpenApiFormat format) + public static System.Threading.Tasks.Task SerializeAsJsonAsync(this T element, Microsoft.OpenApi.OpenApiSpecVersion specVersion, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static void Serialize(this T element, Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion specVersion) + public static System.Threading.Tasks.Task SerializeAsJsonAsync(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static void Serialize(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion, Microsoft.OpenApi.OpenApiFormat format) + public static System.Threading.Tasks.Task SerializeAsYamlAsync(this T element, Microsoft.OpenApi.OpenApiSpecVersion specVersion, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static void Serialize(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion, Microsoft.OpenApi.OpenApiFormat format, Microsoft.OpenApi.Writers.OpenApiWriterSettings settings) + public static System.Threading.Tasks.Task SerializeAsYamlAsync(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static string SerializeAsJson(this T element, Microsoft.OpenApi.OpenApiSpecVersion specVersion) + public static System.Threading.Tasks.Task SerializeAsync(this T element, Microsoft.OpenApi.OpenApiSpecVersion specVersion, Microsoft.OpenApi.OpenApiFormat format, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static void SerializeAsJson(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion) + public static System.Threading.Tasks.Task SerializeAsync(this T element, Microsoft.OpenApi.Writers.IOpenApiWriter writer, Microsoft.OpenApi.OpenApiSpecVersion specVersion, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static string SerializeAsYaml(this T element, Microsoft.OpenApi.OpenApiSpecVersion specVersion) + public static System.Threading.Tasks.Task SerializeAsync(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion, Microsoft.OpenApi.OpenApiFormat format, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } - public static void SerializeAsYaml(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion) + public static System.Threading.Tasks.Task SerializeAsync(this T element, System.IO.Stream stream, Microsoft.OpenApi.OpenApiSpecVersion specVersion, Microsoft.OpenApi.OpenApiFormat format, Microsoft.OpenApi.Writers.OpenApiWriterSettings settings, System.Threading.CancellationToken cancellationToken = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { } } public static class OpenApiServerExtensions @@ -196,10 +194,6 @@ namespace Microsoft.OpenApi.Extensions public static string? ToIdentifier(this Microsoft.OpenApi.Models.JsonSchemaType? schemaType) { } public static Microsoft.OpenApi.Models.JsonSchemaType ToJsonSchemaType(this string identifier) { } } - public static class StringExtensions - { - public static T GetEnumFromDisplayName(this string displayName) { } - } } namespace Microsoft.OpenApi.Interfaces { @@ -221,7 +215,7 @@ namespace Microsoft.OpenApi.Interfaces { Microsoft.OpenApi.Reader.ReadResult Read(System.IO.MemoryStream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings); System.Threading.Tasks.Task ReadAsync(System.IO.Stream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings, System.Threading.CancellationToken cancellationToken = default); - T ReadFragment(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + T ReadFragment(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement; } public interface IOpenApiReferenceable : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiSerializable @@ -229,6 +223,10 @@ namespace Microsoft.OpenApi.Interfaces Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } bool UnresolvedReference { get; set; } } + public interface IOpenApiReferenceableWithTarget : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + { + T Target { get; } + } public interface IOpenApiSerializable : Microsoft.OpenApi.Interfaces.IOpenApiElement { void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer); @@ -237,8 +235,6 @@ namespace Microsoft.OpenApi.Interfaces } public interface IStreamLoader { - [System.Obsolete("Use the Async overload")] - System.IO.Stream Load(System.Uri uri); System.Threading.Tasks.Task LoadAsync(System.Uri uri); } } @@ -562,7 +558,6 @@ namespace Microsoft.OpenApi.Models public Microsoft.OpenApi.Models.OpenApiComponents? Components { get; set; } public System.Collections.Generic.IDictionary? Extensions { get; set; } public Microsoft.OpenApi.Models.OpenApiExternalDocs? ExternalDocs { get; set; } - public string HashCode { get; } public Microsoft.OpenApi.Models.OpenApiInfo Info { get; set; } public string? JsonSchemaDialect { get; set; } public Microsoft.OpenApi.Models.OpenApiPaths Paths { get; set; } @@ -571,11 +566,12 @@ namespace Microsoft.OpenApi.Models public System.Collections.Generic.IList? Tags { get; set; } public System.Collections.Generic.IDictionary? Webhooks { get; set; } public Microsoft.OpenApi.Services.OpenApiWorkspace? Workspace { get; set; } + public bool AddComponent(string id, T componentToRegister) { } + public System.Threading.Tasks.Task GetHashCodeAsync(System.Threading.CancellationToken cancellationToken = default) { } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SetReferenceHostDocument() { } - public static string GenerateHashValue(Microsoft.OpenApi.Models.OpenApiDocument doc) { } public static Microsoft.OpenApi.Reader.ReadResult Load(System.IO.MemoryStream stream, string? format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings? settings = null) { } public static System.Threading.Tasks.Task LoadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings? settings = null) { } public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream stream, string? format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings? settings = null, System.Threading.CancellationToken cancellationToken = default) { } @@ -765,7 +761,7 @@ namespace Microsoft.OpenApi.Models public System.Collections.Generic.IList? Security { get; set; } public System.Collections.Generic.IList? Servers { get; set; } public string? Summary { get; set; } - public System.Collections.Generic.IList? Tags { get; set; } + public System.Collections.Generic.IList? Tags { get; set; } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } @@ -950,11 +946,11 @@ namespace Microsoft.OpenApi.Models public virtual string Description { get; set; } public virtual System.Collections.Generic.IDictionary Extensions { get; set; } public virtual Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; set; } - public virtual Microsoft.OpenApi.Models.ParameterLocation In { get; set; } + public virtual Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } public virtual string Name { get; set; } public virtual System.Uri OpenIdConnectUrl { get; set; } public virtual string Scheme { get; set; } - public virtual Microsoft.OpenApi.Models.SecuritySchemeType Type { get; set; } + public virtual Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; set; } public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public virtual void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } @@ -983,11 +979,10 @@ namespace Microsoft.OpenApi.Models public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + public class OpenApiTag : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiTag() { } public OpenApiTag(Microsoft.OpenApi.Models.OpenApiTag tag) { } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public bool UnresolvedReference { get; set; } public virtual string Description { get; set; } public virtual System.Collections.Generic.IDictionary Extensions { get; set; } @@ -1105,17 +1100,19 @@ namespace Microsoft.OpenApi.Models } namespace Microsoft.OpenApi.Models.References { - public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback + public class OpenApiCallbackReference : Microsoft.OpenApi.Models.OpenApiCallback, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiCallbackReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiCallback Target { get; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override System.Collections.Generic.Dictionary PathItems { get; set; } public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiExampleReference : Microsoft.OpenApi.Models.OpenApiExample + public class OpenApiExampleReference : Microsoft.OpenApi.Models.OpenApiExample, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiExampleReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiExample Target { get; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override string ExternalValue { get; set; } @@ -1124,9 +1121,10 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiHeaderReference : Microsoft.OpenApi.Models.OpenApiHeader + public class OpenApiHeaderReference : Microsoft.OpenApi.Models.OpenApiHeader, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiHeaderReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiHeader Target { get; } public override bool AllowEmptyValue { get; set; } public override bool AllowReserved { get; set; } public override System.Collections.Generic.IDictionary Content { get; set; } @@ -1143,9 +1141,10 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiLinkReference : Microsoft.OpenApi.Models.OpenApiLink + public class OpenApiLinkReference : Microsoft.OpenApi.Models.OpenApiLink, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiLinkReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiLink Target { get; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override string OperationId { get; set; } @@ -1156,9 +1155,10 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiParameterReference : Microsoft.OpenApi.Models.OpenApiParameter + public class OpenApiParameterReference : Microsoft.OpenApi.Models.OpenApiParameter, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiParameterReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiParameter Target { get; } public override bool AllowEmptyValue { get; set; } public override bool AllowReserved { get; set; } public override System.Collections.Generic.IDictionary Content { get; set; } @@ -1177,9 +1177,10 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem + public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiPathItemReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiPathItem Target { get; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override System.Collections.Generic.IDictionary Operations { get; set; } @@ -1188,9 +1189,10 @@ namespace Microsoft.OpenApi.Models.References public override string Summary { get; set; } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiRequestBodyReference : Microsoft.OpenApi.Models.OpenApiRequestBody + public class OpenApiRequestBodyReference : Microsoft.OpenApi.Models.OpenApiRequestBody, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiRequestBodyReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiRequestBody Target { get; } public override System.Collections.Generic.IDictionary Content { get; set; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } @@ -1198,9 +1200,10 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiResponseReference : Microsoft.OpenApi.Models.OpenApiResponse + public class OpenApiResponseReference : Microsoft.OpenApi.Models.OpenApiResponse, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiResponseReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiResponse Target { get; } public override System.Collections.Generic.IDictionary Content { get; set; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } @@ -1210,9 +1213,10 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSchemaReference : Microsoft.OpenApi.Models.OpenApiSchema + public class OpenApiSchemaReference : Microsoft.OpenApi.Models.OpenApiSchema, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiSchemaReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiSchema? Target { get; } public override Microsoft.OpenApi.Models.OpenApiSchema AdditionalProperties { get; set; } public override bool AdditionalPropertiesAllowed { get; set; } public override System.Collections.Generic.IList AllOf { get; set; } @@ -1268,25 +1272,29 @@ namespace Microsoft.OpenApi.Models.References public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme + public class OpenApiSecuritySchemeReference : Microsoft.OpenApi.Models.OpenApiSecurityScheme, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { public OpenApiSecuritySchemeReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiSecurityScheme Target { get; } public override string BearerFormat { get; set; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override Microsoft.OpenApi.Models.OpenApiOAuthFlows Flows { get; set; } - public override Microsoft.OpenApi.Models.ParameterLocation In { get; set; } + public override Microsoft.OpenApi.Models.ParameterLocation? In { get; set; } public override string Name { get; set; } public override System.Uri OpenIdConnectUrl { get; set; } public override string Scheme { get; set; } - public override Microsoft.OpenApi.Models.SecuritySchemeType Type { get; set; } + public override Microsoft.OpenApi.Models.SecuritySchemeType? Type { get; set; } public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag + public class OpenApiTagReference : Microsoft.OpenApi.Models.OpenApiTag, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, Microsoft.OpenApi.Interfaces.IOpenApiReferenceableWithTarget, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { + public OpenApiTagReference(Microsoft.OpenApi.Models.References.OpenApiTagReference source) { } public OpenApiTagReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument) { } + public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } + public Microsoft.OpenApi.Models.OpenApiTag Target { get; } public override string Description { get; set; } public override System.Collections.Generic.IDictionary Extensions { get; set; } public override Microsoft.OpenApi.Models.OpenApiExternalDocs ExternalDocs { get; set; } @@ -1312,24 +1320,24 @@ namespace Microsoft.OpenApi.Reader public Microsoft.OpenApi.Reader.ReadResult Read(System.IO.MemoryStream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings) { } public Microsoft.OpenApi.Reader.ReadResult Read(System.Text.Json.Nodes.JsonNode jsonNode, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings, string format = null) { } public System.Threading.Tasks.Task ReadAsync(System.IO.Stream input, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings, System.Threading.CancellationToken cancellationToken = default) { } - public T ReadFragment(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public T ReadFragment(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public T ReadFragment(System.Text.Json.Nodes.JsonNode input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public T ReadFragment(System.Text.Json.Nodes.JsonNode input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } } public static class OpenApiModelFactory { public static Microsoft.OpenApi.Reader.ReadResult Load(System.IO.MemoryStream stream, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static T Load(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, string format, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public static T Load(System.IO.MemoryStream input, Microsoft.OpenApi.OpenApiSpecVersion version, string format, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } public static System.Threading.Tasks.Task LoadAsync(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken token = default) { } public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream input, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken cancellationToken = default) { } - public static System.Threading.Tasks.Task LoadAsync(string url, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken token = default) + public static System.Threading.Tasks.Task LoadAsync(string url, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken token = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } - public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken token = default) + public static System.Threading.Tasks.Task LoadAsync(System.IO.Stream input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null, System.Threading.CancellationToken token = default) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } public static Microsoft.OpenApi.Reader.ReadResult Parse(string input, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) { } - public static T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) + public static T Parse(string input, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, out Microsoft.OpenApi.Reader.OpenApiDiagnostic diagnostic, string format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings settings = null) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } } public static class OpenApiReaderRegistry @@ -1368,7 +1376,7 @@ namespace Microsoft.OpenApi.Reader public T GetFromTempStorage(string key, object scope = null) { } public string GetLocation() { } public Microsoft.OpenApi.Models.OpenApiDocument Parse(System.Text.Json.Nodes.JsonNode jsonNode) { } - public T ParseFragment(System.Text.Json.Nodes.JsonNode jsonNode, Microsoft.OpenApi.OpenApiSpecVersion version) + public T ParseFragment(System.Text.Json.Nodes.JsonNode jsonNode, Microsoft.OpenApi.OpenApiSpecVersion version, Microsoft.OpenApi.Models.OpenApiDocument openApiDocument) where T : Microsoft.OpenApi.Interfaces.IOpenApiElement { } public void PopLoop(string loopid) { } public bool PushLoop(string loopId, string key) { } @@ -1401,8 +1409,6 @@ namespace Microsoft.OpenApi.Reader.Services public class DefaultStreamLoader : Microsoft.OpenApi.Interfaces.IStreamLoader { public DefaultStreamLoader(System.Uri baseUrl) { } - [System.Obsolete] - public System.IO.Stream Load(System.Uri uri) { } public System.Threading.Tasks.Task LoadAsync(System.Uri uri) { } } } @@ -1501,6 +1507,7 @@ namespace Microsoft.OpenApi.Services public virtual void Visit(Microsoft.OpenApi.Models.OpenApiServer server) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable serverVariable) { } public virtual void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { } + public virtual void Visit(Microsoft.OpenApi.Models.References.OpenApiTagReference tag) { } public virtual void Visit(System.Collections.Generic.IDictionary operations) { } public virtual void Visit(System.Collections.Generic.IDictionary callbacks) { } public virtual void Visit(System.Collections.Generic.IDictionary encodings) { } @@ -1515,6 +1522,7 @@ namespace Microsoft.OpenApi.Services public virtual void Visit(System.Collections.Generic.IList openApiSecurityRequirements) { } public virtual void Visit(System.Collections.Generic.IList servers) { } public virtual void Visit(System.Collections.Generic.IList openApiTags) { } + public virtual void Visit(System.Collections.Generic.IList openApiTags) { } public virtual void Visit(System.Text.Json.Nodes.JsonNode node) { } } public class OpenApiWalker @@ -1532,7 +1540,7 @@ namespace Microsoft.OpenApi.Services public int ComponentsCount() { } public bool Contains(string location) { } public System.Uri GetDocumentId(string key) { } - public bool RegisterComponent(string location, T component) { } + public bool RegisterComponentForDocument(Microsoft.OpenApi.Models.OpenApiDocument openApiDocument, T componentToRegister, string id) { } public void RegisterComponents(Microsoft.OpenApi.Models.OpenApiDocument document) { } public T? ResolveReference(string location) { } } @@ -1653,8 +1661,6 @@ namespace Microsoft.OpenApi.Validations } public class ValidationRule : Microsoft.OpenApi.Validations.ValidationRule { - [System.Obsolete("Please use the other constructor and specify a name")] - public ValidationRule(System.Action validate) { } public ValidationRule(string name, System.Action validate) { } } } @@ -1763,7 +1769,7 @@ namespace Microsoft.OpenApi.Writers } public interface IOpenApiWriter { - void Flush(); + System.Threading.Tasks.Task FlushAsync(System.Threading.CancellationToken cancellationToken = default); void WriteEndArray(); void WriteEndObject(); void WriteNull(); @@ -1808,15 +1814,15 @@ namespace Microsoft.OpenApi.Writers { protected const string IndentationString = " "; protected readonly System.Collections.Generic.Stack Scopes; - public OpenApiWriterBase(System.IO.TextWriter textWriter) { } - public OpenApiWriterBase(System.IO.TextWriter textWriter, Microsoft.OpenApi.Writers.OpenApiWriterSettings settings) { } + protected OpenApiWriterBase(System.IO.TextWriter textWriter) { } + protected OpenApiWriterBase(System.IO.TextWriter textWriter, Microsoft.OpenApi.Writers.OpenApiWriterSettings settings) { } protected abstract int BaseIndentation { get; } public Microsoft.OpenApi.Writers.OpenApiWriterSettings Settings { get; set; } protected System.IO.TextWriter Writer { get; } protected Microsoft.OpenApi.Writers.Scope CurrentScope() { } public virtual void DecreaseIndentation() { } protected Microsoft.OpenApi.Writers.Scope EndScope(Microsoft.OpenApi.Writers.ScopeType type) { } - public void Flush() { } + public System.Threading.Tasks.Task FlushAsync(System.Threading.CancellationToken cancellationToken = default) { } public virtual void IncreaseIndentation() { } protected bool IsArrayScope() { } protected bool IsObjectScope() { } @@ -1876,8 +1882,6 @@ namespace Microsoft.OpenApi.Writers public OpenApiWriterSettings() { } public bool InlineExternalReferences { get; set; } public bool InlineLocalReferences { get; set; } - [System.Obsolete("Use InlineLocalReference and InlineExternalReference settings instead")] - public Microsoft.OpenApi.Writers.ReferenceInlineSetting ReferenceInline { get; set; } } public class OpenApiYamlWriter : Microsoft.OpenApi.Writers.OpenApiWriterBase { @@ -1895,13 +1899,6 @@ namespace Microsoft.OpenApi.Writers public override void WriteValue(string value) { } protected override void WriteValueSeparator() { } } - [System.Obsolete("Use InlineLocalReference and InlineExternalReference settings instead")] - public enum ReferenceInlineSetting - { - DoNotInlineReferences = 0, - InlineLocalReferences = 1, - InlineAllReferences = 2, - } public sealed class Scope { public Scope(Microsoft.OpenApi.Writers.ScopeType type) { } diff --git a/test/Microsoft.OpenApi.Tests/Services/OpenApiValidatorTests.cs b/test/Microsoft.OpenApi.Tests/Services/OpenApiValidatorTests.cs index e5fcc346f..ca56ff75c 100644 --- a/test/Microsoft.OpenApi.Tests/Services/OpenApiValidatorTests.cs +++ b/test/Microsoft.OpenApi.Tests/Services/OpenApiValidatorTests.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Nodes; -using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; @@ -54,12 +53,12 @@ public void ResponseMustHaveADescription() var walker = new OpenApiWalker(validator); walker.Walk(openApiDocument); - validator.Errors.Should().BeEquivalentTo( + Assert.Equivalent( new List { new OpenApiValidatorError(nameof(OpenApiResponseRules.ResponseRequiredFields),"#/paths/~1test/get/responses/200/description", - String.Format(SRResource.Validation_FieldIsRequired, "description", "response")) - }); + string.Format(SRResource.Validation_FieldIsRequired, "description", "response")) + }, validator.Errors); } [Fact] @@ -88,12 +87,12 @@ public void ServersShouldBeReferencedByIndex() var walker = new OpenApiWalker(validator); walker.Walk(openApiDocument); - validator.Errors.Should().BeEquivalentTo( + Assert.Equivalent( new List { new OpenApiValidatorError(nameof(OpenApiServerRules.ServerRequiredFields), "#/servers/1/url", - String.Format(SRResource.Validation_FieldIsRequired, "url", "server")) - }); + string.Format(SRResource.Validation_FieldIsRequired, "url", "server")) + }, validator.Errors); } [Fact] @@ -135,11 +134,11 @@ public void ValidateCustomExtension() var walker = new OpenApiWalker(validator); walker.Walk(openApiDocument); - validator.Errors.Should().BeEquivalentTo( + Assert.Equivalent( new List { new OpenApiValidatorError("FooExtensionRule", "#/info/x-foo", "Don't say hey") - }); + }, validator.Errors); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiComponentsValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiComponentsValidationTests.cs index f6ce92ead..fe2a230e2 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiComponentsValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiComponentsValidationTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Linq; using Microsoft.OpenApi.Extensions; @@ -37,7 +36,7 @@ public void ValidateKeyMustMatchRegularExpressionInComponents() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_ComponentsKeyMustMatchRegularExpr, key, "responses", OpenApiComponentsRules.KeyRegex.ToString()), + Assert.Equal(string.Format(SRResource.Validation_ComponentsKeyMustMatchRegularExpr, key, "responses", OpenApiComponentsRules.KeyRegex.ToString()), error.Message); } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiContactValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiContactValidationTests.cs index 3ad7130ad..213e2138f 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiContactValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiContactValidationTests.cs @@ -1,7 +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; @@ -31,7 +30,7 @@ public void ValidateEmailFieldIsEmailAddressInContact() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_StringMustBeEmailAddress, testEmail), error.Message); + Assert.Equal(string.Format(SRResource.Validation_StringMustBeEmailAddress, testEmail), error.Message); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiExternalDocsValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiExternalDocsValidationTests.cs index aebb11c0a..3098d631a 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiExternalDocsValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiExternalDocsValidationTests.cs @@ -1,7 +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; @@ -28,7 +27,7 @@ public void ValidateUrlIsRequiredInExternalDocs() Assert.True(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_FieldIsRequired, "url", "External Documentation"), error.Message); + Assert.Equal(string.Format(SRResource.Validation_FieldIsRequired, "url", "External Documentation"), error.Message); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs index 25423ab1f..3a685f3a8 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiHeaderValidationTests.cs @@ -4,8 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; -using FluentAssertions; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Validations.Rules; @@ -43,7 +41,7 @@ public void ValidateExampleShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeFalse(); + Assert.False(result); } [Fact] @@ -102,7 +100,7 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeTrue(); + Assert.True(result); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiInfoValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiInfoValidationTests.cs index 95dde7942..12c818a21 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiInfoValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiInfoValidationTests.cs @@ -1,7 +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; @@ -16,8 +15,8 @@ public class OpenApiInfoValidationTests public void ValidateFieldIsRequiredInInfo() { // Arrange - var titleError = String.Format(SRResource.Validation_FieldIsRequired, "title", "info"); - var versionError = String.Format(SRResource.Validation_FieldIsRequired, "version", "info"); + var titleError = string.Format(SRResource.Validation_FieldIsRequired, "title", "info"); + var versionError = string.Format(SRResource.Validation_FieldIsRequired, "version", "info"); var info = new OpenApiInfo(); // Act diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiLicenseValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiLicenseValidationTests.cs index 0f30b0580..94b9d82d0 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiLicenseValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiLicenseValidationTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Linq; using Microsoft.OpenApi.Models; @@ -32,7 +31,7 @@ public void ValidateFieldIsRequiredInLicense() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_FieldIsRequired, "name", "license"), error.Message); + Assert.Equal(string.Format(SRResource.Validation_FieldIsRequired, "name", "license"), error.Message); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs index 51a8e1795..834443135 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiMediaTypeValidationTests.cs @@ -4,11 +4,8 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; -using FluentAssertions; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Services; -using Microsoft.OpenApi.Validations.Rules; using Xunit; namespace Microsoft.OpenApi.Validations.Tests @@ -39,7 +36,7 @@ public void ValidateExampleShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeTrue(); + Assert.True(result); } [Fact] @@ -98,7 +95,7 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeTrue(); + Assert.True(result); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiOAuthFlowValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiOAuthFlowValidationTests.cs index a49b3f9bb..ad8e5f387 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiOAuthFlowValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiOAuthFlowValidationTests.cs @@ -17,8 +17,8 @@ public class OpenApiOAuthFlowValidationTests public void ValidateFixedFieldsIsRequiredInResponse() { // Arrange - var authorizationUrlError = String.Format(SRResource.Validation_FieldIsRequired, "authorizationUrl", "OAuth Flow"); - var tokenUrlError = String.Format(SRResource.Validation_FieldIsRequired, "tokenUrl", "OAuth Flow"); + var authorizationUrlError = string.Format(SRResource.Validation_FieldIsRequired, "authorizationUrl", "OAuth Flow"); + var tokenUrlError = string.Format(SRResource.Validation_FieldIsRequired, "tokenUrl", "OAuth Flow"); IEnumerable errors; var oAuthFlow = new OpenApiOAuthFlow(); diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs index 3f380c7f1..cacf3d7fa 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs @@ -4,8 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; -using FluentAssertions; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Properties; @@ -29,12 +27,12 @@ public void ValidateFieldIsRequiredInParameter() var errors = parameter.Validate(ValidationRuleSet.GetDefaultRuleSet()); // Assert - errors.Should().NotBeEmpty(); - errors.Select(e => e.Message).Should().BeEquivalentTo(new[] + Assert.NotEmpty(errors); + Assert.Equivalent(new[] { nameError, inError - }); + }, errors.Select(e => e.Message)); } [Fact] @@ -54,11 +52,11 @@ public void ValidateRequiredIsTrueWhenInIsPathInParameter() walker.Walk(parameter); var errors = validator.Errors; // Assert - errors.Should().NotBeEmpty(); - errors.Select(e => e.Message).Should().BeEquivalentTo(new[] + Assert.NotEmpty(errors); + Assert.Equivalent(new[] { "\"required\" must be true when parameter location is \"path\"" - }); + }, errors.Select(e => e.Message)); } [Fact] @@ -88,7 +86,7 @@ public void ValidateExampleShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeTrue(); + Assert.True(result); } [Fact] @@ -153,7 +151,7 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeFalse(); + Assert.False(result); } [Fact] @@ -183,15 +181,15 @@ public void PathParameterNotInThePathShouldReturnAnError() var result = errors.Any(); // Assert - result.Should().BeTrue(); - errors.OfType().Select(e => e.RuleName).Should().BeEquivalentTo(new[] + Assert.True(result); + Assert.Equivalent(new[] { "PathParameterShouldBeInThePath" - }); - errors.Select(e => e.Pointer).Should().BeEquivalentTo(new[] + }, errors.OfType().Select(e => e.RuleName)); + Assert.Equivalent(new[] { "#/in" - }); + }, errors.Select(e => e.Pointer)); } [Fact] @@ -226,7 +224,7 @@ public void PathParameterInThePathShouldBeOk() var result = errors.Any(); // Assert - result.Should().BeFalse(); + Assert.False(result); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiPathsValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiPathsValidationTests.cs index 6d0282748..09223e7b8 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiPathsValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiPathsValidationTests.cs @@ -1,5 +1,4 @@ using System.Linq; -using FluentAssertions; using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Properties; @@ -23,8 +22,8 @@ public void ValidatePathsMustBeginWithSlash() var errors = paths.Validate(ValidationRuleSet.GetDefaultRuleSet()); // Assert - errors.Should().NotBeEmpty(); - errors.Select(e => e.Message).Should().BeEquivalentTo(error); + Assert.NotEmpty(errors); + Assert.Equivalent(new string[] {error}, errors.Select(e => e.Message).ToArray()); } [Fact] @@ -42,8 +41,8 @@ public void ValidatePathsAreUnique() var errors = paths.Validate(ValidationRuleSet.GetDefaultRuleSet()); // Assert - errors.Should().NotBeEmpty(); - errors.Select(e => e.Message).Should().BeEquivalentTo(error); + Assert.NotEmpty(errors); + Assert.Equivalent(new string[] {error}, errors.Select(e => e.Message).ToArray()); } [Fact] public void ValidatePathsAreUniqueDoesNotConsiderMultiParametersAsIdentical() @@ -60,7 +59,7 @@ public void ValidatePathsAreUniqueDoesNotConsiderMultiParametersAsIdentical() var errors = paths.Validate(ValidationRuleSet.GetDefaultRuleSet()); // Assert - errors.Should().BeEmpty(); + Assert.Empty(errors); } [Fact] public void ValidatePathsAreUniqueConsidersMultiParametersAsIdentical() @@ -76,7 +75,7 @@ public void ValidatePathsAreUniqueConsidersMultiParametersAsIdentical() var errors = paths.Validate(ValidationRuleSet.GetDefaultRuleSet()); // Assert - errors.Should().NotBeEmpty(); + Assert.NotEmpty(errors); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiResponseValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiResponseValidationTests.cs index b967ebab6..c1b4ce62d 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiResponseValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiResponseValidationTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Linq; using Microsoft.OpenApi.Models; @@ -32,7 +31,7 @@ public void ValidateDescriptionIsRequiredInResponse() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors) as OpenApiValidatorError; - Assert.Equal(String.Format(SRResource.Validation_FieldIsRequired, "description", "response"), error.Message); + Assert.Equal(string.Format(SRResource.Validation_FieldIsRequired, "description", "response"), error.Message); Assert.Equal("#/description", error.Pointer); } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiSchemaValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiSchemaValidationTests.cs index d2aa19590..9edd57c1e 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiSchemaValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiSchemaValidationTests.cs @@ -5,14 +5,12 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json.Nodes; -using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Properties; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Validations.Rules; using Xunit; -using Microsoft.OpenApi.Extensions; namespace Microsoft.OpenApi.Validations.Tests { @@ -39,7 +37,7 @@ public void ValidateDefaultShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeTrue(); + Assert.True(result); } [Fact] @@ -64,7 +62,7 @@ public void ValidateExampleAndDefaultShouldNotHaveDataTypeMismatchForSimpleSchem var expectedWarnings = warnings.Select(e => e.Message).ToList(); // Assert - result.Should().BeTrue(); + Assert.True(result); } [Fact] @@ -106,7 +104,7 @@ public void ValidateEnumShouldNotHaveDataTypeMismatchForSimpleSchema() var result = !warnings.Any(); // Assert - result.Should().BeTrue(); + Assert.True(result); } [Fact] @@ -184,7 +182,7 @@ public void ValidateDefaultShouldNotHaveDataTypeMismatchForComplexSchema() bool result = !warnings.Any(); // Assert - result.Should().BeFalse(); + Assert.False(result); } [Fact] @@ -214,13 +212,13 @@ public void ValidateSchemaRequiredFieldListMustContainThePropertySpecifiedInTheD var result = !errors.Any(); // Assert - result.Should().BeFalse(); - errors.Should().BeEquivalentTo(new List + Assert.False(result); + Assert.Equivalent(new List { new OpenApiValidatorError(nameof(OpenApiSchemaRules.ValidateSchemaDiscriminator),"#/schemas/schema1/discriminator", string.Format(SRResource.Validation_SchemaRequiredFieldListMustContainThePropertySpecifiedInTheDiscriminator, "schema1", "property1")) - }); + }, errors); } [Fact] @@ -275,7 +273,7 @@ public void ValidateOneOfSchemaPropertyNameContainsPropertySpecifiedInTheDiscrim var errors = validator.Errors; //Assert - errors.Should().BeEmpty(); + Assert.Empty(errors); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiServerValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiServerValidationTests.cs index aa6d6ecd0..88be49e73 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiServerValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiServerValidationTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Linq; using Microsoft.OpenApi.Models; @@ -29,7 +28,7 @@ public void ValidateFieldIsRequiredInServer() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_FieldIsRequired, "url", "server"), error.Message); + Assert.Equal(string.Format(SRResource.Validation_FieldIsRequired, "url", "server"), error.Message); } } } diff --git a/test/Microsoft.OpenApi.Tests/Validations/OpenApiTagValidationTests.cs b/test/Microsoft.OpenApi.Tests/Validations/OpenApiTagValidationTests.cs index 2bdec4ba2..d956e2cd0 100644 --- a/test/Microsoft.OpenApi.Tests/Validations/OpenApiTagValidationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Validations/OpenApiTagValidationTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Linq; using Microsoft.OpenApi.Any; @@ -31,7 +30,7 @@ public void ValidateNameIsRequiredInTag() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_FieldIsRequired, "name", "tag"), error.Message); + Assert.Equal(string.Format(SRResource.Validation_FieldIsRequired, "name", "tag"), error.Message); } [Fact] @@ -55,7 +54,7 @@ public void ValidateExtensionNameStartsWithXDashInTag() Assert.False(result); Assert.NotNull(errors); var error = Assert.Single(errors); - Assert.Equal(String.Format(SRResource.Validation_ExtensionNameMustBeginWithXDash, "tagExt", "#/extensions"), error.Message); + Assert.Equal(string.Format(SRResource.Validation_ExtensionNameMustBeginWithXDash, "tagExt", "#/extensions"), error.Message); } } } diff --git a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs index bec1f3602..f90d058b2 100644 --- a/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs +++ b/test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; -using FluentAssertions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.References; @@ -23,12 +22,12 @@ public void LocateTopLevelObjects() var walker = new OpenApiWalker(locator); walker.Walk(doc); - locator.Locations.Should().BeEquivalentTo(new List { + Assert.Equivalent(new List { "#/info", "#/servers", "#/paths", "#/tags" - }); + }, locator.Locations); } [Fact] @@ -51,7 +50,7 @@ public void LocateTopLevelArrayItems() var walker = new OpenApiWalker(locator); walker.Walk(doc); - locator.Locations.Should().BeEquivalentTo(new List { + Assert.Equivalent(new List { "#/info", "#/servers", "#/servers/0", @@ -59,7 +58,7 @@ public void LocateTopLevelArrayItems() "#/paths", "#/tags", "#/tags/0" - }); + }, locator.Locations); } [Fact] @@ -96,7 +95,7 @@ public void LocatePathOperationContentSchema() var walker = new OpenApiWalker(locator); walker.Walk(doc); - locator.Locations.Should().BeEquivalentTo(new List { + Assert.Equivalent(new List { "#/info", "#/servers", "#/paths", @@ -110,9 +109,9 @@ public void LocatePathOperationContentSchema() "#/paths/~1test/get/tags", "#/tags", - }); + }, locator.Locations); - locator.Keys.Should().BeEquivalentTo(new List { "/test", "Get", "200", "application/json" }); + Assert.Equivalent(new List { "/test", "Get", "200", "application/json" }, locator.Keys); } [Fact] @@ -144,7 +143,7 @@ public void WalkDOMWithCycles() var walker = new OpenApiWalker(locator); walker.Walk(doc); - locator.Locations.Should().BeEquivalentTo(new List { + Assert.Equivalent(new List { "#/info", "#/servers", "#/paths", @@ -152,7 +151,7 @@ public void WalkDOMWithCycles() "#/components/schemas/loopy", "#/components/schemas/loopy/properties/name", "#/tags" - }); + }, locator.Locations); } /// @@ -237,13 +236,13 @@ public void LocateReferences() var walker = new OpenApiWalker(locator); walker.Walk(doc); - locator.Locations.Where(l => l.StartsWith("referenceAt:")).Should().BeEquivalentTo(new List { + Assert.Equivalent(new List { "referenceAt: #/paths/~1/get/responses/200/content/application~1json/schema", "referenceAt: #/paths/~1/get/responses/200/headers/test-header/schema", "referenceAt: #/components/schemas/derived/anyOf/0", "referenceAt: #/components/securitySchemes/test-secScheme", "referenceAt: #/components/headers/test-header/schema" - }); + }, locator.Locations.Where(l => l.StartsWith("referenceAt:"))); } } @@ -278,7 +277,7 @@ public override void Visit(OpenApiPathItem pathItem) Locations.Add(this.PathString); } - public override void Visit(OpenApiResponses responses) + public override void Visit(OpenApiResponses response) { Locations.Add(this.PathString); } @@ -328,5 +327,9 @@ public override void Visit(OpenApiServer server) { Locations.Add(this.PathString); } + public override void Visit(IList openApiTags) + { + Locations.Add(this.PathString); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs b/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs index e015da4f4..f93b10375 100644 --- a/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs +++ b/test/Microsoft.OpenApi.Tests/Workspaces/OpenApiReferencableTests.cs @@ -45,10 +45,7 @@ public class OpenApiReferencableTests { "link1", new OpenApiLink() } } }; - private static readonly OpenApiSchema _schemaFragment = new OpenApiSchema(); private static readonly OpenApiSecurityScheme _securitySchemeFragment = new OpenApiSecurityScheme(); - private static readonly OpenApiTag _tagFragment = new OpenApiTag(); - public static IEnumerable ResolveReferenceCanResolveValidJsonPointersTestData => new List { @@ -64,7 +61,6 @@ public class OpenApiReferencableTests new object[] { _responseFragment, "/headers/header1", _responseFragment.Headers["header1"] }, new object[] { _responseFragment, "/links/link1", _responseFragment.Links["link1"] }, new object[] { _securitySchemeFragment, "/", _securitySchemeFragment}, - new object[] { _tagFragment, "/", _tagFragment} }; [Theory] diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs index 30247333f..54fb8cfb6 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs @@ -12,7 +12,7 @@ using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; -using FluentAssertions; +using System.Threading.Tasks; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Writers; @@ -48,7 +48,7 @@ from shouldBeTerse in shouldProduceTerseOutputValues [Theory] [MemberData(nameof(WriteStringListAsJsonShouldMatchExpectedTestCases))] - public void WriteStringListAsJsonShouldMatchExpected(string[] stringValues, bool produceTerseOutput) + public async Task WriteStringListAsJsonShouldMatchExpected(string[] stringValues, bool produceTerseOutput) { // Arrange var outputString = new StringWriter(CultureInfo.InvariantCulture); @@ -62,14 +62,14 @@ public void WriteStringListAsJsonShouldMatchExpected(string[] stringValues, bool } writer.WriteEndArray(); - writer.Flush(); + await writer.FlushAsync(); var parsedObject = JsonSerializer.Deserialize>(outputString.GetStringBuilder().ToString()); var expectedObject = JsonSerializer.Deserialize>(JsonSerializer.Serialize(new List(stringValues))); // Assert - parsedObject.Should().BeEquivalentTo(expectedObject); + Assert.Equivalent(expectedObject, parsedObject); } public static IEnumerable WriteMapAsJsonShouldMatchExpectedTestCasesSimple() @@ -316,7 +316,7 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset var expectedString = JsonSerializer.Serialize(dateTimeOffset, _jsonSerializerOptions.Value); // Assert - writtenString.Should().Be(expectedString); + Assert.Equal(expectedString, writtenString); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs index 2d966e8a5..a26173606 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs @@ -9,8 +9,6 @@ using System.Text.Json; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Writers; using VerifyXunit; using Xunit; @@ -31,7 +29,7 @@ public async Task WriteOpenApiNullAsJsonWorksAsync(bool produceTerseOutput) var json = await WriteAsJsonAsync(null, produceTerseOutput); // Assert - json.Should().Be("null"); + Assert.Equal("null", json); } public static IEnumerable IntInputs @@ -59,7 +57,7 @@ public async Task WriteOpenApiIntegerAsJsonWorksAsync(int input, bool produceTer var json = await WriteAsJsonAsync(intValue, produceTerseOutput); // Assert - json.Should().Be(input.ToString()); + Assert.Equal(input.ToString(), json); } public static IEnumerable LongInputs @@ -87,7 +85,7 @@ public async Task WriteOpenApiLongAsJsonWorksAsync(long input, bool produceTerse var json = await WriteAsJsonAsync(longValue, produceTerseOutput); // Assert - json.Should().Be(input.ToString()); + Assert.Equal(input.ToString(), json); } public static IEnumerable FloatInputs @@ -115,7 +113,7 @@ public async Task WriteOpenApiFloatAsJsonWorksAsync(float input, bool produceTer var json = await WriteAsJsonAsync(floatValue, produceTerseOutput); // Assert - json.Should().Be(input.ToString()); + Assert.Equal(input.ToString(), json); } public static IEnumerable DoubleInputs @@ -143,7 +141,7 @@ public async Task WriteOpenApiDoubleAsJsonWorksAsync(double input, bool produceT var json = await WriteAsJsonAsync(doubleValue, produceTerseOutput); // Assert - json.Should().Be(input.ToString()); + Assert.Equal(input.ToString(), json); } public static IEnumerable StringifiedDateTimes @@ -174,7 +172,7 @@ public async Task WriteOpenApiDateTimeAsJsonWorksAsync(string inputString, bool var expectedJson = "\"" + input.ToString("o") + "\""; // Assert - json.Should().Be(expectedJson); + Assert.Equal(expectedJson, json); } public static IEnumerable BooleanInputs @@ -195,7 +193,7 @@ public async Task WriteOpenApiBooleanAsJsonWorksAsync(bool input, bool produceTe var json = await WriteAsJsonAsync(boolValue, produceTerseOutput); // Assert - json.Should().Be(input.ToString().ToLower()); + Assert.Equal(input.ToString().ToLower(), json); } [Theory] @@ -264,7 +262,7 @@ private static async Task WriteAsJsonAsync(JsonNode any, bool produceTer new() { Terse = produceTerseOutput }); writer.WriteAny(any); - writer.Flush(); + await writer.FlushAsync(); stream.Position = 0; // Act diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterSpecialCharacterTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterSpecialCharacterTests.cs index a127e982b..e02200cd7 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterSpecialCharacterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterSpecialCharacterTests.cs @@ -5,7 +5,6 @@ using System.Globalization; using System.IO; using System.Linq; -using FluentAssertions; using Microsoft.OpenApi.Writers; using Xunit; @@ -47,7 +46,7 @@ public void WriteStringWithSpecialCharactersAsJsonWorks(string input, string exp var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -81,7 +80,7 @@ public void WriteStringWithSpecialCharactersAsYamlWorks(string input, string exp var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -109,7 +108,7 @@ public void WriteStringWithNewlineCharactersInObjectAsYamlWorks(string input, st .Replace("\r", ""); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -135,7 +134,7 @@ public void WriteStringWithNewlineCharactersInArrayAsYamlWorks(string input, str .Replace("\r", ""); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } [Theory] @@ -156,7 +155,7 @@ public void WriteStringAsYamlDoesNotDependOnSystemCulture(string input, string e var actual = outputStringWriter.GetStringBuilder().ToString(); // Assert - actual.Should().Be(expected); + Assert.Equal(expected, actual); } } } diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiYamlWriterTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiYamlWriterTests.cs index f088a3d75..2210cce59 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiYamlWriterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiYamlWriterTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using FluentAssertions; +using System.Threading.Tasks; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Writers; using Xunit; @@ -57,7 +57,7 @@ public static IEnumerable WriteStringListAsYamlShouldMatchExpectedTest [Theory] [MemberData(nameof(WriteStringListAsYamlShouldMatchExpectedTestCases))] - public void WriteStringListAsYamlShouldMatchExpected(string[] stringValues, string expectedYaml) + public async Task WriteStringListAsYamlShouldMatchExpected(string[] stringValues, string expectedYaml) { // Arrange var outputString = new StringWriter(CultureInfo.InvariantCulture); @@ -71,7 +71,7 @@ public void WriteStringListAsYamlShouldMatchExpected(string[] stringValues, stri } writer.WriteEndArray(); - writer.Flush(); + await writer.FlushAsync(); var actualYaml = outputString.GetStringBuilder() .ToString() @@ -80,7 +80,7 @@ public void WriteStringListAsYamlShouldMatchExpected(string[] stringValues, stri expectedYaml = expectedYaml.MakeLineBreaksEnvironmentNeutral(); // Assert - actualYaml.Should().Be(expectedYaml); + Assert.Equal(expectedYaml, actualYaml); } public static IEnumerable WriteMapAsYamlShouldMatchExpectedTestCasesSimple() @@ -314,7 +314,7 @@ public void WriteMapAsYamlShouldMatchExpected(IDictionary inputM // Assert actualYaml = actualYaml.MakeLineBreaksEnvironmentNeutral(); expectedYaml = expectedYaml.MakeLineBreaksEnvironmentNeutral(); - actualYaml.Should().Be(expectedYaml); + Assert.Equal(expectedYaml, actualYaml); } public static IEnumerable WriteDateTimeAsJsonTestCases() @@ -355,7 +355,7 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset var expectedString = " '" + dateTimeOffset.ToString("o") + "'"; // Assert - writtenString.Should().Be(expectedString); + Assert.Equal(expectedString, writtenString); } [Fact] @@ -395,7 +395,7 @@ public void WriteInlineSchema() // Assert actual = actual.MakeLineBreaksEnvironmentNeutral(); expected = expected.MakeLineBreaksEnvironmentNeutral(); - actual.Should().BeEquivalentTo(expected); + Assert.Equivalent(expected, actual); Assert.Equal(expected, actual); } diff --git a/test/Microsoft.OpenApi.Trimming.Tests/Microsoft.OpenApi.Trimming.Tests.csproj b/test/Microsoft.OpenApi.Trimming.Tests/Microsoft.OpenApi.Trimming.Tests.csproj index 08f51d715..fad2dc289 100644 --- a/test/Microsoft.OpenApi.Trimming.Tests/Microsoft.OpenApi.Trimming.Tests.csproj +++ b/test/Microsoft.OpenApi.Trimming.Tests/Microsoft.OpenApi.Trimming.Tests.csproj @@ -4,17 +4,19 @@ net8.0 enable enable + true true false true - NU1903 + NU1903; IL3000 false - + +