Skip to content

Request Body examples should respect media-type #6739

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 29 additions & 34 deletions src/core/plugins/oas3/components/request-body.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,28 @@ import { Map, OrderedMap, List } from "immutable"
import { getCommonExtensions, getSampleSchema, stringify, isEmptyValue } from "core/utils"

function getDefaultRequestBodyValue(requestBody, mediaType, activeExamplesKey) {
let mediaTypeValue = requestBody.getIn(["content", mediaType])
let schema = mediaTypeValue.get("schema").toJS()
let example =
mediaTypeValue.get("example") !== undefined
? stringify(mediaTypeValue.get("example"))
: null
let currentExamplesValue = mediaTypeValue.getIn([
"examples",
activeExamplesKey,
"value"
])
const mediaTypeValue = requestBody.getIn(["content", mediaType])
const schema = mediaTypeValue.get("schema").toJS()

if (mediaTypeValue.get("examples")) {
// the media type DOES have examples
return stringify(currentExamplesValue) || ""
} else {
// the media type DOES NOT have examples
return stringify(
example ||
getSampleSchema(schema, mediaType, {
includeWriteOnly: true
}) ||
""
)
}
const hasExamplesKey = mediaTypeValue.get("examples") !== undefined
const exampleSchema = mediaTypeValue.get("example")
const mediaTypeExample = hasExamplesKey
? mediaTypeValue.getIn([
"examples",
activeExamplesKey,
"value"
])
: exampleSchema

const exampleValue = getSampleSchema(
schema,
mediaType,
{
includeWriteOnly: true
},
mediaTypeExample
)
return stringify(exampleValue)
}


Expand Down Expand Up @@ -212,6 +209,12 @@ const RequestBody = ({
</div>
}

const sampleRequestBody = getDefaultRequestBodyValue(
requestBody,
contentType,
activeExamplesKey,
)

return <div>
{ requestBodyDescription &&
<Markdown source={requestBodyDescription} />
Expand All @@ -235,11 +238,7 @@ const RequestBody = ({
<RequestBodyEditor
value={requestBodyValue}
errors={requestBodyErrors}
defaultValue={getDefaultRequestBodyValue(
requestBody,
contentType,
activeExamplesKey,
)}
defaultValue={sampleRequestBody}
onChange={onChange}
getComponent={getComponent}
/>
Expand All @@ -257,11 +256,7 @@ const RequestBody = ({
<HighlightCode
className="body-param__example"
getConfigs={getConfigs}
value={stringify(requestBodyValue) || getDefaultRequestBodyValue(
requestBody,
contentType,
activeExamplesKey,
)}
value={stringify(requestBodyValue) || sampleRequestBody}
/>
}
includeWriteOnly={true}
Expand Down
57 changes: 57 additions & 0 deletions test/e2e-cypress/static/documents/bugs/6475.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
openapi: 3.0.1
info:
title: Example Swagger
version: '1.0'
servers:
- url: /api/v1
paths:
/xmlTest/examples:
post:
summary: sample issues
operationId: xmlTest_examples
parameters: []
requestBody:
description: Simple Test xml examples
content:
application/xml:
schema:
$ref: "#/components/schemas/Test"
examples:
test:
value:
x: should be xml
responses:
'200':
description: Simple Test xml examples
content: {}
/xmlTest/example:
post:
summary: sample issues
operationId: xmlTest_example
parameters: []
requestBody:
description: Simple Test xml example
content:
application/xml:
schema:
$ref: "#/components/schemas/Test"
example:
x: should be xml
responses:
'200':
description: Simple Test xml example
content: {}
components:
schemas:
Test:
type: object
xml:
name: root
properties:
x:
type: string
other:
type: string
format: email
example:
x: what the f
65 changes: 65 additions & 0 deletions test/e2e-cypress/tests/bugs/6475.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
describe("#6475: 'Examples' keyword definitions can not be rendered as xml", () => {
it("should render requestBody examples preview accourdingly to content-type xml", () => {
const xmlIndicator = "<x>should be xml</x>"

cy
.visit("?url=/documents/bugs/6475.yaml")
.get("#operations-default-xmlTest_examples")
.click()
.get(".opblock-section-request-body")
.within(() => {
cy
.get(".microlight")
.should("include.text", xmlIndicator)
})
})
it("should requestBody examples input accourdingly to content-type xml", () => {
const xmlIndicator = "<x>should be xml</x>"

cy
.visit("?url=/documents/bugs/6475.yaml")
.get("#operations-default-xmlTest_examples")
.click()
.get(".btn.try-out__btn")
.click()
.get(".opblock-section-request-body")
.within(() => {
cy
.get("textarea")
.contains(xmlIndicator)
})
})
})

describe("#6475: 'Example' keyword definitions can not be rendered as xml", () => {
it("should render requestBody examples preview accourdingly to content-type xml", () => {
const xmlIndicator = "<x>should be xml</x>"

cy
.visit("?url=/documents/bugs/6475.yaml")
.get("#operations-default-xmlTest_example")
.click()
.get(".opblock-section-request-body")
.within(() => {
cy
.get(".microlight")
.should("include.text", xmlIndicator)
})
})
it("should requestBody examples input accourdingly to content-type xml", () => {
const xmlIndicator = "<x>should be xml</x>"

cy
.visit("?url=/documents/bugs/6475.yaml")
.get("#operations-default-xmlTest_example")
.click()
.get(".btn.try-out__btn")
.click()
.get(".opblock-section-request-body")
.within(() => {
cy
.get("textarea")
.contains(xmlIndicator)
})
})
})