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

1import io 1ghijkl

2from pathlib import Path 1ghijkl

3from typing import List 1ghijkl

4 

5import pytest 1ghijkl

6from fastapi import FastAPI, UploadFile 1ghijkl

7from fastapi.datastructures import Default 1ghijkl

8from fastapi.testclient import TestClient 1ghijkl

9 

10 

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

15 

16 

17def test_upload_file_invalid_pydantic_v2(): 1ghijkl

18 with pytest.raises(ValueError): 1KLMNOP

19 UploadFile._validate("not a Starlette UploadFile", {}) 1KLMNOP

20 

21 

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

27 

28 

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

34 

35 

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

40 

41 testing_file_store: List[UploadFile] = [] 1abcdef

42 

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

47 

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

53 

54 assert testing_file_store 1abcdef

55 assert testing_file_store[0].file.closed 1abcdef

56 

57 

58# For UploadFile coverage, segments copied from Starlette tests 

59 

60 

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