From 65b66ad35f96f8debf78d2245c9e490460437fd2 Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Mon, 22 Feb 2021 22:45:53 +0000 Subject: [PATCH] fix(oas3): add unsupported warnings for OpenAPI 3.1 schema --- .../lib/parser/oas/parseSchemaObject.js | 39 ++++++++++++++++--- .../unit/parser/oas/parseSchemaObject-test.js | 39 +++++++++++++++++++ 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/packages/openapi3-parser/lib/parser/oas/parseSchemaObject.js b/packages/openapi3-parser/lib/parser/oas/parseSchemaObject.js index 5122d3f64..81e05e81d 100644 --- a/packages/openapi3-parser/lib/parser/oas/parseSchemaObject.js +++ b/packages/openapi3-parser/lib/parser/oas/parseSchemaObject.js @@ -17,18 +17,38 @@ const parseReference = require('../parseReference'); const name = 'Schema Object'; const unsupportedKeys = [ - // JSON Schema - 'multipleOf', 'maximum', 'exclusiveMaximum', 'minimum', - 'exclusiveMinimum', 'maxLength', 'minLength', 'pattern', 'maxItems', - 'minItems', 'uniqueItems', 'maxProperties', 'minProperties', + // JSON Schema Core applicators + 'allOf', 'anyOf', 'not', - // JSON Schema + OAS 3 specific rules - 'allOf', 'anyOf', 'not', 'additionalProperties', 'format', + // JSON Schema Validation (6.2 Numeric) + 'multipleOf', 'maximum', 'exclusiveMaximum', 'minimum', 'exclusiveMinimum', + + // JSON Schema Validation (6.3 Strings) + 'maxLength', 'minLength', 'pattern', 'format', + + // JSON Schema Validation (6.4 Array) + 'maxItems', 'minItems', 'uniqueItems', + + // JSON Schema Validation (6.5 Objects) + 'maxProperties', 'minProperties', // OAS 3 specific 'discriminator', 'readOnly', 'writeOnly', 'xml', 'externalDocs', 'deprecated', ]; +const unsupportedJSONSchemaDraft202012 = [ + // General applicators + 'if', 'then', 'else', 'dependentSchemas', + + // Array + 'prefixItems', 'unevaluatedItems', 'contains', 'minContains', 'maxContains', + + // Object + 'propertiesNames', 'unevaluatedProperties', 'dependentRequired', +]; const isUnsupportedKey = R.anyPass(R.map(hasKey, unsupportedKeys)); +const isUnsupportedKeyJSONSchemaDraft202012 = R.anyPass( + R.map(hasKey, unsupportedJSONSchemaDraft202012) +); function constructObjectStructure(namespace, schema) { @@ -252,6 +272,13 @@ function parseSchema(context) { [hasKey('oneOf'), R.compose(parseOneOf, getValue)], [isUnsupportedKey, createUnsupportedMemberWarning(namespace, name)], + [ + R.both( + isUnsupportedKeyJSONSchemaDraft202012, + R.always(context.isOpenAPIVersionMoreThanOrEqual(3, 1)) + ), + createUnsupportedMemberWarning(namespace, name), + ], // Return a warning for additional properties [R.T, createInvalidMemberWarning(namespace, name)], diff --git a/packages/openapi3-parser/test/unit/parser/oas/parseSchemaObject-test.js b/packages/openapi3-parser/test/unit/parser/oas/parseSchemaObject-test.js index df68f1611..e331d3e3a 100644 --- a/packages/openapi3-parser/test/unit/parser/oas/parseSchemaObject-test.js +++ b/packages/openapi3-parser/test/unit/parser/oas/parseSchemaObject-test.js @@ -1017,4 +1017,43 @@ describe('Schema Object', () => { expect(element.enumerations.get(1)).to.be.instanceof(namespace.elements.Array); }); }); + + describe('warnings for unsupported properties', () => { + it('provides warning for unsupported property', () => { + const schema = new namespace.elements.Object({ + deprecated: true, + }); + + const parseResult = parse(context, schema); + + expect(parseResult).to.contain.warning( + "'Schema Object' contains unsupported key 'deprecated'" + ); + }); + + it('provides invalid warning for unsupported OpenAPI 3.1 property on OpenAPI 3.0', () => { + const schema = new namespace.elements.Object({ + if: true, + }); + + const parseResult = parse(context, schema); + + expect(parseResult).to.contain.warning( + "'Schema Object' contains invalid key 'if'" + ); + }); + + it('provides warning for unsupported OpenAPI 3.1 property', () => { + context.openapiVersion = { major: 3, minor: 1 }; + const schema = new namespace.elements.Object({ + if: true, + }); + + const parseResult = parse(context, schema); + + expect(parseResult).to.contain.warning( + "'Schema Object' contains unsupported key 'if'" + ); + }); + }); });