Skip to content

Commit 087b936

Browse files
lukaszzazulakkirill-of-turov
authored andcommitted
Fix(utils) disallow schema type array value string for oas3 (swagger-api#10713)
* fix(utils): disallow schema type array value string for oas3 only
1 parent 28fb3a9 commit 087b936

4 files changed

Lines changed: 61 additions & 21 deletions

File tree

src/core/utils/index.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ export const validatePattern = (val, rxPattern) => {
410410
}
411411
}
412412

413-
function validateValueBySchema(value, schema, requiredByParam, bypassRequiredCheck, parameterContentMediaType) {
413+
function validateValueBySchema(value, schema, requiredByParam, bypassRequiredCheck, parameterContentMediaType, disallowArrayString) {
414414
if(!schema) return []
415415
let errors = []
416416
let nullable = schema.get("nullable")
@@ -474,11 +474,9 @@ function validateValueBySchema(value, schema, requiredByParam, bypassRequiredChe
474474
let objectCheck = type === "object" && typeof value === "object" && value !== null
475475
let objectStringCheck = type === "object" && typeof value === "string" && value
476476

477-
const allChecks = [
478-
stringCheck, arrayCheck, arrayListCheck, arrayStringCheck, fileCheck,
479-
booleanCheck, numberCheck, integerCheck, objectCheck, objectStringCheck,
480-
]
481-
477+
const checks = [stringCheck, arrayCheck, arrayListCheck, fileCheck,
478+
booleanCheck, numberCheck, integerCheck, objectCheck, objectStringCheck]
479+
const allChecks = disallowArrayString ? checks : checks.concat(arrayStringCheck)
482480
const passedAnyCheck = allChecks.some(v => !!v)
483481

484482
if (schemaRequiresValue && !passedAnyCheck && !bypassRequiredCheck) {
@@ -508,7 +506,7 @@ function validateValueBySchema(value, schema, requiredByParam, bypassRequiredChe
508506
}
509507
if(schema && schema.has("properties")) {
510508
schema.get("properties").forEach((val, key) => {
511-
const errs = validateValueBySchema(objectVal[key], val, false, bypassRequiredCheck, parameterContentMediaType)
509+
const errs = validateValueBySchema(objectVal[key], val, false, bypassRequiredCheck, parameterContentMediaType, disallowArrayString)
512510
errors.push(...errs
513511
.map((error) => ({ propKey: key, error })))
514512
})
@@ -590,7 +588,7 @@ function validateValueBySchema(value, schema, requiredByParam, bypassRequiredChe
590588
}
591589
if(value) {
592590
value.forEach((item, i) => {
593-
const errs = validateValueBySchema(item, schema.get("items"), false, bypassRequiredCheck, parameterContentMediaType)
591+
const errs = validateValueBySchema(item, schema.get("items"), false, bypassRequiredCheck, parameterContentMediaType, disallowArrayString)
594592
errors.push(...errs
595593
.map((err) => ({ index: i, error: err })))
596594
})
@@ -614,7 +612,7 @@ export const validateParam = (param, value, { isOAS3 = false, bypassRequiredChec
614612
parameterContentMediaType
615613
} = getParameterSchema(param, { isOAS3 })
616614

617-
return validateValueBySchema(value, paramDetails, paramRequired, bypassRequiredCheck, parameterContentMediaType)
615+
return validateValueBySchema(value, paramDetails, paramRequired, bypassRequiredCheck, parameterContentMediaType, isOAS3)
618616
}
619617

620618
export const parseSearch = () => {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
describe("Try it out with schema type array but example type string", () => {
2+
it("shows a validation error message when Execute is clicked", () => {
3+
cy
4+
.visit("?tryItOutEnabled=true&url=/documents/features/try-it-out-schema-type-array-example-type-string.yaml")
5+
.get("#operations-default-get_")
6+
.click()
7+
.get(".btn.execute")
8+
.click()
9+
.get(".validation-errors")
10+
.should("exist")
11+
})
12+
})
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
openapi: 3.0.3
2+
info:
3+
title: test
4+
version: 1.0.0
5+
paths:
6+
/:
7+
get:
8+
parameters:
9+
- in: query
10+
name: test
11+
required: true
12+
schema:
13+
type: array
14+
example: 'test1'
15+
items:
16+
type: string
17+
enum:
18+
- 'test1'
19+
- 'test2'
20+
- 'test3'
21+
responses:
22+
default:
23+
description: ok

test/unit/core/utils.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -350,11 +350,21 @@ describe("utils", () => {
350350
let value = null
351351
let result = null
352352

353-
const assertValidateParam = (param, value, expectedError) => {
353+
const assertValidateOas3Param = (param, value, expectedError) => {
354+
// for cases where you _only_ want to try OAS3
355+
result = validateParam(fromJS(param), value, {
356+
isOAS3: true
357+
})
358+
expect( result ).toEqual( expectedError )
359+
}
360+
361+
const assertValidateOas2Param = (param, value, expectedError) => {
354362
// Swagger 2.0 version
355363
result = validateParam( fromJS(param), fromJS(value))
356364
expect( result ).toEqual( expectedError )
365+
}
357366

367+
const assertValidateOas3ParamWithSchema = (param, value, expectedError) => {
358368
// OAS3 version, using `schema` sub-object
359369
let oas3Param = {
360370
required: param.required,
@@ -363,18 +373,14 @@ describe("utils", () => {
363373
required: undefined
364374
}
365375
}
366-
result = validateParam( fromJS(oas3Param), fromJS(value), {
367-
isOAS3: true
368-
})
369-
expect( result ).toEqual( expectedError )
376+
assertValidateOas3Param(oas3Param, value, expectedError)
370377
}
371378

372-
const assertValidateOas3Param = (param, value, expectedError) => {
373-
// for cases where you _only_ want to try OAS3
374-
result = validateParam(fromJS(param), value, {
375-
isOAS3: true
376-
})
377-
expect( result ).toEqual( expectedError )
379+
const assertValidateParam = (param, value, expectedError) => {
380+
// Swagger 2.0 version
381+
assertValidateOas2Param(param, value, expectedError)
382+
// OAS3 version, using `schema` sub-object
383+
assertValidateOas3ParamWithSchema(param, value, expectedError)
378384
}
379385

380386
it("should check the isOAS3 flag when validating parameters", () => {
@@ -749,7 +755,8 @@ describe("utils", () => {
749755
type: "array"
750756
}
751757
value = "[1]"
752-
assertValidateParam(param, value, [])
758+
assertValidateOas3ParamWithSchema(param, value, ["Required field is not provided"])
759+
assertValidateOas2Param(param, value, [])
753760

754761
// valid array, items match type
755762
param = {

0 commit comments

Comments
 (0)