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(); 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..f5cb4f142 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiSubschemaReferenceTests.cs @@ -0,0 +1,64 @@ +// 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); + } + + [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); + } + } +}