bug: parameter allowEmptyValue + required interactions (via #5142)

* add failing tests
* standardize parameter keying
* validateParam test migrations
* migrate test cases to new pattern
* disambiguate name/in ordering in `body.body` test cases
* `name+in`=> `{in}.{name}`
* consider allowEmptyValue parameter inclusion in runtime validation
* use config object for all validateParam options
* drop isXml flag from validateParams
This commit is contained in:
kyle
2019-01-29 16:46:03 -06:00
committed by GitHub
parent be3500c299
commit abf34961e9
9 changed files with 719 additions and 383 deletions

View File

@@ -130,7 +130,7 @@ describe("spec plugin - reducer", function(){
})
})
describe("SPEC_UPDATE_PARAM", function() {
it("should store parameter values by name+in", () => {
it("should store parameter values by {in}.{name}", () => {
const updateParam = reducer["spec_update_param"]
const path = "/pet/post"
@@ -140,14 +140,14 @@ describe("spec plugin - reducer", function(){
const result = updateParam(state, {
payload: {
path: [path, method],
paramName: "body",
paramName: "myBody",
paramIn: "body",
value: `{ "a": 123 }`,
isXml: false
}
})
const response = result.getIn(["meta", "paths", path, method, "parameters", "body.body", "value"])
const response = result.getIn(["meta", "paths", path, method, "parameters", "body.myBody", "value"])
expect(response).toEqual(`{ "a": 123 }`)
})
it("should store parameter values by identity", () => {
@@ -157,7 +157,7 @@ describe("spec plugin - reducer", function(){
const method = "POST"
const param = fromJS({
name: "body",
name: "myBody",
in: "body",
schema: {
type: "string"
@@ -174,12 +174,12 @@ describe("spec plugin - reducer", function(){
}
})
const value = result.getIn(["meta", "paths", path, method, "parameters", `body.body.hash-${param.hashCode()}`, "value"])
const value = result.getIn(["meta", "paths", path, method, "parameters", `body.myBody.hash-${param.hashCode()}`, "value"])
expect(value).toEqual(`{ "a": 123 }`)
})
})
describe("SPEC_UPDATE_EMPTY_PARAM_INCLUSION", function() {
it("should store parameter values by name+in", () => {
it("should store parameter values by {in}.{name}", () => {
const updateParam = reducer["spec_update_empty_param_inclusion"]
const path = "/pet/post"
@@ -196,7 +196,7 @@ describe("spec plugin - reducer", function(){
}
})
const response = result.getIn(["meta", "paths", path, method, "parameter_inclusions", "param.query"])
const response = result.getIn(["meta", "paths", path, method, "parameter_inclusions", "query.param"])
expect(response).toEqual(true)
})
})

View File

@@ -497,7 +497,7 @@ describe("spec plugin - selectors", function(){
})
describe("operationWithMeta", function() {
it("should support merging in name+in keyed param metadata", function () {
it("should support merging in {in}.{name} keyed param metadata", function () {
const state = fromJS({
json: {
paths: {
@@ -505,7 +505,7 @@ describe("spec plugin - selectors", function(){
"get": {
parameters: [
{
name: "body",
name: "myBody",
in: "body"
}
]
@@ -518,7 +518,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
parameters: {
"body.body": {
"body.myBody": {
value: "abc123"
}
}
@@ -533,7 +533,7 @@ describe("spec plugin - selectors", function(){
expect(result.toJS()).toEqual({
parameters: [
{
name: "body",
name: "myBody",
in: "body",
value: "abc123"
}
@@ -542,7 +542,7 @@ describe("spec plugin - selectors", function(){
})
it("should support merging in hash-keyed param metadata", function () {
const bodyParam = fromJS({
name: "body",
name: "myBody",
in: "body"
})
@@ -563,7 +563,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
parameters: {
[`body.body.hash-${bodyParam.hashCode()}`]: {
[`body.myBody.hash-${bodyParam.hashCode()}`]: {
value: "abc123"
}
}
@@ -578,7 +578,7 @@ describe("spec plugin - selectors", function(){
expect(result.toJS()).toEqual({
parameters: [
{
name: "body",
name: "myBody",
in: "body",
value: "abc123"
}
@@ -587,7 +587,7 @@ describe("spec plugin - selectors", function(){
})
})
describe("parameterWithMeta", function() {
it("should support merging in name+in keyed param metadata", function () {
it("should support merging in {in}.{name} keyed param metadata", function () {
const state = fromJS({
json: {
paths: {
@@ -595,7 +595,7 @@ describe("spec plugin - selectors", function(){
"get": {
parameters: [
{
name: "body",
name: "myBody",
in: "body"
}
]
@@ -608,7 +608,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
parameters: {
"body.body": {
"body.myBody": {
value: "abc123"
}
}
@@ -618,17 +618,17 @@ describe("spec plugin - selectors", function(){
}
})
const result = parameterWithMeta(state, ["/", "get"], "body", "body")
const result = parameterWithMeta(state, ["/", "get"], "myBody", "body")
expect(result.toJS()).toEqual({
name: "body",
name: "myBody",
in: "body",
value: "abc123"
})
})
it("should give best-effort when encountering hash-keyed param metadata", function () {
const bodyParam = fromJS({
name: "body",
name: "myBody",
in: "body"
})
@@ -649,7 +649,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
parameters: {
[`body.body.hash-${bodyParam.hashCode()}`]: {
[`body.myBody.hash-${bodyParam.hashCode()}`]: {
value: "abc123"
}
}
@@ -659,10 +659,10 @@ describe("spec plugin - selectors", function(){
}
})
const result = parameterWithMeta(state, ["/", "get"], "body", "body")
const result = parameterWithMeta(state, ["/", "get"], "myBody", "body")
expect(result.toJS()).toEqual({
name: "body",
name: "myBody",
in: "body",
value: "abc123"
})
@@ -670,9 +670,9 @@ describe("spec plugin - selectors", function(){
})
describe("parameterWithMetaByIdentity", function() {
it("should support merging in name+in keyed param metadata", function () {
it("should support merging in {in}.{name} keyed param metadata", function () {
const bodyParam = fromJS({
name: "body",
name: "myBody",
in: "body"
})
@@ -691,7 +691,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
parameters: {
"body.body": {
"body.myBody": {
value: "abc123"
}
}
@@ -704,14 +704,14 @@ describe("spec plugin - selectors", function(){
const result = parameterWithMetaByIdentity(state, ["/", "get"], bodyParam)
expect(result.toJS()).toEqual({
name: "body",
name: "myBody",
in: "body",
value: "abc123"
})
})
it("should support merging in hash-keyed param metadata", function () {
const bodyParam = fromJS({
name: "body",
name: "myBody",
in: "body"
})
@@ -732,7 +732,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
parameters: {
[`body.body.hash-${bodyParam.hashCode()}`]: {
[`body.myBody.hash-${bodyParam.hashCode()}`]: {
value: "abc123"
}
}
@@ -745,14 +745,14 @@ describe("spec plugin - selectors", function(){
const result = parameterWithMetaByIdentity(state, ["/", "get"], bodyParam)
expect(result.toJS()).toEqual({
name: "body",
name: "myBody",
in: "body",
value: "abc123"
})
})
})
describe("parameterInclusionSettingFor", function() {
it("should support getting name+in param inclusion settings", function () {
it("should support getting {in}.{name} param inclusion settings", function () {
const param = fromJS({
name: "param",
in: "query",
@@ -776,7 +776,7 @@ describe("spec plugin - selectors", function(){
"/": {
"get": {
"parameter_inclusions": {
[`param.query`]: true
[`query.param`]: true
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,26 @@
openapi: "3.0.0"
paths:
/aev:
get:
parameters:
- name: param
in: query
allowEmptyValue: true
schema:
type: string
responses:
200:
description: ok
/aev/and/required:
get:
parameters:
- name: param
in: query
allowEmptyValue: true
required: true
schema:
type: string
responses:
200:
description: ok

View File

@@ -0,0 +1,121 @@
describe("#5129: parameter required + allowEmptyValue interactions", () => {
describe("allowEmptyValue parameter", () => {
const opId = "#operations-default-get_aev"
it("should omit the parameter by default", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev")
})
it("should include a value", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(`.parameters-col_description input[type=text]`)
.type("asdf")
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev?param=asdf")
})
it("should include an empty value when empty value box is checked", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(`.parameters-col_description input[type=checkbox]`)
.check()
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev?param=")
})
it("should include a value when empty value box is checked and then input is provided", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(`.parameters-col_description input[type=checkbox]`)
.check()
.get(`.parameters-col_description input[type=text]`)
.type("1234")
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev?param=1234")
})
})
describe("allowEmptyValue + required parameter", () => {
const opId = "#operations-default-get_aev_and_required"
it("should refuse to execute by default", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(".btn.execute")
.click()
.wait(1000)
.get(".request-url pre")
.should("not.exist")
})
it("should include a value", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(`.parameters-col_description input[type=text]`)
.type("asdf")
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev/and/required?param=asdf")
})
it("should include an empty value when empty value box is checked", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(`.parameters-col_description input[type=checkbox]`)
.check()
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev/and/required?param=")
})
it("should include a value when empty value box is checked and then input is provided", () => {
cy
.visit("/?url=/documents/bugs/5129.yaml")
.get(opId)
.click()
.get(".btn.try-out__btn")
.click()
.get(`.parameters-col_description input[type=checkbox]`)
.check()
.get(`.parameters-col_description input[type=text]`)
.type("1234")
.get(".btn.execute")
.click()
.get(".request-url pre")
.should("have.text", "http://localhost:3230/aev/and/required?param=1234")
})
})
})