Skip to content

Commit 32dd3af

Browse files
authored
fix(oas3): reset request body values in try it out (#9717)
1 parent 690b040 commit 32dd3af

File tree

4 files changed

+103
-7
lines changed

4 files changed

+103
-7
lines changed

src/core/containers/OperationContainer.jsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,26 @@ export default class OperationContainer extends PureComponent {
123123

124124
onResetClick = (pathMethod) => {
125125
const defaultRequestBodyValue = this.props.oas3Selectors.selectDefaultRequestBodyValue(...pathMethod)
126-
this.props.oas3Actions.setRequestBodyValue({ value: defaultRequestBodyValue, pathMethod })
126+
const contentType = this.props.oas3Selectors.requestContentType(...pathMethod)
127+
128+
if (contentType === "application/x-www-form-urlencoded" || contentType === "multipart/form-data") {
129+
const jsonRequestBodyValue = JSON.parse(defaultRequestBodyValue)
130+
Object.entries(jsonRequestBodyValue).forEach(([key, value]) => {
131+
if (Array.isArray(value)) {
132+
jsonRequestBodyValue[key] = jsonRequestBodyValue[key].map((val) => {
133+
if (typeof val === "object") {
134+
return JSON.stringify(val, null, 2)
135+
}
136+
return val
137+
})
138+
} else if (typeof value === "object") {
139+
jsonRequestBodyValue[key] = JSON.stringify(jsonRequestBodyValue[key], null, 2)
140+
}
141+
})
142+
this.props.oas3Actions.setRequestBodyValue({ value: fromJS(jsonRequestBodyValue), pathMethod })
143+
} else {
144+
this.props.oas3Actions.setRequestBodyValue({ value: defaultRequestBodyValue, pathMethod })
145+
}
127146
}
128147

129148
onExecute = () => {

src/core/plugins/oas3/reducers.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,13 @@ export default {
2929
// context: user switch from application/json to application/x-www-form-urlencoded
3030
currentVal = Map()
3131
}
32-
let newVal
32+
let newVal = currentVal
3333
const [...valueKeys] = value.keys()
3434
valueKeys.forEach((valueKey) => {
3535
let valueKeyVal = value.getIn([valueKey])
36-
if (!currentVal.has(valueKey)) {
37-
newVal = currentVal.setIn([valueKey, "value"], valueKeyVal)
38-
} else if (!Map.isMap(valueKeyVal)) {
39-
// context: user input will be received as String
40-
newVal = currentVal.setIn([valueKey, "value"], valueKeyVal)
36+
// there is no previous value for this key or the new value is received from user input as a string
37+
if (!newVal.has(valueKey) || !Map.isMap(valueKeyVal)) {
38+
newVal = newVal.setIn([valueKey, "value"], valueKeyVal)
4139
}
4240
})
4341
return state.setIn(["requestData", path, method, "bodyValue"], newVal)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* @prettier
3+
*/
4+
5+
describe("Reset button in try it out", () => {
6+
it("should reset the edited request body value and execute try it out with the default value", () => {
7+
cy.visit("?url=/documents/features/try-it-out-reset.yaml")
8+
.get("#operations-default-post_users")
9+
.click()
10+
.get(".try-out__btn")
11+
.click()
12+
.get(`.parameters[data-property-name="name"] input[type=text]`)
13+
.type("{selectall}not the default name value")
14+
.get(`.parameters[data-property-name="badgeid"] input[type=text]`)
15+
.type("{selectall}not the default badge value")
16+
.get(`.parameters[data-property-name="email"] input[type=text]`)
17+
.type("{selectall}not the default email value")
18+
.get(".btn.execute")
19+
.click()
20+
.get(".curl-command")
21+
.contains(
22+
"name=not%20the%20default%20name%20value&badgeid=not%20the%20default%20badge%20value&email=not%20the%20default%20email%20value"
23+
)
24+
.should("exist")
25+
.get(".try-out__btn.reset")
26+
.click()
27+
.get(".btn.execute")
28+
.click()
29+
.get(".curl-command")
30+
.contains("name=default%20name&badgeid=12345&email=jsmith%40business.com")
31+
.should("exist")
32+
})
33+
})
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
openapi: 3.0.3
2+
info:
3+
title: Test API
4+
version: 1.0.0
5+
paths:
6+
/users:
7+
post:
8+
summary: Create a user
9+
description: Create a user, one of various ways
10+
requestBody:
11+
content:
12+
application/x-www-form-urlencoded:
13+
schema:
14+
$ref: '#/components/schemas/UserSource'
15+
responses:
16+
'204':
17+
description: Successfully opened document
18+
'400':
19+
description: Invalid request
20+
content:
21+
application/json:
22+
schema:
23+
properties:
24+
output:
25+
type: string
26+
example: "Invalid request"
27+
components:
28+
schemas:
29+
UserSource:
30+
type: object
31+
properties:
32+
name:
33+
description: Full name
34+
type: string
35+
example: "default name"
36+
badgeid:
37+
description: Badge number
38+
type: integer
39+
format: uint32
40+
example: 12345
41+
email:
42+
description: E-mail
43+
type: string
44+
example: "jsmith@business.com"
45+
minProperties: 1
46+
maxProperties: 3

0 commit comments

Comments
 (0)