diff --git a/src/Microsoft.OpenApi.Hidi/OpenApiService.cs b/src/Microsoft.OpenApi.Hidi/OpenApiService.cs index c757f4031..692e35c0d 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 /// @@ -392,8 +386,10 @@ 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(); result = await OpenApiDocument.LoadAsync(stream, settings: settings, cancellationToken: cancellationToken).ConfigureAwait(false); @@ -497,6 +493,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 /// @@ -512,11 +513,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) { diff --git a/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs new file mode 100644 index 000000000..a60e051a8 --- /dev/null +++ b/src/Microsoft.OpenApi.Readers/OpenApiReaderSettingsExtensions.cs @@ -0,0 +1,22 @@ +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Readers; + +namespace Microsoft.OpenApi.Reader; + +/// +/// 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.TryAddReader(OpenApiConstants.Yaml, yamlReader); + settings.TryAddReader(OpenApiConstants.Yml, yamlReader); + } +} diff --git a/src/Microsoft.OpenApi.Workbench/MainModel.cs b/src/Microsoft.OpenApi.Workbench/MainModel.cs index f5c0b2768..7cfbb0084 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,7 @@ internal async Task ParseDocumentAsync() { RuleSet = ValidationRuleSet.GetDefaultRuleSet() }; + settings.AddYamlReader(); if (ResolveExternal && !string.IsNullOrWhiteSpace(_inputFile)) { settings.BaseUrl = _inputFile.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? new(_inputFile) diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 3504a92f7..9c8a9b2a7 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -562,10 +562,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 c86c014da..c30f16777 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,13 +20,6 @@ namespace Microsoft.OpenApi.Reader /// 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. /// @@ -73,7 +65,8 @@ 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); + settings ??= DefaultReaderSettings.Value; + return settings.GetReader(format).ReadFragment(input, version, openApiDocument, out diagnostic, settings); } /// @@ -81,11 +74,12 @@ 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) { - 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); } @@ -102,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); } @@ -239,14 +234,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) { - var reader = OpenApiReaderRegistry.GetReader(format); + settings ??= DefaultReaderSettings.Value; + var reader = settings.GetReader(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 @@ -267,14 +263,15 @@ 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); } 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."); } @@ -283,12 +280,12 @@ 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.GetReader(format); var readResult = reader.Read(input, settings); 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)) { @@ -298,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/OpenApiReaderRegistry.cs b/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs deleted file mode 100644 index b86b5a9c6..000000000 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderRegistry.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; -using System.Collections.Concurrent; -using Microsoft.OpenApi.Interfaces; - -namespace Microsoft.OpenApi.Reader -{ - /// - /// Registry for managing different OpenAPI format providers. - /// - 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. - /// - /// The OpenApi file format. - /// 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..2d24947b8 100644 --- a/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs +++ b/src/Microsoft.OpenApi/Reader/OpenApiReaderSettings.cs @@ -4,9 +4,11 @@ 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; +using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Validations; namespace Microsoft.OpenApi.Reader @@ -16,6 +18,87 @@ 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 + { + internal get + { + _httpClient ??= httpClient.Value; + return _httpClient; + } + init + { + _httpClient = value; + } + } + /// + /// Adds a reader for the specified format + /// + 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 + return Readers.TryAdd(format, reader); +#else + if (!Readers.ContainsKey(format)) + { + Readers.Add(format, reader); + return true; + } + return false; +#endif + } + 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 is StringComparer stringComparer && stringComparer == StringComparer.OrdinalIgnoreCase ? + value : + new Dictionary(value, StringComparer.OrdinalIgnoreCase); + } + } /// /// When external references are found, load them into a shared workspace /// @@ -67,18 +150,21 @@ public class OpenApiReaderSettings /// 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/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); } /// 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); 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/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.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs index 5e065a1e8..8e45891db 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiDiagnosticTests.cs @@ -15,15 +15,10 @@ 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() { - 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); @@ -32,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); @@ -48,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 37080252d..67fed8efe 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/OpenApiReaderTests/OpenApiStreamReaderTests.cs @@ -15,16 +15,12 @@ public class OpenApiStreamReaderTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiDocument/"; - public OpenApiStreamReaderTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] 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); } @@ -34,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); } @@ -48,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); } @@ -64,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 a2badc7c8..720eade40 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] @@ -30,6 +23,7 @@ public async Task LoadingDocumentWithResolveAllReferencesShouldLoadDocumentIntoW CustomExternalLoader = new MockLoader(), BaseUrl = new("file://c:\\") }; + settings.AddYamlReader(); var stream = new MemoryStream(); var doc = """ @@ -59,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/ParseNodeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParseNodeTests.cs index e8d22a14a..8dfb20322 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() { @@ -30,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.")) @@ -56,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.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs index 3edc9ac67..d32c9b46b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ReferenceService/TryLoadReferenceV2Tests.cs @@ -16,17 +16,11 @@ 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() { // 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 @@ -51,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); @@ -69,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); @@ -89,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/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..ab11f4b87 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs @@ -21,11 +21,12 @@ 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")); - 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 136c46892..1059c3b02 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")] @@ -56,7 +51,7 @@ public void ParseDocumentWithDifferentCultureShouldSucceed(string culture) exclusiveMinimum: false paths: {} """, - "yaml"); + "yaml", SettingsFixture.ReaderSettings); result.Document.Should().BeEquivalentTo( new OpenApiDocument @@ -313,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 95452e6ad..23b6825b1 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() { @@ -24,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); } @@ -42,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); } @@ -59,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); @@ -84,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(); @@ -103,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); @@ -127,6 +123,7 @@ public void JustSchemeWithCustomHost() { BaseUrl = new("https://bing.com/foo") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -152,6 +149,7 @@ public void JustSchemeWithCustomHostWithEmptyPath() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -176,6 +174,7 @@ public void JustBasePathWithCustomHost() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -200,6 +199,7 @@ public void JustHostWithCustomHost() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -225,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(); @@ -251,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(); @@ -276,6 +278,7 @@ public void LocalHostWithCustomHost() { BaseUrl = new("https://bing.com") }; + settings.AddYamlReader(); var result = OpenApiDocument.Parse(input, "yaml", settings); @@ -301,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 e5523a08c..f1dc5640c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -20,16 +20,11 @@ public class OpenApiDocumentTests { private const string SampleFolderPath = "V31Tests/Samples/OpenApiDocument/"; - public OpenApiDocumentTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] 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); @@ -224,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 { @@ -434,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 @@ -445,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 @@ -502,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; @@ -525,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); @@ -546,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); @@ -562,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 f7c30f65e..b32840020 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() { @@ -109,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); @@ -182,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, @@ -205,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 { @@ -296,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); @@ -335,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)); @@ -354,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)); @@ -374,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)); @@ -395,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)); @@ -414,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)); @@ -432,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); @@ -472,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(); @@ -516,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 5aabe43d3..cca7e002d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiCallbackTests.cs @@ -16,16 +16,11 @@ 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() { // 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( @@ -68,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; @@ -118,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 6ab83bf3c..1629e1939 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() { @@ -30,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 5359162bf..c54ecb628 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(); @@ -60,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 @@ -91,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); } @@ -99,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( @@ -135,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 @@ -161,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 @@ -185,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 { @@ -571,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 { @@ -1044,7 +1039,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. @@ -1055,7 +1050,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]; @@ -1065,7 +1060,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); @@ -1127,7 +1122,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 @@ -1141,7 +1136,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; @@ -1154,7 +1149,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; @@ -1242,7 +1237,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]; @@ -1276,7 +1271,7 @@ public void ParseBasicDocumentWithServerVariableShouldSucceed() default: v2 enum: [v1, v2] paths: {} - """, "yaml"); + """, "yaml", SettingsFixture.ReaderSettings); var expected = new OpenApiDocument { @@ -1324,7 +1319,7 @@ public void ParseBasicDocumentWithServerVariableAndNoDefaultShouldFail() version: enum: [v1, v2] paths: {} - """, "yaml"); + """, "yaml", SettingsFixture.ReaderSettings); Assert.NotEmpty(result.Diagnostic.Errors); } @@ -1332,7 +1327,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); } @@ -1340,7 +1335,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); } @@ -1348,7 +1343,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 bee674bfc..91d2a6059 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiEncodingTests.cs @@ -14,16 +14,11 @@ public class OpenApiEncodingTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiEncoding/"; - public OpenApiEncodingTests() - { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - } - [Fact] 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( @@ -39,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 2a8691ab3..4ddd902e8 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -16,15 +16,10 @@ public class OpenApiExampleTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiExample/"; - public OpenApiExampleTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [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 @@ -76,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 9a11ef5c3..8e5cb6389 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -18,16 +18,11 @@ public class OpenApiInfoTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiInfo/"; - public OpenApiInfoTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] 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( @@ -84,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( @@ -114,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 2905266fc..f60ec2820 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -19,16 +19,11 @@ public class OpenApiMediaTypeTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiMediaType/"; - public OpenApiMediaTypeTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] 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( @@ -49,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 c7a2317dc..661ca508d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -19,15 +19,10 @@ public class OpenApiOperationTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiOperation/"; - public OpenApiOperationTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [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); @@ -41,7 +36,7 @@ public async Task ParseOperationWithParameterWithNoLocationShouldSucceed() Tags = new HashSet { new() { 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 = new HashSet() diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index efdb87110..33ebb0267 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() { @@ -31,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( @@ -52,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( @@ -79,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( @@ -106,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( @@ -147,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( @@ -175,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( @@ -199,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( @@ -223,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( @@ -244,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( @@ -267,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 2d41ed2e2..788dc2609 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiResponseTests.cs @@ -16,15 +16,10 @@ public class OpenApiResponseTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiResponse/"; - public OpenApiResponseTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [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 04d6de97d..7d57294c2 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() { @@ -67,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); @@ -90,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); @@ -115,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); @@ -230,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; @@ -296,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 { @@ -393,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 b0f02270c..ed864d240 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSecuritySchemeTests.cs @@ -14,16 +14,11 @@ 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() { // 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( @@ -38,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( @@ -54,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( @@ -70,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( @@ -96,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 6485aad21..825a90574 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiXmlTests.cs @@ -15,16 +15,11 @@ public class OpenApiXmlTests { private const string SampleFolderPath = "V3Tests/Samples/OpenApiXml/"; - public OpenApiXmlTests() - { - OpenApiReaderRegistry.RegisterReader("yaml", new OpenApiYamlReader()); - } - [Fact] 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( diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index 35e52cc59..39ca7b8ab 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 = @@ -1687,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; } @@ -1990,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 }); @@ -2044,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 34284b9bd..b9f31f9e9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiCallbackReferenceTests.cs @@ -132,9 +132,8 @@ 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; + 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 a52c027f9..4e2ff6c3e 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -111,9 +111,8 @@ 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 = 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 9b3c6c544..99c90916a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiHeaderReferenceTests.cs @@ -80,9 +80,8 @@ 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 = 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 44822454f..d898dd0b6 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiLinkReferenceTests.cs @@ -123,9 +123,8 @@ 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 = 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 8afc96f04..8078bdbe7 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiParameterReferenceTests.cs @@ -81,9 +81,8 @@ 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 = 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 55c5bc7b5..a6930cf8c 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiPathItemReferenceTests.cs @@ -78,9 +78,8 @@ 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 = 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 ef9bea785..118552c2a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiRequestBodyReferenceTests.cs @@ -86,9 +86,8 @@ 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 = 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 785ea5e55..ec72f1fda 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiResponseReferenceTest.cs @@ -69,9 +69,8 @@ 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 = 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 56b7e6d07..3b5100825 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiSecuritySchemeReferenceTests.cs @@ -43,8 +43,7 @@ public class OpenApiSecuritySchemeReferenceTests public OpenApiSecuritySchemeReferenceTests() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - 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 250f8ee53..bed3500d3 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiTagReferenceTest.cs @@ -63,8 +63,7 @@ public class OpenApiTagReferenceTest public OpenApiTagReferenceTest() { - OpenApiReaderRegistry.RegisterReader(OpenApiConstants.Yaml, new OpenApiYamlReader()); - 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/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 6686f1446..76697d7ae 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) { } } @@ -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() { } @@ -1503,10 +1497,14 @@ 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 { init; } 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 bool TryAddReader(string format, Microsoft.OpenApi.Interfaces.IOpenApiReader reader) { } } public static class OpenApiVersionExtensionMethods { @@ -1551,7 +1549,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) { } } } 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)); + } +} 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; } } +}