committed by
GitHub
3 changed files with 229 additions and 17 deletions
@ -0,0 +1,203 @@ |
|||||
|
# Test with parts from, and to verify the report in: |
||||
|
# https://github.com/fastapi/fastapi/discussions/14177 |
||||
|
# Made an issue in: |
||||
|
# https://github.com/fastapi/fastapi/issues/14247 |
||||
|
from enum import Enum |
||||
|
from typing import List |
||||
|
|
||||
|
from fastapi import FastAPI |
||||
|
from fastapi.testclient import TestClient |
||||
|
from inline_snapshot import snapshot |
||||
|
from pydantic import BaseModel, Field |
||||
|
|
||||
|
from tests.utils import pydantic_snapshot |
||||
|
|
||||
|
|
||||
|
class MessageEventType(str, Enum): |
||||
|
alpha = "alpha" |
||||
|
beta = "beta" |
||||
|
|
||||
|
|
||||
|
class MessageEvent(BaseModel): |
||||
|
event_type: MessageEventType = Field(default=MessageEventType.alpha) |
||||
|
output: str |
||||
|
|
||||
|
|
||||
|
class MessageOutput(BaseModel): |
||||
|
body: str = "" |
||||
|
events: List[MessageEvent] = [] |
||||
|
|
||||
|
|
||||
|
class Message(BaseModel): |
||||
|
input: str |
||||
|
output: MessageOutput |
||||
|
|
||||
|
|
||||
|
app = FastAPI(title="Minimal FastAPI App", version="1.0.0") |
||||
|
|
||||
|
|
||||
|
@app.post("/messages", response_model=Message) |
||||
|
async def create_message(input_message: str) -> Message: |
||||
|
return Message( |
||||
|
input=input_message, |
||||
|
output=MessageOutput(body=f"Processed: {input_message}"), |
||||
|
) |
||||
|
|
||||
|
|
||||
|
client = TestClient(app) |
||||
|
|
||||
|
|
||||
|
def test_create_message(): |
||||
|
response = client.post("/messages", params={"input_message": "Hello"}) |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == { |
||||
|
"input": "Hello", |
||||
|
"output": {"body": "Processed: Hello", "events": []}, |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def test_openapi_schema(): |
||||
|
response = client.get("/openapi.json") |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == snapshot( |
||||
|
{ |
||||
|
"openapi": "3.1.0", |
||||
|
"info": {"title": "Minimal FastAPI App", "version": "1.0.0"}, |
||||
|
"paths": { |
||||
|
"/messages": { |
||||
|
"post": { |
||||
|
"summary": "Create Message", |
||||
|
"operationId": "create_message_messages_post", |
||||
|
"parameters": [ |
||||
|
{ |
||||
|
"name": "input_message", |
||||
|
"in": "query", |
||||
|
"required": True, |
||||
|
"schema": {"type": "string", "title": "Input Message"}, |
||||
|
} |
||||
|
], |
||||
|
"responses": { |
||||
|
"200": { |
||||
|
"description": "Successful Response", |
||||
|
"content": { |
||||
|
"application/json": { |
||||
|
"schema": { |
||||
|
"$ref": "#/components/schemas/Message" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
"422": { |
||||
|
"description": "Validation Error", |
||||
|
"content": { |
||||
|
"application/json": { |
||||
|
"schema": { |
||||
|
"$ref": "#/components/schemas/HTTPValidationError" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"components": { |
||||
|
"schemas": { |
||||
|
"HTTPValidationError": { |
||||
|
"properties": { |
||||
|
"detail": { |
||||
|
"items": { |
||||
|
"$ref": "#/components/schemas/ValidationError" |
||||
|
}, |
||||
|
"type": "array", |
||||
|
"title": "Detail", |
||||
|
} |
||||
|
}, |
||||
|
"type": "object", |
||||
|
"title": "HTTPValidationError", |
||||
|
}, |
||||
|
"Message": { |
||||
|
"properties": { |
||||
|
"input": {"type": "string", "title": "Input"}, |
||||
|
"output": {"$ref": "#/components/schemas/MessageOutput"}, |
||||
|
}, |
||||
|
"type": "object", |
||||
|
"required": ["input", "output"], |
||||
|
"title": "Message", |
||||
|
}, |
||||
|
"MessageEvent": { |
||||
|
"properties": { |
||||
|
"event_type": pydantic_snapshot( |
||||
|
v2=snapshot( |
||||
|
{ |
||||
|
"$ref": "#/components/schemas/MessageEventType", |
||||
|
"default": "alpha", |
||||
|
} |
||||
|
), |
||||
|
v1=snapshot( |
||||
|
{ |
||||
|
"allOf": [ |
||||
|
{ |
||||
|
"$ref": "#/components/schemas/MessageEventType" |
||||
|
} |
||||
|
], |
||||
|
"default": "alpha", |
||||
|
} |
||||
|
), |
||||
|
), |
||||
|
"output": {"type": "string", "title": "Output"}, |
||||
|
}, |
||||
|
"type": "object", |
||||
|
"required": ["output"], |
||||
|
"title": "MessageEvent", |
||||
|
}, |
||||
|
"MessageEventType": pydantic_snapshot( |
||||
|
v2=snapshot( |
||||
|
{ |
||||
|
"type": "string", |
||||
|
"enum": ["alpha", "beta"], |
||||
|
"title": "MessageEventType", |
||||
|
} |
||||
|
), |
||||
|
v1=snapshot( |
||||
|
{ |
||||
|
"type": "string", |
||||
|
"enum": ["alpha", "beta"], |
||||
|
"title": "MessageEventType", |
||||
|
"description": "An enumeration.", |
||||
|
} |
||||
|
), |
||||
|
), |
||||
|
"MessageOutput": { |
||||
|
"properties": { |
||||
|
"body": {"type": "string", "title": "Body", "default": ""}, |
||||
|
"events": { |
||||
|
"items": {"$ref": "#/components/schemas/MessageEvent"}, |
||||
|
"type": "array", |
||||
|
"title": "Events", |
||||
|
"default": [], |
||||
|
}, |
||||
|
}, |
||||
|
"type": "object", |
||||
|
"title": "MessageOutput", |
||||
|
}, |
||||
|
"ValidationError": { |
||||
|
"properties": { |
||||
|
"loc": { |
||||
|
"items": { |
||||
|
"anyOf": [{"type": "string"}, {"type": "integer"}] |
||||
|
}, |
||||
|
"type": "array", |
||||
|
"title": "Location", |
||||
|
}, |
||||
|
"msg": {"type": "string", "title": "Message"}, |
||||
|
"type": {"type": "string", "title": "Error Type"}, |
||||
|
}, |
||||
|
"type": "object", |
||||
|
"required": ["loc", "msg", "type"], |
||||
|
"title": "ValidationError", |
||||
|
}, |
||||
|
} |
||||
|
}, |
||||
|
} |
||||
|
) |
||||
Loading…
Reference in new issue