From d23bbf4d89c6b42789b213e9dc85fcad347d68e5 Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Mon, 2 Nov 2026 00:21:58 +0530 Subject: [PATCH 1/3] fix(v3): retain full JSON pointer path on OpenAPI 3.0 schema references --- src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs index 7bb9327b6..22c7bf792 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs @@ -397,7 +397,9 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum if (pointer != null) { var reference = GetReferenceIdAndExternalResource(pointer); - return new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2); + var result = new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2); + result.Reference.SetJsonPointerPath(pointer, context.GetLocation()); + return result; } var schema = new OpenApiSchema(); From 7abf1729129add092ca63397bfcf1d136943e7e2 Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Mon, 2 Nov 2026 00:22:40 +0530 Subject: [PATCH 2/3] test(v3): add unit test for component property schema reference in OpenAPI 3.0 --- .../V3Tests/OpenApiSubschemaReferenceTests.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs new file mode 100644 index 000000000..08690e36d --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.OpenApi; +using Microsoft.OpenApi.Reader; +using Microsoft.OpenApi.Tests; +using Xunit; + +namespace Microsoft.OpenApi.Readers.Tests.V3Tests +{ + [Collection("DefaultSettings")] + public class OpenApiSubschemaReferenceTests + { + private const string Document = @" +openapi: 3.0.3 +info: + title: Subschema references + version: 1.0.0 +paths: {} +components: + schemas: + User: + type: object + properties: + name: + type: string + address: + type: object + properties: + city: + type: string + name: + type: integer + UserName: + $ref: '#/components/schemas/User/properties/name' + UserCity: + $ref: '#/components/schemas/User/properties/address/properties/city' +"; + + [Fact] + public void ReferenceToComponentPropertyResolvesToThatProperty() + { + var document = OpenApiDocument.Parse(Document, "yaml", SettingsFixture.ReaderSettings).Document; + + var userName = Assert.IsType(document.Components.Schemas["UserName"]); + + Assert.NotNull(userName.Target); + Assert.Equal(JsonSchemaType.String, userName.Target.Type); + Assert.Equal("#/components/schemas/User/properties/name", userName.Reference.ReferenceV3); + } + } +} From 698424bf902db0770cccddc6bc16f6af44da98cd Mon Sep 17 00:00:00 2001 From: Hardik Kaurani Date: Mon, 2 Nov 2026 00:23:47 +0530 Subject: [PATCH 3/3] test(v3): add regression test for nested component subschema references in OpenAPI 3.0 --- .../V3Tests/OpenApiSubschemaReferenceTests.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs index 08690e36d..f5cb4f142 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs @@ -48,5 +48,17 @@ public void ReferenceToComponentPropertyResolvesToThatProperty() Assert.Equal(JsonSchemaType.String, userName.Target.Type); Assert.Equal("#/components/schemas/User/properties/name", userName.Reference.ReferenceV3); } + + [Fact] + public void ReferenceToNestedComponentPropertyResolvesToThatProperty() + { + var document = OpenApiDocument.Parse(Document, "yaml", SettingsFixture.ReaderSettings).Document; + + var userCity = Assert.IsType(document.Components.Schemas["UserCity"]); + + Assert.NotNull(userCity.Target); + Assert.Equal(JsonSchemaType.String, userCity.Target.Type); + Assert.Equal("#/components/schemas/User/properties/address/properties/city", userCity.Reference.ReferenceV3); + } } }