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