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" import { getCommonExtensions, getSampleSchema, stringify, isEmptyValue } from "core/utils"
function getDefaultRequestBodyValue(requestBody, mediaType, activeExamplesKey) { function getDefaultRequestBodyValue(requestBody, mediaType, activeExamplesKey) {
let mediaTypeValue = requestBody.getIn(["content", mediaType]) const mediaTypeValue = requestBody.getIn(["content", mediaType])
let schema = mediaTypeValue.get("schema").toJS() const schema = mediaTypeValue.get("schema").toJS()
let example =
mediaTypeValue.get("example") !== undefined const hasExamplesKey = mediaTypeValue.get("examples") !== undefined
? stringify(mediaTypeValue.get("example")) const exampleSchema = mediaTypeValue.get("example")
: null const mediaTypeExample = hasExamplesKey
let currentExamplesValue = mediaTypeValue.getIn([ ? mediaTypeValue.getIn([
"examples", "examples",
activeExamplesKey, activeExamplesKey,
"value" "value"
]) ])
: exampleSchema
if (mediaTypeValue.get("examples")) { const exampleValue = getSampleSchema(
// the media type DOES have examples schema,
return stringify(currentExamplesValue) || "" mediaType,
} else { {
// the media type DOES NOT have examples
return stringify(
example ||
getSampleSchema(schema, mediaType, {
includeWriteOnly: true includeWriteOnly: true
}) || },
"" mediaTypeExample
) )
} return stringify(exampleValue)
} }
@@ -212,6 +209,12 @@ const RequestBody = ({
</div> </div>
} }
const sampleRequestBody = getDefaultRequestBodyValue(
requestBody,
contentType,
activeExamplesKey,
)
return <div> return <div>
{ requestBodyDescription && { requestBodyDescription &&
<Markdown source={requestBodyDescription} /> <Markdown source={requestBodyDescription} />
@@ -235,11 +238,7 @@ const RequestBody = ({
<RequestBodyEditor <RequestBodyEditor
value={requestBodyValue} value={requestBodyValue}
errors={requestBodyErrors} errors={requestBodyErrors}
defaultValue={getDefaultRequestBodyValue( defaultValue={sampleRequestBody}
requestBody,
contentType,
activeExamplesKey,
)}
onChange={onChange} onChange={onChange}
getComponent={getComponent} getComponent={getComponent}
/> />
@@ -257,11 +256,7 @@ const RequestBody = ({
<HighlightCode <HighlightCode
className="body-param__example" className="body-param__example"
getConfigs={getConfigs} getConfigs={getConfigs}
value={stringify(requestBodyValue) || getDefaultRequestBodyValue( value={stringify(requestBodyValue) || sampleRequestBody}
requestBody,
contentType,
activeExamplesKey,
)}
/> />
} }
includeWriteOnly={true} 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)
})
})
})