Skip to content

Commit fdfe002

Browse files
committed
fix: discriminator mapping references don't get a document when created from DOM
Signed-off-by: Vincent Biret <[email protected]>
1 parent e2cd111 commit fdfe002

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

src/Microsoft.OpenApi/Services/OpenApiWalker.cs

+24
Original file line numberDiff line numberDiff line change
@@ -932,13 +932,36 @@ internal void Walk(IOpenApiSchema? schema, bool isComponent = false)
932932
Walk("additionalProperties", () => Walk(schema.AdditionalProperties));
933933
}
934934

935+
Walk("discriminator", () => Walk(schema.Discriminator));
936+
935937
Walk(OpenApiConstants.ExternalDocs, () => Walk(schema.ExternalDocs));
936938

937939
Walk(schema as IOpenApiExtensible);
938940

939941
_schemaLoop.Pop();
940942
}
941943

944+
internal void Walk(OpenApiDiscriminator? openApiDiscriminator)
945+
{
946+
if (openApiDiscriminator == null)
947+
{
948+
return;
949+
}
950+
951+
_visitor.Visit(openApiDiscriminator);
952+
953+
if (openApiDiscriminator.Mapping != null)
954+
{
955+
Walk("mapping", () =>
956+
{
957+
foreach (var item in openApiDiscriminator.Mapping)
958+
{
959+
Walk(item.Key, () => Walk((IOpenApiSchema)item.Value));
960+
}
961+
});
962+
}
963+
}
964+
942965

943966
/// <summary>
944967
/// Visits dictionary of <see cref="IOpenApiExample"/>
@@ -1215,6 +1238,7 @@ internal void Walk(IOpenApiElement element)
12151238
case OpenApiRequestBody e: Walk(e); break;
12161239
case OpenApiResponse e: Walk(e); break;
12171240
case OpenApiSchema e: Walk(e); break;
1241+
case OpenApiDiscriminator e: Walk(e); break;
12181242
case OpenApiSecurityRequirement e: Walk(e); break;
12191243
case OpenApiSecurityScheme e: Walk(e); break;
12201244
case OpenApiServer e: Walk(e); break;

test/Microsoft.OpenApi.Tests/Walkers/WalkerLocationTests.cs

+19-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,23 @@ public void WalkDOMWithCycles()
158158
[Fact]
159159
public void LocateReferences()
160160
{
161-
var baseSchema = new OpenApiSchema();
161+
var baseSchema = new OpenApiSchema
162+
{
163+
Type = JsonSchemaType.Object,
164+
Properties = new()
165+
{
166+
["type"] = new OpenApiSchema() { Type = JsonSchemaType.String }
167+
},
168+
Required = new HashSet<string> { "type" },
169+
Discriminator = new OpenApiDiscriminator
170+
{
171+
PropertyName = "type",
172+
Mapping = new Dictionary<string, OpenApiSchemaReference>
173+
{
174+
["derived"] = new OpenApiSchemaReference("derived")
175+
}
176+
}
177+
};
162178

163179
var derivedSchema = new OpenApiSchema
164180
{
@@ -229,7 +245,8 @@ public void LocateReferences()
229245
"referenceAt: #/paths/~1/get/responses/200/headers/test-header",
230246
"referenceAt: #/components/schemas/derived/anyOf/0",
231247
"referenceAt: #/components/securitySchemes/test-secScheme",
232-
"referenceAt: #/components/headers/test-header/schema"
248+
"referenceAt: #/components/headers/test-header/schema",
249+
"referenceAt: #/components/schemas/base/discriminator/mapping/derived",
233250
}, locator.Locations.Where(l => l.StartsWith("referenceAt:", StringComparison.OrdinalIgnoreCase)));
234251
}
235252
}

0 commit comments

Comments
 (0)