Skip to content
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
69 changes: 47 additions & 22 deletions src/core/components/response.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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
Expand All @@ -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 (
Expand Down
52 changes: 52 additions & 0 deletions test/e2e-cypress/static/documents/bugs/6442.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
openapi: 3.0.1
info:
title: Example Swagger
version: '1.0'
servers:
- url: /api/v1
paths:
/xmlTest:
get:
summary: subscribes to a siri vm stream
operationId: xmlTest
parameters: []
responses:
'200':
description: Simple example
content:
application/xml:
schema:
type: object
xml:
name: root
properties:
x:
type: string
example:
x: what the f
examples:
x2:
summary: "xml not rendered via 'examples' keyword"
value:
x: should be xml
/xmlTest2:
get:
summary: subscribes to a siri vm stream
operationId: xmlTest2
parameters: []
responses:
'200':
description: Simple example
content:
application/xml:
schema:
type: object
xml:
name: root
properties:
x:
type: string
example:
x: what the f
example:
x: should be xml
33 changes: 33 additions & 0 deletions test/e2e-cypress/tests/bugs/6442.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
describe("#6442: 'Examples' keyword definitions can not be rendered as xml", () => {
it("should render response examples accourdingly to content-type xml", () => {
const xmlIndicator = "<x>should be xml</x>"

cy
.visit("?url=/documents/bugs/6442.yaml")
.get("#operations-default-xmlTest")
.click()
.get(".responses-wrapper")
.within(() => {
cy
.get(".microlight")
.should("include.text", xmlIndicator)
})
})
})

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

cy
.visit("?url=/documents/bugs/6442.yaml")
.get("#operations-default-xmlTest2")
.click()
.get(".responses-wrapper")
.within(() => {
cy
.get(".microlight")
.should("include.text", xmlIndicator)
})
})
})