import email.message
import inspect
import json
+from contextlib import AsyncExitStack
from enum import Enum, IntEnum
from typing import (
Any,
if body_field:
if is_body_form:
body = await request.form()
+ stack = request.scope.get("fastapi_astack")
+ assert isinstance(stack, AsyncExitStack)
+ stack.push_async_callback(body.close)
else:
body_bytes = await request.body()
if body_bytes:
+from pathlib import Path
+from typing import List
+
import pytest
-from fastapi import UploadFile
+from fastapi import FastAPI, UploadFile
from fastapi.datastructures import Default
+from fastapi.testclient import TestClient
def test_upload_file_invalid():
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