[bug] [polymorphism] Changes in child schema are ignored when only parent schema is directly referenced
LubomirS opened this issue · comments
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.
Tried to fix this by moving the Discriminator mapping diff code from ComposedSchemaDiffResult to SchemaDiffResult, however the result was that only the model change was created as a result of a second pass (deferred processing), while there was no operation change. Seems like the deferred processing doesn't generate operation changes, which would be a bigger issues than just this bug in polymorphism.