You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
8.0 KiB

from typing import Optional
from fastapi import Depends, FastAPI, Query
from fastapi.testclient import TestClient
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name_required_with_default: str = Query(
"name default", description="This is a name_required_with_default field."
)
name_required_without_default: str = Query(
description="This is a name_required_without_default field."
)
optional_int: Optional[int] = Query(description="This is a optional_int field")
optional_str: Optional[str] = Query(
"default_exists", description="This is a optional_str field"
)
model: str
manufacturer: str
price: float
tax: float
extra_optional_attributes: str = Query(
None,
description="This is a extra_optional_attributes field",
alias="extra_optional_attributes_alias",
max_length=30,
)
@app.get("/item")
async def item_with_query_dependency(item: Item = Depends()):
return item
client = TestClient(app)
openapi_schema_with_not_omitted_description = {
"openapi": "3.0.2",
"info": {"title": "FastAPI", "version": "0.1.0"},
"paths": {
"/item": {
"get": {
"summary": "Item With Query Dependency",
"operationId": "item_with_query_dependency_item_get",
"parameters": [
{
"description": "This is a name_required_with_default field.",
"required": False,
"schema": {
"title": "Name Required With Default",
"type": "string",
"description": "This is a name_required_with_default field.",
"default": "name default",
"extra": {},
},
"name": "name_required_with_default",
"in": "query",
},
{
"description": "This is a name_required_without_default field.",
"required": True,
"schema": {
"title": "Name Required Without Default",
"type": "string",
"description": "This is a name_required_without_default field.",
"extra": {},
},
"name": "name_required_without_default",
"in": "query",
},
{
"description": "This is a optional_int field",
"required": False,
"schema": {
"title": "Optional Int",
"type": "integer",
"description": "This is a optional_int field",
"extra": {},
},
"name": "optional_int",
"in": "query",
},
{
"description": "This is a optional_str field",
"required": False,
"schema": {
"title": "Optional Str",
"type": "string",
"description": "This is a optional_str field",
"default": "default_exists",
"extra": {},
},
"name": "optional_str",
"in": "query",
},
{
"required": True,
"schema": {"title": "Model", "type": "string", "extra": {}},
"name": "model",
"in": "query",
},
{
"required": True,
"schema": {
"title": "Manufacturer",
"type": "string",
"extra": {},
},
"name": "manufacturer",
"in": "query",
},
{
"required": True,
"schema": {"title": "Price", "type": "number", "extra": {}},
"name": "price",
"in": "query",
},
{
"required": True,
"schema": {"title": "Tax", "type": "number", "extra": {}},
"name": "tax",
"in": "query",
},
{
"description": "This is a extra_optional_attributes field",
"required": True,
"schema": {
"title": "Extra Optional Attributes Alias",
"maxLength": 30,
"type": "string",
"description": "This is a extra_optional_attributes field",
"extra": {},
},
"name": "extra_optional_attributes_alias",
"in": "query",
},
],
"responses": {
"200": {
"description": "Successful Response",
"content": {"application/json": {"schema": {}}},
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
},
},
},
}
}
},
"components": {
"schemas": {
"HTTPValidationError": {
"title": "HTTPValidationError",
"type": "object",
"properties": {
"detail": {
"title": "Detail",
"type": "array",
"items": {"$ref": "#/components/schemas/ValidationError"},
}
},
},
"ValidationError": {
"title": "ValidationError",
"required": ["loc", "msg", "type"],
"type": "object",
"properties": {
"loc": {
"title": "Location",
"type": "array",
"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]},
},
"msg": {"title": "Message", "type": "string"},
"type": {"title": "Error Type", "type": "string"},
},
},
}
},
}
def test_openapi_schema_with_query_dependency():
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
assert response.json() == openapi_schema_with_not_omitted_description
def test_response():
expected_response = {
"name_required_with_default": "name default",
"name_required_without_default": "default",
"optional_int": None,
"optional_str": "default_exists",
"model": "model",
"manufacturer": "manufacturer",
"price": 100.0,
"tax": 9.0,
"extra_optional_attributes_alias": "alias_query",
}
response = client.get(
"/item?name_required_with_default=name%20default&name_required_without_default=default&optional_str=default_exists&model=model&manufacturer=manufacturer&price=100&tax=9&extra_optional_attributes_alias=alias_query"
)
assert response.status_code == 200, response.text
assert response.json() == expected_response