From 470840ab25d26f1bc6dd8d8c6774819cf9abfdbe Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 20 Mar 2024 15:09:09 -0400 Subject: [PATCH] - fixes a bug where models properties named "additionalData" or "backingstore" would be ignored Signed-off-by: Vincent Biret --- CHANGELOG.md | 1 + src/Kiota.Builder/CodeDOM/CodeClass.cs | 2 +- .../Kiota.Builder.Tests/KiotaBuilderTests.cs | 77 +++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eba65dc8d8..63d8b1b3b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Fixed a bug where multiple Visual Studio Code instances would make the extension install/update fail. [#3686](https://github.com/microsoft/kiota/issues/3686) +- Fixed a bug where models properties named "additionalData" or "backingstore" would be ignored. [#4224](https://github.com/microsoft/kiota/issues/4224) - PREVIEW: Renamed the config commands to workspace. [#4310](https://github.com/microsoft/kiota/issues/4310) - PREVIEW: Moved preview configuration files to the .kiota directory. [#4310](https://github.com/microsoft/kiota/issues/4310) - PREVIEW: Moved the copy descriptions to dedicated folders. [#4310](https://github.com/microsoft/kiota/issues/4310) diff --git a/src/Kiota.Builder/CodeDOM/CodeClass.cs b/src/Kiota.Builder/CodeDOM/CodeClass.cs index a46e5c1b79..41a41061c2 100644 --- a/src/Kiota.Builder/CodeDOM/CodeClass.cs +++ b/src/Kiota.Builder/CodeDOM/CodeClass.cs @@ -167,7 +167,7 @@ private string ResolveUniquePropertyName(string name) ArgumentException.ThrowIfNullOrEmpty(serializationName); if (BaseClass is CodeClass currentParentClass) - if (currentParentClass.FindPropertyByWireName(serializationName) is CodeProperty currentProperty && !currentProperty.ExistsInBaseType) + if (currentParentClass.FindPropertyByWireName(serializationName) is CodeProperty currentProperty && !currentProperty.ExistsInBaseType && currentProperty.Kind is not CodePropertyKind.AdditionalData or CodePropertyKind.BackingStore) return currentProperty; else return currentParentClass.GetOriginalPropertyDefinedFromBaseType(serializationName); diff --git a/tests/Kiota.Builder.Tests/KiotaBuilderTests.cs b/tests/Kiota.Builder.Tests/KiotaBuilderTests.cs index 99ea0c4769..69d1eb4ca7 100644 --- a/tests/Kiota.Builder.Tests/KiotaBuilderTests.cs +++ b/tests/Kiota.Builder.Tests/KiotaBuilderTests.cs @@ -697,6 +697,83 @@ public async Task TrimsInheritanceUnusedModels() Assert.Null(modelsNS.FindChildByName("AuditEvent", false)); //unused type } [Fact] + public async Task DisambiguatesReservedProperties() + { + var tempFilePath = Path.Combine(Path.GetTempPath(), Path.GetTempFileName()); + await using var fs = await GetDocumentStream(@"openapi: 3.0.1 +info: + title: OData Service for namespace microsoft.graph + description: This OData service is located at https://graph.microsoft.com/v1.0 + version: v1.0 + x-ms-generated-by: + toolName: Microsoft.OpenApi.OData + toolVersion: 1.0.9.0 +servers: + - url: https://graph.microsoft.com/v1.0 +paths: + '/security/alerts_v2/{alert-id}': + get: + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/microsoft.graph.alert' +components: + schemas: + microsoft.graph.entity: + title: entity + required: + - '@odata.type' + type: object + properties: + id: + type: string + '@odata.type': + type: string + microsoft.graph.dictionary: + title: dictionary + required: + - '@odata.type' + type: object + properties: + '@odata.type': + type: string + microsoft.graph.alert: + allOf: + - $ref: '#/components/schemas/microsoft.graph.entity' + - title: alert + required: + - '@odata.type' + type: object + properties: + actorDisplayName: + type: string + nullable: true + additionalData: + anyOf: + - $ref: '#/components/schemas/microsoft.graph.dictionary' + - type: object + nullable: true"); + var mockLogger = new Mock>(); + var builder = new KiotaBuilder(mockLogger.Object, new GenerationConfiguration { ClientClassName = "Graph", OpenAPIFilePath = tempFilePath }, _httpClient); + var document = await builder.CreateOpenApiDocumentAsync(fs); + var node = builder.CreateUriSpace(document); + var codeModel = builder.CreateSourceModel(node); + var modelsNS = codeModel.FindNamespaceByName("ApiSdk.models.microsoft.graph"); + Assert.NotNull(modelsNS); + var entityClass = modelsNS.FindChildByName("Entity", false); + Assert.NotNull(entityClass); + var additionalDataProperty = entityClass.FindChildByName("AdditionalData", false); + Assert.NotNull(additionalDataProperty); + Assert.True(additionalDataProperty.Kind is CodePropertyKind.AdditionalData); + var alertClass = modelsNS.FindChildByName("Alert", false); + Assert.NotNull(alertClass); + var additionalDataEscapedProperty = alertClass.FindChildByName("AdditionalDataProperty", false); + Assert.NotNull(additionalDataEscapedProperty); + Assert.True(additionalDataEscapedProperty.Kind is CodePropertyKind.Custom); + } + [Fact] public async Task TrimsInheritanceUnusedModelsWithUnion() { var tempFilePath = Path.Combine(Path.GetTempPath(), Path.GetTempFileName());