Skip to content

AllOf references not resolved by parser, OneOf and AnyOf resolved correctly #1157

Description

@Leo11221

Hi, it seems that AllOf references are not being resolved, it seems to work for AnyOf and OneOf but not AllOf unless I'm not understanding it correctly, test case:

package com.workday.maya.swagger.generator

import com.workday.maya.logging.Slogger
import com.workday.maya.model.{Expression, ExpressionsMappingSource, Mapping, Path}
import com.workday.maya.test.UnitSpec
import io.swagger.v3.parser.OpenAPIV3Parser
import io.swagger.v3.parser.core.models.ParseOptions
import play.api.libs.json.Json

class AllOfTest extends UnitSpec with Slogger {

  val swaggerJsonGenerator = new SwaggerJsonGenerator

  behavior of "AllOf"

  val anyOfSchema = """openapi: 3.0.0
                      |paths:
                      |  /pets:
                      |      get:
                      |        description: "Test"
                      |        responses:
                      |          200:
                      |            description: Parameters missing or invalid
                      |            content:
                      |              application/json:
                      |                schema:
                      |                  $ref: '#/components/schemas/Pet'
                      |components:
                      |  schemas:
                      |    Dog:
                      |      type: object
                      |      properties:
                      |        bark:
                      |          type: boolean
                      |        breed:
                      |          type: string
                      |    Cat:
                      |      type: object
                      |      properties:
                      |        hunts:
                      |          type: boolean
                      |        age:
                      |          type: integer
                      |    Pet:
                      |      anyOf:
                      |        - $ref: '#/components/schemas/Cat'
                      |        - $ref: '#/components/schemas/Dog'
                      |""".stripMargin

  val oneOfSchema = """openapi: 3.0.0
                      |paths:
                      |  /pets:
                      |    get:
                      |      description: "Test"
                      |      responses:
                      |        200:
                      |          description: Parameters missing or invalid
                      |          content:
                      |            application/json:
                      |              schema:
                      |                $ref: '#/components/schemas/Pet'
                      |components:
                      |  schemas:
                      |    Dog:
                      |      type: object
                      |      properties:
                      |        bark:
                      |          type: boolean
                      |        breed:
                      |          type: string
                      |    Cat:
                      |      type: object
                      |      properties:
                      |        hunts:
                      |          type: boolean
                      |        age:
                      |          type: integer
                      |    Pet:
                      |      oneOf:
                      |        - $ref: '#/components/schemas/Cat'
                      |        - $ref: '#/components/schemas/Dog'""".stripMargin

  val allOfSchema = """openapi: 3.0.0
                      |paths:
                      |  /pets:
                      |    get:
                      |      description: "Test"
                      |      responses:
                      |        200:
                      |          description: Parameters missing or invalid
                      |          content:
                      |            application/json:
                      |              schema:
                      |                $ref: '#/components/schemas/Pet'
                      |components:
                      |  schemas:
                      |    Dog:
                      |      type: object
                      |      properties:
                      |        bark:
                      |          type: boolean
                      |        breed:
                      |          type: string
                      |    Cat:
                      |      type: object
                      |      properties:
                      |        hunts:
                      |          type: boolean
                      |        age:
                      |          type: integer
                      |    Pet:
                      |      allOf:
                      |        - $ref: '#/components/schemas/Cat'
                      |        - $ref: '#/components/schemas/Dog'""".stripMargin

  private val swaggerParserOptions = new ParseOptions
  swaggerParserOptions.setResolve(true)
  swaggerParserOptions.setResolveFully(true)


  it should "resolve references for allOf" in {
    val openApiAllOf = new OpenAPIV3Parser().readContents(allOfSchema, null, swaggerParserOptions)
    println("All of schema is" + openApiAllOf.getOpenAPI.getComponents.getSchemas.get("Pet"))
  }

  it should "resolve references for anyOf" in {
    val openApiAllOf = new OpenAPIV3Parser().readContents(anyOfSchema, null, swaggerParserOptions)
    println("Any of schema is" + openApiAllOf.getOpenAPI.getComponents.getSchemas.get("Pet"))
  }

  it should "resolve references for oneOf" in {
    val openApiAllOf = new OpenAPIV3Parser().readContents(oneOfSchema, null, swaggerParserOptions)
    println("One of schema is" + openApiAllOf.getOpenAPI.getComponents.getSchemas.get("Pet"))
  }
}

Output:

