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:
@@ -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)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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
26
test/e2e-cypress/static/documents/bugs/5129.yaml
Normal file
26
test/e2e-cypress/static/documents/bugs/5129.yaml
Normal 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
|
||||
121
test/e2e-cypress/tests/bugs/5129.js
Normal file
121
test/e2e-cypress/tests/bugs/5129.js
Normal 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")
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user