diff --git a/src/typespec-aaz/src/convertor.ts b/src/typespec-aaz/src/convertor.ts index f2a51793..f49cda13 100644 --- a/src/typespec-aaz/src/convertor.ts +++ b/src/typespec-aaz/src/convertor.ts @@ -895,8 +895,6 @@ function convertModel2CMDObjectSchemaBase( properties[propertyName] = discriminatorProperty; } - const discProperty = properties[propertyName] as CMDStringSchema; - const derivedModels = payloadModel.derivedModels.filter(includeDerivedModel); for (const child of derivedModels) { const childDiscriminatorValue = getDiscriminatorInfo(context, child); @@ -905,12 +903,6 @@ function convertModel2CMDObjectSchemaBase( if (disc) { object.discriminators ??= []; object.discriminators.push(disc); - discProperty.enum ??= { - items: [], - }; - discProperty.enum.items.push({ - value: childDiscriminatorValue.value, - }); } } } @@ -1008,6 +1000,10 @@ function convertModel2CMDObjectDiscriminator( } const jsonName = getJsonName(context, prop); + if (jsonName === discriminatorInfo.propertyName) { + // if this property is a discriminator property, remove it as autorest + continue; + } let schema = convert2CMDSchema( { ...context, @@ -1016,6 +1012,7 @@ function convertModel2CMDObjectDiscriminator( prop, jsonName, ); + if (schema) { if (isReadonlyProperty(context.program, prop)) { schema.readOnly = true; diff --git a/src/typespec-aaz/test/discriminator.test.ts b/src/typespec-aaz/test/discriminator.test.ts new file mode 100644 index 00000000..f83a026e --- /dev/null +++ b/src/typespec-aaz/test/discriminator.test.ts @@ -0,0 +1,61 @@ +import { TestHost, BasicTestRunner } from "@typespec/compiler/testing"; +import { describe, expect, it, beforeEach } from "vitest"; +import { createTypespecAazTestHost, createTypespecAazTestRunner, compileTypespecAAZOperations } from "./test-aaz.js"; +import { ModelVar, generateCompileArmResourceTemplate, findObjectsWithKey } from "./util.js"; + +describe("discriminator parsing", () => { + let host: TestHost; + let runner: BasicTestRunner; + + beforeEach(async () => { + host = await createTypespecAazTestHost(); + runner = await createTypespecAazTestRunner(host); + }); + + it("validate discriminator value", async () => { + const modelTmp: ModelVar = { + modelKey: "targetValue", + modelContent: "TargetResourceConfigurations", + isComposite: true, + appendModel: ` + union ResourceKind { + string, + FunctionsFlexConsumption: "FunctionsFlexConsumption", + } + + model FunctionFlexConsumptionResourceConfiguration { + instanceMemoryMB: int64; + httpConcurrency?: int64; + } + + @discriminator("kind") + model TargetResourceConfigurations { + @visibility(Lifecycle.Create, Lifecycle.Read) + kind: ResourceKind; + } + + model FunctionFlexConsumptionTargetResourceConfigurations + extends TargetResourceConfigurations { + kind: ResourceKind.FunctionsFlexConsumption; + configurations?: Record; + } + `, + }; + + const code: string = generateCompileArmResourceTemplate(modelTmp); + const result = await compileTypespecAAZOperations( + code, + { + "operation": "get-resources-operations", + "api-version": "A", + "resources": ["/subscriptions/{}/resourcegroups/{}/providers/microsoft.mock/mockresources/{}"], + }, + runner, + ); + const resultObj = JSON.parse(result!); + expect(Array.isArray(resultObj)).toBe(true); + expect(resultObj.length).toBe(1); + const targetObj = findObjectsWithKey(resultObj[0].pathItem.get.read.http.responses, "targetValue"); + await expect(JSON.stringify(targetObj, null, 2)).toMatchFileSnapshot("./snapshots/discriminator-prop.json"); + }); +}); diff --git a/src/typespec-aaz/test/snapshots/discriminator-prop.json b/src/typespec-aaz/test/snapshots/discriminator-prop.json new file mode 100644 index 00000000..49b01135 --- /dev/null +++ b/src/typespec-aaz/test/snapshots/discriminator-prop.json @@ -0,0 +1,47 @@ +{ + "type": "object", + "discriminators": [ + { + "property": "kind", + "value": "FunctionsFlexConsumption", + "props": [ + { + "type": "object", + "additionalProps": { + "item": { + "type": "object", + "props": [ + { + "type": "integer64", + "name": "instanceMemoryMB", + "required": true + }, + { + "type": "integer64", + "name": "httpConcurrency" + } + ] + } + }, + "name": "configurations" + } + ] + } + ], + "props": [ + { + "type": "string", + "enum": { + "items": [ + { + "value": "FunctionsFlexConsumption" + } + ] + }, + "name": "kind", + "required": true + } + ], + "name": "targetValue", + "required": true +} \ No newline at end of file