committed by
GitHub
3 changed files with 140 additions and 17 deletions
@ -0,0 +1,109 @@ |
|||||
|
import io |
||||
|
from typing import Any |
||||
|
|
||||
|
import pytest |
||||
|
from fastapi import Depends, FastAPI, File, UploadFile |
||||
|
from fastapi.testclient import TestClient |
||||
|
from starlette.datastructures import UploadFile as StarletteUploadFile |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
|
||||
|
@app.post("/uploadfile") |
||||
|
async def uploadfile(uploadfile: UploadFile = File(...)) -> dict[str, Any]: |
||||
|
return { |
||||
|
"filename": uploadfile.filename, |
||||
|
"is_fastapi_uploadfile": isinstance(uploadfile, UploadFile), |
||||
|
"is_starlette_uploadfile": isinstance(uploadfile, StarletteUploadFile), |
||||
|
"class": f"{uploadfile.__class__.__module__}.{uploadfile.__class__.__name__}", |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@app.post("/uploadfiles") |
||||
|
async def uploadfiles( |
||||
|
uploadfiles: list[UploadFile] = File(...), |
||||
|
) -> list[dict[str, Any]]: |
||||
|
return [ |
||||
|
{ |
||||
|
"filename": uploadfile.filename, |
||||
|
"is_fastapi_uploadfile": isinstance(uploadfile, UploadFile), |
||||
|
"is_starlette_uploadfile": isinstance(uploadfile, StarletteUploadFile), |
||||
|
"class": f"{uploadfile.__class__.__module__}.{uploadfile.__class__.__name__}", |
||||
|
} |
||||
|
for uploadfile in uploadfiles |
||||
|
] |
||||
|
|
||||
|
|
||||
|
async def get_uploadfile_info(uploadfile: UploadFile = File(...)) -> dict[str, Any]: |
||||
|
return { |
||||
|
"filename": uploadfile.filename, |
||||
|
"is_fastapi_uploadfile": isinstance(uploadfile, UploadFile), |
||||
|
"is_starlette_uploadfile": isinstance(uploadfile, StarletteUploadFile), |
||||
|
"class": f"{uploadfile.__class__.__module__}.{uploadfile.__class__.__name__}", |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@app.post("/uploadfile-dep") |
||||
|
async def uploadfile_dep( |
||||
|
uploadfile_info: dict[str, Any] = Depends(get_uploadfile_info), |
||||
|
) -> dict[str, Any]: |
||||
|
return uploadfile_info |
||||
|
|
||||
|
|
||||
|
async def get_uploadfiles_info( |
||||
|
uploadfiles: list[UploadFile] = File(...), |
||||
|
) -> list[dict[str, Any]]: |
||||
|
return [ |
||||
|
{ |
||||
|
"filename": uploadfile.filename, |
||||
|
"is_fastapi_uploadfile": isinstance(uploadfile, UploadFile), |
||||
|
"is_starlette_uploadfile": isinstance(uploadfile, StarletteUploadFile), |
||||
|
"class": f"{uploadfile.__class__.__module__}.{uploadfile.__class__.__name__}", |
||||
|
} |
||||
|
for uploadfile in uploadfiles |
||||
|
] |
||||
|
|
||||
|
|
||||
|
@app.post("/uploadfiles-dep") |
||||
|
async def uploadfiles_dep( |
||||
|
uploadfiles_info: list[dict[str, Any]] = Depends(get_uploadfiles_info), |
||||
|
) -> list[dict[str, Any]]: |
||||
|
return uploadfiles_info |
||||
|
|
||||
|
|
||||
|
@pytest.mark.parametrize("endpoint", ["/uploadfile", "/uploadfile-dep"]) |
||||
|
def test_uploadfile_type(endpoint: str) -> None: |
||||
|
client = TestClient(app) |
||||
|
files = {"uploadfile": ("example.txt", io.BytesIO(b"test content"), "text/plain")} |
||||
|
response = client.post(f"{endpoint}", files=files) |
||||
|
data = response.json() |
||||
|
|
||||
|
assert data["filename"] == "example.txt" |
||||
|
assert data["is_fastapi_uploadfile"] is True |
||||
|
assert data["is_starlette_uploadfile"] is True |
||||
|
assert data["class"].startswith("fastapi.") |
||||
|
|
||||
|
|
||||
|
@pytest.mark.parametrize("endpoint", ["/uploadfiles", "/uploadfiles-dep"]) |
||||
|
def test_uploadfiles_type(endpoint: str) -> None: |
||||
|
client = TestClient(app) |
||||
|
files = [ |
||||
|
("uploadfiles", ("example.txt", io.BytesIO(b"test content"), "text/plain")), |
||||
|
("uploadfiles", ("example2.txt", io.BytesIO(b"test content"), "text/plain")), |
||||
|
] |
||||
|
response = client.post(f"{endpoint}", files=files) |
||||
|
files_data = response.json() |
||||
|
|
||||
|
assert len(files_data) == 2 |
||||
|
|
||||
|
file1 = files_data[0] |
||||
|
assert file1["filename"] == "example.txt" |
||||
|
assert file1["is_fastapi_uploadfile"] is True |
||||
|
assert file1["is_starlette_uploadfile"] is True |
||||
|
assert file1["class"].startswith("fastapi.") |
||||
|
|
||||
|
file2 = files_data[1] |
||||
|
assert file2["filename"] == "example2.txt" |
||||
|
assert file2["is_fastapi_uploadfile"] is True |
||||
|
assert file2["is_starlette_uploadfile"] is True |
||||
|
assert file2["class"].startswith("fastapi.") |
||||
Loading…
Reference in new issue