fix: response examples should respect media-type (#6456)
* response sample generation should take content type into consideration for stringify
This commit is contained in:
@@ -4,6 +4,7 @@ import ImPropTypes from "react-immutable-proptypes"
|
||||
import cx from "classnames"
|
||||
import { fromJS, Seq, Iterable, List, Map } from "immutable"
|
||||
import { getSampleSchema, fromJSOrdered, stringify } from "core/utils"
|
||||
import { isFunc } from "../utils"
|
||||
|
||||
const getExampleComponent = ( sampleResponse, HighlightCode, getConfigs ) => {
|
||||
if (
|
||||
@@ -100,7 +101,6 @@ export default class Response extends React.Component {
|
||||
const Example = getComponent("Example")
|
||||
|
||||
|
||||
var sampleResponse
|
||||
var schema, specPathWithPossibleSchema
|
||||
|
||||
const activeContentType = this.state.responseContentType || contentType
|
||||
@@ -118,38 +118,63 @@ export default class Response extends React.Component {
|
||||
specPathWithPossibleSchema = response.has("schema") ? specPath.push("schema") : specPath
|
||||
}
|
||||
|
||||
const overrideSchemaExample = (oldSchema, newExample) => {
|
||||
if(newExample === undefined)
|
||||
return oldSchema
|
||||
|
||||
if(!oldSchema)
|
||||
oldSchema = { }
|
||||
|
||||
if(isFunc(oldSchema.toJS))
|
||||
oldSchema = oldSchema.toJS()
|
||||
|
||||
oldSchema.example = newExample && isFunc(newExample.toJS)
|
||||
? newExample.toJS()
|
||||
: newExample
|
||||
return oldSchema
|
||||
}
|
||||
let mediaTypeExample
|
||||
let shouldOverrideSchemaExample = false
|
||||
let sampleSchema
|
||||
let sampleGenConfig = {
|
||||
includeReadOnly: true
|
||||
}
|
||||
|
||||
// Goal: find an example value for `sampleResponse`
|
||||
if(isOAS3) {
|
||||
const oas3SchemaForContentType = activeMediaType.get("schema", Map({}))
|
||||
|
||||
sampleSchema = activeMediaType.get("schema", Map({})).toJS()
|
||||
if(examplesForMediaType) {
|
||||
const targetExamplesKey = this.getTargetExamplesKey()
|
||||
const targetExample = examplesForMediaType.get(targetExamplesKey, Map({}))
|
||||
sampleResponse = stringify(targetExample.get("value"))
|
||||
mediaTypeExample = examplesForMediaType
|
||||
.get(targetExamplesKey, Map({}))
|
||||
.get("value")
|
||||
if(mediaTypeExample === undefined) {
|
||||
mediaTypeExample = examplesForMediaType.values().next().value
|
||||
}
|
||||
shouldOverrideSchemaExample = true
|
||||
} else if(activeMediaType.get("example") !== undefined) {
|
||||
// use the example key's value
|
||||
sampleResponse = stringify(activeMediaType.get("example"))
|
||||
} else {
|
||||
// use an example value generated based on the schema
|
||||
sampleResponse = getSampleSchema(oas3SchemaForContentType.toJS(), this.state.responseContentType, {
|
||||
includeReadOnly: true
|
||||
})
|
||||
mediaTypeExample = activeMediaType.get("example")
|
||||
shouldOverrideSchemaExample = true
|
||||
}
|
||||
} else {
|
||||
if(response.getIn(["examples", activeContentType])) {
|
||||
sampleResponse = response.getIn(["examples", activeContentType])
|
||||
} else {
|
||||
sampleResponse = schema ? getSampleSchema(
|
||||
schema.toJS(),
|
||||
activeContentType,
|
||||
{
|
||||
includeReadOnly: true,
|
||||
includeWriteOnly: true // writeOnly has no filtering effect in swagger 2.0
|
||||
}
|
||||
) : null
|
||||
sampleSchema = schema
|
||||
sampleGenConfig = {...sampleGenConfig, includeWriteOnly: true}
|
||||
const oldOASMediaTypeExample = response.getIn(["examples", activeContentType])
|
||||
if(oldOASMediaTypeExample) {
|
||||
mediaTypeExample = oldOASMediaTypeExample
|
||||
shouldOverrideSchemaExample = true
|
||||
}
|
||||
}
|
||||
|
||||
const schemaForSampleGeneration = shouldOverrideSchemaExample
|
||||
? overrideSchemaExample(sampleSchema, mediaTypeExample)
|
||||
: sampleSchema
|
||||
|
||||
const sampleResponse = schemaForSampleGeneration
|
||||
? getSampleSchema(schemaForSampleGeneration, activeContentType, sampleGenConfig)
|
||||
: null
|
||||
|
||||
let example = getExampleComponent( sampleResponse, HighlightCode, getConfigs )
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user