Coverage for tests/test_datastructures.py: 100%
51 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-05-05 00:03 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-05-05 00:03 +0000
1import io 1ghijkl
2from pathlib import Path 1ghijkl
3from typing import List 1ghijkl
5import pytest 1ghijkl
6from fastapi import FastAPI, UploadFile 1ghijkl
7from fastapi.datastructures import Default 1ghijkl
8from fastapi.testclient import TestClient 1ghijkl
11# TODO: remove when deprecating Pydantic v1
12def test_upload_file_invalid(): 1ghijkl
13 with pytest.raises(ValueError): 1EFGHIJ
14 UploadFile.validate("not a Starlette UploadFile") 1EFGHIJ
17def test_upload_file_invalid_pydantic_v2(): 1ghijkl
18 with pytest.raises(ValueError): 1KLMNOP
19 UploadFile._validate("not a Starlette UploadFile", {}) 1KLMNOP
22def test_default_placeholder_equals(): 1ghijkl
23 placeholder_1 = Default("a") 1stuvwx
24 placeholder_2 = Default("a") 1stuvwx
25 assert placeholder_1 == placeholder_2 1stuvwx
26 assert placeholder_1.value == placeholder_2.value 1stuvwx
29def test_default_placeholder_bool(): 1ghijkl
30 placeholder_a = Default("a") 1yzABCD
31 placeholder_b = Default("") 1yzABCD
32 assert placeholder_a 1yzABCD
33 assert not placeholder_b 1yzABCD
36def test_upload_file_is_closed(tmp_path: Path): 1ghijkl
37 path = tmp_path / "test.txt" 1abcdef
38 path.write_bytes(b"<file content>") 1abcdef
39 app = FastAPI() 1abcdef
41 testing_file_store: List[UploadFile] = [] 1abcdef
43 @app.post("/uploadfile/") 1abcdef
44 def create_upload_file(file: UploadFile): 1abcdef
45 testing_file_store.append(file) 1abcdef
46 return {"filename": file.filename} 1abcdef
48 client = TestClient(app) 1abcdef
49 with path.open("rb") as file: 1abcdef
50 response = client.post("/uploadfile/", files={"file": file}) 1abcdef
51 assert response.status_code == 200, response.text 1abcdef
52 assert response.json() == {"filename": "test.txt"} 1abcdef
54 assert testing_file_store 1abcdef
55 assert testing_file_store[0].file.closed 1abcdef
58# For UploadFile coverage, segments copied from Starlette tests
61@pytest.mark.anyio 1ghijkl
62async def test_upload_file(): 1ghijkl
63 stream = io.BytesIO(b"data") 1mnopqr
64 file = UploadFile(filename="file", file=stream, size=4) 1mnopqr
65 assert await file.read() == b"data" 1mnopqr
66 assert file.size == 4 1mnopqr
67 await file.write(b" and more data!") 1mnopqr
68 assert await file.read() == b"" 1mnopqr
69 assert file.size == 19 1mnopqr
70 await file.seek(0) 1mnopqr
71 assert await file.read() == b"data and more data!" 1mnopqr
72 await file.close() 1mnopqr