fix(oas3): compensate for JSON Schemas left unresolved by swagger-client (#9794)
Refs #9790
This commit is contained in:
@@ -66,16 +66,20 @@ export default class Model extends ImmutablePureComponent {
|
|||||||
/*
|
/*
|
||||||
* If we have an unresolved ref, get the schema and name from the ref.
|
* If we have an unresolved ref, get the schema and name from the ref.
|
||||||
* If the ref is external, we can't resolve it, so we just display the ref location.
|
* If the ref is external, we can't resolve it, so we just display the ref location.
|
||||||
* This is for situations where the ref was not resolved by Swagger Client
|
* This is for situations where:
|
||||||
* because we reached the traversal depth limit.
|
* - the ref was not resolved by Swagger Client because we reached the traversal depth limit
|
||||||
|
* - we had a circular ref inside the allOf keyword
|
||||||
*/
|
*/
|
||||||
if ($ref) {
|
if ($ref) {
|
||||||
name = this.getModelName($ref)
|
const refName = this.getModelName($ref)
|
||||||
const refSchema = this.getRefSchema(name)
|
const refSchema = this.getRefSchema(refName)
|
||||||
if (Map.isMap(refSchema)) {
|
if (Map.isMap(refSchema)) {
|
||||||
schema = refSchema.set("$$ref", $ref)
|
schema = refSchema.mergeDeep(schema)
|
||||||
|
if (!$$ref) {
|
||||||
|
schema = schema.set("$$ref", $ref)
|
||||||
$$ref = $ref
|
$$ref = $ref
|
||||||
} else {
|
}
|
||||||
|
} else if (Map.isMap(schema) && schema.size === 1) {
|
||||||
schema = null
|
schema = null
|
||||||
name = $ref
|
name = $ref
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* @prettier
|
||||||
|
*/
|
||||||
|
|
||||||
|
describe("OpenAPI 3.0 spec with allOf containing a circular reference", () => {
|
||||||
|
it("should render correct title and properties", () => {
|
||||||
|
cy.visit("/?url=/documents/features/oas3-all-of-circular-ref.yaml").then(
|
||||||
|
() => {
|
||||||
|
cy.get("[id='model-OneOfParent']").find("button").click()
|
||||||
|
cy.get(".property-row")
|
||||||
|
.contains("additionalData")
|
||||||
|
.siblings()
|
||||||
|
.as("additionalData")
|
||||||
|
cy.get("@additionalData").find("button").click()
|
||||||
|
cy.get("@additionalData")
|
||||||
|
.find("span")
|
||||||
|
.contains("FirstOneOf")
|
||||||
|
.should("exist")
|
||||||
|
.click()
|
||||||
|
cy.get("@additionalData")
|
||||||
|
.find("span")
|
||||||
|
.contains("numberProp")
|
||||||
|
.should("exist")
|
||||||
|
cy.get("@additionalData")
|
||||||
|
.find("span")
|
||||||
|
.contains("additionalData")
|
||||||
|
.should("exist")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
title: Test
|
||||||
|
description: 'Test'
|
||||||
|
license:
|
||||||
|
name: 'Apache 2.0'
|
||||||
|
url: 'https://www.apache.org/licenses/LICENSE-2.0.html'
|
||||||
|
version: '1.0'
|
||||||
|
servers:
|
||||||
|
-
|
||||||
|
url: 'https://localhost:8000'
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
OneOfParent:
|
||||||
|
title: OneOfParent
|
||||||
|
properties:
|
||||||
|
additionalData:
|
||||||
|
oneOf:
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/FirstOneOf'
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/SecondOneOf'
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/ThirdOneOf'
|
||||||
|
type: object
|
||||||
|
FirstOneOf:
|
||||||
|
title: FirstOneOf
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/OneOfParent'
|
||||||
|
-
|
||||||
|
properties:
|
||||||
|
numberProp:
|
||||||
|
type: number
|
||||||
|
example: '1'
|
||||||
|
type: object
|
||||||
|
SecondOneOf:
|
||||||
|
title: SecondOneOf
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/OneOfParent'
|
||||||
|
-
|
||||||
|
properties:
|
||||||
|
person:
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
ThirdOneOf:
|
||||||
|
title: ThirdOneOf
|
||||||
|
type: object
|
||||||
|
allOf:
|
||||||
|
-
|
||||||
|
$ref: '#/components/schemas/OneOfParent'
|
||||||
|
-
|
||||||
|
properties:
|
||||||
|
person:
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
surname:
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
Reference in New Issue
Block a user