From 81eb164c3bdb8315828d9e101842bd6f079d9d39 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 31 Aug 2026 13:56:18 -0400 Subject: [PATCH 1/3] test(assertions): migrate from FluentAssertions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Vincent Biret --- .../DefaultSettingsFixture.cs | 10 -- .../Microsoft.OpenApi.Readers.Tests.csproj | 1 - .../V2Tests/ComparisonTests.cs | 5 +- .../V2Tests/OpenApiDocumentTests.cs | 6 +- .../V2Tests/OpenApiHeaderTests.cs | 16 +- .../V2Tests/OpenApiOperationTests.cs | 17 +- .../V2Tests/OpenApiParameterTests.cs | 11 +- .../V2Tests/OpenApiSchemaTests.cs | 15 +- .../V31Tests/OpenApiDocumentTests.cs | 9 +- .../V31Tests/OpenApiHeaderTests.cs | 1 - .../V31Tests/OpenApiMediaTypeTests.cs | 13 +- .../V31Tests/OpenApiSchemaTests.cs | 7 +- .../V3Tests/OpenApiDocumentTests.cs | 50 +++--- .../V3Tests/OpenApiExampleTests.cs | 12 +- .../V3Tests/OpenApiHeaderTests.cs | 1 - .../V3Tests/OpenApiInfoTests.cs | 19 +-- .../V3Tests/OpenApiMediaTypeTests.cs | 13 +- .../V3Tests/OpenApiOperationTests.cs | 6 +- .../V3Tests/OpenApiParameterTests.cs | 12 +- .../V3Tests/OpenApiSchemaTests.cs | 19 +-- .../DefaultSettingsFixture.cs | 10 -- .../Microsoft.OpenApi.Tests.csproj | 1 - .../Models/OpenApiSchemaTests.cs | 5 +- .../Models/OpenApiSecurityRequirementTests.cs | 6 +- .../OpenApiTestAssert.cs | 158 ++++++++++++++++++ 25 files changed, 235 insertions(+), 188 deletions(-) create mode 100644 test/Microsoft.OpenApi.Tests/OpenApiTestAssert.cs diff --git a/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs b/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs index ed8072ba6..dd14b4cba 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using FluentAssertions; - namespace Microsoft.OpenApi.Readers.Tests { /// @@ -15,14 +13,6 @@ public class DefaultSettingsFixture /// public DefaultSettingsFixture() { - // We need RespectingRuntimeTypes() to ensure equivalence test works property, - // given that there are multiple types that can be used for the declared type OpenApiAny. - // Without this option, properties specific to those types would not be compared. - AssertionOptions.AssertEquivalencyUsing( - o => o - .AllowingInfiniteRecursion() - .RespectingRuntimeTypes() - .WithStrictOrdering()); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index d640c144b..94b847f86 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -18,7 +18,6 @@ - diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs index 7016965a3..d79c1929e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs @@ -3,8 +3,8 @@ using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Tests; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests @@ -27,8 +27,7 @@ public async Task EquivalentV2AndV3DocumentsShouldProduceEquivalentObjects(strin var result1 = await OpenApiDocument.LoadAsync(Path.Join(SampleFolderPath, $"{fileName}.v2.yaml"), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); var result2 = await OpenApiDocument.LoadAsync(Path.Join(SampleFolderPath, $"{fileName}.v3.yaml"), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); - result2.Document.Should().BeEquivalentTo(result1.Document, - options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + OpenApiTestAssert.Equivalent(result1.Document, result2.Document, "Workspace", "BaseUri"); Assert.Equivalent(result2.Diagnostic.Errors, result1.Diagnostic.Errors); } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 49b9e3b04..2362cb388 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -7,8 +7,8 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Tests; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests @@ -119,7 +119,7 @@ public async Task ShouldParseProducesInAnyOrder() Schema = new OpenApiSchemaReference("Error", result.Document) }; - result.Document.Should().BeEquivalentTo(new OpenApiDocument + OpenApiTestAssert.Equivalent(new OpenApiDocument { Info = new() { @@ -220,7 +220,7 @@ public async Task ShouldParseProducesInAnyOrder() ["Error"] = errorSchema } } - }, options => options.Excluding(x => x.BaseUri)); + }, result.Document, "BaseUri"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs index 789047939..8a613abe3 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs @@ -3,10 +3,9 @@ using System.Text.Json.Nodes; using System.IO; -using FluentAssertions; -using FluentAssertions.Equivalency; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V2; +using Microsoft.OpenApi.Tests; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V2Tests @@ -30,7 +29,7 @@ public void ParseHeaderWithDefaultShouldSucceed() var header = OpenApiV2Deserializer.LoadHeader(node, new(), new ParsingContext(new())); // Assert - header.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiHeader { Schema = new OpenApiSchema() @@ -40,9 +39,8 @@ public void ParseHeaderWithDefaultShouldSucceed() Default = new JsonNodeExtension(5).Node } }, - options => options - .IgnoringCyclicReferences() - .Excluding(x => x.Schema.Default.Parent)); + header, + "Parent"); } [Fact] @@ -59,7 +57,7 @@ public void ParseHeaderWithEnumShouldSucceed() var header = OpenApiV2Deserializer.LoadHeader(node, new(), new ParsingContext(new())); // Assert - header.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiHeader { Schema = new OpenApiSchema() @@ -73,9 +71,7 @@ public void ParseHeaderWithEnumShouldSucceed() new JsonNodeExtension(9).Node ] } - }, options => options.IgnoringCyclicReferences() - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Parent"))); + }, header, "Parent"); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs index f2bf3fb22..312569b93 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs @@ -7,7 +7,6 @@ using System.Text; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V2; using Microsoft.OpenApi.Reader.V3; @@ -165,7 +164,7 @@ public void ParseOperationWithBodyShouldSucceed() var operation = OpenApiV2Deserializer.LoadOperation(node, new(), new ParsingContext(new())); // Assert - operation.Should().BeEquivalentTo(_operationWithBody, options => options.IgnoringCyclicReferences()); + OpenApiTestAssert.Equivalent(_operationWithBody, operation); } [Fact] @@ -183,7 +182,7 @@ public async Task ParseOperationWithBodyTwiceShouldYieldSameObject() var operation = OpenApiV2Deserializer.LoadOperation(node, new(), new ParsingContext(new())); // Assert - operation.Should().BeEquivalentTo(_operationWithBody, options => options.IgnoringCyclicReferences()); + OpenApiTestAssert.Equivalent(_operationWithBody, operation); } [Fact] @@ -200,7 +199,7 @@ public void ParseOperationWithResponseExamplesShouldSucceed() var operation = OpenApiV2Deserializer.LoadOperation(node, new(), new ParsingContext(new())); // Assert - operation.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiOperation() { Responses = new OpenApiResponses() @@ -243,13 +242,7 @@ public void ParseOperationWithResponseExamplesShouldSucceed() } }} } - }, options => options.IgnoringCyclicReferences() - .Excluding(o => o.Responses["200"].Content["application/json"].Example[0].Parent) - .Excluding(o => o.Responses["200"].Content["application/json"].Example[0].Root) - .Excluding(o => o.Responses["200"].Content["application/json"].Example[1].Parent) - .Excluding(o => o.Responses["200"].Content["application/json"].Example[1].Root) - .Excluding(o => o.Responses["200"].Content["application/json"].Example[2].Parent) - .Excluding(o => o.Responses["200"].Content["application/json"].Example[2].Root)); + }, operation, "Parent", "Root"); } [Fact] @@ -300,7 +293,7 @@ public void ParseOperationWithBodyAndEmptyConsumesSetsRequestBodySchemaIfExists( var operation = OpenApiV2Deserializer.LoadOperation(node, new(), new ParsingContext(new())); // Assert - operation.Should().BeEquivalentTo(_operationWithBody, options => options.IgnoringCyclicReferences()); + OpenApiTestAssert.Equivalent(_operationWithBody, operation); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs index c4b8f81bf..41fc68d28 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs @@ -3,8 +3,6 @@ // Licensed under the MIT license. using System.IO; -using FluentAssertions; -using FluentAssertions.Equivalency; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V2; using Microsoft.OpenApi.Tests; @@ -226,7 +224,7 @@ public void ParseParameterWithDefaultShouldSucceed() var parameter = OpenApiV2Deserializer.LoadParameter(node, new(), new ParsingContext(new())); // Assert - parameter.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiParameter { In = ParameterLocation.Path, @@ -239,7 +237,7 @@ public void ParseParameterWithDefaultShouldSucceed() Format = "float", Default = new JsonNodeExtension(5).Node } - }, options => options.IgnoringCyclicReferences().Excluding(x => x.Schema.Default.Parent)); + }, parameter, "Parent"); } [Fact] @@ -274,10 +272,7 @@ public void ParseParameterWithEnumShouldSucceed() }; // Assert - parameter.Should().BeEquivalentTo(expected, options => options - .IgnoringCyclicReferences() - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Parent"))); + OpenApiTestAssert.Equivalent(expected, parameter, "Parent"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs index ee5e4a25f..836be574b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs @@ -5,8 +5,6 @@ using System.IO; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; -using FluentAssertions.Equivalency; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V2; using Microsoft.OpenApi.Tests; @@ -35,12 +33,12 @@ public void ParseSchemaWithDefaultShouldSucceed() var schema = OpenApiV2Deserializer.LoadSchema(node, new(), new ParsingContext(new())); // Assert - schema.Should().BeEquivalentTo(new OpenApiSchema + OpenApiTestAssert.Equivalent(new OpenApiSchema { Type = JsonSchemaType.Number, Format = "float", Default = 5 - }, options => options.IgnoringCyclicReferences().Excluding(x => x.Default.Parent)); + }, schema, "Parent"); } [Fact] @@ -57,13 +55,13 @@ public void ParseSchemaWithExampleShouldSucceed() var schema = OpenApiV2Deserializer.LoadSchema(node, new(), new ParsingContext(new())); // Assert - schema.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiSchema { Type = JsonSchemaType.Number, Format = "float", Example = 5 - }, options => options.IgnoringCyclicReferences().Excluding(x => x.Example.Parent)); + }, schema, "Parent"); } [Fact] @@ -92,10 +90,7 @@ public void ParseSchemaWithEnumShouldSucceed() ] }; - schema.Should().BeEquivalentTo(expected, options => - options.IgnoringCyclicReferences() - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Parent"))); + OpenApiTestAssert.Equivalent(expected, schema, "Parent"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index 60c6907ae..adfe815a2 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -2,7 +2,6 @@ using System.Globalization; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Tests; using Xunit; @@ -244,7 +243,7 @@ public async Task ParseDocumentWithWebhooksShouldSucceed() // Assert Assert.Equivalent(new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1, Format = OpenApiConstants.Yaml }, actual.Diagnostic); - actual.Document.Should().BeEquivalentTo(expected, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + OpenApiTestAssert.Equivalent(expected, actual.Document, "Workspace", "BaseUri"); } [Fact] @@ -446,9 +445,7 @@ public async Task ParseDocumentsWithReusablePathItemInWebhooksSucceeds() }; // Assert - actual.Document.Should().BeEquivalentTo(expected, options => options - .Excluding(x => x.Workspace) - .Excluding(y => y.BaseUri)); + OpenApiTestAssert.Equivalent(expected, actual.Document, "Workspace", "BaseUri"); Assert.Equivalent( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1, Format = OpenApiConstants.Yaml }, actual.Diagnostic); } @@ -613,7 +610,7 @@ public async Task ParseDocumentWithEmptyTagsWorks() var path = Path.Join(SampleFolderPath, "documentWithEmptyTags.json"); var doc = (await OpenApiDocument.LoadAsync(path, SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken)).Document; - doc.Paths["/groups"].Operations[HttpMethod.Get].Tags.Should().BeNull("Empty tags are ignored, so we should not have any tags"); + Assert.Null(doc.Paths["/groups"].Operations[HttpMethod.Get].Tags); } [Fact] public async Task DocumentWithSchemaResultsInWarning() diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiHeaderTests.cs index 19cf48714..08ec2ee57 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiHeaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiHeaderTests.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs index c337a968f..c785ac24b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V31; using Microsoft.OpenApi.Tests; @@ -25,7 +24,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() var mediaType = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - mediaType.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiMediaType { Example = 5, @@ -34,9 +33,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, options => options.IgnoringCyclicReferences() - .Excluding(m => m.Example.Parent) - ); + }, mediaType, "Parent"); } [Fact] @@ -46,7 +43,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() var mediaType = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - mediaType.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiMediaType { Examples = new Dictionary @@ -65,9 +62,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, options => options.IgnoringCyclicReferences() - .Excluding(m => m.Examples["example1"].Value.Parent) - .Excluding(m => m.Examples["example2"].Value.Parent)); + }, mediaType, "Parent"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 8f86d8297..94247e59f 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -8,8 +8,6 @@ using System.Linq; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; -using FluentAssertions.Equivalency; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Tests; using Xunit; @@ -292,10 +290,7 @@ public async Task ParseAdvancedV31SchemaShouldSucceed() }; // Assert - schema.Should().BeEquivalentTo(expectedSchema, options => options - .IgnoringCyclicReferences() - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Parent"))); + OpenApiTestAssert.Equivalent(expectedSchema, schema, "Parent"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 6cc8bb7a3..6af3108e6 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -13,7 +13,6 @@ using System.Text.Json.Nodes; using System.Threading; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Tests; using Moq; @@ -55,7 +54,7 @@ public void ParseDocumentFromInlineStringShouldSucceed() paths: {}", OpenApiConstants.Yaml, SettingsFixture.ReaderSettings); - result.Document.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiDocument { Info = new OpenApiInfo @@ -64,7 +63,7 @@ public void ParseDocumentFromInlineStringShouldSucceed() Version = "0.9.1" }, Paths = new OpenApiPaths() - }, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + }, result.Document, "Workspace", "BaseUri"); Assert.Equivalent( new OpenApiDiagnostic() @@ -96,7 +95,7 @@ public async Task ParseBasicDocumentWithMultipleServersShouldSucceed() var result = await OpenApiDocument.LoadAsync(path, SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); Assert.Empty(result.Diagnostic.Errors); - result.Document.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiDocument { Info = new OpenApiInfo @@ -118,7 +117,7 @@ public async Task ParseBasicDocumentWithMultipleServersShouldSucceed() } ], Paths = new OpenApiPaths() - }, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + }, result.Document, "Workspace", "BaseUri"); } [Fact] public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() @@ -131,7 +130,7 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() var result = await OpenApiDocument.LoadAsync(memoryStream, settings: SettingsFixture.ReaderSettings, cancellationToken: TestContext.Current.CancellationToken); - result.Document.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiDocument { Info = new OpenApiInfo @@ -139,7 +138,7 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() Version = "0.9" }, Paths = new OpenApiPaths() - }, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + }, result.Document, "Workspace", "BaseUri"); Assert.Equivalent( new OpenApiDiagnostic @@ -192,7 +191,7 @@ public async Task ParseMinimalDocumentShouldSucceed() { var result = await OpenApiDocument.LoadAsync(Path.Join(SampleFolderPath, "minimalDocument.yaml"), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); - result.Document.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiDocument { Info = new OpenApiInfo @@ -201,7 +200,7 @@ public async Task ParseMinimalDocumentShouldSucceed() Version = "0.9.1" }, Paths = new OpenApiPaths() - }, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + }, result.Document, "Workspace", "BaseUri"); Assert.Equivalent( new OpenApiDiagnostic() @@ -591,7 +590,7 @@ public async Task ParseStandardPetStoreDocumentShouldSucceed() Components = components }; - actual.Document.Should().BeEquivalentTo(expectedDoc, options => options.Excluding(x => x.Workspace).Excluding(y => y.BaseUri)); + OpenApiTestAssert.Equivalent(expectedDoc, actual.Document, "Workspace", "BaseUri"); Assert.Equivalent( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, Format = OpenApiConstants.Yaml }, actual.Diagnostic); @@ -1060,12 +1059,10 @@ [new OpenApiSecuritySchemeReference("securitySchemeName2")] = expected.RegisterComponents(); expected.SetReferenceHostDocument(); - actual.Document.Should().BeEquivalentTo(expected, options => options - .IgnoringCyclicReferences() - .Excluding(ctx => ctx.Path.Contains("Paths[\"/pets\"].Operations[HttpMethod.Get].Tags")) - .Excluding(ctx => ctx.Path.Contains("Paths[\"/pets\"].Operations[HttpMethod.Post].Tags")) - .Excluding(x => x.Workspace) - .Excluding(y => y.BaseUri)); + OpenApiTestAssert.Equivalent(expected, actual.Document, path => + path.MemberName is "Workspace" or "BaseUri" + || path.Value.Contains("Paths[/pets].Operations[Get].Tags") + || path.Value.Contains("Paths[/pets].Operations[Post].Tags")); Assert.Equivalent( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, Format = OpenApiConstants.Yaml }, actual.Diagnostic); @@ -1099,7 +1096,7 @@ public async Task HeaderParameterShouldAllowExample() var exampleHeader = result.Document.Components?.Headers?["example-header"]; Assert.NotNull(exampleHeader); - exampleHeader.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiHeader() { Description = "Test header with example", @@ -1115,12 +1112,11 @@ public async Task HeaderParameterShouldAllowExample() Type = JsonSchemaType.String, Format = "uuid" }, - }, options => options.IgnoringCyclicReferences() - .Excluding(e => e.Example.Parent)); + }, exampleHeader, "Parent"); var examplesHeader = result.Document.Components?.Headers?["examples-header"]; Assert.NotNull(examplesHeader); - examplesHeader.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiHeader() { Description = "Test header with example", @@ -1148,9 +1144,7 @@ public async Task HeaderParameterShouldAllowExample() Type = JsonSchemaType.String, Format = "uuid" }, - }, options => options.IgnoringCyclicReferences() - .Excluding(e => e.Examples["uuid1"].Value.Parent) - .Excluding(e => e.Examples["uuid2"].Value.Parent)); + }, examplesHeader, "Parent"); } [Fact] @@ -1430,13 +1424,7 @@ public async Task ParseDocWithRefsUsingProxyReferencesSucceeds() var actualParamReference = Assert.IsType(actualParam); // Assert - actualParamReference.Should().BeEquivalentTo(expectedParamReference, options => options - .Excluding(x => x.Reference) - .Excluding(x => x.Target) - .Excluding(x => x.RecursiveTarget) - .Excluding(x => x.Schema.Default.Parent) - .Excluding(x => x.Schema.Default.Options) - .IgnoringCyclicReferences()); + OpenApiTestAssert.Equivalent(expectedParamReference, actualParamReference, "Reference", "Target", "RecursiveTarget", "Parent", "Options"); Assert.Equal(expectedSerializedDoc.MakeLineBreaksEnvironmentNeutral(), outputDoc); } @@ -1487,7 +1475,7 @@ public void ParseBasicDocumentWithServerVariableShouldSucceed() Format = OpenApiConstants.Yaml }, result.Diagnostic); - result.Document.Should().BeEquivalentTo(expected, options => options.Excluding(x => x.BaseUri)); + OpenApiTestAssert.Equivalent(expected, result.Document, "BaseUri"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index 6d52c4ff4..9748f8780 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -4,8 +4,8 @@ using System.IO; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Tests; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -56,15 +56,7 @@ public async Task ParseAdvancedExampleShouldSucceed() } }; - example.Should().BeEquivalentTo(expected, options => options.IgnoringCyclicReferences() - .Excluding(e => e.Value["versions"][0]["status"].Root) - .Excluding(e => e.Value["versions"][0]["id"].Root) - .Excluding(e => e.Value["versions"][0]["links"][0]["href"].Root) - .Excluding(e => e.Value["versions"][0]["links"][0]["rel"].Root) - .Excluding(e => e.Value["versions"][1]["status"].Root) - .Excluding(e => e.Value["versions"][1]["id"].Root) - .Excluding(e => e.Value["versions"][1]["links"][0]["href"].Root) - .Excluding(e => e.Value["versions"][1]["links"][0]["rel"].Root)); + OpenApiTestAssert.Equivalent(expected, example, "Root"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiHeaderTests.cs index 1b728ffd6..77d0499ad 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiHeaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiHeaderTests.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Xunit; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index 9379c38e8..8e5f49daa 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -6,8 +6,8 @@ using System.IO; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Tests; using Xunit; namespace Microsoft.OpenApi.Readers.Tests.V3Tests @@ -24,7 +24,7 @@ public async Task ParseAdvancedInfoShouldSucceed() var openApiInfo = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "advancedInfo.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - openApiInfo.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiInfo { Title = "Advanced Info", @@ -61,20 +61,7 @@ public async Task ParseAdvancedInfoShouldSucceed() }), ["x-list"] = new JsonNodeExtension (new JsonArray { "1", "2" }) } - }, options => options.IgnoringCyclicReferences() - .Excluding(i => ((JsonNodeExtension)i.Contact.Extensions["x-twitter"]).Node.Parent) - .Excluding(i => ((JsonNodeExtension)i.License.Extensions["x-disclaimer"]).Node.Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-something"]).Node.Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-contact"]).Node["name"].Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-contact"]).Node["name"].Root) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-contact"]).Node["url"].Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-contact"]).Node["url"].Root) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-contact"]).Node["email"].Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-contact"]).Node["email"].Root) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-list"]).Node[0].Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-list"]).Node[0].Root) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-list"]).Node[1].Parent) - .Excluding(i => ((JsonNodeExtension)i.Extensions["x-list"]).Node[1].Root)); + }, openApiInfo, "Parent", "Root"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 10c0fb9a9..29b7fd496 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V3; using Microsoft.OpenApi.Tests; @@ -25,7 +24,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() var mediaType = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "mediaTypeWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - mediaType.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiMediaType { Example = 5, @@ -34,9 +33,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, options => options.IgnoringCyclicReferences() - .Excluding(m => m.Example.Parent) - ); + }, mediaType, "Parent"); } [Fact] @@ -46,7 +43,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() var mediaType = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "mediaTypeWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - mediaType.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiMediaType { Examples = new Dictionary @@ -65,9 +62,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, options => options.IgnoringCyclicReferences() - .Excluding(m => m.Examples["example1"].Value.Parent) - .Excluding(m => m.Examples["example2"].Value.Parent)); + }, mediaType, "Parent"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index 8756e90f6..f25218093 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -7,7 +7,7 @@ using System.Net.Http; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; +using Microsoft.OpenApi.Tests; using Microsoft.OpenApi.Reader; using Xunit; @@ -71,9 +71,7 @@ public async Task ParseOperationWithParameterWithNoLocationShouldSucceed() }; // Assert - expectedOp.Should().BeEquivalentTo(operation, - options => - options.Excluding(x => x.Tags)); + OpenApiTestAssert.Equivalent(expectedOp, operation, "Tags"); } [Fact] public void DeduplicatesTagReferences() diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index 9b28fbffe..2b6a1a5cc 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -3,10 +3,10 @@ using System.Collections.Generic; using System.IO; -using FluentAssertions; using Microsoft.OpenApi.Reader; using Xunit; using Microsoft.OpenApi.Reader.V3; +using Microsoft.OpenApi.Tests; using System.Threading.Tasks; using System.Net.Http; @@ -240,7 +240,7 @@ public async Task ParseParameterWithExampleShouldSucceed() var parameter = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "parameterWithExample.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - parameter.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiParameter { In = null, @@ -253,7 +253,7 @@ public async Task ParseParameterWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, options => options.IgnoringCyclicReferences().Excluding(p => p.Example.Parent)); + }, parameter, "Parent"); } [Fact] @@ -263,7 +263,7 @@ public async Task ParseParameterWithExamplesShouldSucceed() var parameter = await OpenApiModelFactory.LoadAsync(Path.Join(SampleFolderPath, "parameterWithExamples.yaml"), OpenApiSpecVersion.OpenApi3_0, new(), settings: SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); // Assert - parameter.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiParameter { In = null, @@ -286,9 +286,7 @@ public async Task ParseParameterWithExamplesShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, options => options.IgnoringCyclicReferences() - .Excluding(p => p.Examples["example1"].Value.Parent) - .Excluding(p => p.Examples["example2"].Value.Parent)); + }, parameter, "Parent"); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs index 85126723b..f4b5c1e09 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs @@ -6,8 +6,6 @@ using System.Net.Http; using System.Text.Json.Nodes; using System.Threading.Tasks; -using FluentAssertions; -using FluentAssertions.Equivalency; using Microsoft.OpenApi.Reader; using Microsoft.OpenApi.Reader.V3; using Microsoft.OpenApi.Tests; @@ -67,12 +65,12 @@ public void ParseExampleStringFragmentShouldSucceed() // Assert Assert.Equivalent(new OpenApiDiagnostic(), diagnostic); - jsonNodeExtension.Should().BeEquivalentTo(new JsonNodeExtension( + OpenApiTestAssert.Equivalent(new JsonNodeExtension( new JsonObject { ["foo"] = "bar", ["baz"] = new JsonArray() { 1, 2 } - }), options => options.IgnoringCyclicReferences()); + }), jsonNodeExtension); } [Fact] @@ -90,12 +88,12 @@ public void ParseEnumFragmentShouldSucceed() // Assert Assert.Equivalent(new OpenApiDiagnostic(), diagnostic); - jsonNodeExtension.Should().BeEquivalentTo(new JsonNodeExtension( + OpenApiTestAssert.Equivalent(new JsonNodeExtension( new JsonArray { "foo", "baz" - }), options => options.IgnoringCyclicReferences()); + }), jsonNodeExtension); } [Fact] @@ -254,7 +252,7 @@ public void ParseBasicSchemaWithExampleShouldSucceed() // Assert Assert.Equivalent(new OpenApiDiagnostic(), diagnostic); - schema.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiSchema { Type = JsonSchemaType.Object, @@ -279,12 +277,7 @@ public void ParseBasicSchemaWithExampleShouldSucceed() ["name"] = new JsonNodeExtension("Puma").Node, ["id"] = new JsonNodeExtension(1).Node } - }, options => options - .IgnoringCyclicReferences() - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Parent")) - .Excluding((IMemberInfo memberInfo) => - memberInfo.Path.EndsWith("Root"))); + }, schema, "Parent", "Root"); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs b/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs index d2afed0c6..0386c79df 100644 --- a/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs +++ b/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using FluentAssertions; - namespace Microsoft.OpenApi.Tests { /// @@ -15,14 +13,6 @@ public class DefaultSettingsFixture /// public DefaultSettingsFixture() { - // We need RespectingRuntimeTypes() to ensure equivalence test works property, - // given that there are multiple types that can be used for the declared type OpenApiAny. - // Without this option, properties specific to those types would not be compared. - AssertionOptions.AssertEquivalencyUsing( - o => o - .AllowingInfiniteRecursion() - .RespectingRuntimeTypes() - .WithStrictOrdering()); } } } diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index cff07adde..78235960d 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -10,7 +10,6 @@ - diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index a3cd6a2ed..63d384b79 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -10,7 +10,6 @@ using System.Text.Json.Schema; using System.Text.Json.Serialization; using System.Threading.Tasks; -using FluentAssertions; using Microsoft.OpenApi.Reader; using VerifyXunit; using Xunit; @@ -636,9 +635,7 @@ public void CloningSchemaExamplesWorks(JsonNode example) var schemaCopy = schema.CreateShallowCopy(); // Act && Assert - schema.Example.Should().BeEquivalentTo(schemaCopy.Example, options => options - .IgnoringCyclicReferences() - .Excluding(x => x.Options)); + OpenApiTestAssert.Equivalent(schemaCopy.Example, schema.Example, "Options"); } #pragma warning restore CS0618 diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs index 8022d1070..47edf9aa9 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecurityRequirementTests.cs @@ -6,7 +6,6 @@ using System.Globalization; using System.IO; using System.Threading.Tasks; -using FluentAssertions; using VerifyXunit; using Xunit; using System.Text.Json.Nodes; @@ -234,14 +233,15 @@ public void SchemesShouldConsiderOnlyReferenceIdForEquality() Assert.Equal(2, securityRequirement.Count); - securityRequirement.Should().BeEquivalentTo( + OpenApiTestAssert.Equivalent( new OpenApiSecurityRequirement { // This should work with any security scheme object // as long as Reference.Id os securityScheme1 [new OpenApiSecuritySchemeReference("securityScheme1", null)] = new List(), [new OpenApiSecuritySchemeReference("securityScheme2", null)] = new List { "scope1", "scope2" }, - }); + }, + securityRequirement); } } } diff --git a/test/Microsoft.OpenApi.Tests/OpenApiTestAssert.cs b/test/Microsoft.OpenApi.Tests/OpenApiTestAssert.cs new file mode 100644 index 000000000..e9bd68048 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/OpenApiTestAssert.cs @@ -0,0 +1,158 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text.Json.Nodes; +using Xunit; + +namespace Microsoft.OpenApi.Tests; + +public static class OpenApiTestAssert +{ + public static void Equivalent(T expected, T actual, params string[] excludedMemberNames) + { + Equivalent(expected, actual, path => excludedMemberNames.Contains(path.MemberName)); + } + + public static void Equivalent(T expected, T actual, Func exclude) + { + Compare(expected, actual, EquivalencyPath.Root, exclude, new HashSet()); + } + + public readonly record struct EquivalencyPath(string Value, string MemberName) + { + public static EquivalencyPath Root { get; } = new(string.Empty, string.Empty); + + public EquivalencyPath Member(string memberName) + { + var value = string.IsNullOrEmpty(Value) ? memberName : $"{Value}.{memberName}"; + return new(value, memberName); + } + + public EquivalencyPath Index(object index) + { + return new($"{Value}[{index}]", MemberName); + } + } + + private static void Compare(object expected, object actual, EquivalencyPath path, Func exclude, HashSet visited) + { + if (exclude(path)) + { + return; + } + + if (expected is null || actual is null) + { + Assert.Equal(expected, actual); + return; + } + + if (expected is JsonNode || actual is JsonNode) + { + var expectedNode = Assert.IsAssignableFrom(expected); + var actualNode = Assert.IsAssignableFrom(actual); + Assert.True(JsonNode.DeepEquals(expectedNode, actualNode), $"Expected JSON node at '{path.Value}' to be equivalent."); + return; + } + + var expectedType = expected.GetType(); + if (IsSimpleType(expectedType)) + { + Assert.Equal(expected, actual); + return; + } + + if (!expectedType.IsValueType) + { + var pair = new ReferencePair(expected, actual); + if (!visited.Add(pair)) + { + return; + } + } + + if (expected is IDictionary expectedDictionary && actual is IDictionary actualDictionary) + { + Assert.Equal(expectedDictionary.Count, actualDictionary.Count); + foreach (DictionaryEntry expectedEntry in expectedDictionary) + { + Assert.True(actualDictionary.Contains(expectedEntry.Key), $"Expected dictionary at '{path.Value}' to contain key '{expectedEntry.Key}'."); + Compare(expectedEntry.Value, actualDictionary[expectedEntry.Key], path.Index(expectedEntry.Key), exclude, visited); + } + + return; + } + + if (expected is IEnumerable expectedEnumerable && actual is IEnumerable actualEnumerable && expected is not string) + { + var expectedItems = expectedEnumerable.Cast().ToList(); + var actualItems = actualEnumerable.Cast().ToList(); + + Assert.Equal(expectedItems.Count, actualItems.Count); + for (var index = 0; index < expectedItems.Count; index++) + { + Compare(expectedItems[index], actualItems[index], path.Index(index), exclude, visited); + } + + return; + } + + foreach (var property in expectedType.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(static p => p.GetIndexParameters().Length == 0)) + { + var propertyPath = path.Member(property.Name); + if (exclude(propertyPath)) + { + continue; + } + + var actualProperty = actual.GetType().GetProperty(property.Name, BindingFlags.Instance | BindingFlags.Public); + Assert.NotNull(actualProperty); + Compare(property.GetValue(expected), actualProperty.GetValue(actual), propertyPath, exclude, visited); + } + + foreach (var field in expectedType.GetFields(BindingFlags.Instance | BindingFlags.Public)) + { + var fieldPath = path.Member(field.Name); + if (exclude(fieldPath)) + { + continue; + } + + var actualField = actual.GetType().GetField(field.Name, BindingFlags.Instance | BindingFlags.Public); + Assert.NotNull(actualField); + Compare(field.GetValue(expected), actualField.GetValue(actual), fieldPath, exclude, visited); + } + } + + private static bool IsSimpleType(Type type) + { + return type.IsPrimitive + || type.IsEnum + || type == typeof(string) + || type == typeof(decimal) + || type == typeof(DateTime) + || type == typeof(DateTimeOffset) + || type == typeof(TimeSpan) + || type == typeof(Uri) + || type == typeof(Guid); + } + + private readonly record struct ReferencePair(object Expected, object Actual) + { + public bool Equals(ReferencePair other) + { + return ReferenceEquals(Expected, other.Expected) && ReferenceEquals(Actual, other.Actual); + } + + public override int GetHashCode() + { + return HashCode.Combine(RuntimeHelpers.GetHashCode(Expected), RuntimeHelpers.GetHashCode(Actual)); + } + } +} From 287a6c239509c9cff3014e2fcf12cddaccbf9405 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 31 Aug 2026 14:03:07 -0400 Subject: [PATCH 2/3] test(assertions): use nameof for equivalency excludes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4a641408-bb75-484a-a8b1-25aa38f42105 --- .../V2Tests/ComparisonTests.cs | 2 +- .../V2Tests/OpenApiDocumentTests.cs | 2 +- .../V2Tests/OpenApiHeaderTests.cs | 4 ++-- .../V2Tests/OpenApiOperationTests.cs | 2 +- .../V2Tests/OpenApiParameterTests.cs | 4 ++-- .../V2Tests/OpenApiSchemaTests.cs | 6 ++--- .../V31Tests/OpenApiDocumentTests.cs | 4 ++-- .../V31Tests/OpenApiMediaTypeTests.cs | 4 ++-- .../V31Tests/OpenApiSchemaTests.cs | 2 +- .../V3Tests/OpenApiDocumentTests.cs | 24 +++++++++---------- .../V3Tests/OpenApiExampleTests.cs | 2 +- .../V3Tests/OpenApiInfoTests.cs | 2 +- .../V3Tests/OpenApiMediaTypeTests.cs | 4 ++-- .../V3Tests/OpenApiOperationTests.cs | 2 +- .../V3Tests/OpenApiParameterTests.cs | 5 ++-- .../V3Tests/OpenApiSchemaTests.cs | 2 +- .../Models/OpenApiSchemaTests.cs | 2 +- 17 files changed, 37 insertions(+), 36 deletions(-) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs index d79c1929e..db63cbe9c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/ComparisonTests.cs @@ -27,7 +27,7 @@ public async Task EquivalentV2AndV3DocumentsShouldProduceEquivalentObjects(strin var result1 = await OpenApiDocument.LoadAsync(Path.Join(SampleFolderPath, $"{fileName}.v2.yaml"), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); var result2 = await OpenApiDocument.LoadAsync(Path.Join(SampleFolderPath, $"{fileName}.v3.yaml"), SettingsFixture.ReaderSettings, token: TestContext.Current.CancellationToken); - OpenApiTestAssert.Equivalent(result1.Document, result2.Document, "Workspace", "BaseUri"); + OpenApiTestAssert.Equivalent(result1.Document, result2.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); Assert.Equivalent(result2.Diagnostic.Errors, result1.Diagnostic.Errors); } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs index 2362cb388..fe8a03ac1 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiDocumentTests.cs @@ -220,7 +220,7 @@ public async Task ShouldParseProducesInAnyOrder() ["Error"] = errorSchema } } - }, result.Document, "BaseUri"); + }, result.Document, nameof(OpenApiDocument.BaseUri)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs index 8a613abe3..965ea9c7e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiHeaderTests.cs @@ -40,7 +40,7 @@ public void ParseHeaderWithDefaultShouldSucceed() } }, header, - "Parent"); + nameof(JsonNode.Parent)); } [Fact] @@ -71,7 +71,7 @@ public void ParseHeaderWithEnumShouldSucceed() new JsonNodeExtension(9).Node ] } - }, header, "Parent"); + }, header, nameof(JsonNode.Parent)); } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs index 312569b93..b4777dbda 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiOperationTests.cs @@ -242,7 +242,7 @@ public void ParseOperationWithResponseExamplesShouldSucceed() } }} } - }, operation, "Parent", "Root"); + }, operation, nameof(JsonNode.Parent), nameof(JsonNode.Root)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs index 41fc68d28..7e7f15405 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiParameterTests.cs @@ -237,7 +237,7 @@ public void ParseParameterWithDefaultShouldSucceed() Format = "float", Default = new JsonNodeExtension(5).Node } - }, parameter, "Parent"); + }, parameter, nameof(JsonNode.Parent)); } [Fact] @@ -272,7 +272,7 @@ public void ParseParameterWithEnumShouldSucceed() }; // Assert - OpenApiTestAssert.Equivalent(expected, parameter, "Parent"); + OpenApiTestAssert.Equivalent(expected, parameter, nameof(JsonNode.Parent)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs index 836be574b..cbbde4b70 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V2Tests/OpenApiSchemaTests.cs @@ -38,7 +38,7 @@ public void ParseSchemaWithDefaultShouldSucceed() Type = JsonSchemaType.Number, Format = "float", Default = 5 - }, schema, "Parent"); + }, schema, nameof(JsonNode.Parent)); } [Fact] @@ -61,7 +61,7 @@ public void ParseSchemaWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float", Example = 5 - }, schema, "Parent"); + }, schema, nameof(JsonNode.Parent)); } [Fact] @@ -90,7 +90,7 @@ public void ParseSchemaWithEnumShouldSucceed() ] }; - OpenApiTestAssert.Equivalent(expected, schema, "Parent"); + OpenApiTestAssert.Equivalent(expected, schema, nameof(JsonNode.Parent)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs index adfe815a2..0de42636b 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDocumentTests.cs @@ -243,7 +243,7 @@ public async Task ParseDocumentWithWebhooksShouldSucceed() // Assert Assert.Equivalent(new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1, Format = OpenApiConstants.Yaml }, actual.Diagnostic); - OpenApiTestAssert.Equivalent(expected, actual.Document, "Workspace", "BaseUri"); + OpenApiTestAssert.Equivalent(expected, actual.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); } [Fact] @@ -445,7 +445,7 @@ public async Task ParseDocumentsWithReusablePathItemInWebhooksSucceeds() }; // Assert - OpenApiTestAssert.Equivalent(expected, actual.Document, "Workspace", "BaseUri"); + OpenApiTestAssert.Equivalent(expected, actual.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); Assert.Equivalent( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_1, Format = OpenApiConstants.Yaml }, actual.Diagnostic); } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs index c785ac24b..bb9604851 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiMediaTypeTests.cs @@ -33,7 +33,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, mediaType, "Parent"); + }, mediaType, nameof(JsonNode.Parent)); } [Fact] @@ -62,7 +62,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, mediaType, "Parent"); + }, mediaType, nameof(JsonNode.Parent)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 94247e59f..caffb3e3e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -290,7 +290,7 @@ public async Task ParseAdvancedV31SchemaShouldSucceed() }; // Assert - OpenApiTestAssert.Equivalent(expectedSchema, schema, "Parent"); + OpenApiTestAssert.Equivalent(expectedSchema, schema, nameof(JsonNode.Parent)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index 6af3108e6..3b6c8afcd 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -63,7 +63,7 @@ public void ParseDocumentFromInlineStringShouldSucceed() Version = "0.9.1" }, Paths = new OpenApiPaths() - }, result.Document, "Workspace", "BaseUri"); + }, result.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); Assert.Equivalent( new OpenApiDiagnostic() @@ -117,7 +117,7 @@ public async Task ParseBasicDocumentWithMultipleServersShouldSucceed() } ], Paths = new OpenApiPaths() - }, result.Document, "Workspace", "BaseUri"); + }, result.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); } [Fact] public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() @@ -138,7 +138,7 @@ public async Task ParseBrokenMinimalDocumentShouldYieldExpectedDiagnostic() Version = "0.9" }, Paths = new OpenApiPaths() - }, result.Document, "Workspace", "BaseUri"); + }, result.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); Assert.Equivalent( new OpenApiDiagnostic @@ -200,7 +200,7 @@ public async Task ParseMinimalDocumentShouldSucceed() Version = "0.9.1" }, Paths = new OpenApiPaths() - }, result.Document, "Workspace", "BaseUri"); + }, result.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); Assert.Equivalent( new OpenApiDiagnostic() @@ -590,7 +590,7 @@ public async Task ParseStandardPetStoreDocumentShouldSucceed() Components = components }; - OpenApiTestAssert.Equivalent(expectedDoc, actual.Document, "Workspace", "BaseUri"); + OpenApiTestAssert.Equivalent(expectedDoc, actual.Document, nameof(OpenApiDocument.Workspace), nameof(OpenApiDocument.BaseUri)); Assert.Equivalent( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, Format = OpenApiConstants.Yaml }, actual.Diagnostic); @@ -1060,9 +1060,9 @@ [new OpenApiSecuritySchemeReference("securitySchemeName2")] = expected.SetReferenceHostDocument(); OpenApiTestAssert.Equivalent(expected, actual.Document, path => - path.MemberName is "Workspace" or "BaseUri" - || path.Value.Contains("Paths[/pets].Operations[Get].Tags") - || path.Value.Contains("Paths[/pets].Operations[Post].Tags")); + path.MemberName is nameof(OpenApiDocument.Workspace) or nameof(OpenApiDocument.BaseUri) + || path.Value.Contains($"{nameof(OpenApiDocument.Paths)}[/pets].{nameof(OpenApiPathItem.Operations)}[{HttpMethod.Get}].{nameof(OpenApiOperation.Tags)}") + || path.Value.Contains($"{nameof(OpenApiDocument.Paths)}[/pets].{nameof(OpenApiPathItem.Operations)}[{HttpMethod.Post}].{nameof(OpenApiOperation.Tags)}")); Assert.Equivalent( new OpenApiDiagnostic() { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0, Format = OpenApiConstants.Yaml }, actual.Diagnostic); @@ -1112,7 +1112,7 @@ public async Task HeaderParameterShouldAllowExample() Type = JsonSchemaType.String, Format = "uuid" }, - }, exampleHeader, "Parent"); + }, exampleHeader, nameof(JsonNode.Parent)); var examplesHeader = result.Document.Components?.Headers?["examples-header"]; Assert.NotNull(examplesHeader); @@ -1144,7 +1144,7 @@ public async Task HeaderParameterShouldAllowExample() Type = JsonSchemaType.String, Format = "uuid" }, - }, examplesHeader, "Parent"); + }, examplesHeader, nameof(JsonNode.Parent)); } [Fact] @@ -1424,7 +1424,7 @@ public async Task ParseDocWithRefsUsingProxyReferencesSucceeds() var actualParamReference = Assert.IsType(actualParam); // Assert - OpenApiTestAssert.Equivalent(expectedParamReference, actualParamReference, "Reference", "Target", "RecursiveTarget", "Parent", "Options"); + OpenApiTestAssert.Equivalent(expectedParamReference, actualParamReference, nameof(OpenApiParameterReference.Reference), nameof(OpenApiParameterReference.Target), nameof(OpenApiParameterReference.RecursiveTarget), nameof(JsonNode.Parent), nameof(JsonNode.Options)); Assert.Equal(expectedSerializedDoc.MakeLineBreaksEnvironmentNeutral(), outputDoc); } @@ -1475,7 +1475,7 @@ public void ParseBasicDocumentWithServerVariableShouldSucceed() Format = OpenApiConstants.Yaml }, result.Diagnostic); - OpenApiTestAssert.Equivalent(expected, result.Document, "BaseUri"); + OpenApiTestAssert.Equivalent(expected, result.Document, nameof(OpenApiDocument.BaseUri)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs index 9748f8780..f098738e8 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiExampleTests.cs @@ -56,7 +56,7 @@ public async Task ParseAdvancedExampleShouldSucceed() } }; - OpenApiTestAssert.Equivalent(expected, example, "Root"); + OpenApiTestAssert.Equivalent(expected, example, nameof(JsonNode.Root)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs index 8e5f49daa..a11b044f4 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiInfoTests.cs @@ -61,7 +61,7 @@ public async Task ParseAdvancedInfoShouldSucceed() }), ["x-list"] = new JsonNodeExtension (new JsonArray { "1", "2" }) } - }, openApiInfo, "Parent", "Root"); + }, openApiInfo, nameof(JsonNode.Parent), nameof(JsonNode.Root)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs index 29b7fd496..1a8793fea 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiMediaTypeTests.cs @@ -33,7 +33,7 @@ public async Task ParseMediaTypeWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, mediaType, "Parent"); + }, mediaType, nameof(JsonNode.Parent)); } [Fact] @@ -62,7 +62,7 @@ public async Task ParseMediaTypeWithExamplesShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, mediaType, "Parent"); + }, mediaType, nameof(JsonNode.Parent)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs index f25218093..de462ebb2 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiOperationTests.cs @@ -71,7 +71,7 @@ public async Task ParseOperationWithParameterWithNoLocationShouldSucceed() }; // Assert - OpenApiTestAssert.Equivalent(expectedOp, operation, "Tags"); + OpenApiTestAssert.Equivalent(expectedOp, operation, nameof(OpenApiOperation.Tags)); } [Fact] public void DeduplicatesTagReferences() diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs index 2b6a1a5cc..04d734b17 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiParameterTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using System.Text.Json.Nodes; using Microsoft.OpenApi.Reader; using Xunit; using Microsoft.OpenApi.Reader.V3; @@ -253,7 +254,7 @@ public async Task ParseParameterWithExampleShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, parameter, "Parent"); + }, parameter, nameof(JsonNode.Parent)); } [Fact] @@ -286,7 +287,7 @@ public async Task ParseParameterWithExamplesShouldSucceed() Type = JsonSchemaType.Number, Format = "float" } - }, parameter, "Parent"); + }, parameter, nameof(JsonNode.Parent)); } [Fact] diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs index f4b5c1e09..f574245e6 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs @@ -277,7 +277,7 @@ public void ParseBasicSchemaWithExampleShouldSucceed() ["name"] = new JsonNodeExtension("Puma").Node, ["id"] = new JsonNodeExtension(1).Node } - }, schema, "Parent", "Root"); + }, schema, nameof(JsonNode.Parent), nameof(JsonNode.Root)); } [Fact] diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs index 63d384b79..41bf64a7a 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs @@ -635,7 +635,7 @@ public void CloningSchemaExamplesWorks(JsonNode example) var schemaCopy = schema.CreateShallowCopy(); // Act && Assert - OpenApiTestAssert.Equivalent(schemaCopy.Example, schema.Example, "Options"); + OpenApiTestAssert.Equivalent(schemaCopy.Example, schema.Example, nameof(JsonNode.Options)); } #pragma warning restore CS0618 From bcd08a3c990e89aeefd65bb7f4fa7790d80f7993 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 31 Aug 2026 14:04:33 -0400 Subject: [PATCH 3/3] tests: removes outdated fixture Signed-off-by: Vincent Biret --- .../DefaultSettingsFixture.cs | 18 ------------------ .../DefaultSettingsFixtureCollection.cs | 19 ------------------- .../DefaultSettingsFixture.cs | 18 ------------------ .../DefaultSettingsFixtureCollection.cs | 19 ------------------- 4 files changed, 74 deletions(-) delete mode 100644 test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs delete mode 100644 test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixtureCollection.cs delete mode 100644 test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs delete mode 100644 test/Microsoft.OpenApi.Tests/DefaultSettingsFixtureCollection.cs diff --git a/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs b/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs deleted file mode 100644 index dd14b4cba..000000000 --- a/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixture.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -namespace Microsoft.OpenApi.Readers.Tests -{ - /// - /// Fixture containing default settings for external libraries. - /// - public class DefaultSettingsFixture - { - /// - /// Initializes an instance of . - /// - public DefaultSettingsFixture() - { - } - } -} diff --git a/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixtureCollection.cs b/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixtureCollection.cs deleted file mode 100644 index d17520848..000000000 --- a/test/Microsoft.OpenApi.Readers.Tests/DefaultSettingsFixtureCollection.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using Xunit; - -namespace Microsoft.OpenApi.Readers.Tests -{ - /// - /// Collection dummy class for . - /// - /// - /// This class is needed in xUnit framework to define collection name - /// to be used in unit test classes. - /// - [CollectionDefinition("DefaultSettings")] - public class DefaultSettingsFixtureCollection : ICollectionFixture - { - } -} diff --git a/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs b/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs deleted file mode 100644 index 0386c79df..000000000 --- a/test/Microsoft.OpenApi.Tests/DefaultSettingsFixture.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -namespace Microsoft.OpenApi.Tests -{ - /// - /// Fixture containing default settings for external libraries. - /// - public class DefaultSettingsFixture - { - /// - /// Initializes an instance of . - /// - public DefaultSettingsFixture() - { - } - } -} diff --git a/test/Microsoft.OpenApi.Tests/DefaultSettingsFixtureCollection.cs b/test/Microsoft.OpenApi.Tests/DefaultSettingsFixtureCollection.cs deleted file mode 100644 index 22f562c4d..000000000 --- a/test/Microsoft.OpenApi.Tests/DefaultSettingsFixtureCollection.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using Xunit; - -namespace Microsoft.OpenApi.Tests -{ - /// - /// Collection dummy class for . - /// - /// - /// This class is needed in xUnit framework to define collection name - /// to be used in unit test classes. - /// - [CollectionDefinition("DefaultSettings")] - public class DefaultSettingsFixtureCollection : ICollectionFixture - { - } -}