Skip to content

Commit 2c70b44

Browse files
authored
Adds discriminator object to complex types which have derived types (#238)
* Add derived types of complex types to discriminator value * Add test to validate discriminator values added to complex types * Add release note
1 parent 283b135 commit 2c70b44

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiSchemaGenerator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ internal static OpenApiSchema CreateSchemaTypeSchema(this ODataContext context,
374374
}
375375

376376
private static OpenApiSchema CreateStructuredTypeSchema(this ODataContext context, IEdmStructuredType structuredType, bool processBase, bool processExample,
377-
IEnumerable<IEdmEntityType> derivedTypes = null)
377+
IEnumerable<IEdmStructuredType> derivedTypes = null)
378378
{
379379
Debug.Assert(context != null);
380380
Debug.Assert(structuredType != null);
@@ -387,7 +387,7 @@ private static OpenApiSchema CreateStructuredTypeSchema(this ODataContext contex
387387

388388
if (context.Settings.EnableDiscriminatorValue && derivedTypes == null)
389389
{
390-
derivedTypes = context.Model.FindDirectlyDerivedTypes(structuredType).OfType<IEdmEntityType>();
390+
derivedTypes = context.Model.FindDirectlyDerivedTypes(structuredType);
391391
}
392392

393393
if (processBase && structuredType.BaseType != null)
@@ -435,8 +435,8 @@ private static OpenApiSchema CreateStructuredTypeSchema(this ODataContext contex
435435
{
436436
// The discriminator object is added to structured types which have derived types.
437437
OpenApiDiscriminator discriminator = null;
438-
if (context.Settings.EnableDiscriminatorValue && derivedTypes.Any() && structuredType.BaseType != null)
439-
{
438+
if (context.Settings.EnableDiscriminatorValue && derivedTypes.Any())
439+
{
440440
Dictionary<string, string> mapping = derivedTypes
441441
.ToDictionary(x => $"#{x.FullTypeName()}", x => new OpenApiSchema
442442
{

src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<TargetFrameworks>netstandard2.0</TargetFrameworks>
1616
<PackageId>Microsoft.OpenApi.OData</PackageId>
1717
<SignAssembly>true</SignAssembly>
18-
<Version>1.0.11-preview2</Version>
18+
<Version>1.0.11-preview3</Version>
1919
<Description>This package contains the codes you need to convert OData CSDL to Open API Document of Model.</Description>
2020
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
2121
<PackageTags>Microsoft OpenApi OData EDM</PackageTags>
@@ -26,6 +26,7 @@
2626
- Add error ranges for OData actions when ErrorResponsesAsDefault is set to false #218
2727
- Fixes missing bound operations on some navigation property paths #201
2828
- Provides support for using success status code range 2XX #153
29+
- Adds discriminator object to complex types which have derived types #233
2930
</PackageReleaseNotes>
3031
<AssemblyName>Microsoft.OpenApi.OData.Reader</AssemblyName>
3132
<AssemblyOriginatorKeyFile>..\..\tool\Microsoft.OpenApi.OData.snk</AssemblyOriginatorKeyFile>

test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiSchemaGeneratorTests.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public void CreateStructuredTypeSchemaThrowArgumentNullEnumType()
8181
}
8282

8383
[Fact]
84-
public void CreateStructuredTypeSchemaWithDiscriminatorValueEnabledReturnsCorrectSchema()
84+
public void CreateStructuredTypeSchemaForEntityTypeWithDiscriminatorValueEnabledReturnsCorrectSchema()
8585
{
8686
// Arrange
8787
IEdmModel model = EdmModelHelper.GraphBetaModel;
@@ -142,6 +142,48 @@ public void CreateStructuredTypeSchemaWithDiscriminatorValueEnabledReturnsCorrec
142142
}".ChangeLineBreaks(), json);
143143
}
144144

145+
[Fact]
146+
public void CreateStructuredTypeSchemaForComplexTypeWithDiscriminatorValueEnabledReturnsCorrectSchema()
147+
{
148+
// Arrange
149+
IEdmModel model = EdmModelHelper.GraphBetaModel;
150+
ODataContext context = new(model, new OpenApiConvertSettings
151+
{
152+
EnableDiscriminatorValue = true,
153+
});
154+
155+
IEdmComplexType complex = model.SchemaElements.OfType<IEdmComplexType>().First(t => t.Name == "userSet");
156+
Assert.NotNull(complex); // Guard
157+
158+
// Act
159+
var schema = context.CreateStructuredTypeSchema(complex);
160+
string json = schema.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);
161+
162+
// Assert
163+
Assert.NotNull(json);
164+
Assert.Equal(@"{
165+
""title"": ""userSet"",
166+
""type"": ""object"",
167+
""properties"": {
168+
""isBackup"": {
169+
""type"": ""boolean"",
170+
""nullable"": true
171+
}
172+
},
173+
""discriminator"": {
174+
""propertyName"": ""@odata.type"",
175+
""mapping"": {
176+
""#microsoft.graph.connectedOrganizationMembers"": ""#/components/schemas/microsoft.graph.connectedOrganizationMembers"",
177+
""#microsoft.graph.externalSponsors"": ""#/components/schemas/microsoft.graph.externalSponsors"",
178+
""#microsoft.graph.groupMembers"": ""#/components/schemas/microsoft.graph.groupMembers"",
179+
""#microsoft.graph.internalSponsors"": ""#/components/schemas/microsoft.graph.internalSponsors"",
180+
""#microsoft.graph.requestorManager"": ""#/components/schemas/microsoft.graph.requestorManager"",
181+
""#microsoft.graph.singleUser"": ""#/components/schemas/microsoft.graph.singleUser""
182+
}
183+
}
184+
}".ChangeLineBreaks(), json);
185+
}
186+
145187
[Fact]
146188
public void CreateStructuredTypePropertiesSchemaWithCustomAttributeReturnsCorrectSchema()
147189
{

0 commit comments

Comments
 (0)