Azure / Azure/openapi-diff

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

未關閉
#347 5 則留言 0 個 reaction 已指派 1 人 已被 @mikeharder 認領 在 GitHub 檢視
主要語言
C#
星號
290
分支
50
平均合併
5 天 13 小時
30 天內合併 PR
5

描述

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"}]
}
}
}
```

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。