mirror of
https://github.com/fastapi/fastapi.git
synced 2025-12-25 15:18:36 -05:00
* ➕ Add mkdocstrings and griffe-typingdoc to dependencies * 🔧 Add mkdocstrings configs to MkDocs * 📝 Add first WIP reference page * ⬆️ Upgrade typing-extensions to the minimum version including Doc() * 📝 Add docs to FastAPI parameters * 📝 Add docstrings for OpenAPI docs utils * 📝 Add docstrings for security utils * 📝 Add docstrings for UploadFile * 📝 Update docstrings in FastAPI class * 📝 Add docstrings for path operation methods * 📝 Add docstring for jsonable_encoder * 📝 Add docstrings for exceptions * 📝 Add docstsrings for parameter functions * 📝 Add docstrings for responses * 📝 Add docstrings for APIRouter * ♻️ Sub-class BackgroundTasks to document it with docstrings * 📝 Update usage of background tasks in dependencies * ✅ Update tests with new deprecation warnings * 📝 Add new reference docs * 🔧 Update MkDocs with new reference docs * ✅ Update pytest fixture, deprecation is raised only once * 🎨 Update format for types in exceptions.py * ♻️ Update annotations in BackgroundTask, `Annotated` can't take ParamSpec's P.args or P.kwargs * ✏️ Fix typos caught by @pawamoy * 🔧 Update and fix MkDocstrings configs from @pawamoy tips * 📝 Update reference docs * ✏️ Fix typos found by @pawamoy * ➕ Add HTTPX as a dependency for docs, for the TestClient * 🔧 Update MkDocs config, rename websockets reference * 🔇 Add type-ignores for Doc as the stubs haven't been released for mypy * 🔥 Remove duplicated deprecated notice * 🔇 Remove typing error for unreleased stub in openapi/docs.py * ✅ Add tests for UploadFile for coverage * ⬆️ Upgrade griffe-typingdoc==0.2.2 * 📝 Refactor docs structure * 🔨 Update README generation with new index frontmatter and style * 🔨 Update generation of languages, remove from top menu, keep in lang menu * 📝 Add OpenAPI Pydantic models * 🔨 Update docs script to not translate Reference and Release Notes * 🔧 Add reference for OpenAPI models * 🔧 Update MkDocs config for mkdocstrings insiders * 👷 Install mkdocstring insiders in CI for docs * 🐛 Fix MkDocstrings insiders install URL * ➕ Move dependencies shared by docs and tests to its own requirements file * 👷 Update cache keys for test and docs dependencies * 📝 Remove no longer needed __init__ placeholder docstrings * 📝 Move docstring for APIRouter to the class level (not __init__ level) * 🔥 Remove no longer needed dummy placeholder __init__ docstring
73 lines
2.0 KiB
Python
73 lines
2.0 KiB
Python
import io
|
|
from pathlib import Path
|
|
from typing import List
|
|
|
|
import pytest
|
|
from fastapi import FastAPI, UploadFile
|
|
from fastapi.datastructures import Default
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
# TODO: remove when deprecating Pydantic v1
|
|
def test_upload_file_invalid():
|
|
with pytest.raises(ValueError):
|
|
UploadFile.validate("not a Starlette UploadFile")
|
|
|
|
|
|
def test_upload_file_invalid_pydantic_v2():
|
|
with pytest.raises(ValueError):
|
|
UploadFile._validate("not a Starlette UploadFile", {})
|
|
|
|
|
|
def test_default_placeholder_equals():
|
|
placeholder_1 = Default("a")
|
|
placeholder_2 = Default("a")
|
|
assert placeholder_1 == placeholder_2
|
|
assert placeholder_1.value == placeholder_2.value
|
|
|
|
|
|
def test_default_placeholder_bool():
|
|
placeholder_a = Default("a")
|
|
placeholder_b = Default("")
|
|
assert placeholder_a
|
|
assert not placeholder_b
|
|
|
|
|
|
def test_upload_file_is_closed(tmp_path: Path):
|
|
path = tmp_path / "test.txt"
|
|
path.write_bytes(b"<file content>")
|
|
app = FastAPI()
|
|
|
|
testing_file_store: List[UploadFile] = []
|
|
|
|
@app.post("/uploadfile/")
|
|
def create_upload_file(file: UploadFile):
|
|
testing_file_store.append(file)
|
|
return {"filename": file.filename}
|
|
|
|
client = TestClient(app)
|
|
with path.open("rb") as file:
|
|
response = client.post("/uploadfile/", files={"file": file})
|
|
assert response.status_code == 200, response.text
|
|
assert response.json() == {"filename": "test.txt"}
|
|
|
|
assert testing_file_store
|
|
assert testing_file_store[0].file.closed
|
|
|
|
|
|
# For UploadFile coverage, segments copied from Starlette tests
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_upload_file():
|
|
stream = io.BytesIO(b"data")
|
|
file = UploadFile(filename="file", file=stream, size=4)
|
|
assert await file.read() == b"data"
|
|
assert file.size == 4
|
|
await file.write(b" and more data!")
|
|
assert await file.read() == b""
|
|
assert file.size == 19
|
|
await file.seek(0)
|
|
assert await file.read() == b"data and more data!"
|
|
await file.close()
|