From 6e38b406ad63d74d3a13a0397707d6ef242bdbe8 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 16 Apr 2025 14:26:41 -0400 Subject: [PATCH] feat: upgrades to OAI.net preview17 Signed-off-by: Vincent Biret --- .../Edm/ODataContext.cs | 4 +- .../OpenApiEdmTypeSchemaGenerator.cs | 21 ++-- .../Generator/OpenApiLinkGenerator.cs | 2 +- .../Generator/OpenApiParameterGenerator.cs | 6 +- .../Generator/OpenApiResponseGenerator.cs | 8 +- .../Generator/OpenApiSchemaGenerator.cs | 19 ++- .../Generator/OpenApiServerGenerator.cs | 2 +- .../Generator/OpenApiTagGenerator.cs | 2 +- .../Microsoft.OpenAPI.OData.Reader.csproj | 2 +- .../Operation/EntityGetOperationHandler.cs | 2 +- .../EntitySetPostOperationHandler.cs | 2 +- .../Operation/EntityUpdateOperationHandler.cs | 2 +- .../MediaEntityOperationalHandler.cs | 2 +- .../NavigationPropertyGetOperationHandler.cs | 2 +- .../Operation/RefGetOperationHandler.cs | 2 +- .../Operation/SingletonGetOperationHandler.cs | 2 +- ...omLineProcesser.cs => ComLineProcessor.cs} | 18 +-- src/OoasUtil/FileOpenApiGenerator.cs | 2 +- src/OoasUtil/OpenApiGenerator.cs | 4 +- src/OoasUtil/Program.cs | 28 ++--- src/OoasUtil/UrlOpenApiGenerator.cs | 2 +- .../EdmModelOpenApiExtensionsTest.cs | 68 +++++------ .../OpenApiErrorSchemaGeneraratorTests.cs | 2 +- .../Generator/OpenApiSchemaGeneratorTests.cs | 112 +++++++++--------- ...icrosoft.OpenAPI.OData.Reader.Tests.csproj | 2 +- ...mplexPropertyPatchOperationHandlerTests.cs | 2 +- ...omplexPropertyPostOperationHandlerTests.cs | 2 +- ...ComplexPropertyPutOperationHandlerTests.cs | 2 +- .../EdmActionImportOperationHandlerTests.cs | 6 +- .../EdmActionOperationHandlerTests.cs | 10 +- .../EdmFunctionImportOperationHandlerTests.cs | 6 +- .../EdmFunctionOperationHandlerTests.cs | 10 +- .../EntityDeleteOperationHandlerTests.cs | 6 +- .../EntityGetOperationHandlerTests.cs | 6 +- .../EntityPatchOperationHandlerTests.cs | 8 +- .../EntityPutOperationHandlerTests.cs | 8 +- .../EntitySetGetOperationHandlerTests.cs | 8 +- .../EntitySetPostOperationHandlerTests.cs | 6 +- .../MediaEntityPutOperationHandlerTests.cs | 2 +- ...igationPropertyGetOperationHandlerTests.cs | 4 +- ...ationPropertyPatchOperationHandlerTests.cs | 6 +- ...gationPropertyPostOperationHandlerTests.cs | 4 +- ...igationPropertyPutOperationHandlerTests.cs | 6 +- .../ODataTypeCastGetOperationHandlerTests.cs | 8 +- .../SingletonGetOperationHandlerTests.cs | 4 +- .../SingletonPatchOperationHandlerTests.cs | 4 +- .../ComplexPropertyPathItemHandlerTests.cs | 16 ++- .../PathItem/EntityPathItemHandlerTests.cs | 2 +- .../PathItem/EntitySetPathItemHandlerTests.cs | 9 +- .../NavigationPropertyPathItemHandlerTests.cs | 15 ++- .../OperationImportPathItemHandlerTests.cs | 10 +- 51 files changed, 260 insertions(+), 228 deletions(-) rename src/OoasUtil/{ComLineProcesser.cs => ComLineProcessor.cs} (97%) diff --git a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataContext.cs b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataContext.cs index 1441a32fd..4128d6769 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Edm/ODataContext.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Edm/ODataContext.cs @@ -136,7 +136,7 @@ public IEnumerable AllPaths /// /// Gets all tags. /// - public ISet? Tags { get; private set; } + public HashSet? Tags { get; private set; } /// /// Append tag. @@ -144,7 +144,7 @@ public IEnumerable AllPaths /// The tag item. internal void AppendTag(OpenApiTag tagItem) { - Tags ??= new HashSet(); + Tags ??= []; if (tagItem.Name is not null && FindTagByName(tagItem.Name) is not null) { diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiEdmTypeSchemaGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiEdmTypeSchemaGenerator.cs index fc1e4e689..40ea8a048 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiEdmTypeSchemaGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiEdmTypeSchemaGenerator.cs @@ -15,6 +15,7 @@ using Microsoft.OpenApi.Extensions; using Microsoft.OpenApi.Models.References; using Microsoft.OpenApi.Models.Interfaces; +using System.Globalization; namespace Microsoft.OpenApi.OData.Generator { @@ -127,15 +128,15 @@ public static IOpenApiSchema CreateSchema(this ODataContext context, IEdmPrimiti // The precision is represented with the maximum and minimum keywords and a value of ±(10^ (precision - scale) - 10^ scale). double tmp = Math.Pow(10, decimalTypeReference.Precision.Value - decimalTypeReference.Scale.Value) - Math.Pow(10, -decimalTypeReference.Scale.Value); - openApiSchema.Minimum = (decimal?)(tmp * -1.0); - openApiSchema.Maximum = (decimal?)(tmp); + openApiSchema.Minimum = (tmp * -1.0).ToString(CultureInfo.InvariantCulture); + openApiSchema.Maximum = tmp.ToString(CultureInfo.InvariantCulture); } else { // If the scale facet has a numeric value, and ±(10^precision - 1) if the scale is variable double tmp = Math.Pow(10, decimalTypeReference.Precision.Value) - 1; - openApiSchema.Minimum = (decimal?)(tmp * -1.0); - openApiSchema.Maximum = (decimal?)(tmp); + openApiSchema.Minimum = (tmp * -1.0).ToString(CultureInfo.InvariantCulture); + openApiSchema.Maximum = tmp.ToString(CultureInfo.InvariantCulture); } } @@ -246,14 +247,14 @@ public static IOpenApiSchema CreateSchema(this ODataContext context, IEdmPrimiti case EdmPrimitiveTypeKind.Int16: schema.Type = JsonSchemaType.Number; schema.Format = "int16"; - schema.Minimum = Int16.MinValue; // -32768 - schema.Maximum = Int16.MaxValue; // 32767 + schema.Minimum = short.MinValue.ToString(CultureInfo.InvariantCulture); // -32768 + schema.Maximum = short.MaxValue.ToString(CultureInfo.InvariantCulture); // 32767 break; case EdmPrimitiveTypeKind.Int32: schema.Type = JsonSchemaType.Number; schema.Format = "int32"; - schema.Minimum = Int32.MinValue; // -2147483648 - schema.Maximum = Int32.MaxValue; // 2147483647 + schema.Minimum = int.MinValue.ToString(CultureInfo.InvariantCulture); // -2147483648 + schema.Maximum = int.MaxValue.ToString(CultureInfo.InvariantCulture); // 2147483647 break; case EdmPrimitiveTypeKind.Int64 when emitIEEECompatibleTypes: schema.OneOf = @@ -269,8 +270,8 @@ public static IOpenApiSchema CreateSchema(this ODataContext context, IEdmPrimiti case EdmPrimitiveTypeKind.SByte: schema.Type = JsonSchemaType.Number; schema.Format = "int8"; - schema.Minimum = SByte.MinValue; // -128 - schema.Maximum = SByte.MaxValue; // 127 + schema.Minimum = sbyte.MinValue.ToString(CultureInfo.InvariantCulture); // -128 + schema.Maximum = sbyte.MaxValue.ToString(CultureInfo.InvariantCulture); // 127 break; case EdmPrimitiveTypeKind.String: // string schema.Type = JsonSchemaType.String; diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiLinkGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiLinkGenerator.cs index b852e2e43..6ff25dafc 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiLinkGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiLinkGenerator.cs @@ -30,7 +30,7 @@ internal static class OpenApiLinkGenerator /// "Optional: The list of parameters of the incoming operation. /// Optional: The operation id of the source of the NavigationProperty object. /// The created dictionary of object. - public static IDictionary CreateLinks(this ODataContext context, + public static Dictionary CreateLinks(this ODataContext context, IEdmEntityType entityType, string entityName, string entityKind, ODataPath path, IList? parameters = null, string? navPropOperationId = null) { diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiParameterGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiParameterGenerator.cs index 8c986e22b..a30889a31 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiParameterGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiParameterGenerator.cs @@ -858,7 +858,7 @@ public static void AppendParameter(this IList parameters, IOp return null; } - IList expandItems = [ "*" ]; + List expandItems = [ "*" ]; foreach (var property in structuredType.NavigationProperties()) { @@ -902,7 +902,7 @@ private static OpenApiParameter CreateTop(int topExample) { Type = JsonSchemaType.Number, Format = "int64", - Minimum = 0, + Minimum = "0", }, Example = topExample, Style = ParameterStyle.Form, @@ -922,7 +922,7 @@ private static OpenApiParameter CreateSkip() { Type = JsonSchemaType.Number, Format = "int64", - Minimum = 0, + Minimum = "0", }, Style = ParameterStyle.Form, Explode = false diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs index 25ec6f75c..293c6ceab 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs @@ -187,19 +187,19 @@ public static OpenApiResponses CreateResponses(this ODataContext context, IEdmOp } else if (operation.IsDeltaFunction()) { - baseSchema.Properties.Add(ODataConstants.OdataNextLink); - baseSchema.Properties.Add(ODataConstants.OdataDeltaLink); + baseSchema.Properties.Add(ODataConstants.OdataNextLink.Key, ODataConstants.OdataNextLink.Value); + baseSchema.Properties.Add(ODataConstants.OdataDeltaLink.Key, ODataConstants.OdataDeltaLink.Value); schema = baseSchema; } else { if (context.Settings.EnablePagination) { - baseSchema.Properties.Add(ODataConstants.OdataNextLink); + baseSchema.Properties.Add(ODataConstants.OdataNextLink.Key, ODataConstants.OdataNextLink.Value); } if (context.Settings.EnableCount) { - baseSchema.Properties.Add(ODataConstants.OdataCount); + baseSchema.Properties.Add(ODataConstants.OdataCount.Key, ODataConstants.OdataCount.Value); } schema = baseSchema; } diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiSchemaGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiSchemaGenerator.cs index 1cb0941da..af8b756ca 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiSchemaGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiSchemaGenerator.cs @@ -106,11 +106,11 @@ public static void AddSchemasToDocument(this ODataContext context, OpenApiDocume }; document.AddComponent(Constants.BaseCollectionPaginationCountResponse, responseSchema); - responseSchema.Properties ??= new Dictionary(); + responseSchema.Properties ??= []; if (context.Settings.EnableCount) - responseSchema.Properties.Add(ODataConstants.OdataCount); + responseSchema.Properties.Add(ODataConstants.OdataCount.Key, ODataConstants.OdataCount.Value); if (context.Settings.EnablePagination) - responseSchema.Properties.Add(ODataConstants.OdataNextLink); + responseSchema.Properties.Add(ODataConstants.OdataNextLink.Key, ODataConstants.OdataNextLink.Value); } // @odata.nextLink + @odata.deltaLink @@ -265,10 +265,10 @@ private static OpenApiSchema CreateCollectionSchema(ODataContext context, IOpenA else { if (context.Settings.EnablePagination) - baseSchema.Properties.Add(ODataConstants.OdataNextLink); + baseSchema.Properties.Add(ODataConstants.OdataNextLink.Key, ODataConstants.OdataNextLink.Value); if (context.Settings.EnableCount) - baseSchema.Properties.Add(ODataConstants.OdataCount); + baseSchema.Properties.Add(ODataConstants.OdataCount.Key, ODataConstants.OdataCount.Value); collectionSchema = baseSchema; } @@ -420,7 +420,7 @@ public static IOpenApiSchema CreatePropertySchema(this ODataContext context, IEd /// The Edm structured type. /// The Open API document to lookup references. /// The created map of . - public static IDictionary CreateStructuredTypePropertiesSchema(this ODataContext context, IEdmStructuredType structuredType, OpenApiDocument document) + public static Dictionary CreateStructuredTypePropertiesSchema(this ODataContext context, IEdmStructuredType structuredType, OpenApiDocument document) { Utils.CheckArgumentNull(context, nameof(context)); Utils.CheckArgumentNull(structuredType, nameof(structuredType)); @@ -545,10 +545,9 @@ private static OpenApiSchema CreateStructuredTypeSchema(this ODataContext contex OpenApiDiscriminator? discriminator = null; if (context.Settings.EnableDiscriminatorValue && derivedTypes is not null && derivedTypes.Any()) { - Dictionary mapping = derivedTypes - .Select(x => ($"#{x.FullTypeName()}", new OpenApiSchemaReference(x.FullTypeName(), document).Reference.ReferenceV3)) - .Where(x => x.Item2 != null) - .ToDictionary(x => x.Item1, x => x.Item2!); + Dictionary mapping = derivedTypes + .Select(x => ($"#{x.FullTypeName()}", new OpenApiSchemaReference(x.FullTypeName(), document))) + .ToDictionary(x => x.Item1, x => x.Item2); discriminator = new OpenApiDiscriminator { diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiServerGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiServerGenerator.cs index c1ada2a43..afac502ac 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiServerGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiServerGenerator.cs @@ -20,7 +20,7 @@ internal static class OpenApiServerGenerator /// /// The OData context. /// The created collection of object. - public static IList CreateServers(this ODataContext context) + public static List CreateServers(this ODataContext context) { Utils.CheckArgumentNull(context, nameof(context)); diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiTagGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiTagGenerator.cs index 192d2fc18..059996c05 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiTagGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiTagGenerator.cs @@ -22,7 +22,7 @@ internal static class OpenApiTagGenerator /// /// The OData context. /// The created collection of object. - public static ISet CreateTags(this ODataContext context) + public static HashSet CreateTags(this ODataContext context) { Utils.CheckArgumentNull(context, nameof(context)); diff --git a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj index f07b7c5e8..5e07e77d1 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj +++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj @@ -30,7 +30,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/EntityGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/EntityGetOperationHandler.cs index b02d38abf..8507cd40a 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/EntityGetOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/EntityGetOperationHandler.cs @@ -106,7 +106,7 @@ protected override void SetParameters(OpenApiOperation operation) protected override void SetResponses(OpenApiOperation operation) { IOpenApiSchema? schema = null; - IDictionary? links = null; + Dictionary? links = null; if (EntitySet is not null) { diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/EntitySetPostOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/EntitySetPostOperationHandler.cs index 235b8fd2e..c867f6576 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/EntitySetPostOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/EntitySetPostOperationHandler.cs @@ -136,7 +136,7 @@ protected override void AppendCustomParameters(OpenApiOperation operation) /// Get the entity content description. /// /// The entity content description. - private IDictionary GetContentDescription() + private Dictionary GetContentDescription() { var schema = GetEntitySchema(); var content = new Dictionary(); diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/EntityUpdateOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/EntityUpdateOperationHandler.cs index 81be9e2bd..8a1ec04b8 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/EntityUpdateOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/EntityUpdateOperationHandler.cs @@ -88,7 +88,7 @@ protected override void SetRequestBody(OpenApiOperation operation) base.SetRequestBody(operation); } - protected IDictionary GetContent() + protected Dictionary GetContent() { var schema = GetOpenApiSchema(); var content = new Dictionary(); diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs index cc954648c..9982b0204 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs @@ -166,7 +166,7 @@ protected string GetOperationId(string prefix, string identifier) /// Gets a media entity content description. /// /// The entity content description. - protected IDictionary GetContentDescription() + protected Dictionary GetContentDescription() { // Fetch the respective AcceptableMediaTypes (_, var property) = GetStreamElements(); diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/NavigationPropertyGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/NavigationPropertyGetOperationHandler.cs index 49a271198..81a6766d8 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/NavigationPropertyGetOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/NavigationPropertyGetOperationHandler.cs @@ -92,7 +92,7 @@ protected override void SetExtensions(OpenApiOperation operation) /// protected override void SetResponses(OpenApiOperation operation) { - IDictionary? links = null; + Dictionary? links = null; if (Context is { Settings.ShowLinks: true } && NavigationProperty is not null && Path is not null) { var operationId = GetOperationId(); diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/RefGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/RefGetOperationHandler.cs index a70765b21..06ca60a2e 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/RefGetOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/RefGetOperationHandler.cs @@ -103,7 +103,7 @@ protected override void SetResponses(OpenApiOperation operation) // $ref returns string for the Uri? Type = JsonSchemaType.String }; - IDictionary? links = null; + Dictionary? links = null; if (Context is {Settings.ShowLinks: true} && NavigationProperty is not null && Path is not null) { var operationId = GetOperationId(); diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/SingletonGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/SingletonGetOperationHandler.cs index d4f90bc31..9d5e1b838 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/SingletonGetOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/SingletonGetOperationHandler.cs @@ -97,7 +97,7 @@ protected override void SetResponses(OpenApiOperation operation) if (Singleton is not null) { IOpenApiSchema? schema = null; - IDictionary? links = null; + Dictionary? links = null; if (Context is {Settings.EnableDerivedTypesReferencesForResponses: true}) { diff --git a/src/OoasUtil/ComLineProcesser.cs b/src/OoasUtil/ComLineProcessor.cs similarity index 97% rename from src/OoasUtil/ComLineProcesser.cs rename to src/OoasUtil/ComLineProcessor.cs index 9f73d63be..84cb58c3b 100644 --- a/src/OoasUtil/ComLineProcesser.cs +++ b/src/OoasUtil/ComLineProcessor.cs @@ -15,17 +15,17 @@ namespace OoasUtil /// /// Command line arguments processer. /// - internal class ComLineProcesser + internal class ComLineProcessor { private IList _args; private bool _continue; public static Version version = new Version(1, 0, 0, 0); /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The command line arguments. - public ComLineProcesser(string[] args) + public ComLineProcessor(string[] args) { _args = args; } @@ -43,7 +43,9 @@ public ComLineProcesser(string[] args) /// /// Output format. /// - public OpenApiFormat? Format { get; private set; } + #nullable enable + public string? Format { get; private set; } + #nullable restore /// /// Whether KeyAsSegment is used. @@ -145,7 +147,7 @@ public bool Process() case "--yaml": case "-y": - if (!ProcessTarget(OpenApiFormat.Yaml)) + if (!ProcessTarget("yaml")) { return false; } @@ -153,7 +155,7 @@ public bool Process() case "--json": case "-j": - if (!ProcessTarget(OpenApiFormat.Json)) + if (!ProcessTarget("json")) { return false; } @@ -240,7 +242,7 @@ public bool Process() // by default. if (Format == null) { - Format = OpenApiFormat.Json; + Format = "json"; } if (Version == null) @@ -313,7 +315,7 @@ private bool ProcessOutput(string file) return true; } - private bool ProcessTarget(OpenApiFormat format) + private bool ProcessTarget(string format) { if (Format != null) { diff --git a/src/OoasUtil/FileOpenApiGenerator.cs b/src/OoasUtil/FileOpenApiGenerator.cs index 446ab60c2..808d9e162 100644 --- a/src/OoasUtil/FileOpenApiGenerator.cs +++ b/src/OoasUtil/FileOpenApiGenerator.cs @@ -35,7 +35,7 @@ internal class FileOpenApiGenerator : OpenApiGenerator /// The output. /// The format. /// Conversion settings. - public FileOpenApiGenerator(string input, string output, OpenApiFormat format, OpenApiConvertSettings settings) + public FileOpenApiGenerator(string input, string output, string format, OpenApiConvertSettings settings) : base(output, format, settings) { Input = input; diff --git a/src/OoasUtil/OpenApiGenerator.cs b/src/OoasUtil/OpenApiGenerator.cs index e3ef89c91..5448965a1 100644 --- a/src/OoasUtil/OpenApiGenerator.cs +++ b/src/OoasUtil/OpenApiGenerator.cs @@ -24,7 +24,7 @@ internal abstract class OpenApiGenerator /// /// Output format. /// - public OpenApiFormat Format { get; } + public string Format { get; } /// /// Output file. @@ -42,7 +42,7 @@ internal abstract class OpenApiGenerator /// The output. /// The output format. /// Conversion settings. - protected OpenApiGenerator(string output, OpenApiFormat format, OpenApiConvertSettings settings) + protected OpenApiGenerator(string output, string format, OpenApiConvertSettings settings) { Output = output; Format = format; diff --git a/src/OoasUtil/Program.cs b/src/OoasUtil/Program.cs index 59f19488b..211dc0f52 100644 --- a/src/OoasUtil/Program.cs +++ b/src/OoasUtil/Program.cs @@ -19,13 +19,13 @@ static async System.Threading.Tasks.Task Main(string[] args) // args = new[] { "--yaml", "--input", @"http://services.odata.org/TrippinRESTierService", "-o", @"E:\work\OneApiDesign\test1\TripUrl.yaml" }; // args = new[] { "--json", "-i", @"http://services.odata.org/TrippinRESTierService", "-o", @"E:\work\OneApiDesign\test1\TripUrl.json" }; - ComLineProcesser processer = new ComLineProcesser(args); - if (!processer.Process()) + ComLineProcessor processor = new ComLineProcessor(args); + if (!processor.Process()) { return 0; } - if (!processer.CanContinue) + if (!processor.CanContinue) { return 1; } @@ -34,23 +34,23 @@ static async System.Threading.Tasks.Task Main(string[] args) OpenApiConvertSettings settings = new OpenApiConvertSettings { - EnableKeyAsSegment = processer.KeyAsSegment, - EnableDerivedTypesReferencesForResponses = processer.DerivedTypesReferencesForResponses.Value, - EnableDerivedTypesReferencesForRequestBody = processer.DerivedTypesReferencesForRequestBody.Value, - RequireDerivedTypesConstraintForBoundOperations = processer.RequireDerivedTypesConstraint.Value, - EnablePagination = processer.EnablePagination.Value, - EnableUnqualifiedCall = processer.EnableUnqualifiedCall.Value, - ShowSchemaExamples = !processer.DisableSchemaExamples.Value, - OpenApiSpecVersion = processer.Version.Value, + EnableKeyAsSegment = processor.KeyAsSegment, + EnableDerivedTypesReferencesForResponses = processor.DerivedTypesReferencesForResponses.Value, + EnableDerivedTypesReferencesForRequestBody = processor.DerivedTypesReferencesForRequestBody.Value, + RequireDerivedTypesConstraintForBoundOperations = processor.RequireDerivedTypesConstraint.Value, + EnablePagination = processor.EnablePagination.Value, + EnableUnqualifiedCall = processor.EnableUnqualifiedCall.Value, + ShowSchemaExamples = !processor.DisableSchemaExamples.Value, + OpenApiSpecVersion = processor.Version.Value, }; - if (processer.IsLocalFile) + if (processor.IsLocalFile) { - generator = new FileOpenApiGenerator(processer.Input, processer.Output, processer.Format.Value, settings); + generator = new FileOpenApiGenerator(processor.Input, processor.Output, processor.Format, settings); } else { - generator = new UrlOpenApiGenerator(new Uri(processer.Input), processer.Output, processer.Format.Value, settings); + generator = new UrlOpenApiGenerator(new Uri(processor.Input), processor.Output, processor.Format, settings); } if (await generator.GenerateAsync()) diff --git a/src/OoasUtil/UrlOpenApiGenerator.cs b/src/OoasUtil/UrlOpenApiGenerator.cs index 7325da484..5ba1d5b3c 100644 --- a/src/OoasUtil/UrlOpenApiGenerator.cs +++ b/src/OoasUtil/UrlOpenApiGenerator.cs @@ -33,7 +33,7 @@ internal class UrlOpenApiGenerator : OpenApiGenerator /// The output. /// The format. /// Conversion settings. - public UrlOpenApiGenerator(Uri input, string output, OpenApiFormat format, OpenApiConvertSettings settings) + public UrlOpenApiGenerator(Uri input, string output, string format, OpenApiConvertSettings settings) : base(output, format, settings) { Input = input; diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/EdmModelOpenApiExtensionsTest.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/EdmModelOpenApiExtensionsTest.cs index 15eddb242..2d01e1dc4 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/EdmModelOpenApiExtensionsTest.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/EdmModelOpenApiExtensionsTest.cs @@ -29,13 +29,13 @@ public void ConvertToOpenApiThrowsArgumentNullModel() } [Theory] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Yaml)] - public async Task EmptyEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, OpenApiFormat format) + [InlineData(OpenApiSpecVersion.OpenApi2_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "json")] + [InlineData(OpenApiSpecVersion.OpenApi2_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "yaml")] + public async Task EmptyEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, string format) { // Arrange IEdmModel model = EdmModelHelper.EmptyModel; @@ -54,13 +54,13 @@ public async Task EmptyEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, Op } [Theory] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Yaml)] - public async Task BasicEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, OpenApiFormat format) + [InlineData(OpenApiSpecVersion.OpenApi2_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "json")] + [InlineData(OpenApiSpecVersion.OpenApi2_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "yaml")] + public async Task BasicEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, string format) { // Arrange IEdmModel model = EdmModelHelper.BasicEdmModel; @@ -81,13 +81,13 @@ public async Task BasicEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, Op } [Theory] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Yaml)] - public async Task MultipleSchemasEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, OpenApiFormat format) + [InlineData(OpenApiSpecVersion.OpenApi2_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "json")] + [InlineData(OpenApiSpecVersion.OpenApi2_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "yaml")] + public async Task MultipleSchemasEdmModelToOpenApiWorks(OpenApiSpecVersion specVersion, string format) { // Arrange IEdmModel model = EdmModelHelper.MultipleSchemasEdmModel; @@ -110,13 +110,13 @@ public async Task MultipleSchemasEdmModelToOpenApiWorks(OpenApiSpecVersion specV } [Theory] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Json)] - [InlineData(OpenApiSpecVersion.OpenApi2_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_0, OpenApiFormat.Yaml)] - [InlineData(OpenApiSpecVersion.OpenApi3_1, OpenApiFormat.Yaml)] - public async Task TripServiceMetadataToOpenApiWorks(OpenApiSpecVersion specVersion, OpenApiFormat format) + [InlineData(OpenApiSpecVersion.OpenApi2_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "json")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "json")] + [InlineData(OpenApiSpecVersion.OpenApi2_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_0, "yaml")] + [InlineData(OpenApiSpecVersion.OpenApi3_1, "yaml")] + public async Task TripServiceMetadataToOpenApiWorks(OpenApiSpecVersion specVersion, string format) { // Arrange IEdmModel model = EdmModelHelper.TripServiceModel; @@ -141,11 +141,11 @@ public async Task TripServiceMetadataToOpenApiWorks(OpenApiSpecVersion specVersi AssertDocumentsAreEqual(result, fileName, format); } - private void AssertDocumentsAreEqual(string result, string fileName, OpenApiFormat format) + private void AssertDocumentsAreEqual(string result, string fileName, string format) { _output.WriteLine(result); var expected = Resources.GetString(fileName); - if (format is OpenApiFormat.Json) + if (format is "json") { var parsedJson = JsonNode.Parse(result); Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), parsedJson)); @@ -156,10 +156,10 @@ private void AssertDocumentsAreEqual(string result, string fileName, OpenApiForm } } - private static string GetFormatExt(OpenApiFormat format) => + private static string GetFormatExt(string format) => format switch { - OpenApiFormat.Json => "json", - OpenApiFormat.Yaml => "yaml", + "json" => "json", + "yaml" => "yaml", _ => throw new NotImplementedException() }; @@ -171,7 +171,7 @@ private static string GetVersion(OpenApiSpecVersion version) => _ => throw new NotImplementedException() }; - private static async Task WriteEdmModelAsOpenApi(IEdmModel model, OpenApiFormat target, + private static async Task WriteEdmModelAsOpenApi(IEdmModel model, string target, OpenApiConvertSettings settings = null) { settings ??= new OpenApiConvertSettings(); diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs index 886868d91..0ab48b130 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs @@ -25,7 +25,7 @@ public void AddsEmptyInnerErrorWhenNoComplexTypeIsProvided() var schema = OpenApiErrorSchemaGenerator.CreateInnerErrorSchema(context, new()); Assert.Equal(JsonSchemaType.Object, schema.Type); - Assert.Empty(schema.Properties); + Assert.Null(schema.Properties); } [Fact] public void AddsInnerErrorPropertiesWhenComplexTypeIsProvided() diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiSchemaGeneratorTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiSchemaGeneratorTests.cs index 23d8ceda2..09de27362 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiSchemaGeneratorTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiSchemaGeneratorTests.cs @@ -195,75 +195,79 @@ public async Task CreateStructuredTypeSchemaForEntityTypeWithDiscriminatorValueE // Act var schema = context.CreateStructuredTypeSchema(entity, new()); var derivedSchema = context.CreateStructuredTypeSchema(derivedEntity, new()); - var json = JsonNode.Parse(await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0)); + var rawJson = await schema.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); + var json = JsonNode.Parse(rawJson); // Assert Assert.True(derivedSchema.AllOf.FirstOrDefault(x => derivedType.Equals(x.Title))?.Properties.ContainsKey("@odata.type")); Assert.NotNull(json); - Assert.True(JsonNode.DeepEquals(JsonNode.Parse(@"{ - ""allOf"": [ + Assert.True(JsonNode.DeepEquals(JsonNode.Parse( +""" +{ + "allOf": [ { - ""$ref"": ""#/components/schemas/microsoft.graph.entity"" + "$ref": "#/components/schemas/microsoft.graph.entity" }, { - ""title"": ""directoryObject"", - ""required"": [ - ""@odata.type"" + "title": "directoryObject", + "required": [ + "@odata.type" ], - ""type"": ""object"", - ""properties"": { - ""deletedDateTime"": { - ""pattern"": ""^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$"", - ""type"": ""string"", - ""description"": ""Date and time when this object was deleted. Always null when the object hasn't been deleted."", - ""format"": ""date-time"", - ""nullable"": true + "type": "object", + "properties": { + "deletedDateTime": { + "pattern": "^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$", + "type": "string", + "description": "Date and time when this object was deleted. Always null when the object hasn't been deleted.", + "format": "date-time", + "nullable": true }, - ""@odata.type"": { - ""type"": ""string"", - ""default"": ""#microsoft.graph.directoryObject"" + "@odata.type": { + "type": "string", + "default": "#microsoft.graph.directoryObject" } }, - ""discriminator"": { - ""propertyName"": ""@odata.type"", - ""mapping"": { - ""#microsoft.graph.user"": ""#/components/schemas/microsoft.graph.user"", - ""#microsoft.graph.servicePrincipal"": ""#/components/schemas/microsoft.graph.servicePrincipal"", - ""#microsoft.graph.group"": ""#/components/schemas/microsoft.graph.group"", - ""#microsoft.graph.device"": ""#/components/schemas/microsoft.graph.device"", - ""#microsoft.graph.administrativeUnit"": ""#/components/schemas/microsoft.graph.administrativeUnit"", - ""#microsoft.graph.application"": ""#/components/schemas/microsoft.graph.application"", - ""#microsoft.graph.policyBase"": ""#/components/schemas/microsoft.graph.policyBase"", - ""#microsoft.graph.appManagementPolicy"": ""#/components/schemas/microsoft.graph.appManagementPolicy"", - ""#microsoft.graph.stsPolicy"": ""#/components/schemas/microsoft.graph.stsPolicy"", - ""#microsoft.graph.homeRealmDiscoveryPolicy"": ""#/components/schemas/microsoft.graph.homeRealmDiscoveryPolicy"", - ""#microsoft.graph.tokenIssuancePolicy"": ""#/components/schemas/microsoft.graph.tokenIssuancePolicy"", - ""#microsoft.graph.tokenLifetimePolicy"": ""#/components/schemas/microsoft.graph.tokenLifetimePolicy"", - ""#microsoft.graph.claimsMappingPolicy"": ""#/components/schemas/microsoft.graph.claimsMappingPolicy"", - ""#microsoft.graph.activityBasedTimeoutPolicy"": ""#/components/schemas/microsoft.graph.activityBasedTimeoutPolicy"", - ""#microsoft.graph.authorizationPolicy"": ""#/components/schemas/microsoft.graph.authorizationPolicy"", - ""#microsoft.graph.tenantRelationshipAccessPolicyBase"": ""#/components/schemas/microsoft.graph.tenantRelationshipAccessPolicyBase"", - ""#microsoft.graph.crossTenantAccessPolicy"": ""#/components/schemas/microsoft.graph.crossTenantAccessPolicy"", - ""#microsoft.graph.tenantAppManagementPolicy"": ""#/components/schemas/microsoft.graph.tenantAppManagementPolicy"", - ""#microsoft.graph.externalIdentitiesPolicy"": ""#/components/schemas/microsoft.graph.externalIdentitiesPolicy"", - ""#microsoft.graph.permissionGrantPolicy"": ""#/components/schemas/microsoft.graph.permissionGrantPolicy"", - ""#microsoft.graph.servicePrincipalCreationPolicy"": ""#/components/schemas/microsoft.graph.servicePrincipalCreationPolicy"", - ""#microsoft.graph.identitySecurityDefaultsEnforcementPolicy"": ""#/components/schemas/microsoft.graph.identitySecurityDefaultsEnforcementPolicy"", - ""#microsoft.graph.extensionProperty"": ""#/components/schemas/microsoft.graph.extensionProperty"", - ""#microsoft.graph.endpoint"": ""#/components/schemas/microsoft.graph.endpoint"", - ""#microsoft.graph.resourceSpecificPermissionGrant"": ""#/components/schemas/microsoft.graph.resourceSpecificPermissionGrant"", - ""#microsoft.graph.contract"": ""#/components/schemas/microsoft.graph.contract"", - ""#microsoft.graph.directoryObjectPartnerReference"": ""#/components/schemas/microsoft.graph.directoryObjectPartnerReference"", - ""#microsoft.graph.directoryRole"": ""#/components/schemas/microsoft.graph.directoryRole"", - ""#microsoft.graph.directoryRoleTemplate"": ""#/components/schemas/microsoft.graph.directoryRoleTemplate"", - ""#microsoft.graph.directorySettingTemplate"": ""#/components/schemas/microsoft.graph.directorySettingTemplate"", - ""#microsoft.graph.organization"": ""#/components/schemas/microsoft.graph.organization"", - ""#microsoft.graph.orgContact"": ""#/components/schemas/microsoft.graph.orgContact"" + "discriminator": { + "propertyName": "@odata.type", + "mapping": { + "#microsoft.graph.user": "#/components/schemas/microsoft.graph.user", + "#microsoft.graph.servicePrincipal": "#/components/schemas/microsoft.graph.servicePrincipal", + "#microsoft.graph.group": "#/components/schemas/microsoft.graph.group", + "#microsoft.graph.device": "#/components/schemas/microsoft.graph.device", + "#microsoft.graph.administrativeUnit": "#/components/schemas/microsoft.graph.administrativeUnit", + "#microsoft.graph.application": "#/components/schemas/microsoft.graph.application", + "#microsoft.graph.policyBase": "#/components/schemas/microsoft.graph.policyBase", + "#microsoft.graph.appManagementPolicy": "#/components/schemas/microsoft.graph.appManagementPolicy", + "#microsoft.graph.stsPolicy": "#/components/schemas/microsoft.graph.stsPolicy", + "#microsoft.graph.homeRealmDiscoveryPolicy": "#/components/schemas/microsoft.graph.homeRealmDiscoveryPolicy", + "#microsoft.graph.tokenIssuancePolicy": "#/components/schemas/microsoft.graph.tokenIssuancePolicy", + "#microsoft.graph.tokenLifetimePolicy": "#/components/schemas/microsoft.graph.tokenLifetimePolicy", + "#microsoft.graph.claimsMappingPolicy": "#/components/schemas/microsoft.graph.claimsMappingPolicy", + "#microsoft.graph.activityBasedTimeoutPolicy": "#/components/schemas/microsoft.graph.activityBasedTimeoutPolicy", + "#microsoft.graph.authorizationPolicy": "#/components/schemas/microsoft.graph.authorizationPolicy", + "#microsoft.graph.tenantRelationshipAccessPolicyBase": "#/components/schemas/microsoft.graph.tenantRelationshipAccessPolicyBase", + "#microsoft.graph.crossTenantAccessPolicy": "#/components/schemas/microsoft.graph.crossTenantAccessPolicy", + "#microsoft.graph.tenantAppManagementPolicy": "#/components/schemas/microsoft.graph.tenantAppManagementPolicy", + "#microsoft.graph.externalIdentitiesPolicy": "#/components/schemas/microsoft.graph.externalIdentitiesPolicy", + "#microsoft.graph.permissionGrantPolicy": "#/components/schemas/microsoft.graph.permissionGrantPolicy", + "#microsoft.graph.servicePrincipalCreationPolicy": "#/components/schemas/microsoft.graph.servicePrincipalCreationPolicy", + "#microsoft.graph.identitySecurityDefaultsEnforcementPolicy": "#/components/schemas/microsoft.graph.identitySecurityDefaultsEnforcementPolicy", + "#microsoft.graph.extensionProperty": "#/components/schemas/microsoft.graph.extensionProperty", + "#microsoft.graph.endpoint": "#/components/schemas/microsoft.graph.endpoint", + "#microsoft.graph.resourceSpecificPermissionGrant": "#/components/schemas/microsoft.graph.resourceSpecificPermissionGrant", + "#microsoft.graph.contract": "#/components/schemas/microsoft.graph.contract", + "#microsoft.graph.directoryObjectPartnerReference": "#/components/schemas/microsoft.graph.directoryObjectPartnerReference", + "#microsoft.graph.directoryRole": "#/components/schemas/microsoft.graph.directoryRole", + "#microsoft.graph.directoryRoleTemplate": "#/components/schemas/microsoft.graph.directoryRoleTemplate", + "#microsoft.graph.directorySettingTemplate": "#/components/schemas/microsoft.graph.directorySettingTemplate", + "#microsoft.graph.organization": "#/components/schemas/microsoft.graph.organization", + "#microsoft.graph.orgContact": "#/components/schemas/microsoft.graph.orgContact" } } } ] -}"), json)); +} +"""), json)); } [Theory] diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj b/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj index bbb6fc20d..28c3c2e01 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj @@ -88,7 +88,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPatchOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPatchOperationHandlerTests.cs index a7ea353a9..67412e712 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPatchOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPatchOperationHandlerTests.cs @@ -98,7 +98,7 @@ public void CreateComplexPropertyPatchOperationReturnsCorrectOperationForCollect } else { - Assert.Empty(patch.Responses[statusCode].Content); + Assert.Null(patch.Responses[statusCode].Content); } if (enableOperationId) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPostOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPostOperationHandlerTests.cs index 908f0b6df..1b3926bb8 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPostOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPostOperationHandlerTests.cs @@ -71,7 +71,7 @@ public void CreateComplexPropertyPostOperationReturnsCorrectOperationForCollecti } else { - Assert.Empty(post.Responses[statusCode].Content); + Assert.Null(post.Responses[statusCode].Content); } if (enableOperationId) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPutOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPutOperationHandlerTests.cs index a6edc48e6..e4d8d916a 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ComplexPropertyPutOperationHandlerTests.cs @@ -57,7 +57,7 @@ public void CreateComplexPropertyPutOperationReturnsCorrectOperationForSingle(bo } else { - Assert.Empty(put.Responses[statusCode].Content); + Assert.Null(put.Responses[statusCode].Content); } if (enableOperationId) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionImportOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionImportOperationHandlerTests.cs index 0122ce86e..985c89221 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionImportOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionImportOperationHandlerTests.cs @@ -29,6 +29,8 @@ public EdmActionImportOperationHandlerTests() openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + openApiDocument.Tags ??= []; + openApiDocument.Tags.Add(new OpenApiTag { Name = "ResetDataSource" }); } [Fact] @@ -198,10 +200,10 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmActionImp // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -248,7 +250,7 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmActionImp } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionOperationHandlerTests.cs index d606dae4d..5459c1bd1 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmActionOperationHandlerTests.cs @@ -29,6 +29,8 @@ public EdmActionOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "me.user.Actions" }); } private readonly OpenApiDocument _openApiDocument = new(); private EdmActionOperationHandler _operationHandler => new(_openApiDocument); @@ -284,10 +286,10 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmAction(bo // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -310,7 +312,7 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmAction(bo } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } @@ -345,11 +347,11 @@ public void CreateOperationForEdmActionWithCollectionReturnTypeContainsXMsPageab // Assert if (enablePagination && action.ReturnType.IsCollection()) { - Assert.True(operation.Extensions.ContainsKey(Common.Constants.xMsPageable)); + Assert.True(operation.Extensions.ContainsKey(Common.Constants.xMsPageable)); } else { - Assert.False(operation.Extensions.ContainsKey(Common.Constants.xMsPageable)); + Assert.DoesNotContain(Common.Constants.xMsPageable, operation.Extensions?.Keys.Select(static x => x) ?? []); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionImportOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionImportOperationHandlerTests.cs index b4cc26ac7..e271fc104 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionImportOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionImportOperationHandlerTests.cs @@ -27,6 +27,8 @@ public EdmFunctionImportOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "GetNearestAirport" }); } private readonly OpenApiDocument _openApiDocument = new(); private EdmFunctionImportOperationHandler _operationHandler => new(_openApiDocument); @@ -275,10 +277,10 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmFunctionI // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -355,7 +357,7 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmFunctionI } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionOperationHandlerTests.cs index 12847cf54..16cfdff54 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EdmFunctionOperationHandlerTests.cs @@ -28,6 +28,8 @@ public EdmFunctionOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "me.user.Functions" }); } private readonly OpenApiDocument _openApiDocument = new(); @@ -489,10 +491,10 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmFunction( // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -515,7 +517,7 @@ public async Task OperationRestrictionsTermWorksToCreateOperationForEdmFunction( } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } @@ -548,11 +550,11 @@ public void CreateOperationForEdmFunctionWithCollectionReturnTypeContainsXMsPage // Assert if (enablePagination && function.ReturnType.IsCollection()) { - Assert.True(operation.Extensions.ContainsKey(Common.Constants.xMsPageable)); + Assert.True(operation.Extensions.ContainsKey(Common.Constants.xMsPageable)); } else { - Assert.False(operation.Extensions.ContainsKey(Common.Constants.xMsPageable)); + Assert.DoesNotContain(Common.Constants.xMsPageable, operation.Extensions?.Keys.Select(static x => x) ?? []); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityDeleteOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityDeleteOperationHandlerTests.cs index 89809b42d..c6e88b7c9 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityDeleteOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityDeleteOperationHandlerTests.cs @@ -25,6 +25,8 @@ public EntityDeleteOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "Customers.Customer" }); } private readonly OpenApiDocument _openApiDocument = new(); private EntityDeleteOperationHandler _operationHandler => new (_openApiDocument); @@ -148,10 +150,10 @@ public async Task CreateEntityDeleteReturnsSecurityForDeleteRestrictions(bool en // Assert Assert.NotNull(delete); - Assert.NotNull(delete.Security); if (enableAnnotation) { + Assert.NotNull(delete.Security); Assert.Equal(2, delete.Security.Count); string json = await delete.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -175,7 +177,7 @@ public async Task CreateEntityDeleteReturnsSecurityForDeleteRestrictions(bool en } else { - Assert.Empty(delete.Security); + Assert.Null(delete.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityGetOperationHandlerTests.cs index 91de64618..2d412ee13 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityGetOperationHandlerTests.cs @@ -26,6 +26,8 @@ public EntityGetOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "Customers.Customer" }); } private readonly OpenApiDocument _openApiDocument = new(); @@ -200,10 +202,10 @@ public async Task CreateEntityGetOperationReturnsSecurityForReadRestrictions(boo // Assert Assert.NotNull(get); - Assert.NotNull(get.Security); if (enableAnnotation) { + Assert.NotNull(get.Security); Assert.Equal(2, get.Security.Count); string json = await get.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -227,7 +229,7 @@ public async Task CreateEntityGetOperationReturnsSecurityForReadRestrictions(boo } else { - Assert.Empty(get.Security); + Assert.Null(get.Security); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPatchOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPatchOperationHandlerTests.cs index 8371132c5..7095defe8 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPatchOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPatchOperationHandlerTests.cs @@ -25,6 +25,8 @@ public EntityPatchOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "Customers.Customer" }); } private readonly OpenApiDocument _openApiDocument = new(); @@ -76,7 +78,7 @@ public void CreateEntityPatchOperationReturnsCorrectOperation(bool enableOperati } else { - Assert.Empty(patch.Responses[statusCode].Content); + Assert.Null(patch.Responses[statusCode].Content); } if (enableOperationId) @@ -162,10 +164,10 @@ public async Task CreateEntityPatchReturnsSecurityForUpdateRestrictions(bool ena // Assert Assert.NotNull(patch); - Assert.NotNull(patch.Security); if (enableAnnotation) { + Assert.NotNull(patch.Security); Assert.Equal(2, patch.Security.Count); string json = await patch.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -189,7 +191,7 @@ public async Task CreateEntityPatchReturnsSecurityForUpdateRestrictions(bool ena } else { - Assert.Empty(patch.Security); + Assert.Null(patch.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPutOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPutOperationHandlerTests.cs index 26a9ac763..f78aa19b0 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntityPutOperationHandlerTests.cs @@ -25,6 +25,8 @@ public EntityPutOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "Customers.Customer" }); } private readonly OpenApiDocument _openApiDocument = new(); @@ -76,7 +78,7 @@ public void CreateEntityPutOperationReturnsCorrectOperation(bool enableOperation } else { - Assert.Empty(putOperation.Responses[statusCode].Content); + Assert.Null(putOperation.Responses[statusCode].Content); } if (enableOperationId) @@ -162,10 +164,10 @@ public async Task CreateEntityPutReturnsSecurityForUpdateRestrictions(bool enabl // Assert Assert.NotNull(putOperation); - Assert.NotNull(putOperation.Security); if (enableAnnotation) { + Assert.NotNull(putOperation.Security); Assert.Equal(2, putOperation.Security.Count); string json = await putOperation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -189,7 +191,7 @@ public async Task CreateEntityPutReturnsSecurityForUpdateRestrictions(bool enabl } else { - Assert.Empty(putOperation.Security); + Assert.Null(putOperation.Security); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetGetOperationHandlerTests.cs index db027e21c..ecef75469 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetGetOperationHandlerTests.cs @@ -30,6 +30,8 @@ public EntitySetGetOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "Customers.Customer" }); } private readonly OpenApiDocument _openApiDocument = new(); @@ -90,7 +92,7 @@ public void CreateEntitySetGetOperationReturnsCorrectOperation(bool enableOperat } else { - Assert.False(get.Extensions.ContainsKey(Constants.xMsPageable)); + Assert.DoesNotContain(Constants.xMsPageable, get.Extensions?.Keys.Select(static x => x) ?? []); } } @@ -313,10 +315,10 @@ public async Task CreateEntitySetGetOperationReturnsSecurityForReadRestrictions( // Assert Assert.NotNull(get); - Assert.NotNull(get.Security); if (enableAnnotation) { + Assert.NotNull(get.Security); Assert.Equal(2, get.Security.Count); string json = await get.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -338,7 +340,7 @@ public async Task CreateEntitySetGetOperationReturnsSecurityForReadRestrictions( } else { - Assert.Empty(get.Security); + Assert.Null(get.Security); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetPostOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetPostOperationHandlerTests.cs index c731a3056..e13fdb0a3 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetPostOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/EntitySetPostOperationHandlerTests.cs @@ -29,6 +29,8 @@ public EntitySetPostOperationHandlerTests() _openApiDocument.AddComponent("Application", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, }); + _openApiDocument.Tags ??= []; + _openApiDocument.Tags.Add(new OpenApiTag { Name = "Customers.Customer" }); } private readonly OpenApiDocument _openApiDocument = new(); @@ -207,10 +209,10 @@ public async Task CreateEntitySetPostReturnsSecurityForInsertRestrictions(bool e // Assert Assert.NotNull(post); - Assert.NotNull(post.Security); if (enableAnnotation) { + Assert.NotNull(post.Security); Assert.Equal(2, post.Security.Count); string json = await post.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -238,7 +240,7 @@ public async Task CreateEntitySetPostReturnsSecurityForInsertRestrictions(bool e } else { - Assert.Empty(post.Security); + Assert.Null(post.Security); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs index 77f45cf7c..f8ca1e30f 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs @@ -133,7 +133,7 @@ private void VerifyMediaEntityPutOperation(string annotation, bool enableOperati } else { - Assert.Empty(putOperation3.Responses[statusCode].Content); + Assert.Null(putOperation3.Responses[statusCode].Content); } if (!string.IsNullOrEmpty(annotation)) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyGetOperationHandlerTests.cs index 4b41a9f36..fc01b99cd 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyGetOperationHandlerTests.cs @@ -305,10 +305,10 @@ public async Task CreateNavigationGetOperationReturnsSecurityForReadRestrictions // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -352,7 +352,7 @@ public async Task CreateNavigationGetOperationReturnsSecurityForReadRestrictions } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPatchOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPatchOperationHandlerTests.cs index 2789ff49b..10ef8d2fa 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPatchOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPatchOperationHandlerTests.cs @@ -80,7 +80,7 @@ public void CreateNavigationPatchOperationReturnsCorrectOperation(bool enableOpe } else { - Assert.Empty(operation.Responses[statusCode].Content); + Assert.Null(operation.Responses[statusCode].Content); } if (enableOperationId) @@ -210,10 +210,10 @@ public async Task CreateNavigationPatchOperationReturnsSecurityForUpdateRestrict // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -257,7 +257,7 @@ public async Task CreateNavigationPatchOperationReturnsSecurityForUpdateRestrict } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPostOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPostOperationHandlerTests.cs index 423d2e38d..8a3b7d7fb 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPostOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPostOperationHandlerTests.cs @@ -227,10 +227,10 @@ public async Task CreateNavigationPostOperationReturnsSecurityForInsertRestricti // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -274,7 +274,7 @@ public async Task CreateNavigationPostOperationReturnsSecurityForInsertRestricti } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPutOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPutOperationHandlerTests.cs index e2c7dcc84..16a85d4a6 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/NavigationPropertyPutOperationHandlerTests.cs @@ -80,7 +80,7 @@ public void CreateNavigationPutOperationReturnsCorrectOperation(bool enableOpera } else { - Assert.Empty(operation.Responses[statusCode].Content); + Assert.Null(operation.Responses[statusCode].Content); } if (enableOperationId) @@ -188,10 +188,10 @@ public async Task CreateNavigationPuthOperationReturnsSecurityForUpdateRestricti // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -235,7 +235,7 @@ public async Task CreateNavigationPuthOperationReturnsSecurityForUpdateRestricti } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ODataTypeCastGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ODataTypeCastGetOperationHandlerTests.cs index a229279ba..b552e310a 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ODataTypeCastGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/ODataTypeCastGetOperationHandlerTests.cs @@ -120,7 +120,7 @@ public void CreateODataTypeCastGetOperationReturnsCorrectOperationForCollectionN Assert.NotNull(operation.Tags); var tag = Assert.Single(operation.Tags); Assert.Equal("People.Person", tag.Name); - Assert.Empty(tag.Extensions); + Assert.Null(tag.Extensions); Assert.NotNull(operation.Parameters); Assert.Equal(5, operation.Parameters.Count); //select, expand, id, id, ConsistencyLevel @@ -237,7 +237,7 @@ public void CreateODataTypeCastGetOperationReturnsCorrectOperationForEntitySetId Assert.NotNull(operation.Tags); var tag = Assert.Single(operation.Tags); Assert.Equal("People.Person", tag.Name); - Assert.Empty(tag.Extensions); + Assert.Null(tag.Extensions); Assert.NotNull(operation.Parameters); Assert.Equal(4, operation.Parameters.Count); //select, expand, id @@ -298,7 +298,7 @@ public void CreateODataTypeCastGetOperationReturnsCorrectOperationForSingleNavig Assert.NotNull(operation.Tags); var tag = Assert.Single(operation.Tags); Assert.Equal("People.Person", tag.Name); - Assert.Empty(tag.Extensions); + Assert.Null(tag.Extensions); Assert.NotNull(operation.Parameters); Assert.Equal(3, operation.Parameters.Count); //select, expand, id @@ -355,7 +355,7 @@ public void CreateODataTypeCastGetOperationReturnsCorrectOperationForSingleton(b Assert.NotNull(operation.Tags); var tag = Assert.Single(operation.Tags); Assert.Equal("Me.Person", tag.Name); - Assert.Empty(tag.Extensions); + Assert.Null(tag.Extensions); Assert.NotNull(operation.Parameters); Assert.Equal(2, operation.Parameters.Count); //select, expand diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonGetOperationHandlerTests.cs index c27cdafd5..53c314f0b 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonGetOperationHandlerTests.cs @@ -212,10 +212,10 @@ public async Task ReadRestrictionsTermWorksToCreateOperationForSingletonGetOpera // Assert Assert.NotNull(operation); - Assert.NotNull(operation.Security); if (enableAnnotation) { + Assert.NotNull(operation.Security); Assert.Equal(2, operation.Security.Count); string json = await operation.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0); @@ -260,7 +260,7 @@ public async Task ReadRestrictionsTermWorksToCreateOperationForSingletonGetOpera } else { - Assert.Empty(operation.Security); + Assert.Null(operation.Security); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonPatchOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonPatchOperationHandlerTests.cs index 6901a363c..6869a5d2f 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonPatchOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/SingletonPatchOperationHandlerTests.cs @@ -84,7 +84,7 @@ public void CreateSingletonPatchOperationReturnsCorrectOperation(bool enableOper } else { - Assert.Empty(patch.Responses[statusCode].Content); + Assert.Null(patch.Responses[statusCode].Content); } if (enableOperationId) @@ -302,7 +302,7 @@ private async Task VerifyOperation(string annotation, bool hasRestriction) else { Assert.Empty(patch.Parameters); - Assert.Empty(patch.Security); + Assert.Null(patch.Security); } } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/ComplexPropertyPathItemHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/ComplexPropertyPathItemHandlerTests.cs index 46c4ddfc3..ade425409 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/ComplexPropertyPathItemHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/ComplexPropertyPathItemHandlerTests.cs @@ -61,7 +61,7 @@ public void SetsDefaultOperations(bool useAnnotationToGeneratePath, bool annotat Assert.Equal(ODataPathKind.ComplexProperty, path.Kind); // guard var pathItem = _pathItemHandler.CreatePathItem(context, path); Assert.NotNull(pathItem); - Assert.Equal(operationCount, pathItem.Operations.Count); + Assert.Equal(operationCount, pathItem.Operations?.Count ?? 0); if (operationCount > 0) { @@ -70,8 +70,7 @@ public void SetsDefaultOperations(bool useAnnotationToGeneratePath, bool annotat } else { - Assert.False(pathItem.Operations.ContainsKey(HttpMethod.Get)); - Assert.False(pathItem.Operations.ContainsKey(HttpMethod.Patch)); + Assert.Null(pathItem.Operations); } } @@ -114,7 +113,7 @@ public void SetsUpdateOperationWithUpdateMethodUpdateRestrictions(bool useAnnota Assert.Equal(ODataPathKind.ComplexProperty, path.Kind); // guard var pathItem = _pathItemHandler.CreatePathItem(context, path); Assert.NotNull(pathItem); - Assert.Equal(operationCount, pathItem.Operations.Count); + Assert.Equal(operationCount, pathItem.Operations?.Count ?? 0); if (operationCount > 0) { @@ -130,8 +129,7 @@ public void SetsUpdateOperationWithUpdateMethodUpdateRestrictions(bool useAnnota } else { - Assert.False(pathItem.Operations.ContainsKey(HttpMethod.Patch)); - Assert.False(pathItem.Operations.ContainsKey(HttpMethod.Put)); + Assert.Null(pathItem.Operations); } } @@ -172,7 +170,7 @@ public void SetsPostOnCollectionProperties(bool useAnnotationToGeneratePath, boo Assert.Equal(ODataPathKind.ComplexProperty, path.Kind); // guard var pathItem = _pathItemHandler.CreatePathItem(context, path); Assert.NotNull(pathItem); - Assert.Equal(operationCount, pathItem.Operations.Count); + Assert.Equal(operationCount, pathItem.Operations?.Count ?? 0); if (operationCount > 0) { @@ -180,7 +178,7 @@ public void SetsPostOnCollectionProperties(bool useAnnotationToGeneratePath, boo } else { - Assert.False(pathItem.Operations.ContainsKey(HttpMethod.Post)); + Assert.Null(pathItem.Operations); } } [Fact] @@ -254,7 +252,7 @@ public void CreatesComplexPropertyPathsBasedOnTargetPathAnnotations(string reada // Assert Assert.NotNull(pathItem); - Assert.Equal(operationCount, pathItem.Operations.Count); + Assert.Equal(operationCount, pathItem.Operations?.Count ?? 0); if (operationCount == 1) { Assert.True(pathItem.Operations.ContainsKey(HttpMethod.Patch)); diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntityPathItemHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntityPathItemHandlerTests.cs index a78ccf990..e5c7bd88e 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntityPathItemHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntityPathItemHandlerTests.cs @@ -114,7 +114,7 @@ public void CreateEntityPathItemReturnsCorrectPathItemWithPathParameters(bool de } else { - Assert.Empty(pathItem.Parameters); + Assert.Null(pathItem.Parameters); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntitySetPathItemHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntitySetPathItemHandlerTests.cs index 58afba883..00c88fb56 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntitySetPathItemHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/EntitySetPathItemHandlerTests.cs @@ -151,8 +151,13 @@ private void VerifyPathItemOperations(string annotation, string[] expected) // Assert Assert.NotNull(pathItem); - Assert.NotNull(pathItem.Operations); - Assert.Equal(expected, pathItem.Operations.Select(e => e.Key.ToString().ToLowerInvariant())); + if (expected is {Length: > 0}) + { + Assert.NotNull(pathItem.Operations); + Assert.Equal(expected, pathItem.Operations.Select(e => e.Key.ToString().ToLowerInvariant())); + } + else + Assert.Null(pathItem.Operations); } [Fact] diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/NavigationPropertyPathItemHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/NavigationPropertyPathItemHandlerTests.cs index 520f5d7c8..8d93e6d5b 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/NavigationPropertyPathItemHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/NavigationPropertyPathItemHandlerTests.cs @@ -163,7 +163,7 @@ public void CreateNavigationPropertyPathItemReturnsCorrectPathItemWithPathParame } else { - Assert.Empty(pathItem.Parameters); + Assert.Null(pathItem.Parameters); } } @@ -202,7 +202,7 @@ public static IEnumerable CollectionNavigationPropertyData { get { - IList navigationPropertyPaths = new List + var navigationPropertyPaths = new List { "ContainedOrders", "Orders", @@ -232,7 +232,7 @@ public static IEnumerable SingleNavigationPropertyData { get { - IList navigationPropertyPaths = new List + var navigationPropertyPaths = new List { "ContainedMyOrder", "MyOrder", @@ -294,17 +294,20 @@ public void CreatePathItemForNavigationPropertyAndReadRestrictions(bool hasRestr // Assert Assert.NotNull(pathItem); - Assert.NotNull(pathItem.Operations); if (hasRestrictions) { if (readable) - Assert.Contains(pathItem.Operations, o => o.Key == HttpMethod.Get); + { + Assert.NotNull(pathItem.Operations); + Assert.Contains(pathItem.Operations, o => o.Key == HttpMethod.Get); + } else - Assert.DoesNotContain(pathItem.Operations, o => o.Key == HttpMethod.Get); + Assert.DoesNotContain(pathItem.Operations ?? [], o => o.Key == HttpMethod.Get); } else { + Assert.NotNull(pathItem.Operations); Assert.Contains(pathItem.Operations, o => o.Key == HttpMethod.Get); } } diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/OperationImportPathItemHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/OperationImportPathItemHandlerTests.cs index 99ed868c2..56104a838 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/OperationImportPathItemHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/PathItem/OperationImportPathItemHandlerTests.cs @@ -112,16 +112,16 @@ public void CreatePathItemForOperationImportWithReadRestrictionsReturnsCorrectPa // Assert Assert.NotNull(pathItem); - Assert.NotNull(pathItem.Operations); if (operationType == null) { - Assert.Empty(pathItem.Operations); + Assert.Null(pathItem.Operations); } else { - var operationKeyValue = Assert.Single(pathItem.Operations); - Assert.Equal(HttpMethod.Parse(operationType), operationKeyValue.Key); - Assert.NotNull(operationKeyValue.Value); + Assert.NotNull(pathItem.Operations); + var operationKeyValue = Assert.Single(pathItem.Operations); + Assert.Equal(HttpMethod.Parse(operationType), operationKeyValue.Key); + Assert.NotNull(operationKeyValue.Value); } }