From ffe24d5a83d60268a35bc89fc2023caada9d5f5c Mon Sep 17 00:00:00 2001 From: Mathias Spanhove Date: Wed, 9 Nov 2022 00:23:19 +0100 Subject: [PATCH] fix(try-it-out): reset of oas3 requestBody should use default values (#8265) Co-authored-by: Mathias Spanhove --- src/core/components/operation.jsx | 3 ++ src/core/components/parameters/parameters.jsx | 8 ++++-- src/core/containers/OperationContainer.jsx | 6 ++++ src/core/plugins/oas3/selectors.js | 20 +++++++++++++ .../static/documents/bugs/8217.yaml | 28 +++++++++++++++++++ test/e2e-cypress/tests/bugs/8217.js | 24 ++++++++++++++++ 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 test/e2e-cypress/static/documents/bugs/8217.yaml create mode 100644 test/e2e-cypress/tests/bugs/8217.js diff --git a/src/core/components/operation.jsx b/src/core/components/operation.jsx index 49868813b26..f0c9e5129de 100644 --- a/src/core/components/operation.jsx +++ b/src/core/components/operation.jsx @@ -17,6 +17,7 @@ export default class Operation extends PureComponent { toggleShown: PropTypes.func.isRequired, onTryoutClick: PropTypes.func.isRequired, + onResetClick: PropTypes.func.isRequired, onCancelClick: PropTypes.func.isRequired, onExecute: PropTypes.func.isRequired, @@ -48,6 +49,7 @@ export default class Operation extends PureComponent { request, toggleShown, onTryoutClick, + onResetClick, onCancelClick, onExecute, fn, @@ -152,6 +154,7 @@ export default class Operation extends PureComponent { operation={operation} onChangeKey={onChangeKey} onTryoutClick = { onTryoutClick } + onResetClick = { onResetClick } onCancelClick = { onCancelClick } tryItOutEnabled = { tryItOutEnabled } allowTryItOut={allowTryItOut} diff --git a/src/core/components/parameters/parameters.jsx b/src/core/components/parameters/parameters.jsx index eb6dd47aaae..d76b23a56f6 100644 --- a/src/core/components/parameters/parameters.jsx +++ b/src/core/components/parameters/parameters.jsx @@ -25,6 +25,7 @@ export default class Parameters extends Component { tryItOutEnabled: PropTypes.bool, allowTryItOut: PropTypes.bool, onTryoutClick: PropTypes.func, + onResetClick: PropTypes.func, onCancelClick: PropTypes.func, onChangeKey: PropTypes.array, pathMethod: PropTypes.array.isRequired, @@ -73,7 +74,7 @@ export default class Parameters extends Component { }) } } - + onChangeMediaType = ({ value, pathMethod }) => { let { specActions, oas3Selectors, oas3Actions } = this.props const userHasEditedBody = oas3Selectors.hasUserEditedBody(...pathMethod) @@ -94,6 +95,7 @@ export default class Parameters extends Component { let { onTryoutClick, + onResetClick, parameters, allowTryItOut, tryItOutEnabled, @@ -161,7 +163,7 @@ export default class Parameters extends Component { enabled={tryItOutEnabled} onCancelClick={this.props.onCancelClick} onTryoutClick={onTryoutClick} - onResetClick={() => oas3Actions.setRequestBodyValue({ value: undefined, pathMethod })}/> + onResetClick={() => onResetClick(pathMethod)}/> ) : null} {this.state.parametersVisible ?
@@ -220,7 +222,7 @@ export default class Parameters extends Component { onChange={(value) => { this.onChangeMediaType({ value, pathMethod }) }} - className="body-param-content-type" + className="body-param-content-type" ariaLabel="Request content type" />
diff --git a/src/core/containers/OperationContainer.jsx b/src/core/containers/OperationContainer.jsx index cdf560cf38e..89ce7f51ae1 100644 --- a/src/core/containers/OperationContainer.jsx +++ b/src/core/containers/OperationContainer.jsx @@ -122,6 +122,11 @@ export default class OperationContainer extends PureComponent { this.setState({tryItOutEnabled: !this.state.tryItOutEnabled}) } + onResetClick = (pathMethod) => { + const defaultRequestBodyValue = this.props.oas3Selectors.selectDefaultRequestBodyValue(...pathMethod) + this.props.oas3Actions.setRequestBodyValue({ value: defaultRequestBodyValue, pathMethod }) + } + onExecute = () => { this.setState({ executeInProgress: true }) } @@ -225,6 +230,7 @@ export default class OperationContainer extends PureComponent { toggleShown={this.toggleShown} onTryoutClick={this.onTryoutClick} + onResetClick={this.onResetClick} onCancelClick={this.onCancelClick} onExecute={this.onExecute} specPath={specPath} diff --git a/src/core/plugins/oas3/selectors.js b/src/core/plugins/oas3/selectors.js index 72c86f01b4e..792b844eeaf 100644 --- a/src/core/plugins/oas3/selectors.js +++ b/src/core/plugins/oas3/selectors.js @@ -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) => { const {oas3Selectors, specSelectors} = system.getSystem() const spec = specSelectors.specJson() diff --git a/test/e2e-cypress/static/documents/bugs/8217.yaml b/test/e2e-cypress/static/documents/bugs/8217.yaml new file mode 100644 index 00000000000..fa3d8cf8363 --- /dev/null +++ b/test/e2e-cypress/static/documents/bugs/8217.yaml @@ -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 \ No newline at end of file diff --git a/test/e2e-cypress/tests/bugs/8217.js b/test/e2e-cypress/tests/bugs/8217.js new file mode 100644 index 00000000000..2c61c42a937 --- /dev/null +++ b/test/e2e-cypress/tests/bugs/8217.js @@ -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") + }) +}) \ No newline at end of file