diff --git a/src/services/__tests__/fixtures/discriminator.json b/src/services/__tests__/fixtures/discriminator.json new file mode 100644 index 00000000..9af0d945 --- /dev/null +++ b/src/services/__tests__/fixtures/discriminator.json @@ -0,0 +1,67 @@ +{ + "openapi": "3.0.0", + "servers": [], + "info": { + "title": "Broken Redoc Discriminator", + "version": "" + }, + "paths": { + "/foo": { + "get": { + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/FooTopLevel" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "JsonApiResource": { + "type": "object", + "description": "A related resource.", + "required": [ + "type" + ], + "discriminator": { + "propertyName": "type" + }, + "properties": { + "type": { + "type": "string", + "description": "The type of object this resource represents." + } + } + }, + "FooTopLevel": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/Foo" + } + } + }, + "Foo": { + "allOf": [ + { + "type": "object" + }, + { + "$ref": "#/components/schemas/JsonApiResource" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/services/__tests__/models/Schema.test.ts b/src/services/__tests__/models/Schema.test.ts new file mode 100644 index 00000000..9c1c20fe --- /dev/null +++ b/src/services/__tests__/models/Schema.test.ts @@ -0,0 +1,19 @@ +import { SchemaModel } from '../../models/Schema'; +import { OpenAPIParser } from '../../OpenAPIParser'; +import { RedocNormalizedOptions } from '../../RedocNormalizedOptions'; + +const opts = new RedocNormalizedOptions({}); + +describe('Models', () => { + describe('Schema', () => { + let parser; + + test('discriminator with one field', () => { + const spec = require('../fixtures/discriminator.json'); + parser = new OpenAPIParser(spec, undefined, opts); + const schema = new SchemaModel(parser, spec.components.schemas.Foo, '', opts); + expect(schema.oneOf).toHaveLength(1); + expect(schema.discriminatorProp).toEqual('type'); + }); + }); +}); diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index dda8eabc..c12aa404 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -166,12 +166,12 @@ export class SchemaModel { private initDiscriminator( schema: OpenAPISchema & { - namedParents?: string[]; + parentRefs?: string[]; }, parser: OpenAPIParser, ) { this.discriminatorProp = schema.discriminator!.propertyName; - const derived = parser.findDerived([...(schema.namedParents || []), this._$ref]); + const derived = parser.findDerived([...(schema.parentRefs || []), this._$ref]); if (schema.oneOf) { for (const variant of schema.oneOf) {