diff --git a/src/services/__tests__/models/Schema.circular.test.ts b/src/services/__tests__/models/Schema.circular.test.ts index e84bf16034..7954e96d39 100644 --- a/src/services/__tests__/models/Schema.circular.test.ts +++ b/src/services/__tests__/models/Schema.circular.test.ts @@ -553,7 +553,7 @@ describe('Models', () => { friend: !circular petType*: packSize: - `); +`); }); test('should detect and recursion with nested oneOf', () => { @@ -595,5 +595,65 @@ describe('Models', () => { Tag -> !circular `); }); + + test('should not use discriminator for direct schemas refs in oneOf/anyOf', () => { + const spec = parseYaml(outdent` + openapi: 3.0.0 + components: + schemas: + Parent: + type: object + discriminator: + propertyName: type + mapping: + foo: '#/components/schemas/Foo' + bar: '#/components/schemas/Bar' + baz: '#/components/schemas/Baz' + properties: + type: + type: string + Foo: + allOf: + - $ref: '#/components/schemas/Parent' + - type: object + Bar: + allOf: + - $ref: '#/components/schemas/Parent' + - type: object + Baz: + allOf: + - $ref: '#/components/schemas/Parent' + - type: object + properties: + nested: + anyOf: + - $ref: '#/components/schemas/Foo' + - $ref: '#/components/schemas/Bar' + + `) as any; + + parser = new OpenAPIParser(spec, undefined, opts); + const schema = new SchemaModel( + parser, + spec.components.schemas.Parent, + '#/components/schemas/Parent', + opts, + ); + + expect(printSchema(schema, circularDetailsPrinter)).toMatchInlineSnapshot(` + oneOf + foo -> + type: + bar -> + type: + baz -> + type: + nested: oneOf + Foo -> + type: + Bar -> + type: + `); + }); }); }); diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index 7ad20821c2..42a6b6336d 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -253,6 +253,8 @@ export class SchemaModel { ...merged, title, allOf: [{ ...this.schema, oneOf: undefined, anyOf: undefined }], + // if specific child schemas are listed in oneOf/anyOf, they are not supposed to be discriminated + discriminator: derefVariant.allOf ? undefined : merged.discriminator, } as OpenAPISchema, variant.$ref || this.pointer + '/oneOf/' + idx, this.options,