From 2e24f5f83fe892a61f15635e57f2e9199f62baf8 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 13 Aug 2026 08:30:21 -0400 Subject: [PATCH] tests: adds validation tests for circular reference handling --- .../V3Tests/OpenApiSchemaTests.cs | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs index 109997bb6..15115b73a 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSchemaTests.cs @@ -418,6 +418,78 @@ public void ParseBasicSchemaWithReferenceShouldSucceed() }, options => options.Excluding(m => m.Name == "HostDocument")); } + [Fact] + public void ParseSchemaWithCircularPropertyReferencesShouldSucceed() + { + var openApiDoc = new OpenApiStringReader().Read(""" + { + "openapi": "3.0.0", + "info": { + "title": "Test", + "version": "0.0.1" + }, + "paths": {}, + "components": { + "schemas": { + "A": { + "properties": { + "b": { + "$ref": "#/components/schemas/B" + } + } + }, + "B": { + "properties": { + "a": { + "$ref": "#/components/schemas/A" + } + } + } + } + } + } + """, out var diagnostic); + + diagnostic.Should().BeEquivalentTo( + new OpenApiDiagnostic { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); + + var schemaA = openApiDoc.Components.Schemas["A"]; + var schemaB = openApiDoc.Components.Schemas["B"]; + + schemaA.Properties["b"].Should().BeSameAs(schemaB); + schemaB.Properties["a"].Should().BeSameAs(schemaA); + } + + [Fact] + public void ParseSchemaWithCircularRootReferencesShouldSucceed() + { + var openApiDoc = new OpenApiStringReader().Read(""" + { + "openapi": "3.0.0", + "info": { + "title": "Test", + "version": "0.0.1" + }, + "paths": {}, + "components": { + "schemas": { + "A": { + "$ref": "#/components/schemas/B" + }, + "B": { + "$ref": "#/components/schemas/A" + } + } + } + } + """, out var diagnostic); + + diagnostic.Should().BeEquivalentTo( + new OpenApiDiagnostic { SpecificationVersion = OpenApiSpecVersion.OpenApi3_0 }); + + openApiDoc.Components.Schemas["A"].Should().BeSameAs(openApiDoc.Components.Schemas["B"]); + } + [Fact] public void ParseAdvancedSchemaWithReferenceShouldSucceed() {