diff --git a/kaizen-openapi-parser/src/main/java/com/reprezen/kaizen/oasparser/val3/ParameterValidator.java b/kaizen-openapi-parser/src/main/java/com/reprezen/kaizen/oasparser/val3/ParameterValidator.java index 980c04bf..56f5084e 100755 --- a/kaizen-openapi-parser/src/main/java/com/reprezen/kaizen/oasparser/val3/ParameterValidator.java +++ b/kaizen-openapi-parser/src/main/java/com/reprezen/kaizen/oasparser/val3/ParameterValidator.java @@ -54,9 +54,11 @@ public void runObjectValidations() { checkRequired(parameter); validateStringField(F_style, false, Regexes.STYLE_REGEX); checkAllowReserved(parameter); - // TODO Q: Should schema be required in parameter object? - validateField(F_schema, false, Schema.class, new SchemaValidator()); - validateMapField(F_contentMediaTypes, false, false, MediaType.class, new MediaTypeValidator()); + Overlay schemaOverlay = validateField(F_schema, false, Schema.class, new SchemaValidator()); + Overlay contentOverlay = validateMapField(F_contentMediaTypes, false, false, MediaType.class, + new MediaTypeValidator()); + // Schema xor content must be present + checkSchemaContentXor(schemaOverlay,contentOverlay); validateExtensions(parameter.getExtensions()); } @@ -98,7 +100,20 @@ void checkExampleExclusion(Overlay> examples, Overlay 0; boolean examplePresent = example != null && example.isPresent(); if (examplesPresent && examplePresent) { - results.addError("ExmplExclusion|The 'example' and 'exmaples' properties may not both appear", value); + results.addError("ExmplExclusion|The 'example' and 'examples' properties may not both appear", value); + } + } + + private void checkSchemaContentXor(Overlay schemaOverlay, Overlay contentOverlay) { + int count = 0; + if (schemaOverlay != null && schemaOverlay.isPresent()) { + count++; + } + if (contentOverlay != null && contentOverlay.isPresent()) { + count++; + } + if (count != 1) { + results.addError("Exactly one of schema|content must be present", value); } } } diff --git a/kaizen-openapi-parser/src/test/java/com/reprezen/kaizen/oasparser/val3/ParameterValidatorTest.java b/kaizen-openapi-parser/src/test/java/com/reprezen/kaizen/oasparser/val3/ParameterValidatorTest.java index 91605e91..e3f47579 100644 --- a/kaizen-openapi-parser/src/test/java/com/reprezen/kaizen/oasparser/val3/ParameterValidatorTest.java +++ b/kaizen-openapi-parser/src/test/java/com/reprezen/kaizen/oasparser/val3/ParameterValidatorTest.java @@ -41,6 +41,15 @@ public void shouldPass_OnValidParam() throws Exception { assertTrue(model.isValid()); } + @Test + public void shouldFail_OnInValidParamType() throws Exception { + OpenApi3 model = new OpenApi3Parser().parse(getClass().getResource("/models/params/invalidParamType.yaml"), true); + + assertEquals(1, model.getValidationItems().size()); + assertEquals("Exactly one of schema|content must be present", model.getValidationItems().iterator().next().getMsg() ); + assertFalse(model.isValid()); + } + @Test public void shouldAllow_HybridPathParam() throws Exception { OpenApi3 model = new OpenApi3Parser().parse(getClass().getResource("/models/params/hybridParam.yaml"), true); diff --git a/kaizen-openapi-parser/src/test/resources/models/params/hybridParam.yaml b/kaizen-openapi-parser/src/test/resources/models/params/hybridParam.yaml index a2a3147f..efc897df 100644 --- a/kaizen-openapi-parser/src/test/resources/models/params/hybridParam.yaml +++ b/kaizen-openapi-parser/src/test/resources/models/params/hybridParam.yaml @@ -10,6 +10,8 @@ paths: - in: path name: params required: true + schema: + type: string responses: 200: - description: Ok \ No newline at end of file + description: Ok diff --git a/kaizen-openapi-parser/src/test/resources/models/params/invalidParam.yaml b/kaizen-openapi-parser/src/test/resources/models/params/invalidParam.yaml index 1ef4f3f6..0ccba093 100644 --- a/kaizen-openapi-parser/src/test/resources/models/params/invalidParam.yaml +++ b/kaizen-openapi-parser/src/test/resources/models/params/invalidParam.yaml @@ -10,6 +10,8 @@ paths: - in: path name: id required: true + schema: + type: string responses: 200: description: Ok diff --git a/kaizen-openapi-parser/src/test/resources/models/params/invalidParamType.yaml b/kaizen-openapi-parser/src/test/resources/models/params/invalidParamType.yaml new file mode 100644 index 00000000..f1cfb644 --- /dev/null +++ b/kaizen-openapi-parser/src/test/resources/models/params/invalidParamType.yaml @@ -0,0 +1,21 @@ +--- +openapi: "3.0.0" +info: + version: 1.0.0 + title: My API Spec +paths: + /{id}: + get: + parameters: + - in: path + name: id + required: true + schema: + type: string + content: + application/json: + schema: + type: string + responses: + 200: + description: Ok diff --git a/kaizen-openapi-parser/src/test/resources/models/params/multiHybridParam.yaml b/kaizen-openapi-parser/src/test/resources/models/params/multiHybridParam.yaml index b6ab84ce..9146b9c2 100644 --- a/kaizen-openapi-parser/src/test/resources/models/params/multiHybridParam.yaml +++ b/kaizen-openapi-parser/src/test/resources/models/params/multiHybridParam.yaml @@ -10,9 +10,13 @@ paths: - in: path name: customerID required: true + schema: + type: string - in: path name: orderID required: true + schema: + type: integer responses: 200: - description: Ok \ No newline at end of file + description: Ok diff --git a/kaizen-openapi-parser/src/test/resources/models/params/pathParamNotRequired.yaml b/kaizen-openapi-parser/src/test/resources/models/params/pathParamNotRequired.yaml index 884347ba..2ec9221b 100644 --- a/kaizen-openapi-parser/src/test/resources/models/params/pathParamNotRequired.yaml +++ b/kaizen-openapi-parser/src/test/resources/models/params/pathParamNotRequired.yaml @@ -9,6 +9,8 @@ paths: parameters: - in: path name: id + schema: + type: string responses: 200: description: Ok diff --git a/kaizen-openapi-parser/src/test/resources/models/params/validParam.yaml b/kaizen-openapi-parser/src/test/resources/models/params/validParam.yaml index bef4e6b2..8e882003 100644 --- a/kaizen-openapi-parser/src/test/resources/models/params/validParam.yaml +++ b/kaizen-openapi-parser/src/test/resources/models/params/validParam.yaml @@ -10,6 +10,8 @@ paths: - in: path name: id required: true + schema: + type: string responses: 200: description: Ok