fix(try-it-out): reset of oas3 requestBody should use default values (#8265)

Co-authored-by: Mathias Spanhove <mathias.spanhove@katoennatie.com>
This commit is contained in:
Mathias Spanhove
2022-11-09 00:23:19 +01:00
committed by GitHub
parent 0b8de2c179
commit ffe24d5a83
6 changed files with 86 additions and 3 deletions

View File

@@ -17,6 +17,7 @@ export default class Operation extends PureComponent {
toggleShown: PropTypes.func.isRequired, toggleShown: PropTypes.func.isRequired,
onTryoutClick: PropTypes.func.isRequired, onTryoutClick: PropTypes.func.isRequired,
onResetClick: PropTypes.func.isRequired,
onCancelClick: PropTypes.func.isRequired, onCancelClick: PropTypes.func.isRequired,
onExecute: PropTypes.func.isRequired, onExecute: PropTypes.func.isRequired,
@@ -48,6 +49,7 @@ export default class Operation extends PureComponent {
request, request,
toggleShown, toggleShown,
onTryoutClick, onTryoutClick,
onResetClick,
onCancelClick, onCancelClick,
onExecute, onExecute,
fn, fn,
@@ -152,6 +154,7 @@ export default class Operation extends PureComponent {
operation={operation} operation={operation}
onChangeKey={onChangeKey} onChangeKey={onChangeKey}
onTryoutClick = { onTryoutClick } onTryoutClick = { onTryoutClick }
onResetClick = { onResetClick }
onCancelClick = { onCancelClick } onCancelClick = { onCancelClick }
tryItOutEnabled = { tryItOutEnabled } tryItOutEnabled = { tryItOutEnabled }
allowTryItOut={allowTryItOut} allowTryItOut={allowTryItOut}

View File

@@ -25,6 +25,7 @@ export default class Parameters extends Component {
tryItOutEnabled: PropTypes.bool, tryItOutEnabled: PropTypes.bool,
allowTryItOut: PropTypes.bool, allowTryItOut: PropTypes.bool,
onTryoutClick: PropTypes.func, onTryoutClick: PropTypes.func,
onResetClick: PropTypes.func,
onCancelClick: PropTypes.func, onCancelClick: PropTypes.func,
onChangeKey: PropTypes.array, onChangeKey: PropTypes.array,
pathMethod: PropTypes.array.isRequired, pathMethod: PropTypes.array.isRequired,
@@ -94,6 +95,7 @@ export default class Parameters extends Component {
let { let {
onTryoutClick, onTryoutClick,
onResetClick,
parameters, parameters,
allowTryItOut, allowTryItOut,
tryItOutEnabled, tryItOutEnabled,
@@ -161,7 +163,7 @@ export default class Parameters extends Component {
enabled={tryItOutEnabled} enabled={tryItOutEnabled}
onCancelClick={this.props.onCancelClick} onCancelClick={this.props.onCancelClick}
onTryoutClick={onTryoutClick} onTryoutClick={onTryoutClick}
onResetClick={() => oas3Actions.setRequestBodyValue({ value: undefined, pathMethod })}/> onResetClick={() => onResetClick(pathMethod)}/>
) : null} ) : null}
</div> </div>
{this.state.parametersVisible ? <div className="parameters-container"> {this.state.parametersVisible ? <div className="parameters-container">

View File

@@ -122,6 +122,11 @@ export default class OperationContainer extends PureComponent {
this.setState({tryItOutEnabled: !this.state.tryItOutEnabled}) this.setState({tryItOutEnabled: !this.state.tryItOutEnabled})
} }
onResetClick = (pathMethod) => {
const defaultRequestBodyValue = this.props.oas3Selectors.selectDefaultRequestBodyValue(...pathMethod)
this.props.oas3Actions.setRequestBodyValue({ value: defaultRequestBodyValue, pathMethod })
}
onExecute = () => { onExecute = () => {
this.setState({ executeInProgress: true }) this.setState({ executeInProgress: true })
} }
@@ -225,6 +230,7 @@ export default class OperationContainer extends PureComponent {
toggleShown={this.toggleShown} toggleShown={this.toggleShown}
onTryoutClick={this.onTryoutClick} onTryoutClick={this.onTryoutClick}
onResetClick={this.onResetClick}
onCancelClick={this.onCancelClick} onCancelClick={this.onCancelClick}
onExecute={this.onExecute} onExecute={this.onExecute}
specPath={specPath} specPath={specPath}

View File

@@ -61,6 +61,26 @@ export const shouldRetainRequestBodyValue = onlyOAS3((state, path, method) => {
} }
) )
export const selectDefaultRequestBodyValue = (state, path, method) => (system) => {
const {oas3Selectors, specSelectors} = system.getSystem()
const spec = specSelectors.specJson()
if(isOAS3Helper(spec)) {
const currentMediaType = oas3Selectors.requestContentType(path, method)
if (currentMediaType) {
return getDefaultRequestBodyValue(
specSelectors.specResolvedSubtree(["paths", path, method, "requestBody"]),
currentMediaType,
oas3Selectors.activeExamplesMember(
path, method,
"requestBody",
"requestBody",
)
)
}
}
return null
}
export const hasUserEditedBody = (state, path, method) => (system) => { export const hasUserEditedBody = (state, path, method) => (system) => {
const {oas3Selectors, specSelectors} = system.getSystem() const {oas3Selectors, specSelectors} = system.getSystem()
const spec = specSelectors.specJson() const spec = specSelectors.specJson()

View File

@@ -0,0 +1,28 @@
openapi: 3.0.1
info:
title: Example Swagger with required default body parameter
version: 1.0.0
paths:
/pet:
post:
operationId: addPet
requestBody:
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/BodyParameter'
required: true
responses:
405:
description: Invalid input
content: {}
components:
schemas:
BodyParameter:
required:
- bodyParameter
type: object
properties:
bodyParameter:
type: string
default: default

View File

@@ -0,0 +1,24 @@
describe("#8217: Reset Request Body not using default values", () => {
it("it reset the user edited value and executes with the default value in case of try out reset. (#6517)", () => {
cy
.visit("?url=/documents/bugs/8217.yaml")
.get("#operations-default-addPet")
.click()
// Expand Try It Out
.get(".try-out__btn")
.click()
// replace default sample with bad value
.get(`.parameters[data-property-name="bodyParameter"] input`)
.type("{selectall}not the default value")
// Reset Try It Out
.get(".try-out__btn.reset")
.click()
// Submit using default value
.get(".btn.execute")
.click()
// No required validation error on body parameter
.get(`.parameters[data-property-name="bodyParameter"] input`)
.should("have.value", "default")
.and("not.have.class", "invalid")
})
})