Activating test InMemoryLog4jAppender
All of schema isclass ComposedSchema {
    class Schema {
        type: null
        format: null
        $ref: null
        description: null
        title: null
        multipleOf: null
        maximum: null
        exclusiveMaximum: null
        minimum: null
        exclusiveMinimum: null
        maxLength: null
        minLength: null
        pattern: null
        maxItems: null
        minItems: null
        uniqueItems: null
        maxProperties: null
        minProperties: null
        required: null
        not: null
        properties: null
        additionalProperties: null
        nullable: null
        readOnly: null
        writeOnly: null
        example: null
        externalDocs: null
        deprecated: null
        discriminator: null
        xml: null
    }
    allOf: [class Schema {
        type: null
        format: null
        $ref: #/components/schemas/Cat
        description: null
        title: null
        multipleOf: null
        maximum: null
        exclusiveMaximum: null
        minimum: null
        exclusiveMinimum: null
        maxLength: null
        minLength: null
        pattern: null
        maxItems: null
        minItems: null
        uniqueItems: null
        maxProperties: null
        minProperties: null
        required: null
        not: null
        properties: null
        additionalProperties: null
        nullable: null
        readOnly: null
        writeOnly: null
        example: null
        externalDocs: null
        deprecated: null
        discriminator: null
        xml: null
    }, class Schema {
        type: null
        format: null
        $ref: #/components/schemas/Dog
        description: null
        title: null
        multipleOf: null
        maximum: null
        exclusiveMaximum: null
        minimum: null
        exclusiveMinimum: null
        maxLength: null
        minLength: null
        pattern: null
        maxItems: null
        minItems: null
        uniqueItems: null
        maxProperties: null
        minProperties: null
        required: null
        not: null
        properties: null
        additionalProperties: null
        nullable: null
        readOnly: null
        writeOnly: null
        example: null
        externalDocs: null
        deprecated: null
        discriminator: null
        xml: null
    }]
    anyOf: null
    oneOf: null
}
Any of schema isclass ComposedSchema {
    class Schema {
        type: null
        format: null
        $ref: null
        description: null
        title: null
        multipleOf: null
        maximum: null
        exclusiveMaximum: null
        minimum: null
        exclusiveMinimum: null
        maxLength: null
        minLength: null
        pattern: null
        maxItems: null
        minItems: null
        uniqueItems: null
        maxProperties: null
        minProperties: null
        required: null
        not: null
        properties: null
        additionalProperties: null
        nullable: null
        readOnly: null
        writeOnly: null
        example: null
        externalDocs: null
        deprecated: null
        discriminator: null
        xml: null
    }
    allOf: null
    anyOf: [class ObjectSchema {
        class Schema {
            type: object
            format: null
            $ref: null
            description: null
            title: null
            multipleOf: null
            maximum: null
            exclusiveMaximum: null
            minimum: null
            exclusiveMinimum: null
            maxLength: null
            minLength: null
            pattern: null
            maxItems: null
            minItems: null
            uniqueItems: null
            maxProperties: null
            minProperties: null
            required: null
            not: null
            properties: {hunts=class BooleanSchema {
                class Schema {
                    type: boolean
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }, age=class IntegerSchema {
                class Schema {
                    type: integer
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }}
            additionalProperties: null
            nullable: null
            readOnly: null
            writeOnly: null
            example: null
            externalDocs: null
            deprecated: null
            discriminator: null
            xml: null
        }
    }, class ObjectSchema {
        class Schema {
            type: object
            format: null
            $ref: null
            description: null
            title: null
            multipleOf: null
            maximum: null
            exclusiveMaximum: null
            minimum: null
            exclusiveMinimum: null
            maxLength: null
            minLength: null
            pattern: null
            maxItems: null
            minItems: null
            uniqueItems: null
            maxProperties: null
            minProperties: null
            required: null
            not: null
            properties: {bark=class BooleanSchema {
                class Schema {
                    type: boolean
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }, breed=class StringSchema {
                class Schema {
                    type: string
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }}
            additionalProperties: null
            nullable: null
            readOnly: null
            writeOnly: null
            example: null
            externalDocs: null
            deprecated: null
            discriminator: null
            xml: null
        }
    }]
    oneOf: null
}
One of schema isclass ComposedSchema {
    class Schema {
        type: null
        format: null
        $ref: null
        description: null
        title: null
        multipleOf: null
        maximum: null
        exclusiveMaximum: null
        minimum: null
        exclusiveMinimum: null
        maxLength: null
        minLength: null
        pattern: null
        maxItems: null
        minItems: null
        uniqueItems: null
        maxProperties: null
        minProperties: null
        required: null
        not: null
        properties: null
        additionalProperties: null
        nullable: null
        readOnly: null
        writeOnly: null
        example: null
        externalDocs: null
        deprecated: null
        discriminator: null
        xml: null
    }
    allOf: null
    anyOf: null
    oneOf: [class ObjectSchema {
        class Schema {
            type: object
            format: null
            $ref: null
            description: null
            title: null
            multipleOf: null
            maximum: null
            exclusiveMaximum: null
            minimum: null
            exclusiveMinimum: null
            maxLength: null
            minLength: null
            pattern: null
            maxItems: null
            minItems: null
            uniqueItems: null
            maxProperties: null
            minProperties: null
            required: null
            not: null
            properties: {hunts=class BooleanSchema {
                class Schema {
                    type: boolean
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }, age=class IntegerSchema {
                class Schema {
                    type: integer
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }}
            additionalProperties: null
            nullable: null
            readOnly: null
            writeOnly: null
            example: null
            externalDocs: null
            deprecated: null
            discriminator: null
            xml: null
        }
    }, class ObjectSchema {
        class Schema {
            type: object
            format: null
            $ref: null
            description: null
            title: null
            multipleOf: null
            maximum: null
            exclusiveMaximum: null
            minimum: null
            exclusiveMinimum: null
            maxLength: null
            minLength: null
            pattern: null
            maxItems: null
            minItems: null
            uniqueItems: null
            maxProperties: null
            minProperties: null
            required: null
            not: null
            properties: {bark=class BooleanSchema {
                class Schema {
                    type: boolean
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }, breed=class StringSchema {
                class Schema {
                    type: string
                    format: null
                    $ref: null
                    description: null
                    title: null
                    multipleOf: null
                    maximum: null
                    exclusiveMaximum: null
                    minimum: null
                    exclusiveMinimum: null
                    maxLength: null
                    minLength: null
                    pattern: null
                    maxItems: null
                    minItems: null
                    uniqueItems: null
                    maxProperties: null
                    minProperties: null
                    required: null
                    not: null
                    properties: null
                    additionalProperties: null
                    nullable: null
                    readOnly: null
                    writeOnly: null
                    example: null
                    externalDocs: null
                    deprecated: null
                    discriminator: null
                    xml: null
                }
            }}
            additionalProperties: null
            nullable: null
            readOnly: null
            writeOnly: null
            example: null
            externalDocs: null
            deprecated: null
            discriminator: null
            xml: null
        }
    }]
}

Process finished with exit code 0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions