from typing import Optional from fastapi import FastAPI, File, Form from starlette.testclient import TestClient from typing_extensions import Annotated app = FastAPI() @app.post("/urlencoded") async def post_url_encoded(age: Annotated[Optional[int], Form()] = None): return age @app.post("/multipart") async def post_multi_part( age: Annotated[Optional[int], Form()] = None, file: Annotated[Optional[bytes], File()] = None, ): return {"file": file, "age": age} client = TestClient(app) def test_form_default_url_encoded(): response = client.post("/urlencoded", data={"age": ""}) assert response.status_code == 200 assert response.text == "null" def test_form_default_multi_part(): response = client.post("/multipart", data={"age": ""}) assert response.status_code == 200 assert response.json() == {"file": None, "age": None}