ExpandAllOf() throws "incompatible properties" if schemas are compatible but not equal
- Dominant language
- C#
- Stars
- 290
- Forks
- 50
- Avg merge
- 5d 13h
- Merged PRs (30d)
- 5
Description
The following spec should be valid per JSON Schema and Swagger. However, we throw error `incompatible properties` when trying to process it, since `DogOwner.pet` is type `Dog`, which is compatible with **but not equal to** `PetOwner.pet` of type `Pet`.
https://github.com/Azure/openapi-diff/blob/88502940aed70915f3ff88c551d37db43d37ba45/src/lib/util/resolveSwagger.ts#L250
@JeffreyRichter, @mikekistler: Do you think the code should be changed to allow types that are compatible but not equal? If so, should it be conditioned on whether the swagger is handwritten or typespec-generated, under the assumption that SDKs for TypeSpec will be generated directly from TypeSpec and not the intermediate Swagger?
We recently fixed a similar issue in https://github.com/Azure/openapi-diff/pull/329, although in this case the types were identical with just an extra step of indirection.
@markcowl and I believe this is valid swagger, but some of our SDK generators may not handle it correctly, which might be why it's not allowed in `openapi-diff`. However, `openapi-diff` should not be responsible for this. It should be tested directly by the SDK generation tests.
## Repro Steps
Save spec below to file `test.json`, then run `npx @azure/oad test.json test.json`.
```
Error: incompatible properties : pet
definitions/DogOwner/properties/pet
at file:///home/mharder/tmp/oad/test.json#L61:8
definitions/PetOwner/properties/pet
at file:///home/mharder/tmp/oad/test.json#L53:8
```
```json
{
"swagger": "2.0",
"info": {
"version": "1.0.0",
"title": "title",
},
"paths": {
},
"definitions": {
"Pet": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
},
"Dog": {
"type": "object",
"properties": {
"bones": {
"type": "integer"
}
},
"allOf": [{"$ref": "#/definitions/Pet"}]
},
"PetOwner": {
"type": "object",
"properties": {
"ssn": {
"type": "integer"
},
"pet": {
"$ref": "#/definitions/Pet"
}
}
},
"DogOwner": {
"type": "object",
"properties": {
"pet": {
"$ref": "#/definitions/Dog"
}
},
"allOf": [{"$ref": "#/definitions/PetOwner"}]
}
}
}
```
Contributor guide
Assessment
This issue has not been assessed yet.