OpenAPITools / OpenAPITools/openapi-diff

[bug] [polymorphism] Changes in child schema are ignored when only parent schema is directly referenced

Aperta
#571 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
Java
Stelle
1.1k
Fork
190
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

When using AllOf for polymorphism, when a property references a parent schema using ref and a change is done to a child schema which is not referenced directly anywhere in the OAS file, changes done to child schema are ignored in the differ output.

Example schema:

openapi: 3.0.0
servers:
  - url: 'http://petstore.swagger.io/v2'
info:
  description: >-
    This is a sample server Petstore server.  You can find out more about
    Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,
    #swagger](http://swagger.io/irc/).  For this sample, you can use the api key
    `special-key` to test the authorization filters.
  version: 1.0.0
  title: Swagger Petstore
  termsOfService: 'http://swagger.io/terms/'
  contact:
    email: apiteam@swagger.io
  license:
    name: Apache 2.0
    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
tags:
  - name: pet
    description: Everything about your Pets
    externalDocs:
      description: Find out more
      url: 'http://swagger.io'
  - name: store
    description: Access to Petstore orders
  - name: user
    description: Operations about user
    externalDocs:
      description: Find out more about our store
      url: 'http://swagger.io'
paths:
  /pet/findByStatus:
    get:
      tags:
        - pet
      summary: Finds Pets by status
      description: Multiple status values can be provided with comma separated strings
      operationId: findPetsByStatus
      parameters:
        - name: status
          in: query
          description: Status values that need to be considered for filter
          required: true
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - available
                - pending
                - sold
              default: available
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  pets:
                    type: array
                    items:
                      $ref: '#/components/schemas/Pet'
        '400':
          description: Invalid status value
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
externalDocs:
  description: Find out more about Swagger
  url: 'http://swagger.io'
components:
  requestBodies:
    Pet:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Pet'
      description: Pet object that needs to be added to the store
      required: true
  securitySchemes:
    petstore_auth:
      type: oauth2
      flows:
        implicit:
          authorizationUrl: 'http://petstore.swagger.io/oauth/dialog'
          scopes:
            'write:pets': modify pets in your account
            'read:pets': read your pets
    api_key:
      type: apiKey
      name: api_key
      in: header
  schemas:
    BasePet:
      type: object
      properties:
        pet_color:
          type: string
    Pet:
      allOf:
      - $ref: '#/components/schemas/BasePet'
      type: object
      discriminator:
        propertyName: pet_type
        mapping:
          dog: '#/components/schemas/Dog'
          cat: '#/components/schemas/Cat'
      required:
      - pet_type
      properties:
        pet_type:
          nullable: false
          allOf:
          - type: string
    Cat:
      description: Cat class
      allOf:
      - $ref: '#/components/schemas/Pet'
      type: object
      discriminator:
        propertyName: pet_type
        mapping:
          dog: '#/components/schemas/Cat'
      properties:
        name:
          type: string
        toy:
          $ref: '#/components/schemas/Toy'
    Dog:
      description: Dog class
      allOf:
      - $ref: '#/components/schemas/Pet'
      type: object
      discriminator:
        propertyName: pet_type
        mapping:
          dog: '#/components/schemas/Cat'
      properties:
        bark:
          type: string
    Toy:
      description: Toy class
      type: object
      discriminator:
        propertyName: toy_type
        mapping:
          ball: '#/components/schemas/Ball'
      properties:
        toy_type:
          type: string
        price:
          type: number
    Ball:
      description: Ball class
      allOf:
        - $ref: '#/components/schemas/Toy'
        - type: object
          properties:
            size:
              type: string
      discriminator:
        propertyName: toy_type
        mapping:
          ball: '#/components/schemas/Ball'

If I add new property material to Ball, I would expect to see changes in GET /pet/findByStatus operation, while the actual situation is, that the changes are ignored.

Tested with 2.1.0-SNAPSHOT.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia riproducendo il caso segnalato con il documento OpenAPI fornito e confronta l'output di differ dopo aver aggiunto Ball.material. Traccia come il riferimento GET /pet/findByStatus raggiunge gli schemi polimorfici e verifica che siano incluse le modifiche agli schemi figlio referenziati indirettamente. Il lavoro è completato quando l'output segnala la modifica a Ball e un test di regressione copre questo scenario.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java, openapi
Ambito
api
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.