Azure / Azure/openapi-diff

ExpandAllOf() throws "incompatible properties" if schemas are compatible but not equal

Open
#347 5 comments 0 reactions 1 assignee Claimed by @mikeharder View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.