mirror of https://github.com/tiangolo/fastapi.git
166 lines
5.2 KiB
Python
166 lines
5.2 KiB
Python
"""
|
|
Regression test: Ensure app-level responses with Union models and content/examples
|
|
don't accumulate duplicate $ref entries in anyOf arrays.
|
|
See https://github.com/fastapi/fastapi/pull/14463
|
|
"""
|
|
|
|
from fastapi import FastAPI
|
|
from pydantic import BaseModel
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
class ModelA(BaseModel):
|
|
a: str
|
|
|
|
|
|
class ModelB(BaseModel):
|
|
b: str
|
|
|
|
|
|
app = FastAPI(
|
|
responses={
|
|
500: {
|
|
'model': ModelA | ModelB,
|
|
'content': {"application/json": {
|
|
'examples': {"Case A": {"value": "a"}}
|
|
}}
|
|
}
|
|
}
|
|
)
|
|
|
|
|
|
@app.get('/route1')
|
|
def route1():
|
|
return "test"
|
|
|
|
|
|
@app.get('/route2')
|
|
def route2():
|
|
return "test"
|
|
|
|
|
|
client = TestClient(app)
|
|
|
|
|
|
def test_openapi_schema():
|
|
response = client.get("/openapi.json")
|
|
assert response.status_code == 200, response.text
|
|
assert response.json() == {
|
|
"openapi": "3.1.0",
|
|
"info": {
|
|
"title": "FastAPI",
|
|
"version": "0.1.0"
|
|
},
|
|
"paths": {
|
|
"/route1": {
|
|
"get": {
|
|
"summary": "Route1",
|
|
"operationId": "route1_route1_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal Server Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/components/schemas/ModelA"
|
|
},
|
|
{
|
|
"$ref": "#/components/schemas/ModelB"
|
|
}
|
|
],
|
|
"title": "Response 500 Route1 Route1 Get"
|
|
},
|
|
"examples": {
|
|
"Case A": {
|
|
"value": "a"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/route2": {
|
|
"get": {
|
|
"summary": "Route2",
|
|
"operationId": "route2_route2_get",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful Response",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal Server Error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/components/schemas/ModelA"
|
|
},
|
|
{
|
|
"$ref": "#/components/schemas/ModelB"
|
|
}
|
|
],
|
|
"title": "Response 500 Route2 Route2 Get"
|
|
},
|
|
"examples": {
|
|
"Case A": {
|
|
"value": "a"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"ModelA": {
|
|
"properties": {
|
|
"a": {
|
|
"type": "string",
|
|
"title": "A"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"a"
|
|
],
|
|
"title": "ModelA"
|
|
},
|
|
"ModelB": {
|
|
"properties": {
|
|
"b": {
|
|
"type": "string",
|
|
"title": "B"
|
|
}
|
|
},
|
|
"type": "object",
|
|
"required": [
|
|
"b"
|
|
],
|
|
"title": "ModelB"
|
|
}
|
|
}
|
|
}
|
|
}
|