Skip to content

Commit f7d87f0

Browse files
committed
fix: anchor combination with id resolution
1 parent 6e9f76b commit f7d87f0

2 files changed

Lines changed: 39 additions & 7 deletions

File tree

src/Microsoft.OpenApi/Services/OpenApiWorkspace.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,13 @@ private void RegisterSchemaIdentifiers(IOpenApiSchema schema, Uri baseUri, ISet<
298298
}
299299

300300
var schemaBaseUri = baseUri;
301+
if (!string.IsNullOrEmpty(schema.Id) &&
302+
Uri.TryCreate(schema.Id, UriKind.RelativeOrAbsolute, out var schemaIdUri))
303+
{
304+
schemaBaseUri = schemaIdUri.IsAbsoluteUri ? schemaIdUri : new Uri(baseUri, schemaIdUri);
305+
RegisterComponent(schemaBaseUri.AbsoluteUri, schema);
306+
}
307+
301308
if (schema is IOpenApiSchemaMissingProperties { Anchor.Length: > 0 } schemaWithAnchor)
302309
{
303310
var anchorUriBuilder = new UriBuilder(schemaBaseUri)
@@ -307,13 +314,6 @@ private void RegisterSchemaIdentifiers(IOpenApiSchema schema, Uri baseUri, ISet<
307314
RegisterComponent(anchorUriBuilder.Uri.AbsoluteUri, schema);
308315
}
309316

310-
if (!string.IsNullOrEmpty(schema.Id) &&
311-
Uri.TryCreate(schema.Id, UriKind.RelativeOrAbsolute, out var schemaIdUri))
312-
{
313-
schemaBaseUri = schemaIdUri.IsAbsoluteUri ? schemaIdUri : new Uri(baseUri, schemaIdUri);
314-
RegisterComponent(schemaBaseUri.AbsoluteUri, schema);
315-
}
316-
317317
RegisterSchemaIdentifier(schema.Items, schemaBaseUri, visitedSchemas);
318318
RegisterSchemaIdentifier(schema.AdditionalProperties, schemaBaseUri, visitedSchemas);
319319
RegisterSchemaIdentifier(schema.Not, schemaBaseUri, visitedSchemas);

test/Microsoft.OpenApi.Tests/Workspaces/OpenApiWorkspaceTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,38 @@ public void OpenApiWorkspacesCanResolveReferencesToDocumentFragmentsWithJsonPoin
120120
Assert.Same(responseFragment.Headers["header1"], resolvedElement.Headers["header1"]);
121121
}
122122

123+
[Fact]
124+
public void OpenApiWorkspacesCanResolveSchemaAnchorAgainstSchemaId()
125+
{
126+
// Arrange
127+
var workspace = new OpenApiWorkspace();
128+
var schema = new OpenApiSchema
129+
{
130+
Id = "https://example.com/schema",
131+
Anchor = "address",
132+
Type = JsonSchemaType.Object
133+
};
134+
var document = new OpenApiDocument
135+
{
136+
BaseUri = new Uri("https://example.com/openapi.yaml"),
137+
Components = new OpenApiComponents
138+
{
139+
Schemas = new Dictionary<string, IOpenApiSchema>
140+
{
141+
["person"] = schema
142+
}
143+
}
144+
};
145+
146+
workspace.RegisterComponents(document);
147+
148+
// Act
149+
var resolvedSchema = workspace.ResolveReference<OpenApiSchema>("https://example.com/schema#address");
150+
151+
// Assert
152+
Assert.Same(schema, resolvedSchema);
153+
}
154+
123155
// Test artifacts
124156
private static OpenApiDocument CreateCommonDocument()
125157
{

0 commit comments

Comments
 (0)