Browse Source

Add tets for `Form` model with `File` field

pull/14343/head
Yurii Motov 8 months ago
parent
commit
57f0dde99f
  1. 86
      tests/test_forms_single_model.py

86
tests/test_forms_single_model.py

@ -1,7 +1,7 @@
from typing import List, Optional from typing import List, Optional
from dirty_equals import IsDict from dirty_equals import IsDict
from fastapi import FastAPI, Form from fastapi import FastAPI, File, Form
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing_extensions import Annotated from typing_extensions import Annotated
@ -17,11 +17,24 @@ class FormModel(BaseModel):
alias_with: str = Field(alias="with", default="nothing") alias_with: str = Field(alias="with", default="nothing")
class FormWithFileModel(BaseModel):
comment: str
file_data: bytes = File()
@app.post("/form/") @app.post("/form/")
def post_form(user: Annotated[FormModel, Form()]): def post_form(user: Annotated[FormModel, Form()]):
return user return user
@app.post("/form-with-file/")
def post_form_(form_data: Annotated[FormWithFileModel, Form()]):
return {
"comment": form_data.comment,
"file_size": len(form_data.file_data),
}
client = TestClient(app) client = TestClient(app)
@ -131,3 +144,74 @@ def test_no_data():
] ]
} }
) )
def test_form_with_file():
file_content = b"Hello, this is a test file."
response = client.post(
"/form-with-file/",
data={"comment": "This is a comment."},
files={"file_data": ("test.txt", file_content, "text/plain")},
)
assert response.status_code == 200, response.text
assert response.json() == {
"comment": "This is a comment.",
"file_size": len(file_content),
}
def test_form_with_file_missing_file():
response = client.post(
"/form-with-file/",
data={"comment": "This is a comment."},
)
assert response.status_code == 422, response.text
assert response.json() == IsDict(
{
"detail": [
{
"type": "missing",
"loc": ["body", "file_data"],
"msg": "Field required",
"input": {"comment": "This is a comment."},
}
]
}
) | IsDict(
# TODO: remove when deprecating Pydantic v1
{
"detail": [
{
"loc": ["body", "file_data"],
"msg": "field required",
"type": "value_error.missing",
}
]
}
)
def test_form_with_file_openapi():
response = client.get("/openapi.json")
assert response.status_code == 200, response.text
openapi_schema = response.json()
assert openapi_schema["paths"]["/form-with-file/"]["post"]["requestBody"] == {
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/FormWithFileModel",
},
},
},
"required": True,
}
assert openapi_schema["components"]["schemas"]["FormWithFileModel"] == {
"title": "FormWithFileModel",
"type": "object",
"properties": {
"file_data": {"title": "File Data", "type": "string", "format": "binary"},
"comment": {"title": "Comment", "type": "string"},
},
"required": ["comment", "file_data"],
}

Loading…
Cancel
Save