Skip to content

Commit 7208db5

Browse files
Update implementation of OpenApiWorkspace.ResolveReference to support referencing document fragments
1 parent 3234cdc commit 7208db5

File tree

2 files changed

+50
-12
lines changed

2 files changed

+50
-12
lines changed

src/Microsoft.OpenApi/Services/OpenApiWorkspace.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void AddDocument(string location, OpenApiDocument document)
9292
/// <remarks>Not sure how this is going to work. Does the reference just point to the fragment as a whole, or do we need to
9393
/// to be able to point into the fragment. Keeping it private until we figure it out.
9494
/// </remarks>
95-
private void AddFragment(string location, IOpenApiElement fragment)
95+
public void AddFragment(string location, IOpenApiElement fragment)
9696
{
9797
_fragments.Add(ToLocationUrl(location), fragment);
9898
}
@@ -114,21 +114,14 @@ public void AddArtifact(string location, Stream artifact)
114114
/// <returns></returns>
115115
public IOpenApiReferenceable ResolveReference(OpenApiReference reference)
116116
{
117-
if (_documents.TryGetValue(new Uri(BaseUrl,reference.ExternalResource),out var doc))
117+
if (_documents.TryGetValue(new Uri(BaseUrl, reference.ExternalResource), out var doc))
118118
{
119-
return doc.ResolveReference(reference, true);
119+
return doc.ResolveReference(reference, true);
120120
}
121121
else if (_fragments.TryGetValue(new Uri(BaseUrl, reference.ExternalResource), out var fragment))
122122
{
123-
var frag = fragment as IOpenApiReferenceable;
124-
if (frag != null)
125-
{
126-
return null; // frag.ResolveReference(reference, true); // IOpenApiElement needs to implement ResolveReference
127-
}
128-
else
129-
{
130-
return null;
131-
}
123+
var pointer = new JsonPointer($"/{reference.Id ?? string.Empty}");
124+
return fragment.ResolveReference(pointer);
132125
}
133126
return null;
134127
}

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,51 @@ public void OpenApiWorkspacesShouldLoadDocumentFragments()
155155
Assert.True(false);
156156
}
157157

158+
[Fact]
159+
public void OpenApiWorkspacesCanResolveReferencesToDocumentFragments()
160+
{
161+
// Arrange
162+
var workspace = new OpenApiWorkspace();
163+
var schemaFragment = new OpenApiSchema { Type = "string", Description = "Schema from a fragment" };
164+
workspace.AddFragment("fragment", schemaFragment);
165+
166+
// Act
167+
var schema = workspace.ResolveReference(new OpenApiReference()
168+
{
169+
ExternalResource = "fragment"
170+
}) as OpenApiSchema;
171+
172+
// Assert
173+
Assert.NotNull(schema);
174+
Assert.Equal("Schema from a fragment", schema.Description);
175+
}
176+
177+
[Fact]
178+
public void OpenApiWorkspacesCanResolveReferencesToDocumentFragmentsWithJsonPointers()
179+
{
180+
// Arrange
181+
var workspace = new OpenApiWorkspace();
182+
var componentsFragment = new OpenApiComponents
183+
{
184+
Schemas =
185+
{
186+
["schemaOne"] = new OpenApiSchema() {Type = "string", Description = "Schema from a fragment"}
187+
}
188+
};
189+
workspace.AddFragment("fragment", componentsFragment);
190+
191+
// Act
192+
var schema = workspace.ResolveReference(new OpenApiReference()
193+
{
194+
Id = "components/schemas/schemaOne",
195+
ExternalResource = "fragment"
196+
}) as OpenApiSchema;
197+
198+
// Assert
199+
Assert.NotNull(schema);
200+
Assert.Equal("Schema from a fragment", schema.Description);
201+
}
202+
158203

159204
// Test artifacts
160205

0 commit comments

Comments
 (0)