Request Body examples should respect media-type (#6739)

* fix: request body.jsx should rely on the getSampleSchema utility

* test: add test to ensure xml request body
This commit is contained in:
Mahtis Michel
2021-01-04 19:23:23 +01:00
committed by GitHub
parent f35acced49
commit 68e9b1b439
3 changed files with 151 additions and 34 deletions

View File

@@ -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([
const mediaTypeValue = requestBody.getIn(["content", mediaType])
const schema = mediaTypeValue.get("schema").toJS()
const hasExamplesKey = mediaTypeValue.get("examples") !== undefined
const exampleSchema = mediaTypeValue.get("example")
const mediaTypeExample = hasExamplesKey
? mediaTypeValue.getIn([
"examples",
activeExamplesKey,
"value"
])
: exampleSchema
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, {
const exampleValue = getSampleSchema(
schema,
mediaType,
{
includeWriteOnly: true
}) ||
""
},
mediaTypeExample
)
}
return stringify(exampleValue)
}
@@ -212,6 +209,12 @@ const RequestBody = ({
</div>
}
const sampleRequestBody = getDefaultRequestBodyValue(
requestBody,
contentType,
activeExamplesKey,
)
return <div>
{ requestBodyDescription &&
<Markdown source={requestBodyDescription} />
@@ -235,11 +238,7 @@ const RequestBody = ({
<RequestBodyEditor
value={requestBodyValue}
errors={requestBodyErrors}
defaultValue={getDefaultRequestBodyValue(
requestBody,
contentType,
activeExamplesKey,
)}
defaultValue={sampleRequestBody}
onChange={onChange}
getComponent={getComponent}
/>
@@ -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}

View File

@@ -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

View File

@@ -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)
})
})
})