Skip to content

Commit

Permalink
fix(xml): render example with oneOf/anyOf (#8206)
Browse files Browse the repository at this point in the history
* test(e2e): render xml example with oneOf/anyOf
  • Loading branch information
tim-lai authored Sep 28, 2022
1 parent 5558bc8 commit 4b5d4bd
Show file tree
Hide file tree
Showing 3 changed files with 387 additions and 7 deletions.
15 changes: 8 additions & 7 deletions src/core/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -605,18 +605,19 @@ export const validateParam = (param, value, { isOAS3 = false, bypassRequiredChec
}

const getXmlSampleSchema = (schema, config, exampleOverride) => {
if (schema && (!schema.xml || !schema.xml.name)) {
schema.xml = schema.xml || {}

if (schema && !schema.xml) {
schema.xml = {}
}
if (schema && !schema.xml.name) {
if (!schema.$$ref && (schema.type || schema.items || schema.properties || schema.additionalProperties)) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- XML example cannot be generated; root element name is undefined -->"
}
if (schema.$$ref) {
let match = schema.$$ref.match(/\S*\/(\S+)$/)
schema.xml.name = match[1]
} else if (schema.type || schema.items || schema.properties || schema.additionalProperties) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- XML example cannot be generated; root element name is undefined -->"
} else {
return null
}
}

return memoizedCreateXMLExample(schema, config, exampleOverride)
}

Expand Down
309 changes: 309 additions & 0 deletions test/e2e-cypress/static/documents/features/oas3-xml.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,309 @@
{
"openapi": "3.0.0",
"info": {
"version": "1.0.0",
"title": "XML definition with oneOf & anyOf",
"description": "Definition to cover multiple XML examples"
},
"paths": {
"/foo": {
"post": {
"requestBody": {
"content": {
"text/xml": {
"schema": {
"description": "XML schema with oneOf for /foo request and mediaType text/xml",
"oneOf": [
{
"$ref": "#/components/schemas/OneOfOne"
},
{
"$ref": "#/components/schemas/OneOfTwo"
},
{
"$ref": "#/components/schemas/OneOfThree"
},
{
"$ref": "#/components/schemas/OneOfFour"
}
]
}
},
"application/xml": {
"schema": {
"description": "fallback XML schema with mediaType application/xml",
"$ref": "#/components/schemas/OneOfTwo"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "OK",
"content": {
"text/xml": {
"schema": {
"description": "XML schema with mediaType text/xml",
"$ref": "#/components/schemas/foobarResponse"
}
}
}
}
}
}
},
"/bar": {
"post": {
"requestBody": {
"content": {
"text/xml": {
"schema": {
"description": "XML schema with anyOf for /bar request and mediaType text/xml",
"anyOf": [
{
"$ref": "#/components/schemas/OneOfOne"
},
{
"$ref": "#/components/schemas/OneOfTwo"
},
{
"$ref": "#/components/schemas/OneOfThree"
},
{
"$ref": "#/components/schemas/OneOfFour"
}
]
}
},
"application/xml": {
"schema": {
"description": "fallback XML schema with mediaType application/xml",
"$ref": "#/components/schemas/OneOfTwo"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "OK",
"content": {
"text/xml": {
"schema": {
"description": "XML schema with mediaType text/xml",
"$ref": "#/components/schemas/foobarResponse"
}
}
}
}
}
}
},
"/foobar": {
"post": {
"requestBody": {
"content": {
"application/xml": {
"schema": {
"description": "XML schema with oneOf for /foobar request and mediaType application/xml",
"oneOf": [
{
"$ref": "#/components/schemas/OneOfOne"
},
{
"$ref": "#/components/schemas/OneOfTwo"
},
{
"$ref": "#/components/schemas/OneOfThree"
},
{
"$ref": "#/components/schemas/OneOfFour"
}
]
}
},
"text/xml": {
"schema": {
"description": "fallback XML schema with mediaType text/xml",
"$ref": "#/components/schemas/OneOfThree"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "OK",
"content": {
"text/xml": {
"schema": {
"description": "XML schema with mediaType application/xml",
"$ref": "#/components/schemas/foobarResponse"
}
}
}
}
}
}
},
"/barfoo": {
"post": {
"requestBody": {
"content": {
"application/xml": {
"schema": {
"description": "XML schema with anyOf for /barfoo request and mediaType application/xml",
"anyOf": [
{
"$ref": "#/components/schemas/OneOfOne"
},
{
"$ref": "#/components/schemas/OneOfTwo"
},
{
"$ref": "#/components/schemas/OneOfThree"
},
{
"$ref": "#/components/schemas/OneOfFour"
}
]
}
},
"text/xml": {
"schema": {
"description": "fallback XML schema with mediaType text/xml",
"$ref": "#/components/schemas/OneOfThree"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/xml": {
"schema": {
"description": "XML schema with mediaType application/xml",
"$ref": "#/components/schemas/foobarResponse"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"OneOfOne": {
"type": "object",
"properties": {
"Body": {
"type": "object",
"properties": {
"fooOne": {}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv"
}
}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv",
"namespace": "http://schemas.xmlsoap.org/soap/envelope/",
"name": "Envelope"
}
},
"OneOfTwo": {
"type": "object",
"properties": {
"Body": {
"type": "object",
"properties": {
"fooTwo": {}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv"
}
}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv",
"namespace": "http://schemas.xmlsoap.org/soap/envelope/",
"name": "Envelope"
}
},
"OneOfThree": {
"type": "object",
"properties": {
"Body": {
"type": "object",
"properties": {
"fooThree": {}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv"
}
}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv",
"namespace": "http://schemas.xmlsoap.org/soap/envelope/",
"name": "Envelope"
}
},
"OneOfFour": {
"type": "object",
"properties": {
"Body": {
"type": "object",
"properties": {
"fooFour": {}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv"
}
}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv",
"namespace": "http://schemas.xmlsoap.org/soap/envelope/",
"name": "Envelope"
}
},
"foobarResponse": {
"type": "object",
"properties": {
"Body": {
"type": "object",
"properties": {
"foobarResObj": {
"type": "object"
}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv"
}
}
},
"additionalProperties": false,
"xml": {
"prefix": "soapenv",
"namespace": "http://schemas.xmlsoap.org/soap/envelope/",
"name": "Envelope"
}
}
}
}
}
Loading

0 comments on commit 4b5d4bd

Please sign in to comment.