Skip to content

Commit

Permalink
Adds discriminator object to complex types which have derived types (#…
Browse files Browse the repository at this point in the history
…238)

* Add derived types of complex types to discriminator value

* Add test to validate discriminator values added to complex types

* Add release note
  • Loading branch information
irvinesunday authored Jun 22, 2022
1 parent 283b135 commit 2c70b44
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ internal static OpenApiSchema CreateSchemaTypeSchema(this ODataContext context,
}

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

if (context.Settings.EnableDiscriminatorValue && derivedTypes == null)
{
derivedTypes = context.Model.FindDirectlyDerivedTypes(structuredType).OfType<IEdmEntityType>();
derivedTypes = context.Model.FindDirectlyDerivedTypes(structuredType);
}

if (processBase && structuredType.BaseType != null)
Expand Down Expand Up @@ -435,8 +435,8 @@ private static OpenApiSchema CreateStructuredTypeSchema(this ODataContext contex
{
// The discriminator object is added to structured types which have derived types.
OpenApiDiscriminator discriminator = null;
if (context.Settings.EnableDiscriminatorValue && derivedTypes.Any() && structuredType.BaseType != null)
{
if (context.Settings.EnableDiscriminatorValue && derivedTypes.Any())
{
Dictionary<string, string> mapping = derivedTypes
.ToDictionary(x => $"#{x.FullTypeName()}", x => new OpenApiSchema
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<PackageId>Microsoft.OpenApi.OData</PackageId>
<SignAssembly>true</SignAssembly>
<Version>1.0.11-preview2</Version>
<Version>1.0.11-preview3</Version>
<Description>This package contains the codes you need to convert OData CSDL to Open API Document of Model.</Description>
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
<PackageTags>Microsoft OpenApi OData EDM</PackageTags>
Expand All @@ -26,6 +26,7 @@
- Add error ranges for OData actions when ErrorResponsesAsDefault is set to false #218
- Fixes missing bound operations on some navigation property paths #201
- Provides support for using success status code range 2XX #153
- Adds discriminator object to complex types which have derived types #233
</PackageReleaseNotes>
<AssemblyName>Microsoft.OpenApi.OData.Reader</AssemblyName>
<AssemblyOriginatorKeyFile>..\..\tool\Microsoft.OpenApi.OData.snk</AssemblyOriginatorKeyFile>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void CreateStructuredTypeSchemaThrowArgumentNullEnumType()
}

[Fact]
public void CreateStructuredTypeSchemaWithDiscriminatorValueEnabledReturnsCorrectSchema()
public void CreateStructuredTypeSchemaForEntityTypeWithDiscriminatorValueEnabledReturnsCorrectSchema()
{
// Arrange
IEdmModel model = EdmModelHelper.GraphBetaModel;
Expand Down Expand Up @@ -142,6 +142,48 @@ public void CreateStructuredTypeSchemaWithDiscriminatorValueEnabledReturnsCorrec
}".ChangeLineBreaks(), json);
}

[Fact]
public void CreateStructuredTypeSchemaForComplexTypeWithDiscriminatorValueEnabledReturnsCorrectSchema()
{
// Arrange
IEdmModel model = EdmModelHelper.GraphBetaModel;
ODataContext context = new(model, new OpenApiConvertSettings
{
EnableDiscriminatorValue = true,
});

IEdmComplexType complex = model.SchemaElements.OfType<IEdmComplexType>().First(t => t.Name == "userSet");
Assert.NotNull(complex); // Guard

// Act
var schema = context.CreateStructuredTypeSchema(complex);
string json = schema.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);

// Assert
Assert.NotNull(json);
Assert.Equal(@"{
""title"": ""userSet"",
""type"": ""object"",
""properties"": {
""isBackup"": {
""type"": ""boolean"",
""nullable"": true
}
},
""discriminator"": {
""propertyName"": ""@odata.type"",
""mapping"": {
""#microsoft.graph.connectedOrganizationMembers"": ""#/components/schemas/microsoft.graph.connectedOrganizationMembers"",
""#microsoft.graph.externalSponsors"": ""#/components/schemas/microsoft.graph.externalSponsors"",
""#microsoft.graph.groupMembers"": ""#/components/schemas/microsoft.graph.groupMembers"",
""#microsoft.graph.internalSponsors"": ""#/components/schemas/microsoft.graph.internalSponsors"",
""#microsoft.graph.requestorManager"": ""#/components/schemas/microsoft.graph.requestorManager"",
""#microsoft.graph.singleUser"": ""#/components/schemas/microsoft.graph.singleUser""
}
}
}".ChangeLineBreaks(), json);
}

[Fact]
public void CreateStructuredTypePropertiesSchemaWithCustomAttributeReturnsCorrectSchema()
{
Expand Down

0 comments on commit 2c70b44

Please sign in to comment.