From 0ff19f869920f18755d2bae880f57b5ffe95c7f6 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 24 Feb 2025 13:41:41 -0500 Subject: [PATCH 01/19] draft: removes static registry for readers Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 9 +++---- src/Microsoft.OpenApi.Workbench/MainModel.cs | 6 ++--- .../Reader/OpenApiModelFactory.cs | 15 ++++++----- .../Reader/OpenApiReaderRegistry.cs | 25 ------------------- .../Reader/OpenApiReaderSettings.cs | 4 +++ 5 files changed, 17 insertions(+), 42 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index c757f4031..6e9aab6e6 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -40,12 +40,6 @@ namespace Microsoft.OpenApi.Hidi { internal static class OpenApiService { - static OpenApiService() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yml, new OpenApiYamlReader()); - } - /// /// Implementation of the transform command /// @@ -394,6 +388,9 @@ private static async Task ParseOpenApiAsync(string openApiFile, bool new(openApiFile) : new Uri("file://" + new FileInfo(openApiFile).DirectoryName + Path.DirectorySeparatorChar) }; + var yamlReader = new OpenApiYamlReader(); + settings.Readers.Add(OpenApiConstants.Yaml, yamlReader); + settings.Readers.Add(OpenApiConstants.Yml, yamlReader); result = await OpenApiDocument.LoadAsync(stream, settings: settings, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs index f5c0b2768..f95c8c1ae 100644 --- a/src/Microsoft.OpenApi.Workbench/MainModel.cs +++ b/src/Microsoft.OpenApi.Workbench/MainModel.cs @@ -211,9 +211,6 @@ protected void OnPropertyChanged(string propertyName) /// internal async Task ParseDocumentAsync() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yml, new OpenApiYamlReader()); - Stream stream = null; try { @@ -238,6 +235,9 @@ internal async Task ParseDocumentAsync() { RuleSet = ValidationRuleSet.GetDefaultRuleSet() }; + var yamlReader = new OpenApiYamlReader(); + settings.Readers.Add(OpenApiConstants.Yaml, yamlReader); + settings.Readers.Add(OpenApiConstants.Yml, yamlReader); if (ResolveExternal && !string.IsNullOrWhiteSpace(_inputFile)) { settings.BaseUrl = _inputFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? new(_inputFile) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index c86c014da..9037a9bde 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -23,11 +23,6 @@ public static class OpenApiModelFactory { private static readonly HttpClient _httpClient = new(); - static OpenApiModelFactory() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Json, new OpenApiJsonReader()); - } - /// /// Loads the input stream and parses it into an Open API document. /// @@ -45,6 +40,7 @@ public static ReadResult Load(MemoryStream stream, if (stream is null) throw new ArgumentNullException(nameof(stream)); #endif settings ??= new OpenApiReaderSettings(); + settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); // Get the format of the stream if not provided format ??= InspectStreamFormat(stream); @@ -73,7 +69,7 @@ public static ReadResult Load(MemoryStream stream, 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, openApiDocument, out diagnostic, settings); + return settings.Readers[format].ReadFragment(input, version, openApiDocument, out diagnostic, settings); } /// @@ -122,6 +118,7 @@ public static async Task LoadAsync(Stream input, string format = nul if (input is null) throw new ArgumentNullException(nameof(input)); #endif settings ??= new OpenApiReaderSettings(); + settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); Stream preparedStream; if (format is null) @@ -204,6 +201,7 @@ public static ReadResult Parse(string input, #endif format ??= InspectInputFormat(input); settings ??= new OpenApiReaderSettings(); + settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); // Copy string into MemoryStream using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input)); @@ -235,6 +233,7 @@ public static T Parse(string input, #endif format ??= InspectInputFormat(input); settings ??= new OpenApiReaderSettings(); + settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input)); return Load(stream, version, format, openApiDocument, out diagnostic, settings); } @@ -243,7 +242,7 @@ public static T Parse(string input, private static async Task InternalLoadAsync(Stream input, string format, OpenApiReaderSettings settings, CancellationToken cancellationToken = default) { - var reader = OpenApiReaderRegistry.GetReader(format); + var reader = settings.Readers[format]; var readResult = await reader.ReadAsync(input, settings, cancellationToken).ConfigureAwait(false); if (settings?.LoadExternalRefs ?? DefaultReaderSettings.LoadExternalRefs) @@ -283,7 +282,7 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp throw new ArgumentException($"Cannot parse the stream: {nameof(input)} is empty or contains no elements."); } - var reader = OpenApiReaderRegistry.GetReader(format); + var reader = settings.Readers[format]; var readResult = reader.Read(input, settings); return readResult; } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs index b86b5a9c6..ed2133b8c 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. using System; -using System.Collections.Concurrent; using Microsoft.OpenApi.Interfaces; namespace Microsoft.OpenApi.Reader @@ -12,13 +11,6 @@ namespace Microsoft.OpenApi.Reader /// public static class OpenApiReaderRegistry { - private static readonly ConcurrentDictionary _readers = new(StringComparer.OrdinalIgnoreCase); - - /// - /// Defines a default OpenAPI reader. - /// - public static readonly IOpenApiReader DefaultReader = new OpenApiJsonReader(); - /// /// Registers an IOpenApiReader for a given OpenAPI format. /// @@ -26,23 +18,6 @@ public static class OpenApiReaderRegistry /// The reader instance. public static void RegisterReader(string format, IOpenApiReader reader) { - _readers.AddOrUpdate(format, reader, (_, _) => reader); - } - - /// - /// Retrieves an IOpenApiReader for a given OpenAPI format. - /// - /// - /// - /// - public static IOpenApiReader GetReader(string format) - { - if (_readers.TryGetValue(format, out var reader)) - { - return reader; - } - - throw new NotSupportedException($"Format '{format}' is not supported. Register your reader with the OpenApiReaderRegistry class."); } } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index c1a275009..3d816570f 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -16,6 +16,10 @@ namespace Microsoft.OpenApi.Reader /// public class OpenApiReaderSettings { + /// + /// Readers to use to parse the OpenAPI document + /// + public Dictionary Readers { get; init; } = new Dictionary(StringComparer.OrdinalIgnoreCase); /// /// When external references are found, load them into a shared workspace /// From fe7a2fd654e93ce99dd0ebd628042f816c787104 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 24 Feb 2025 13:56:00 -0500 Subject: [PATCH 02/19] fix: removes static readers registry Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 4 +--- .../OpenApiReaderSettingsExtensions.cs | 21 +++++++++++++++++ src/Microsoft.OpenApi.Workbench/MainModel.cs | 4 +--- .../Reader/OpenApiModelFactory.cs | 8 +++---- .../Reader/OpenApiReaderRegistry.cs | 23 ------------------- .../Reader/OpenApiReaderSettings.cs | 8 +++++++ .../Services/OpenApiServiceTests.cs | 2 -- .../OpenApiDiagnosticTests.cs | 5 ---- .../OpenApiStreamReaderTests.cs | 5 ---- .../OpenApiWorkspaceStreamTests.cs | 7 ------ .../ParseNodeTests.cs | 5 ---- .../TryLoadReferenceV2Tests.cs | 6 ----- .../TestCustomExtension.cs | 2 +- .../V2Tests/ComparisonTests.cs | 3 ++- .../V2Tests/OpenApiDocumentTests.cs | 5 ---- .../V2Tests/OpenApiServerTests.cs | 5 ---- .../V31Tests/OpenApiDocumentTests.cs | 5 ---- .../V31Tests/OpenApiSchemaTests.cs | 5 ---- .../V3Tests/OpenApiCallbackTests.cs | 5 ---- .../V3Tests/OpenApiDiscriminatorTests.cs | 5 ---- .../V3Tests/OpenApiDocumentTests.cs | 5 ---- .../V3Tests/OpenApiEncodingTests.cs | 5 ---- .../V3Tests/OpenApiExampleTests.cs | 5 ---- .../V3Tests/OpenApiInfoTests.cs | 5 ---- .../V3Tests/OpenApiMediaTypeTests.cs | 5 ---- .../V3Tests/OpenApiOperationTests.cs | 5 ---- .../V3Tests/OpenApiParameterTests.cs | 5 ---- .../V3Tests/OpenApiResponseTests.cs | 5 ---- .../V3Tests/OpenApiSchemaTests.cs | 5 ---- .../V3Tests/OpenApiSecuritySchemeTests.cs | 5 ---- .../V3Tests/OpenApiXmlTests.cs | 5 ---- .../Models/OpenApiDocumentTests.cs | 5 ---- .../OpenApiCallbackReferenceTests.cs | 1 - .../OpenApiExampleReferenceTests.cs | 1 - .../References/OpenApiHeaderReferenceTests.cs | 1 - .../References/OpenApiLinkReferenceTests.cs | 1 - .../OpenApiParameterReferenceTests.cs | 1 - .../OpenApiPathItemReferenceTests.cs | 1 - .../OpenApiRequestBodyReferenceTests.cs | 1 - .../OpenApiResponseReferenceTest.cs | 1 - .../OpenApiSecuritySchemeReferenceTests.cs | 1 - .../References/OpenApiTagReferenceTest.cs | 1 - 42 files changed, 38 insertions(+), 165 deletions(-) create mode 100644 src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs delete mode 100644 src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 6e9aab6e6..68f79790c 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -388,9 +388,7 @@ private static async Task ParseOpenApiAsync(string openApiFile, bool new(openApiFile) : new Uri("file://" + new FileInfo(openApiFile).DirectoryName + Path.DirectorySeparatorChar) }; - var yamlReader = new OpenApiYamlReader(); - settings.Readers.Add(OpenApiConstants.Yaml, yamlReader); - settings.Readers.Add(OpenApiConstants.Yml, yamlReader); + settings.AddYamlReader(); result = await OpenApiDocument.LoadAsync(stream, settings: settings, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs new file mode 100644 index 000000000..c4d12e46d --- /dev/null +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs @@ -0,0 +1,21 @@ +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; + +namespace Microsoft.OpenApi.Readers; + +/// +/// Extensions for +/// +public static class OpenApiReaderSettingsExtensions +{ + /// + /// Adds a reader for the specified format + /// + /// The settings to add the reader to. + public static void AddYamlReader(this OpenApiReaderSettings settings) + { + var yamlReader = new OpenApiYamlReader(); + settings.Readers.Add(OpenApiConstants.Yaml, yamlReader); + settings.Readers.Add(OpenApiConstants.Yml, yamlReader); + } +} diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs index f95c8c1ae..7cfbb0084 100644 --- a/src/Microsoft.OpenApi.Workbench/MainModel.cs +++ b/src/Microsoft.OpenApi.Workbench/MainModel.cs @@ -235,9 +235,7 @@ internal async Task ParseDocumentAsync() { RuleSet = ValidationRuleSet.GetDefaultRuleSet() }; - var yamlReader = new OpenApiYamlReader(); - settings.Readers.Add(OpenApiConstants.Yaml, yamlReader); - settings.Readers.Add(OpenApiConstants.Yml, yamlReader); + settings.AddYamlReader(); if (ResolveExternal && !string.IsNullOrWhiteSpace(_inputFile)) { settings.BaseUrl = _inputFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? new(_inputFile) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 9037a9bde..eb5ea49c1 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -40,7 +40,7 @@ public static ReadResult Load(MemoryStream stream, if (stream is null) throw new ArgumentNullException(nameof(stream)); #endif settings ??= new OpenApiReaderSettings(); - settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); + settings.AddJsonReader(); // Get the format of the stream if not provided format ??= InspectStreamFormat(stream); @@ -118,7 +118,7 @@ public static async Task LoadAsync(Stream input, string format = nul if (input is null) throw new ArgumentNullException(nameof(input)); #endif settings ??= new OpenApiReaderSettings(); - settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); + settings.AddJsonReader(); Stream preparedStream; if (format is null) @@ -201,7 +201,7 @@ public static ReadResult Parse(string input, #endif format ??= InspectInputFormat(input); settings ??= new OpenApiReaderSettings(); - settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); + settings.AddJsonReader(); // Copy string into MemoryStream using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input)); @@ -233,7 +233,7 @@ public static T Parse(string input, #endif format ??= InspectInputFormat(input); settings ??= new OpenApiReaderSettings(); - settings.Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); + settings.AddJsonReader(); using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input)); return Load(stream, version, format, openApiDocument, out diagnostic, settings); } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs deleted file mode 100644 index ed2133b8c..000000000 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; -using Microsoft.OpenApi.Interfaces; - -namespace Microsoft.OpenApi.Reader -{ - /// - /// Registry for managing different OpenAPI format providers. - /// - public static class OpenApiReaderRegistry - { - /// - /// Registers an IOpenApiReader for a given OpenAPI format. - /// - /// The OpenApi file format. - /// The reader instance. - public static void RegisterReader(string format, IOpenApiReader reader) - { - } - } -} diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index 3d816570f..e5cb689c0 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -7,6 +7,7 @@ using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.MicrosoftExtensions; +using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Validations; namespace Microsoft.OpenApi.Reader @@ -16,6 +17,13 @@ namespace Microsoft.OpenApi.Reader /// public class OpenApiReaderSettings { + /// + /// Adds a reader for the specified format + /// + public void AddJsonReader() + { + Readers.Add(OpenApiConstants.Json, new OpenApiJsonReader()); + } /// /// Readers to use to parse the OpenAPI document /// diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs index b4a04c4ce..c23222eb6 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs @@ -26,8 +26,6 @@ public sealed class OpenApiServiceTests : IDisposable public OpenApiServiceTests() { _logger = new Logger(_loggerFactory); - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yml, new OpenApiYamlReader()); - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs index 5e065a1e8..012aaf785 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs @@ -15,11 +15,6 @@ namespace Microsoft.OpenApi.Readers.Tests.OpenApiReaderTests [Collection("DefaultSettings")] public class OpenApiDiagnosticTests { - public OpenApiDiagnosticTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] public async Task DetectedSpecificationVersionShouldBeV2_0() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs index 37080252d..72b27d2f8 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -15,11 +15,6 @@ public class OpenApiStreamReaderTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/"; - public OpenApiStreamReaderTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task StreamShouldCloseIfLeaveStreamOpenSettingEqualsFalse() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs index a2badc7c8..d75f48e5f 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs @@ -11,13 +11,6 @@ namespace Microsoft.OpenApi.Readers.Tests.OpenApiWorkspaceTests { public class OpenApiWorkspaceStreamTests { - private const string SampleFolderPath = "V3Tests/Samples/OpenApiWorkspace/"; - - public OpenApiWorkspaceStreamTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - // Use OpenApiWorkspace to load a document and a referenced document [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs index e8d22a14a..a2f0c26e9 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs @@ -12,11 +12,6 @@ namespace Microsoft.OpenApi.Tests { public class ParseNodeTests { - public ParseNodeTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public void BrokenSimpleList() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs index 3edc9ac67..55ccedb44 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs @@ -16,12 +16,6 @@ namespace Microsoft.OpenApi.Readers.Tests.ReferenceService public class TryLoadReferenceV2Tests { private const string SampleFolderPath = "ReferenceService/Samples/"; - - public TryLoadReferenceV2Tests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task LoadParameterReference() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs index 8de46ad64..c95378d5a 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs @@ -36,8 +36,8 @@ public void ParseCustomExtension() }; } } } }; + settings.AddYamlReader(); - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); var diag = new OpenApiDiagnostic(); var actual = OpenApiDocument.Parse(description, "yaml", settings: settings); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs index ae725bcb1..4fd9b3e88 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs @@ -21,7 +21,8 @@ public class ComparisonTests //[InlineData("definitions")] //Currently broken due to V3 references not behaving the same as V2 public async Task EquivalentV2AndV3DocumentsShouldProduceEquivalentObjects(string fileName) { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); + var settings = new OpenApiReaderSettings(); + settings.AddYamlReader(); using var streamV2 = Resources.GetStream(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")); using var streamV3 = Resources.GetStream(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml")); var result1 = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 136c46892..f30cea710 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -21,11 +21,6 @@ public class OpenApiDocumentTests { private const string SampleFolderPath = "V2Tests/Samples/"; - public OpenApiDocumentTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Theory] [InlineData("en-US")] [InlineData("hi-IN")] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs index 95452e6ad..c03decc14 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs @@ -7,11 +7,6 @@ namespace Microsoft.OpenApi.Readers.Tests.V2Tests { public class OpenApiServerTests { - public OpenApiServerTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public void NoServer() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index e5523a08c..ac203f434 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -20,11 +20,6 @@ public class OpenApiDocumentTests { private const string SampleFolderPath = "V31Tests/Samples/OpenApiDocument/"; - public OpenApiDocumentTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] public async Task ParseDocumentWithWebhooksShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index f7c30f65e..76e443141 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -32,11 +32,6 @@ public static MemoryStream GetMemoryStream(string fileName) return new MemoryStream(fileBytes); } - public OpenApiSchemaTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParseBasicV31SchemaShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs index 5aabe43d3..b4060f865 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -16,11 +16,6 @@ namespace Microsoft.OpenApi.Readers.Tests.V3Tests public class OpenApiCallbackTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiCallback/"; - public OpenApiCallbackTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] public async Task ParseBasicCallbackShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 6ab83bf3c..4ae532321 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -14,11 +14,6 @@ public class OpenApiDiscriminatorTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiDiscriminator/"; - public OpenApiDiscriminatorTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] public async Task ParseBasicDiscriminatorShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 83daf329d..1224830bd 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -28,11 +28,6 @@ public class OpenApiDocumentTests private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/"; private const string codacyApi = "https://api.codacy.com/api/api-docs/swagger.yaml"; - public OpenApiDocumentTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - private static async Task CloneAsync(T element) where T : class, IOpenApiSerializable { using var stream = new MemoryStream(); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs index bee674bfc..643f2b59a 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs @@ -14,11 +14,6 @@ public class OpenApiEncodingTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiEncoding/"; - public OpenApiEncodingTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] public async Task ParseBasicEncodingShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index 2a8691ab3..c2c3e8fe9 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -16,11 +16,6 @@ public class OpenApiExampleTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiExample/"; - public OpenApiExampleTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParseAdvancedExampleShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index 9a11ef5c3..3167f04b2 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -18,11 +18,6 @@ public class OpenApiInfoTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiInfo/"; - public OpenApiInfoTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParseAdvancedInfoShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 2905266fc..0c31e385d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -19,11 +19,6 @@ public class OpenApiMediaTypeTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiMediaType/"; - public OpenApiMediaTypeTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParseMediaTypeWithExampleShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index 1dd24a128..6c7e6a671 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -16,11 +16,6 @@ public class OpenApiOperationTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiOperation/"; - public OpenApiOperationTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task OperationWithSecurityRequirementShouldReferenceSecurityScheme() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index efdb87110..ac5ac4aca 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -19,11 +19,6 @@ public class OpenApiParameterTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiParameter/"; - public OpenApiParameterTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParsePathParameterShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs index 2d41ed2e2..9c3fd10c8 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs @@ -16,11 +16,6 @@ public class OpenApiResponseTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiResponse/"; - public OpenApiResponseTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ResponseWithReferencedHeaderShouldReferenceComponent() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs index 04d6de97d..1d40a2240 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs @@ -24,11 +24,6 @@ public class OpenApiSchemaTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiSchema/"; - public OpenApiSchemaTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public void ParsePrimitiveSchemaShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs index b0f02270c..2f1376c90 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs @@ -14,11 +14,6 @@ namespace Microsoft.OpenApi.Readers.Tests.V3Tests public class OpenApiSecuritySchemeTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiSecurityScheme/"; - public OpenApiSecuritySchemeTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParseHttpSecuritySchemeShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs index 6485aad21..3c0ce2997 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs @@ -15,11 +15,6 @@ public class OpenApiXmlTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiXml/"; - public OpenApiXmlTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] public async Task ParseBasicXmlShouldSucceed() { diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index 3716a0b32..10225b509 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -24,11 +24,6 @@ namespace Microsoft.OpenApi.Tests.Models [Collection("DefaultSettings")] public class OpenApiDocumentTests { - public OpenApiDocumentTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - public static readonly OpenApiComponents TopLevelReferencingComponents = new OpenApiComponents() { Schemas = diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs index 34284b9bd..b4e492f60 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -132,7 +132,6 @@ public class OpenApiCallbackReferenceTests public OpenApiCallbackReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); OpenApiDocument openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; OpenApiDocument openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index a52c027f9..44e36a999 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -111,7 +111,6 @@ public class OpenApiExampleReferenceTests public OpenApiExampleReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index 9b3c6c544..07dae392b 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -80,7 +80,6 @@ public class OpenApiHeaderReferenceTests public OpenApiHeaderReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index 44822454f..d583aa1d3 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -123,7 +123,6 @@ public class OpenApiLinkReferenceTests public OpenApiLinkReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs index 8afc96f04..5a9b9c115 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -81,7 +81,6 @@ public class OpenApiParameterReferenceTests public OpenApiParameterReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index 55c5bc7b5..d6453f0ca 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -78,7 +78,6 @@ public class OpenApiPathItemReferenceTests public OpenApiPathItemReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index ef9bea785..14a04a03e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -86,7 +86,6 @@ public class OpenApiRequestBodyReferenceTests public OpenApiRequestBodyReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index 785ea5e55..bf22a6e3f 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -69,7 +69,6 @@ public class OpenApiResponseReferenceTest public OpenApiResponseReferenceTest() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index 56b7e6d07..44201d615 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -43,7 +43,6 @@ public class OpenApiSecuritySchemeReferenceTests public OpenApiSecuritySchemeReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); var result = OpenApiDocument.Parse(OpenApi, "yaml"); _openApiSecuritySchemeReference = new("mySecurityScheme", result.Document); } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index 250f8ee53..5cd1c722a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -63,7 +63,6 @@ public class OpenApiTagReferenceTest public OpenApiTagReferenceTest() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); var result = OpenApiDocument.Parse(OpenApi, "yaml"); _openApiTagReference = new("user", result.Document); } From e29c01d3553c3cf6cde34c9ed63f66bbc9ccb8b1 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:04:58 -0500 Subject: [PATCH 03/19] chore: default registration of json reader chore: default namespace for yaml reader registration Signed-off-by: Vincent Biret --- .../OpenApiReaderSettingsExtensions.cs | 20 +++++++++++++++---- .../Reader/OpenApiModelFactory.cs | 4 ---- .../Reader/OpenApiReaderSettings.cs | 14 +++++++++++-- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs index c4d12e46d..96c44cf73 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs @@ -1,7 +1,8 @@ +using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Readers; -namespace Microsoft.OpenApi.Readers; +namespace Microsoft.OpenApi.Reader; /// /// Extensions for @@ -15,7 +16,18 @@ public static class OpenApiReaderSettingsExtensions public static void AddYamlReader(this OpenApiReaderSettings settings) { var yamlReader = new OpenApiYamlReader(); - settings.Readers.Add(OpenApiConstants.Yaml, yamlReader); - settings.Readers.Add(OpenApiConstants.Yml, yamlReader); + settings.AddReaderToSettings(OpenApiConstants.Yaml, yamlReader); + settings.AddReaderToSettings(OpenApiConstants.Yml, yamlReader); + } + private static void AddReaderToSettings(this OpenApiReaderSettings settings, string format, IOpenApiReader reader) + { +#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER + settings.Readers.Add(format, reader); +#else + if (!settings.Readers.ContainsKey(format)) + { + settings.Readers.Add(format, reader); + } +#endif } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index eb5ea49c1..f8d9d38f6 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -40,7 +40,6 @@ public static ReadResult Load(MemoryStream stream, if (stream is null) throw new ArgumentNullException(nameof(stream)); #endif settings ??= new OpenApiReaderSettings(); - settings.AddJsonReader(); // Get the format of the stream if not provided format ??= InspectStreamFormat(stream); @@ -118,7 +117,6 @@ public static async Task LoadAsync(Stream input, string format = nul if (input is null) throw new ArgumentNullException(nameof(input)); #endif settings ??= new OpenApiReaderSettings(); - settings.AddJsonReader(); Stream preparedStream; if (format is null) @@ -201,7 +199,6 @@ public static ReadResult Parse(string input, #endif format ??= InspectInputFormat(input); settings ??= new OpenApiReaderSettings(); - settings.AddJsonReader(); // Copy string into MemoryStream using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input)); @@ -233,7 +230,6 @@ public static T Parse(string input, #endif format ??= InspectInputFormat(input); settings ??= new OpenApiReaderSettings(); - settings.AddJsonReader(); using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input)); return Load(stream, version, format, openApiDocument, out diagnostic, settings); } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index e5cb689c0..574815cd2 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -22,12 +22,22 @@ public class OpenApiReaderSettings /// public void AddJsonReader() { - Readers.Add(OpenApiConstants.Json, new OpenApiJsonReader()); +#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER + Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); +#else + if (!Readers.ContainsKey(OpenApiConstants.Json)) + { + Readers.Add(OpenApiConstants.Json, new OpenApiJsonReader()); + } +#endif } /// /// Readers to use to parse the OpenAPI document /// - public Dictionary Readers { get; init; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + public Dictionary Readers { get; init; } = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { OpenApiConstants.Json, new OpenApiJsonReader() } + }; /// /// When external references are found, load them into a shared workspace /// From a8c7e16bde1794263394f41c4bb9b12ae6233815 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:05:10 -0500 Subject: [PATCH 04/19] chore: adds missing yaml reader for test Signed-off-by: Vincent Biret --- .../Services/OpenApiFilterServiceTests.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs index a3494ba13..513355b50 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs +++ b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs @@ -5,6 +5,7 @@ using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models.Interfaces; using Microsoft.OpenApi.Models.References; +using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Services; using Microsoft.OpenApi.Tests.UtilityFiles; using Moq; @@ -232,7 +233,9 @@ public async Task CopiesOverAllReferencedComponentsToTheSubsetDocumentCorrectly( // Act using var stream = File.OpenRead(filePath); - var doc = (await OpenApiDocument.LoadAsync(stream, "yaml")).Document; + var settings = new OpenApiReaderSettings(); + settings.AddYamlReader(); + var doc = (await OpenApiDocument.LoadAsync(stream, "yaml", settings)).Document; var predicate = OpenApiFilterService.CreatePredicate(operationIds: operationIds); var subsetOpenApiDocument = OpenApiFilterService.CreateFilteredDocument(doc, predicate); From 75e9d9abe61a73d5b91f653886fa2cbf0fe2e244 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:06:07 -0500 Subject: [PATCH 05/19] chore: updates public export of API Signed-off-by: Vincent Biret --- .../PublicApi/PublicApi.approved.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index ca8c30327..bc0ce8cee 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1490,12 +1490,6 @@ namespace Microsoft.OpenApi.Reader 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 - { - public static readonly Microsoft.OpenApi.Interfaces.IOpenApiReader DefaultReader; - public static Microsoft.OpenApi.Interfaces.IOpenApiReader GetReader(string format) { } - public static void RegisterReader(string format, Microsoft.OpenApi.Interfaces.IOpenApiReader reader) { } - } public class OpenApiReaderSettings { public OpenApiReaderSettings() { } @@ -1505,7 +1499,9 @@ namespace Microsoft.OpenApi.Reader public System.Collections.Generic.Dictionary> ExtensionParsers { get; set; } public bool LeaveStreamOpen { get; set; } public bool LoadExternalRefs { get; set; } + public System.Collections.Generic.Dictionary Readers { get; init; } public Microsoft.OpenApi.Validations.ValidationRuleSet RuleSet { get; set; } + public void AddJsonReader() { } public void AddMicrosoftExtensionParsers() { } } public static class OpenApiVersionExtensionMethods From 243a111c19f2939b0a5d27c21db302f8349049eb Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:13:01 -0500 Subject: [PATCH 06/19] fix: adds missing cancellation parameter to async method Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Models/OpenApiDocument.cs | 5 +++-- src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 7820a6f8e..631acbf4a 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -545,10 +545,11 @@ public static ReadResult Load(MemoryStream stream, /// /// The path to the OpenAPI file. /// The OpenApi reader settings. + /// The cancellation token /// - public static async Task LoadAsync(string url, OpenApiReaderSettings? settings = null) + public static async Task LoadAsync(string url, OpenApiReaderSettings? settings = null, CancellationToken token = default) { - return await OpenApiModelFactory.LoadAsync(url, settings); + return await OpenApiModelFactory.LoadAsync(url, settings, token).ConfigureAwait(false); } /// diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index f8d9d38f6..5fc4e5ec7 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -76,7 +76,7 @@ public static T Load(MemoryStream input, OpenApiSpecVersion version, string f /// /// The path to the OpenAPI file /// The OpenApi reader settings. - /// + /// The cancellation token /// public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken token = default) { From 01398f0cbe717f43d8f558c234a25c5e794261a2 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:23:10 -0500 Subject: [PATCH 07/19] chore: adds missing yaml reader to settings for base tests Signed-off-by: Vincent Biret --- test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs | 4 ++-- .../Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs | 6 +++--- .../Models/References/OpenApiCallbackReferenceTests.cs | 4 ++-- .../Models/References/OpenApiExampleReferenceTests.cs | 4 ++-- .../Models/References/OpenApiHeaderReferenceTests.cs | 4 ++-- .../Models/References/OpenApiLinkReferenceTests.cs | 4 ++-- .../Models/References/OpenApiParameterReferenceTests.cs | 4 ++-- .../Models/References/OpenApiPathItemReferenceTests.cs | 4 ++-- .../Models/References/OpenApiRequestBodyReferenceTests.cs | 4 ++-- .../Models/References/OpenApiResponseReferenceTest.cs | 4 ++-- .../References/OpenApiSecuritySchemeReferenceTests.cs | 2 +- .../Models/References/OpenApiTagReferenceTest.cs | 2 +- test/Microsoft.OpenApi.Tests/SettingsFixture.cs | 7 +++++++ 13 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 test/Microsoft.OpenApi.Tests/SettingsFixture.cs diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs index a2f0c26e9..8dfb20322 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs @@ -25,7 +25,7 @@ public void BrokenSimpleList() paths: { } """; - var result = OpenApiDocument.Parse(input, "yaml"); + var result = OpenApiDocument.Parse(input, "yaml", SettingsFixture.ReaderSettings); Assert.Equivalent(new List() { new OpenApiError(new OpenApiReaderException("Expected a value.")) @@ -51,7 +51,7 @@ public void BadSchema() schema: asdasd """; - var res= OpenApiDocument.Parse(input, "yaml"); + var res= OpenApiDocument.Parse(input, "yaml", SettingsFixture.ReaderSettings); Assert.Equivalent(new List { diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index 10225b509..c9c74fbe6 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -1682,7 +1682,7 @@ And reading in similar documents(one has a whitespace) yields the same hash code private static async Task ParseInputFileAsync(string filePath) { - var openApiDoc = (await OpenApiDocument.LoadAsync(filePath)).Document; + var openApiDoc = (await OpenApiDocument.LoadAsync(filePath, SettingsFixture.ReaderSettings)).Document; return openApiDoc; } @@ -1985,7 +1985,7 @@ public async Task SerializeV31DocumentWithRefsInWebhooksWorks() items: type: object"; - var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithReusableWebhooks.yaml")).Document; + var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithReusableWebhooks.yaml", SettingsFixture.ReaderSettings)).Document; var stringWriter = new StringWriter(); var writer = new OpenApiYamlWriter(stringWriter, new OpenApiWriterSettings { InlineLocalReferences = true }); @@ -2039,7 +2039,7 @@ public async Task SerializeDocWithDollarIdInDollarRefSucceeds() radius: type: number "; - var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithDollarId.yaml")).Document; + var doc = (await OpenApiDocument.LoadAsync("Models/Samples/docWithDollarId.yaml", SettingsFixture.ReaderSettings)).Document; var actual = await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_1); Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), actual.MakeLineBreaksEnvironmentNeutral()); } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs index b4e492f60..b9f31f9e9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -132,8 +132,8 @@ public class OpenApiCallbackReferenceTests public OpenApiCallbackReferenceTests() { - OpenApiDocument openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - OpenApiDocument openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + OpenApiDocument openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + OpenApiDocument openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", openApiDoc_2.BaseUri); openApiDoc.Workspace.RegisterComponents(openApiDoc_2); _externalCallbackReference = new("callbackEvent", openApiDoc, "https://myserver.com/beta"); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index 44e36a999..4e2ff6c3e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -111,8 +111,8 @@ public class OpenApiExampleReferenceTests public OpenApiExampleReferenceTests() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs index 07dae392b..99c90916a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -80,8 +80,8 @@ public class OpenApiHeaderReferenceTests public OpenApiHeaderReferenceTests() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs index d583aa1d3..d898dd0b6 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -123,8 +123,8 @@ public class OpenApiLinkReferenceTests public OpenApiLinkReferenceTests() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs index 5a9b9c115..8078bdbe7 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -81,8 +81,8 @@ public class OpenApiParameterReferenceTests public OpenApiParameterReferenceTests() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs index d6453f0ca..a6930cf8c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -78,8 +78,8 @@ public class OpenApiPathItemReferenceTests public OpenApiPathItemReferenceTests() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); _openApiDoc_2.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs index 14a04a03e..118552c2a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -86,8 +86,8 @@ public class OpenApiRequestBodyReferenceTests public OpenApiRequestBodyReferenceTests() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs index bf22a6e3f..ec72f1fda 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -69,8 +69,8 @@ public class OpenApiResponseReferenceTest public OpenApiResponseReferenceTest() { - _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml).Document; - _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml).Document; + _openApiDoc = OpenApiDocument.Parse(OpenApi, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; + _openApiDoc_2 = OpenApiDocument.Parse(OpenApi_2, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings).Document; _openApiDoc.Workspace.AddDocumentId("https://myserver.com/beta", _openApiDoc_2.BaseUri); _openApiDoc.Workspace.RegisterComponents(_openApiDoc_2); diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs index 44201d615..3b5100825 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -43,7 +43,7 @@ public class OpenApiSecuritySchemeReferenceTests public OpenApiSecuritySchemeReferenceTests() { - var result = OpenApiDocument.Parse(OpenApi, "yaml"); + var result = OpenApiDocument.Parse(OpenApi, "yaml", SettingsFixture.ReaderSettings); _openApiSecuritySchemeReference = new("mySecurityScheme", result.Document); } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs index 5cd1c722a..bed3500d3 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -63,7 +63,7 @@ public class OpenApiTagReferenceTest public OpenApiTagReferenceTest() { - var result = OpenApiDocument.Parse(OpenApi, "yaml"); + var result = OpenApiDocument.Parse(OpenApi, "yaml", SettingsFixture.ReaderSettings); _openApiTagReference = new("user", result.Document); } diff --git a/test/Microsoft.OpenApi.Tests/SettingsFixture.cs b/test/Microsoft.OpenApi.Tests/SettingsFixture.cs new file mode 100644 index 000000000..96ca4cbe8 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/SettingsFixture.cs @@ -0,0 +1,7 @@ +using Microsoft.OpenApi.Reader; + +namespace Microsoft.OpenApi.Tests; +public static class SettingsFixture +{ + public static OpenApiReaderSettings ReaderSettings { get { var settings = new OpenApiReaderSettings(); settings.AddYamlReader() ; return settings; } } +} From f8a775bfd14df15b20c6354d34aecccd9f09f3d3 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:44:29 -0500 Subject: [PATCH 08/19] chore: adds missing yaml reader for readers tests Signed-off-by: Vincent Biret --- .../OpenApiDiagnosticTests.cs | 5 ++- .../OpenApiStreamReaderTests.cs | 10 ++++- .../UnsupportedSpecVersionTests.cs | 2 +- .../OpenApiWorkspaceStreamTests.cs | 2 + .../TryLoadReferenceV2Tests.cs | 8 ++-- .../SettingsFixture.cs | 7 ++++ .../V2Tests/ComparisonTests.cs | 4 +- .../V2Tests/OpenApiDocumentTests.cs | 3 +- .../V2Tests/OpenApiServerTests.cs | 17 +++++++-- .../V31Tests/OpenApiDocumentTests.cs | 16 ++++---- .../V31Tests/OpenApiSchemaTests.cs | 24 ++++++------ .../V3Tests/OpenApiCallbackTests.cs | 6 +-- .../V3Tests/OpenApiDiscriminatorTests.cs | 2 +- .../V3Tests/OpenApiDocumentTests.cs | 38 +++++++++---------- .../V3Tests/OpenApiEncodingTests.cs | 4 +- .../V3Tests/OpenApiExampleTests.cs | 4 +- .../V3Tests/OpenApiInfoTests.cs | 6 +-- .../V3Tests/OpenApiMediaTypeTests.cs | 4 +- .../V3Tests/OpenApiOperationTests.cs | 4 +- .../V3Tests/OpenApiParameterTests.cs | 20 +++++----- .../V3Tests/OpenApiResponseTests.cs | 2 +- .../V3Tests/OpenApiSchemaTests.cs | 12 +++--- .../V3Tests/OpenApiSecuritySchemeTests.cs | 10 ++--- .../V3Tests/OpenApiXmlTests.cs | 2 +- 24 files changed, 120 insertions(+), 92 deletions(-) create mode 100644 test/Microsoft.OpenApi.Readers.Tests/SettingsFixture.cs diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs index 012aaf785..8e45891db 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs @@ -18,7 +18,7 @@ public class OpenApiDiagnosticTests [Fact] public async Task DetectedSpecificationVersionShouldBeV2_0() { - var actual = await OpenApiDocument.LoadAsync("V2Tests/Samples/basic.v2.yaml"); + var actual = await OpenApiDocument.LoadAsync("V2Tests/Samples/basic.v2.yaml", SettingsFixture.ReaderSettings); Assert.NotNull(actual.Diagnostic); Assert.Equal(OpenApiSpecVersion.OpenApi2_0, actual.Diagnostic.SpecificationVersion); @@ -27,7 +27,7 @@ public async Task DetectedSpecificationVersionShouldBeV2_0() [Fact] public async Task DetectedSpecificationVersionShouldBeV3_0() { - var actual = await OpenApiDocument.LoadAsync("V3Tests/Samples/OpenApiDocument/minimalDocument.yaml"); + var actual = await OpenApiDocument.LoadAsync("V3Tests/Samples/OpenApiDocument/minimalDocument.yaml", SettingsFixture.ReaderSettings); Assert.NotNull(actual.Diagnostic); Assert.Equal(OpenApiSpecVersion.OpenApi3_0, actual.Diagnostic.SpecificationVersion); @@ -43,6 +43,7 @@ public async Task DiagnosticReportMergedForExternalReferenceAsync() CustomExternalLoader = new ResourceLoader(), BaseUrl = new("fie://c:\\") }; + settings.AddYamlReader(); ReadResult result; result = await OpenApiDocument.LoadAsync("OpenApiReaderTests/Samples/OpenApiDiagnosticReportMerged/TodoMain.yaml", settings); diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs index 72b27d2f8..67fed8efe 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -20,6 +20,7 @@ public async Task StreamShouldCloseIfLeaveStreamOpenSettingEqualsFalse() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); var settings = new OpenApiReaderSettings { LeaveStreamOpen = false }; + settings.AddYamlReader(); _ = await OpenApiDocument.LoadAsync(stream, settings: settings); Assert.False(stream.CanRead); } @@ -29,6 +30,7 @@ public async Task StreamShouldNotCloseIfLeaveStreamOpenSettingEqualsTrue() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); var settings = new OpenApiReaderSettings { LeaveStreamOpen = true }; + settings.AddYamlReader(); _ = await OpenApiDocument.LoadAsync(stream, settings: settings); Assert.True(stream.CanRead); } @@ -43,7 +45,9 @@ public async Task StreamShouldNotBeDisposedIfLeaveStreamOpenSettingIsTrueAsync() memoryStream.Position = 0; var stream = memoryStream; - _ = await OpenApiDocument.LoadAsync(stream, settings: new OpenApiReaderSettings { LeaveStreamOpen = true }); + var settings = new OpenApiReaderSettings { LeaveStreamOpen = true }; + settings.AddYamlReader(); + _ = await OpenApiDocument.LoadAsync(stream, settings: settings); stream.Seek(0, SeekOrigin.Begin); // does not throw an object disposed exception Assert.True(stream.CanRead); } @@ -59,7 +63,9 @@ public async Task StreamShouldReadWhenInitializedAsync() var stream = await httpClient.GetStreamAsync("20fe7a7b720a0e48e5842d002ac418b12a8201df/tests/v3.0/pass/petstore.yaml"); // Read V3 as YAML - var result = await OpenApiDocument.LoadAsync(stream); + var settings = new OpenApiReaderSettings(); + settings.AddYamlReader(); + var result = await OpenApiDocument.LoadAsync(stream, settings: settings); Assert.NotNull(result.Document); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs index 83d7c33d5..428e86725 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/UnsupportedSpecVersionTests.cs @@ -16,7 +16,7 @@ public async Task ThrowOpenApiUnsupportedSpecVersionException() { try { - _ = await OpenApiDocument.LoadAsync("OpenApiReaderTests/Samples/unsupported.v1.yaml"); + _ = await OpenApiDocument.LoadAsync("OpenApiReaderTests/Samples/unsupported.v1.yaml", SettingsFixture.ReaderSettings); } catch (OpenApiUnsupportedSpecVersionException exception) { diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs index d75f48e5f..720eade40 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiWorkspaceTests/OpenApiWorkspaceStreamTests.cs @@ -23,6 +23,7 @@ public async Task LoadingDocumentWithResolveAllReferencesShouldLoadDocumentIntoW CustomExternalLoader = new MockLoader(), BaseUrl = new("file://c:\\") }; + settings.AddYamlReader(); var stream = new MemoryStream(); var doc = """ @@ -52,6 +53,7 @@ public async Task LoadDocumentWithExternalReferenceShouldLoadBothDocumentsIntoWo CustomExternalLoader = new ResourceLoader(), BaseUrl = new("file://c:\\"), }; + settings.AddYamlReader(); ReadResult result; result = await OpenApiDocument.LoadAsync("V3Tests/Samples/OpenApiWorkspace/TodoMain.yaml", settings); diff --git a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs index 55ccedb44..d32c9b46b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs @@ -20,7 +20,7 @@ public class TryLoadReferenceV2Tests public async Task LoadParameterReference() { // Arrange - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"), SettingsFixture.ReaderSettings); var reference = new OpenApiParameterReference("skipParam", result.Document); // Assert @@ -45,7 +45,7 @@ public async Task LoadParameterReference() [Fact] public async Task LoadSecuritySchemeReference() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"), SettingsFixture.ReaderSettings); var reference = new OpenApiSecuritySchemeReference("api_key_sample", result.Document); @@ -63,7 +63,7 @@ public async Task LoadSecuritySchemeReference() [Fact] public async Task LoadResponseReference() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"), SettingsFixture.ReaderSettings); var reference = new OpenApiResponseReference("NotFound", result.Document); @@ -83,7 +83,7 @@ public async Task LoadResponseReference() [Fact] public async Task LoadResponseAndSchemaReference() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "multipleReferences.v2.yaml"), SettingsFixture.ReaderSettings); var reference = new OpenApiResponseReference("GeneralError", result.Document); var expected = new OpenApiResponse diff --git a/test/Microsoft.OpenApi.Readers.Tests/SettingsFixture.cs b/test/Microsoft.OpenApi.Readers.Tests/SettingsFixture.cs new file mode 100644 index 000000000..21f434311 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/SettingsFixture.cs @@ -0,0 +1,7 @@ +using Microsoft.OpenApi.Reader; + +namespace Microsoft.OpenApi.Readers.Tests; +public static class SettingsFixture +{ + public static OpenApiReaderSettings ReaderSettings { get { var settings = new OpenApiReaderSettings(); settings.AddYamlReader() ; return settings; } } +} diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs index 4fd9b3e88..ab11f4b87 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs @@ -25,8 +25,8 @@ public async Task EquivalentV2AndV3DocumentsShouldProduceEquivalentObjects(strin settings.AddYamlReader(); using var streamV2 = Resources.GetStream(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")); using var streamV3 = Resources.GetStream(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml")); - var result1 = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml")); - var result2 = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml")); + var result1 = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, $"{fileName}.v2.yaml"), SettingsFixture.ReaderSettings); + var result2 = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, $"{fileName}.v3.yaml"), SettingsFixture.ReaderSettings); result2.Document.Should().BeEquivalentTo(result1.Document, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index f30cea710..1059c3b02 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -51,7 +51,7 @@ public void ParseDocumentWithDifferentCultureShouldSucceed(string culture) exclusiveMinimum: false paths: {} """, - "yaml"); + "yaml", SettingsFixture.ReaderSettings); result.Document.Should().BeEquivalentTo( new OpenApiDocument @@ -308,6 +308,7 @@ public async Task ParseDocumentWithDefaultContentTypeSettingShouldSucceed() { DefaultContentType = ["application/json"] }; + settings.AddYamlReader(); var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithEmptyProduces.yaml"), settings); var mediaType = actual.Document.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs index c03decc14..23b6825b1 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiServerTests.cs @@ -19,7 +19,7 @@ public void NoServer() paths: {} """; - var result = OpenApiDocument.Parse(input, "yaml"); + var result = OpenApiDocument.Parse(input, "yaml", SettingsFixture.ReaderSettings); Assert.Empty(result.Document.Servers); } @@ -37,7 +37,7 @@ public void JustSchemeNoDefault() - http paths: {} """; - var result = OpenApiDocument.Parse(input, "yaml"); + var result = OpenApiDocument.Parse(input, "yaml", SettingsFixture.ReaderSettings); Assert.Empty(result.Document.Servers); } @@ -54,7 +54,7 @@ public void JustHostNoDefault() host: www.foo.com paths: {} """; - var result = OpenApiDocument.Parse(input, "yaml"); + var result = OpenApiDocument.Parse(input, "yaml", SettingsFixture.ReaderSettings); var server = result.Document.Servers.First(); Assert.Single(result.Document.Servers); @@ -79,6 +79,7 @@ public void NoBasePath() { BaseUrl = new("https://www.foo.com/spec.yaml") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); var server = result.Document.Servers.First(); @@ -98,7 +99,7 @@ public void JustBasePathNoDefault() basePath: /baz paths: {} """; - var result = OpenApiDocument.Parse(input, "yaml"); + var result = OpenApiDocument.Parse(input, "yaml", SettingsFixture.ReaderSettings); var server = result.Document.Servers.First(); Assert.Single(result.Document.Servers); @@ -122,6 +123,7 @@ public void JustSchemeWithCustomHost() { BaseUrl = new("https://bing.com/foo") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -147,6 +149,7 @@ public void JustSchemeWithCustomHostWithEmptyPath() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -171,6 +174,7 @@ public void JustBasePathWithCustomHost() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -195,6 +199,7 @@ public void JustHostWithCustomHost() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -220,6 +225,7 @@ public void JustHostWithCustomHostWithApi() { BaseUrl = new("https://dev.bing.com/api/description.yaml") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); var server = result.Document.Servers.First(); @@ -246,6 +252,7 @@ public void MultipleServers() { BaseUrl = new("https://dev.bing.com/api") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); var server = result.Document.Servers.First(); @@ -271,6 +278,7 @@ public void LocalHostWithCustomHost() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -296,6 +304,7 @@ public void InvalidHostShouldYieldError() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); Assert.Empty(result.Document.Servers); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index ac203f434..f1dc5640c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -24,7 +24,7 @@ public class OpenApiDocumentTests public async Task ParseDocumentWithWebhooksShouldSucceed() { // Arrange and Act - var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "documentWithWebhooks.yaml")); + var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "documentWithWebhooks.yaml"), SettingsFixture.ReaderSettings); var petSchema = new OpenApiSchemaReference("petSchema", actual.Document); var newPetSchema = new OpenApiSchemaReference("newPetSchema", actual.Document); @@ -219,7 +219,7 @@ public async Task ParseDocumentWithWebhooksShouldSucceed() public async Task ParseDocumentsWithReusablePathItemInWebhooksSucceeds() { // Arrange && Act - var actual = await OpenApiDocument.LoadAsync("V31Tests/Samples/OpenApiDocument/documentWithReusablePaths.yaml"); + var actual = await OpenApiDocument.LoadAsync("V31Tests/Samples/OpenApiDocument/documentWithReusablePaths.yaml", SettingsFixture.ReaderSettings); var components = new OpenApiComponents { @@ -429,7 +429,7 @@ public async Task ParseDocumentWithExampleInSchemaShouldSucceed() var writer = new OpenApiJsonWriter(outputStringWriter, new OpenApiJsonWriterSettings { Terse = false }); // Act - var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithExample.yaml")); + var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithExample.yaml"), SettingsFixture.ReaderSettings); actual.Document.SerializeAsV31(writer); // Assert @@ -440,7 +440,7 @@ public async Task ParseDocumentWithExampleInSchemaShouldSucceed() public async Task ParseDocumentWithPatternPropertiesInSchemaWorks() { // Arrange and Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithPatternPropertiesInSchema.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithPatternPropertiesInSchema.yaml"), SettingsFixture.ReaderSettings); var actualSchema = result.Document.Paths["/example"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; var expectedSchema = new OpenApiSchema @@ -497,7 +497,7 @@ public async Task ParseDocumentWithPatternPropertiesInSchemaWorks() public async Task ParseDocumentWithReferenceByIdGetsResolved() { // Arrange and Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithReferenceById.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithReferenceById.yaml"), SettingsFixture.ReaderSettings); var responseSchema = result.Document.Paths["/resource"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; var requestBodySchema = result.Document.Paths["/resource"].Operations[OperationType.Post].RequestBody.Content["application/json"].Schema; @@ -520,6 +520,7 @@ public async Task ExternalDocumentDereferenceToOpenApiDocumentUsingJsonPointerWo LoadExternalRefs = true, BaseUrl = new(path), }; + settings.AddYamlReader(); // Act var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "externalRefByJsonPointer.yaml"), settings); @@ -541,10 +542,11 @@ public async Task ParseExternalDocumentDereferenceToOpenApiDocumentByIdWorks() LoadExternalRefs = true, BaseUrl = new(path), }; + settings.AddYamlReader(); // Act var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "externalRefById.yaml"), settings); - var doc2 = (await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "externalResource.yaml"))).Document; + var doc2 = (await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "externalResource.yaml"), SettingsFixture.ReaderSettings)).Document; var requestBodySchema = result.Document.Paths["/resource"].Operations[OperationType.Get].Parameters[0].Schema; result.Document.Workspace.RegisterComponents(doc2); @@ -557,7 +559,7 @@ public async Task ParseExternalDocumentDereferenceToOpenApiDocumentByIdWorks() public async Task ParseDocumentWith31PropertiesWorks() { var path = Path.Combine(SampleFolderPath, "documentWith31Properties.yaml"); - var doc = (await OpenApiDocument.LoadAsync(path)).Document; + var doc = (await OpenApiDocument.LoadAsync(path, SettingsFixture.ReaderSettings)).Document; var outputStringWriter = new StringWriter(); doc.SerializeAsV31(new OpenApiYamlWriter(outputStringWriter)); await outputStringWriter.FlushAsync(); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 76e443141..b32840020 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -104,7 +104,7 @@ public async Task ParseBasicV31SchemaShouldSucceed() // Act var schema = await OpenApiModelFactory.LoadAsync( - Path.Combine(SampleFolderPath, "jsonSchema.json"), OpenApiSpecVersion.OpenApi3_1, new()); + Path.Combine(SampleFolderPath, "jsonSchema.json"), OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent(expectedObject, schema); @@ -177,7 +177,7 @@ public async Task ParseV31SchemaShouldSucceed() var path = Path.Combine(SampleFolderPath, "schema.yaml"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); var expectedSchema = new OpenApiSchema { Type = JsonSchemaType.Object, @@ -200,7 +200,7 @@ public async Task ParseAdvancedV31SchemaShouldSucceed() { // Arrange and Act var path = Path.Combine(SampleFolderPath, "advancedSchema.yaml"); - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); var expectedSchema = new OpenApiSchema { @@ -291,7 +291,7 @@ public void ParseSchemaWithExamplesShouldSucceed() - ubuntu "; // Act - var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml"); + var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml", SettingsFixture.ReaderSettings); // Assert Assert.Equal(2, schema.Examples.Count); @@ -330,7 +330,7 @@ public async Task SerializeV31SchemaWithMultipleTypesAsV3Works() var path = Path.Combine(SampleFolderPath, "schemaWithTypeArray.yaml"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); var writer = new StringWriter(); schema.SerializeAsV3(new OpenApiYamlWriter(writer)); @@ -349,7 +349,7 @@ public async Task SerializeV31SchemaWithMultipleTypesAsV2Works() var path = Path.Combine(SampleFolderPath, "schemaWithTypeArray.yaml"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); var writer = new StringWriter(); schema.SerializeAsV2(new OpenApiYamlWriter(writer)); @@ -369,7 +369,7 @@ public async Task SerializeV3SchemaWithNullableAsV31Works() var path = Path.Combine(SampleFolderPath, "schemaWithNullable.yaml"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_0, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); var writer = new StringWriter(); schema.SerializeAsV31(new OpenApiYamlWriter(writer)); @@ -390,7 +390,7 @@ public async Task SerializeV2SchemaWithNullableExtensionAsV31Works() var path = Path.Combine(SampleFolderPath, "schemaWithNullableExtension.yaml"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi2_0, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi2_0, new(), SettingsFixture.ReaderSettings); var writer = new StringWriter(); schema.SerializeAsV31(new OpenApiYamlWriter(writer)); @@ -409,7 +409,7 @@ public void SerializeSchemaWithTypeArrayAndNullableDoesntEmitType() var expected = @"{ }"; - var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml"); + var schema = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_1, new(), out _, "yaml", SettingsFixture.ReaderSettings); var writer = new StringWriter(); schema.SerializeAsV2(new OpenApiYamlWriter(writer)); @@ -427,7 +427,7 @@ public async Task LoadSchemaWithNullableExtensionAsV31Works(string filePath) var path = Path.Combine(SampleFolderPath, filePath); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equal(JsonSchemaType.String | JsonSchemaType.Null, schema.Type); @@ -467,7 +467,7 @@ public async Task SerializeSchemaWithJsonSchemaKeywordsWorks() var path = Path.Combine(SampleFolderPath, "schemaWithJsonSchemaKeywords.yaml"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); // serialization var writer = new StringWriter(); @@ -511,7 +511,7 @@ public async Task ParseSchemaWithConstWorks() var path = Path.Combine(SampleFolderPath, "schemaWithConst.json"); // Act - var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new()); + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); Assert.Equal("active", schema.Properties["status"].Const); Assert.Equal("admin", schema.Properties["user"].Properties["role"].Const); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs index b4060f865..cca7e002d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -20,7 +20,7 @@ public class OpenApiCallbackTests public async Task ParseBasicCallbackShouldSucceed() { // Act - var callback = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var callback = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicCallback.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -63,7 +63,7 @@ public async Task ParseCallbackWithReferenceShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "callbackWithReference.yaml")); // Act - var result = await OpenApiModelFactory.LoadAsync(stream, OpenApiConstants.Yaml); + var result = await OpenApiModelFactory.LoadAsync(stream, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings); // Assert var path = result.Document.Paths.First().Value; @@ -113,7 +113,7 @@ public async Task ParseCallbackWithReferenceShouldSucceed() public async Task ParseMultipleCallbacksWithReferenceShouldSucceed() { // Act - var result = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "multipleCallbacksWithReference.yaml")); + var result = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "multipleCallbacksWithReference.yaml"), SettingsFixture.ReaderSettings); // Assert var path = result.Document.Paths.First().Value; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 4ae532321..1629e1939 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -25,7 +25,7 @@ public async Task ParseBasicDiscriminatorShouldSucceed() memoryStream.Position = 0; // Act - var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, new(), out var diagnostic); + var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, new(), out var diagnostic, SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 1224830bd..75d79ff90 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -55,7 +55,7 @@ public void ParseDocumentFromInlineStringShouldSucceed() title: Simple Document version: 0.9.1 paths: {}", - OpenApiConstants.Yaml); + OpenApiConstants.Yaml, SettingsFixture.ReaderSettings); result.Document.Should().BeEquivalentTo( new OpenApiDocument @@ -86,7 +86,7 @@ public void ParseInlineStringWithoutProvidingFormatSucceeds() paths: {} """; - var readResult = OpenApiDocument.Parse(stringOpenApiDoc); + var readResult = OpenApiDocument.Parse(stringOpenApiDoc, settings: SettingsFixture.ReaderSettings); Assert.Equal("Sample API", readResult.Document.Info.Title); } @@ -94,7 +94,7 @@ public void ParseInlineStringWithoutProvidingFormatSucceeds() public async Task ParseBasicDocumentWithMultipleServersShouldSucceed() { var path = Path.Combine(SampleFolderPath, "basicDocumentWithMultipleServers.yaml"); - var result = await OpenApiDocument.LoadAsync(path); + var result = await OpenApiDocument.LoadAsync(path, SettingsFixture.ReaderSettings); Assert.Empty(result.Diagnostic.Errors); result.Document.Should().BeEquivalentTo( @@ -130,7 +130,7 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() await stream.CopyToAsync(memoryStream); memoryStream.Position = 0; - var result = await OpenApiDocument.LoadAsync(memoryStream); + var result = await OpenApiDocument.LoadAsync(memoryStream, settings: SettingsFixture.ReaderSettings); result.Document.Should().BeEquivalentTo( new OpenApiDocument @@ -156,7 +156,7 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() [Fact] public async Task ParseMinimalDocumentShouldSucceed() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "minimalDocument.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "minimalDocument.yaml"), SettingsFixture.ReaderSettings); result.Document.Should().BeEquivalentTo( new OpenApiDocument @@ -180,7 +180,7 @@ public async Task ParseMinimalDocumentShouldSucceed() public async Task ParseStandardPetStoreDocumentShouldSucceed() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStore.yaml")); - var actual = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml); + var actual = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings); var components = new OpenApiComponents { @@ -566,7 +566,7 @@ public async Task ParseStandardPetStoreDocumentShouldSucceed() public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() { using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "petStoreWithTagAndSecurity.yaml")); - var actual = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml); + var actual = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings); var components = new OpenApiComponents { @@ -1046,7 +1046,7 @@ public async Task ParseModifiedPetStoreDocumentWithTagAndSecurityShouldSucceed() [Fact] public async Task ParsePetStoreExpandedShouldSucceed() { - var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml")); + var actual = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "petStoreExpanded.yaml"), SettingsFixture.ReaderSettings); // TODO: Create the object in memory and compare with the one read from YAML file. @@ -1057,7 +1057,7 @@ public async Task ParsePetStoreExpandedShouldSucceed() [Fact] public async Task GlobalSecurityRequirementShouldReferenceSecurityScheme() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "securedApi.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "securedApi.yaml"), SettingsFixture.ReaderSettings); var securityRequirement = result.Document.SecurityRequirements[0]; @@ -1067,7 +1067,7 @@ public async Task GlobalSecurityRequirementShouldReferenceSecurityScheme() [Fact] public async Task HeaderParameterShouldAllowExample() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "apiWithFullHeaderComponent.yaml"), SettingsFixture.ReaderSettings); var exampleHeader = result.Document.Components?.Headers?["example-header"]; Assert.NotNull(exampleHeader); @@ -1129,7 +1129,7 @@ public async Task HeaderParameterShouldAllowExample() public async Task ParseDocumentWithReferencedSecuritySchemeWorks() { // Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithSecuritySchemeReference.yaml"), SettingsFixture.ReaderSettings); var securityScheme = result.Document.Components.SecuritySchemes["OAuth2"]; // Assert @@ -1143,7 +1143,7 @@ public async Task ParseDocumentWithJsonSchemaReferencesWorks() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithJsonSchema.yaml")); // Act - var result = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml); + var result = await OpenApiDocument.LoadAsync(stream, OpenApiConstants.Yaml, SettingsFixture.ReaderSettings); var actualSchema = result.Document.Paths["/users/{userId}"].Operations[OperationType.Get].Responses["200"].Content["application/json"].Schema; @@ -1156,7 +1156,7 @@ public async Task ParseDocumentWithJsonSchemaReferencesWorks() public async Task ValidateExampleShouldNotHaveDataTypeMismatch() { // Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "documentWithDateExampleInSchema.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "documentWithDateExampleInSchema.yaml"), SettingsFixture.ReaderSettings); // Assert var warnings = result.Diagnostic.Warnings; @@ -1244,7 +1244,7 @@ public async Task ParseDocWithRefsUsingProxyReferencesSucceeds() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minifiedPetStore.yaml")); // Act - var doc = (await OpenApiDocument.LoadAsync(stream)).Document; + var doc = (await OpenApiDocument.LoadAsync(stream, settings: SettingsFixture.ReaderSettings)).Document; var actualParam = doc.Paths["/pets"].Operations[OperationType.Get].Parameters[0]; var outputDoc = (await doc.SerializeAsYamlAsync(OpenApiSpecVersion.OpenApi3_0)).MakeLineBreaksEnvironmentNeutral(); var expectedParam = expected.Paths["/pets"].Operations[OperationType.Get].Parameters[0]; @@ -1278,7 +1278,7 @@ public void ParseBasicDocumentWithServerVariableShouldSucceed() default: v2 enum: [v1, v2] paths: {} - """, "yaml"); + """, "yaml", SettingsFixture.ReaderSettings); var expected = new OpenApiDocument { @@ -1326,7 +1326,7 @@ public void ParseBasicDocumentWithServerVariableAndNoDefaultShouldFail() version: enum: [v1, v2] paths: {} - """, "yaml"); + """, "yaml", SettingsFixture.ReaderSettings); Assert.NotEmpty(result.Diagnostic.Errors); } @@ -1334,7 +1334,7 @@ public void ParseBasicDocumentWithServerVariableAndNoDefaultShouldFail() [Fact] public async Task ParseDocumentWithEmptyPathsSucceeds() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithEmptyPaths.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithEmptyPaths.yaml"), SettingsFixture.ReaderSettings); Assert.Empty(result.Diagnostic.Errors); } @@ -1342,7 +1342,7 @@ public async Task ParseDocumentWithEmptyPathsSucceeds() public async Task ParseDocumentWithExampleReferencesPasses() { // Act & Assert: Ensure no NullReferenceException is thrown - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithExampleReferences.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "docWithExampleReferences.yaml"), SettingsFixture.ReaderSettings); Assert.Empty(result.Diagnostic.Errors); } @@ -1350,7 +1350,7 @@ public async Task ParseDocumentWithExampleReferencesPasses() public async Task ParseDocumentWithNonStandardMIMETypePasses() { // Act & Assert: Ensure NotSupportedException is not thrown for non-standard MIME type: text/x-yaml - var result = await OpenApiDocument.LoadAsync(codacyApi); + var result = await OpenApiDocument.LoadAsync(codacyApi, SettingsFixture.ReaderSettings); Assert.NotNull(result.Document); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs index 643f2b59a..91d2a6059 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs @@ -18,7 +18,7 @@ public class OpenApiEncodingTests public async Task ParseBasicEncodingShouldSucceed() { // Act - var encoding = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var encoding = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicEncoding.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -34,7 +34,7 @@ public async Task ParseAdvancedEncodingShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "advancedEncoding.yaml")); // Act - var encoding = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new()); + var encoding = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index c2c3e8fe9..4ddd902e8 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -19,7 +19,7 @@ public class OpenApiExampleTests [Fact] public async Task ParseAdvancedExampleShouldSucceed() { - var example = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var example = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); var expected = new OpenApiExample { Value = new JsonObject @@ -71,7 +71,7 @@ public async Task ParseAdvancedExampleShouldSucceed() [Fact] public async Task ParseExampleForcedStringSucceed() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "explicitString.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "explicitString.yaml"), SettingsFixture.ReaderSettings); 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 3167f04b2..8e5cb6389 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -22,7 +22,7 @@ public class OpenApiInfoTests public async Task ParseAdvancedInfoShouldSucceed() { // Act - var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert openApiInfo.Should().BeEquivalentTo( @@ -79,7 +79,7 @@ public async Task ParseAdvancedInfoShouldSucceed() public async Task ParseBasicInfoShouldSucceed() { // Act - var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "basicInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -109,7 +109,7 @@ public async Task ParseMinimalInfoShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "minimalInfo.yaml")); // Act - var openApiInfo = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new()); + var openApiInfo = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 0c31e385d..f60ec2820 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -23,7 +23,7 @@ public class OpenApiMediaTypeTests public async Task ParseMediaTypeWithExampleShouldSucceed() { // Act - var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert mediaType.Should().BeEquivalentTo( @@ -44,7 +44,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() public async Task ParseMediaTypeWithExamplesShouldSucceed() { // Act - var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var mediaType = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert mediaType.Should().BeEquivalentTo( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index 6c7e6a671..9eb1cf667 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -19,7 +19,7 @@ public class OpenApiOperationTests [Fact] public async Task OperationWithSecurityRequirementShouldReferenceSecurityScheme() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "securedOperation.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "securedOperation.yaml"), SettingsFixture.ReaderSettings); var securityScheme = result.Document.Paths["/"].Operations[OperationType.Get].Security[0].Keys.First(); Assert.Equivalent(result.Document.Components.SecuritySchemes.First().Value, securityScheme); @@ -33,7 +33,7 @@ public async Task ParseOperationWithParameterWithNoLocationShouldSucceed() Tags = { new OpenApiTag() { Name = "user" } } }; // Act - var operation = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0, openApiDocument); + var operation = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "operationWithParameterWithNoLocation.json"), OpenApiSpecVersion.OpenApi3_0, openApiDocument, SettingsFixture.ReaderSettings); var expectedOp = new OpenApiOperation { Tags = diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index ac5ac4aca..33ebb0267 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -26,7 +26,7 @@ public async Task ParsePathParameterShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "pathParameter.yaml")); // Act - var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -47,7 +47,7 @@ public async Task ParsePathParameterShouldSucceed() public async Task ParseQueryParameterShouldSucceed() { // Act - var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -74,7 +74,7 @@ public async Task ParseQueryParameterShouldSucceed() public async Task ParseQueryParameterWithObjectTypeShouldSucceed() { // Act - var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "queryParameterWithObjectType.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -101,7 +101,7 @@ public async Task ParseQueryParameterWithObjectTypeAndContentShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "queryParameterWithObjectTypeAndContent.yaml")); // Act - var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -142,7 +142,7 @@ public async Task ParseQueryParameterWithObjectTypeAndContentShouldSucceed() public async Task ParseHeaderParameterShouldSucceed() { // Act - var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "headerParameter.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -170,7 +170,7 @@ public async Task ParseHeaderParameterShouldSucceed() public async Task ParseParameterWithNullLocationShouldSucceed() { // Act - var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithNullLocation.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -194,7 +194,7 @@ public async Task ParseParameterWithNoLocationShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithNoLocation.yaml")); // Act - var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -218,7 +218,7 @@ public async Task ParseParameterWithUnknownLocationShouldSucceed() using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "parameterWithUnknownLocation.yaml")); // Act - var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(stream, OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -239,7 +239,7 @@ public async Task ParseParameterWithUnknownLocationShouldSucceed() public async Task ParseParameterWithExampleShouldSucceed() { // Act - var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert parameter.Should().BeEquivalentTo( @@ -262,7 +262,7 @@ public async Task ParseParameterWithExampleShouldSucceed() public async Task ParseParameterWithExamplesShouldSucceed() { // Act - var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var parameter = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // 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 9c3fd10c8..788dc2609 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs @@ -19,7 +19,7 @@ public class OpenApiResponseTests [Fact] public async Task ResponseWithReferencedHeaderShouldReferenceComponent() { - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "responseWithHeaderReference.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "responseWithHeaderReference.yaml"), SettingsFixture.ReaderSettings); var response = result.Document.Components.Responses["Test"]; var expected = response.Headers.First().Value; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs index 1d40a2240..7d57294c2 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs @@ -62,7 +62,7 @@ public void ParseExampleStringFragmentShouldSucceed() }"; // Act - var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic); + var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic, settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent(new OpenApiDiagnostic(), diagnostic); @@ -85,7 +85,7 @@ public void ParseEnumFragmentShouldSucceed() ]"; // Act - var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic); + var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic, settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent(new OpenApiDiagnostic(), diagnostic); @@ -110,7 +110,7 @@ public void ParsePathFragmentShouldSucceed() "; // Act - var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic, "yaml"); + var openApiAny = OpenApiModelFactory.Parse(input, OpenApiSpecVersion.OpenApi3_0, new(), out var diagnostic, "yaml", SettingsFixture.ReaderSettings); // Assert Assert.Equivalent(new OpenApiDiagnostic(), diagnostic); @@ -225,7 +225,7 @@ public void ParseBasicSchemaWithExampleShouldSucceed() public async Task ParseBasicSchemaWithReferenceShouldSucceed() { // Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "basicSchemaWithReference.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "basicSchemaWithReference.yaml"), SettingsFixture.ReaderSettings); // Assert var components = result.Document.Components; @@ -291,7 +291,7 @@ public async Task ParseBasicSchemaWithReferenceShouldSucceed() public async Task ParseAdvancedSchemaWithReferenceShouldSucceed() { // Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "advancedSchemaWithReference.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "advancedSchemaWithReference.yaml"), SettingsFixture.ReaderSettings); var expectedComponents = new OpenApiComponents { @@ -388,7 +388,7 @@ public async Task ParseAdvancedSchemaWithReferenceShouldSucceed() public async Task ParseExternalReferenceSchemaShouldSucceed() { // Act - var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "externalReferencesSchema.yaml")); + var result = await OpenApiDocument.LoadAsync(Path.Combine(SampleFolderPath, "externalReferencesSchema.yaml"), SettingsFixture.ReaderSettings); // Assert var components = result.Document.Components; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs index 2f1376c90..ed864d240 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs @@ -18,7 +18,7 @@ public class OpenApiSecuritySchemeTests public async Task ParseHttpSecuritySchemeShouldSucceed() { // Act - var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "httpSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -33,7 +33,7 @@ public async Task ParseHttpSecuritySchemeShouldSucceed() public async Task ParseApiKeySecuritySchemeShouldSucceed() { // Act - var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "apiKeySecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -49,7 +49,7 @@ public async Task ParseApiKeySecuritySchemeShouldSucceed() public async Task ParseBearerSecuritySchemeShouldSucceed() { // Act - var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "bearerSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -65,7 +65,7 @@ public async Task ParseBearerSecuritySchemeShouldSucceed() public async Task ParseOAuth2SecuritySchemeShouldSucceed() { // Act - var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "oauth2SecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( @@ -91,7 +91,7 @@ public async Task ParseOAuth2SecuritySchemeShouldSucceed() public async Task ParseOpenIdConnectSecuritySchemeShouldSucceed() { // Act - var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new()); + var securityScheme = await OpenApiModelFactory.LoadAsync(Path.Combine(SampleFolderPath, "openIdConnectSecurityScheme.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs index 3c0ce2997..825a90574 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs @@ -19,7 +19,7 @@ public class OpenApiXmlTests public async Task ParseBasicXmlShouldSucceed() { // Act - var xml = await OpenApiModelFactory.LoadAsync(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), OpenApiSpecVersion.OpenApi3_0, new()); + var xml = await OpenApiModelFactory.LoadAsync(Resources.GetStream(Path.Combine(SampleFolderPath, "basicXml.yaml")), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings); // Assert Assert.Equivalent( From 0a819b454944d2a0e46bccc46062896a9c12d068 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:45:19 -0500 Subject: [PATCH 09/19] chore; updates public api surface for missing cancellation token parameter Signed-off-by: Vincent Biret --- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index bc0ce8cee..23ad2ff24 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -733,7 +733,7 @@ namespace Microsoft.OpenApi.Models public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SetReferenceHostDocument() { } 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(string url, Microsoft.OpenApi.Reader.OpenApiReaderSettings? settings = null, System.Threading.CancellationToken token = default) { } 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) { } public static Microsoft.OpenApi.Reader.ReadResult Parse(string input, string? format = null, Microsoft.OpenApi.Reader.OpenApiReaderSettings? settings = null) { } } From cea892957d79a5f1bc314abd51452e92e233da11 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 08:55:00 -0500 Subject: [PATCH 10/19] chore: fixes potential NRT Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 5fc4e5ec7..21ed4c48a 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -68,6 +68,7 @@ public static ReadResult Load(MemoryStream stream, public static T Load(MemoryStream input, OpenApiSpecVersion version, string format, OpenApiDocument openApiDocument, out OpenApiDiagnostic diagnostic, OpenApiReaderSettings settings = null) where T : IOpenApiElement { format ??= InspectStreamFormat(input); + settings ??= DefaultReaderSettings.Value; return settings.Readers[format].ReadFragment(input, version, openApiDocument, out diagnostic, settings); } @@ -234,14 +235,15 @@ public static T Parse(string input, return Load(stream, version, format, openApiDocument, out diagnostic, settings); } - private static readonly OpenApiReaderSettings DefaultReaderSettings = new(); + private static readonly Lazy DefaultReaderSettings = new(() => new OpenApiReaderSettings()); private static async Task InternalLoadAsync(Stream input, string format, OpenApiReaderSettings settings, CancellationToken cancellationToken = default) { + settings ??= DefaultReaderSettings.Value; var reader = settings.Readers[format]; var readResult = await reader.ReadAsync(input, settings, cancellationToken).ConfigureAwait(false); - if (settings?.LoadExternalRefs ?? DefaultReaderSettings.LoadExternalRefs) + if (settings.LoadExternalRefs) { var diagnosticExternalRefs = await LoadExternalRefsAsync(readResult.Document, settings, format, cancellationToken).ConfigureAwait(false); // Merge diagnostics of external reference @@ -269,7 +271,8 @@ private static async Task LoadExternalRefsAsync(OpenApiDocume private static ReadResult InternalLoad(MemoryStream input, string format, OpenApiReaderSettings settings) { - if (settings?.LoadExternalRefs ?? DefaultReaderSettings.LoadExternalRefs) + settings ??= DefaultReaderSettings.Value; + if (settings.LoadExternalRefs) { throw new InvalidOperationException("Loading external references are not supported when using synchronous methods."); } From 9b910f3928ebcb24560ff004a58e5d397ed3d836 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 09:06:35 -0500 Subject: [PATCH 11/19] fix: moves the http client for the reader to settings so it can be passed by client application Signed-off-by: Vincent Biret --- .../Reader/OpenApiModelFactory.cs | 13 ++++++------- .../Reader/OpenApiReaderSettings.cs | 18 ++++++++++++++++++ .../PublicApi/PublicApi.approved.txt | 1 + 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 21ed4c48a..15dca4eec 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Linq; -using System.Net.Http; using System.Security; using System.Text; using System.Threading; @@ -21,8 +20,6 @@ namespace Microsoft.OpenApi.Reader /// public static class OpenApiModelFactory { - private static readonly HttpClient _httpClient = new(); - /// /// Loads the input stream and parses it into an Open API document. /// @@ -81,7 +78,8 @@ public static T Load(MemoryStream input, OpenApiSpecVersion version, string f /// public static async Task LoadAsync(string url, OpenApiReaderSettings settings = null, CancellationToken token = default) { - var (stream, format) = await RetrieveStreamAndFormatAsync(url, token).ConfigureAwait(false); + settings ??= DefaultReaderSettings.Value; + var (stream, format) = await RetrieveStreamAndFormatAsync(url, settings, token).ConfigureAwait(false); return await LoadAsync(stream, format, settings, token).ConfigureAwait(false); } @@ -98,7 +96,8 @@ public static async Task LoadAsync(string url, OpenApiReaderSettings /// The OpenAPI element. 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); + settings ??= DefaultReaderSettings.Value; + var (stream, format) = await RetrieveStreamAndFormatAsync(url, settings, token).ConfigureAwait(false); return await LoadAsync(stream, version, openApiDocument, format, settings, token); } @@ -286,7 +285,7 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp return readResult; } - private static async Task<(Stream, string)> RetrieveStreamAndFormatAsync(string url, CancellationToken token = default) + private static async Task<(Stream, string)> RetrieveStreamAndFormatAsync(string url, OpenApiReaderSettings settings, CancellationToken token = default) { if (!string.IsNullOrEmpty(url)) { @@ -296,7 +295,7 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { - var response = await _httpClient.GetAsync(url, token).ConfigureAwait(false); + var response = await settings.HttpClient.GetAsync(url, token).ConfigureAwait(false); var mediaType = response.Content.Headers.ContentType.MediaType; var contentType = mediaType.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)[0]; format = contentType.Split('/').Last().Split('+').Last().Split('-').Last(); diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index 574815cd2..12ec7cb6d 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net.Http; using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.MicrosoftExtensions; @@ -17,6 +18,23 @@ namespace Microsoft.OpenApi.Reader /// public class OpenApiReaderSettings { + private static readonly Lazy httpClient = new(() => new HttpClient()); + private HttpClient _httpClient; + /// + /// HttpClient to use for making requests and retrieve documents + /// + public HttpClient HttpClient + { + get + { + _httpClient ??= httpClient.Value; + return _httpClient; + } + init + { + _httpClient = value; + } + } /// /// Adds a reader for the specified format /// diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 23ad2ff24..690c3f484 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1497,6 +1497,7 @@ namespace Microsoft.OpenApi.Reader public Microsoft.OpenApi.Interfaces.IStreamLoader CustomExternalLoader { get; set; } public System.Collections.Generic.List DefaultContentType { get; set; } public System.Collections.Generic.Dictionary> ExtensionParsers { get; set; } + public System.Net.Http.HttpClient HttpClient { get; init; } public bool LeaveStreamOpen { get; set; } public bool LoadExternalRefs { get; set; } public System.Collections.Generic.Dictionary Readers { get; init; } From 205fec19b9f4243ce9cad57d6fdb3ec9642e3a6e Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 09:09:02 -0500 Subject: [PATCH 12/19] chore: changes visibility of client getter to avoid it being used for other aspects Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs | 2 +- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index 12ec7cb6d..166d80b11 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -25,7 +25,7 @@ public class OpenApiReaderSettings /// public HttpClient HttpClient { - get + internal get { _httpClient ??= httpClient.Value; return _httpClient; diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 690c3f484..6d8756f19 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1497,7 +1497,7 @@ namespace Microsoft.OpenApi.Reader public Microsoft.OpenApi.Interfaces.IStreamLoader CustomExternalLoader { get; set; } public System.Collections.Generic.List DefaultContentType { get; set; } public System.Collections.Generic.Dictionary> ExtensionParsers { get; set; } - public System.Net.Http.HttpClient HttpClient { get; init; } + public System.Net.Http.HttpClient HttpClient { init; } public bool LeaveStreamOpen { get; set; } public bool LoadExternalRefs { get; set; } public System.Collections.Generic.Dictionary Readers { get; init; } From f257ad5da23762b156efe0fa905ca9d4f7448714 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 09:24:31 -0500 Subject: [PATCH 13/19] fix avoid creating a client for each request in hidi Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 68f79790c..72bb66231 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -492,6 +492,11 @@ private static Dictionary> EnumerateJsonDocument(JsonElemen return paths; } + private static readonly Lazy httpClient = new(() => new HttpClient() + { + DefaultRequestVersion = HttpVersion.Version20 + }); + /// /// Reads stream from file system or makes HTTP request depending on the input string /// @@ -507,11 +512,7 @@ private static async Task GetStreamAsync(string input, ILogger logger, C { try { - using var httpClient = new HttpClient - { - DefaultRequestVersion = HttpVersion.Version20 - }; - stream = await httpClient.GetStreamAsync(new Uri(input), cancellationToken).ConfigureAwait(false); + stream = await httpClient.Value.GetStreamAsync(new Uri(input), cancellationToken).ConfigureAwait(false); } catch (HttpRequestException ex) { From 0f23798f61ac964f9e71ef7402213392ebe91151 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 09:25:37 -0500 Subject: [PATCH 14/19] fix: avoid creating new http clients to load additional documents of the workspace Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs | 2 +- .../Reader/Services/DefaultStreamLoader.cs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 15dca4eec..2b879fdb4 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -263,7 +263,7 @@ private static async Task LoadExternalRefsAsync(OpenApiDocume var openApiWorkSpace = new OpenApiWorkspace(baseUrl); // Load this root document into the workspace - var streamLoader = new DefaultStreamLoader(settings.BaseUrl); + var streamLoader = new DefaultStreamLoader(settings.BaseUrl, settings.HttpClient); var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, settings.CustomExternalLoader ?? streamLoader, settings); return await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document, format ?? OpenApiConstants.Json, null, token).ConfigureAwait(false); } diff --git a/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs b/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs index ef00c496f..ad36e5554 100644 --- a/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs +++ b/src/Microsoft.OpenApi/Reader/Services/DefaultStreamLoader.cs @@ -18,15 +18,17 @@ namespace Microsoft.OpenApi.Reader.Services public class DefaultStreamLoader : IStreamLoader { private readonly Uri baseUrl; - private readonly HttpClient _httpClient = new(); + private readonly HttpClient _httpClient; /// /// The default stream loader /// /// - public DefaultStreamLoader(Uri baseUrl) + /// The HttpClient to use to retrieve documents when needed + public DefaultStreamLoader(Uri baseUrl, HttpClient httpClient) { this.baseUrl = baseUrl; + _httpClient = Utils.CheckArgumentNull(httpClient); } /// From f260e587381dec0b7afb4b1ecf83093e6dae5d95 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 09:28:31 -0500 Subject: [PATCH 15/19] chore: updates public api surface export Signed-off-by: Vincent Biret --- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 6d8756f19..9a919baef 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1548,7 +1548,7 @@ namespace Microsoft.OpenApi.Reader.Services { public class DefaultStreamLoader : Microsoft.OpenApi.Interfaces.IStreamLoader { - public DefaultStreamLoader(System.Uri baseUrl) { } + public DefaultStreamLoader(System.Uri baseUrl, System.Net.Http.HttpClient httpClient) { } public System.Threading.Tasks.Task LoadAsync(System.Uri uri, System.Threading.CancellationToken cancellationToken = default) { } } } From 9386faec70655279ec3a031fd2afcd9cab09af40 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 25 Feb 2025 09:32:52 -0500 Subject: [PATCH 16/19] fix: use a single http client in hidi Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi.Hidi/OpenApiService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index 72bb66231..692e35c0d 100644 --- a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs +++ b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs @@ -386,7 +386,8 @@ private static async Task ParseOpenApiAsync(string openApiFile, bool LoadExternalRefs = inlineExternal, BaseUrl = openApiFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? new(openApiFile) : - new Uri("file://" + new FileInfo(openApiFile).DirectoryName + Path.DirectorySeparatorChar) + new Uri("file://" + new FileInfo(openApiFile).DirectoryName + Path.DirectorySeparatorChar), + HttpClient = httpClient.Value }; settings.AddYamlReader(); From c632305bf2fdedcd42ee90ce400a9574bee8fec8 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 26 Feb 2025 07:24:20 -0500 Subject: [PATCH 17/19] chore: use try add instead of add Signed-off-by: Vincent Biret --- .../OpenApiReaderSettingsExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs index 96c44cf73..aa9974218 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs @@ -22,7 +22,7 @@ public static void AddYamlReader(this OpenApiReaderSettings settings) private static void AddReaderToSettings(this OpenApiReaderSettings settings, string format, IOpenApiReader reader) { #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER - settings.Readers.Add(format, reader); + settings.Readers.TryAdd(format, reader); #else if (!settings.Readers.ContainsKey(format)) { From 31bfaace7fa72f6c9e457e4e19082674973caace Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 26 Feb 2025 08:11:46 -0500 Subject: [PATCH 18/19] chore: adds tests on readers settings chore: adds method with explicit exception when adding readers Signed-off-by: Vincent Biret --- .../OpenApiReaderSettingsExtensions.cs | 15 +--- .../Reader/OpenApiModelFactory.cs | 6 +- .../Reader/OpenApiReaderSettings.cs | 84 ++++++++++++++----- .../OpenApiReaderSettingsExtensionsTests.cs | 32 +++++++ .../PublicApi/PublicApi.approved.txt | 1 + .../Reader/OpenApiReaderSettingsTests.cs | 78 +++++++++++++++++ 6 files changed, 181 insertions(+), 35 deletions(-) create mode 100644 test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderSettingsExtensionsTests.cs create mode 100644 test/Microsoft.OpenApi.Tests/Reader/OpenApiReaderSettingsTests.cs diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs index aa9974218..a60e051a8 100644 --- a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs @@ -16,18 +16,7 @@ public static class OpenApiReaderSettingsExtensions public static void AddYamlReader(this OpenApiReaderSettings settings) { var yamlReader = new OpenApiYamlReader(); - settings.AddReaderToSettings(OpenApiConstants.Yaml, yamlReader); - settings.AddReaderToSettings(OpenApiConstants.Yml, yamlReader); - } - private static void AddReaderToSettings(this OpenApiReaderSettings settings, string format, IOpenApiReader reader) - { -#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER - settings.Readers.TryAdd(format, reader); -#else - if (!settings.Readers.ContainsKey(format)) - { - settings.Readers.Add(format, reader); - } -#endif + settings.TryAddReader(OpenApiConstants.Yaml, yamlReader); + settings.TryAddReader(OpenApiConstants.Yml, yamlReader); } } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs index 2b879fdb4..c30f16777 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiModelFactory.cs @@ -66,7 +66,7 @@ public static T Load(MemoryStream input, OpenApiSpecVersion version, string f { format ??= InspectStreamFormat(input); settings ??= DefaultReaderSettings.Value; - return settings.Readers[format].ReadFragment(input, version, openApiDocument, out diagnostic, settings); + return settings.GetReader(format).ReadFragment(input, version, openApiDocument, out diagnostic, settings); } /// @@ -239,7 +239,7 @@ public static T Parse(string input, private static async Task InternalLoadAsync(Stream input, string format, OpenApiReaderSettings settings, CancellationToken cancellationToken = default) { settings ??= DefaultReaderSettings.Value; - var reader = settings.Readers[format]; + var reader = settings.GetReader(format); var readResult = await reader.ReadAsync(input, settings, cancellationToken).ConfigureAwait(false); if (settings.LoadExternalRefs) @@ -280,7 +280,7 @@ private static ReadResult InternalLoad(MemoryStream input, string format, OpenAp throw new ArgumentException($"Cannot parse the stream: {nameof(input)} is empty or contains no elements."); } - var reader = settings.Readers[format]; + var reader = settings.GetReader(format); var readResult = reader.Read(input, settings); return readResult; } diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index 166d80b11..c8c206ff7 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -40,23 +40,66 @@ internal get /// public void AddJsonReader() { + TryAddReader(OpenApiConstants.Json, new OpenApiJsonReader()); + } + /// + /// Gets the reader for the specified format + /// + /// Format to fetch the reader for + /// The retrieved reader + /// When no reader is registered for that format + internal IOpenApiReader GetReader(string format) + { + Utils.CheckArgumentNullOrEmpty(format); + if (Readers.TryGetValue(format, out var reader)) + { + return reader; + } + + throw new NotSupportedException($"Format '{format}' is not supported."); + } + /// + /// Adds a reader for the specified format. + /// This method is a no-op if the reader already exists. + /// This method is equivalent to TryAdd, is provided for compatibility reasons and TryAdd should be used instead when available. + /// + /// Format to add a reader for + /// Reader to add + /// True if the reader was added, false if it already existed + public bool TryAddReader(string format, IOpenApiReader reader) + { + Utils.CheckArgumentNullOrEmpty(format); + Utils.CheckArgumentNull(reader); #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER - Readers.TryAdd(OpenApiConstants.Json, new OpenApiJsonReader()); + return Readers.TryAdd(format, reader); #else - if (!Readers.ContainsKey(OpenApiConstants.Json)) + if (!Readers.ContainsKey(format)) { - Readers.Add(OpenApiConstants.Json, new OpenApiJsonReader()); + Readers.Add(format, reader); + return true; } + return false; #endif } - /// - /// Readers to use to parse the OpenAPI document - /// - public Dictionary Readers { get; init; } = new Dictionary(StringComparer.OrdinalIgnoreCase) + private Dictionary _readers = new(StringComparer.OrdinalIgnoreCase) { { OpenApiConstants.Json, new OpenApiJsonReader() } }; /// + /// Readers to use to parse the OpenAPI document + /// + public Dictionary Readers + { + get => _readers; + init + { + Utils.CheckArgumentNull(value); + _readers = value.Comparer == StringComparer.OrdinalIgnoreCase ? + value : + new Dictionary(value, StringComparer.OrdinalIgnoreCase); + } + } + /// /// When external references are found, load them into a shared workspace /// public bool LoadExternalRefs { get; set; } = false; @@ -107,18 +150,21 @@ public void AddJsonReader() /// public void AddMicrosoftExtensionParsers() { - if (!ExtensionParsers.ContainsKey(OpenApiPagingExtension.Name)) - ExtensionParsers.Add(OpenApiPagingExtension.Name, static (i, _) => OpenApiPagingExtension.Parse(i)); - if (!ExtensionParsers.ContainsKey(OpenApiEnumValuesDescriptionExtension.Name)) - ExtensionParsers.Add(OpenApiEnumValuesDescriptionExtension.Name, static (i, _ ) => OpenApiEnumValuesDescriptionExtension.Parse(i)); - if (!ExtensionParsers.ContainsKey(OpenApiPrimaryErrorMessageExtension.Name)) - ExtensionParsers.Add(OpenApiPrimaryErrorMessageExtension.Name, static (i, _ ) => OpenApiPrimaryErrorMessageExtension.Parse(i)); - if (!ExtensionParsers.ContainsKey(OpenApiDeprecationExtension.Name)) - ExtensionParsers.Add(OpenApiDeprecationExtension.Name, static (i, _ ) => OpenApiDeprecationExtension.Parse(i)); - if (!ExtensionParsers.ContainsKey(OpenApiReservedParameterExtension.Name)) - ExtensionParsers.Add(OpenApiReservedParameterExtension.Name, static (i, _ ) => OpenApiReservedParameterExtension.Parse(i)); - if (!ExtensionParsers.ContainsKey(OpenApiEnumFlagsExtension.Name)) - ExtensionParsers.Add(OpenApiEnumFlagsExtension.Name, static (i, _ ) => OpenApiEnumFlagsExtension.Parse(i)); + TryAddExtensionParser(OpenApiPagingExtension.Name, static (i, _) => OpenApiPagingExtension.Parse(i)); + TryAddExtensionParser(OpenApiEnumValuesDescriptionExtension.Name, static (i, _ ) => OpenApiEnumValuesDescriptionExtension.Parse(i)); + TryAddExtensionParser(OpenApiPrimaryErrorMessageExtension.Name, static (i, _ ) => OpenApiPrimaryErrorMessageExtension.Parse(i)); + TryAddExtensionParser(OpenApiDeprecationExtension.Name, static (i, _ ) => OpenApiDeprecationExtension.Parse(i)); + TryAddExtensionParser(OpenApiReservedParameterExtension.Name, static (i, _ ) => OpenApiReservedParameterExtension.Parse(i)); + TryAddExtensionParser(OpenApiEnumFlagsExtension.Name, static (i, _ ) => OpenApiEnumFlagsExtension.Parse(i)); + } + private void TryAddExtensionParser(string name, Func parser) + { +#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP || NET5_0_OR_GREATER + ExtensionParsers.TryAdd(name, parser); +#else + if (!ExtensionParsers.ContainsKey(name)) + ExtensionParsers.Add(name, parser); +#endif } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderSettingsExtensionsTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderSettingsExtensionsTests.cs new file mode 100644 index 000000000..2d69bcf73 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderSettingsExtensionsTests.cs @@ -0,0 +1,32 @@ +using System; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Reader; +using Xunit; + +namespace Microsoft.OpenApi.Readers.Tests; + +public class OpenApiReaderSettingsExtensionsTests +{ + [Fact] + public void AddsYamlReader() + { + var settings = new OpenApiReaderSettings(); + Assert.Single(settings.Readers); + Assert.DoesNotContain(OpenApiConstants.Yaml, settings.Readers.Keys); + Assert.DoesNotContain(OpenApiConstants.Yml, settings.Readers.Keys); + + settings.AddYamlReader(); + Assert.Equal(3, settings.Readers.Count); + Assert.Contains(OpenApiConstants.Yaml, settings.Readers.Keys); + Assert.Contains(OpenApiConstants.Yml, settings.Readers.Keys); + Assert.IsType(settings.GetReader(OpenApiConstants.Yaml)); + Assert.IsType(settings.GetReader(OpenApiConstants.Yml)); + } + [Fact] + public void IsAvailableOnSameNamespace() + { + var settingsNS = typeof(OpenApiReaderSettings).Namespace; + var extensionsNS = typeof(OpenApiReaderSettingsExtensions).Namespace; + Assert.Equal(settingsNS, extensionsNS, StringComparer.Ordinal); + } +} diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 90e856f49..76697d7ae 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1504,6 +1504,7 @@ namespace Microsoft.OpenApi.Reader public Microsoft.OpenApi.Validations.ValidationRuleSet RuleSet { get; set; } public void AddJsonReader() { } public void AddMicrosoftExtensionParsers() { } + public bool TryAddReader(string format, Microsoft.OpenApi.Interfaces.IOpenApiReader reader) { } } public static class OpenApiVersionExtensionMethods { diff --git a/test/Microsoft.OpenApi.Tests/Reader/OpenApiReaderSettingsTests.cs b/test/Microsoft.OpenApi.Tests/Reader/OpenApiReaderSettingsTests.cs new file mode 100644 index 000000000..b01289c1d --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Reader/OpenApiReaderSettingsTests.cs @@ -0,0 +1,78 @@ +using System; +using Microsoft.OpenApi.MicrosoftExtensions; +using Microsoft.OpenApi.Models; +using Xunit; + +namespace Microsoft.OpenApi.Reader.Tests; + +public class OpenApiReaderSettingsTests +{ + [Fact] + public void Defensive() + { + var settings = new OpenApiReaderSettings(); + Assert.Throws(() => settings.GetReader(null)); + Assert.Throws(() => settings.GetReader(string.Empty)); + + Assert.Throws(() => settings.TryAddReader(null, null)); + Assert.Throws(() => settings.TryAddReader(string.Empty, null)); + Assert.Throws(() => settings.TryAddReader(null, new OpenApiJsonReader())); + Assert.Throws(() => settings.TryAddReader(string.Empty, new OpenApiJsonReader())); + Assert.Throws(() => settings.TryAddReader("json", null)); + } + + [Fact] + public void Defaults() + { + var settings = new OpenApiReaderSettings(); + Assert.NotNull(settings.HttpClient); + + Assert.IsType(settings.GetReader(OpenApiConstants.Json)); + Assert.Throws(() =>settings.GetReader(OpenApiConstants.Yaml)); + Assert.Single(settings.Readers); + + Assert.Equal(StringComparer.OrdinalIgnoreCase, settings.Readers.Comparer); + + Assert.False(settings.TryAddReader("json", new OpenApiJsonReader())); + Assert.Empty(settings.ExtensionParsers); + } + [Fact] + public void InitializesReadersWithComparer() + { + var settings = new OpenApiReaderSettings + { + Readers = [] + }; + + Assert.Equal(StringComparer.OrdinalIgnoreCase, settings.Readers.Comparer); + } + [Fact] + public void AddsMicrosoftExtensions() + { + var settings = new OpenApiReaderSettings(); + Assert.Empty(settings.ExtensionParsers); + settings.AddMicrosoftExtensionParsers(); + + Assert.NotEmpty(settings.ExtensionParsers); + Assert.Contains(OpenApiPagingExtension.Name, settings.ExtensionParsers.Keys); + Assert.Contains(OpenApiEnumValuesDescriptionExtension.Name, settings.ExtensionParsers.Keys); + Assert.Contains(OpenApiPrimaryErrorMessageExtension.Name, settings.ExtensionParsers.Keys); + Assert.Contains(OpenApiDeprecationExtension.Name, settings.ExtensionParsers.Keys); + Assert.Contains(OpenApiReservedParameterExtension.Name, settings.ExtensionParsers.Keys); + Assert.Contains(OpenApiEnumFlagsExtension.Name, settings.ExtensionParsers.Keys); + } + [Fact] + public void AddsJsonReader() + { + var settings = new OpenApiReaderSettings() + { + Readers = [] + }; + + Assert.Empty(settings.Readers); + + settings.AddJsonReader(); + Assert.Single(settings.Readers); + Assert.IsType(settings.GetReader(OpenApiConstants.Json)); + } +} From ea6e99b2dd3d3e5af950ad265b41ffea48b7d65b Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 26 Feb 2025 08:29:11 -0500 Subject: [PATCH 19/19] chore: use the implemented operator Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs index c8c206ff7..2d24947b8 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -94,7 +94,7 @@ public Dictionary Readers init { Utils.CheckArgumentNull(value); - _readers = value.Comparer == StringComparer.OrdinalIgnoreCase ? + _readers = value.Comparer is StringComparer stringComparer && stringComparer == StringComparer.OrdinalIgnoreCase ? value : new Dictionary(value, StringComparer.OrdinalIgnoreCase); }